package com.swust.chargingmobileback.socket;
import com.swust.chargingmobileback.dao.home.PileTransMapper;
import com.swust.chargingmobileback.model.PileTrans;
import com.swust.chargingmobileback.service.home.impl.ScanServiceImpl;
import com.swust.chargingmobileback.util.algorithm.CRC16;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.List;
/**
* @author 73559
* @Date 2018/7/8 17:20
*/
@Service
@Transactional(rollbackFor=RuntimeException.class)
public class SocketImpl {
static Logger logger = LoggerFactory.getLogger(SocketImpl.class);
@Resource
private PileTransMapper pileTransMapper;
/**
* 状态码
*/
int stateCode = Integer.MAX_VALUE;
/**
* 向网关发送充电请求
*
* @param ip
* 网关地址
* @param port
* 端口
* @param list
* 卡号及卡余额
* @param obj
* 部分数据内容
* @return 状态码
*/
public String sendScanSocket(String ip, int port, List<String> list,
Object[] obj, String button) {
// 判断是否开始充电,默认开启充电失败
boolean flag = false;
// 由于网关发送多次信息,可能出现这种情况:前一次开启,flag=true,
// 后一次又发来其他状态码,返回flag=false,将前一次给覆盖
boolean flag1 = false;
// 生成crc校验码
// 十六进制数据内容
String data = initStartData(list, obj, button);
// 数据内容转为16进制字节数组
byte[] byteData = CRC16.HexStringToBinary(data);
// crc校验码数据内容
int crcInt = CRC16.calcCrc16(byteData);
// 根据数据内容生成CRC校验码
String crcString = (Integer.toHexString(crcInt)).toUpperCase();
if (crcString.length() < 4) {
crcString = "0" + crcString;
}
// 组装数据包
// 拼接完整数据包内容
String packageData = "A42400" + data + crcString + "B4";
logger.info("开始充电客户端完整数据包=" + packageData);
logger.info(
"处理后的客户端数据展示开始------------------------------------", 3);
logger.info("网关号=" + obj[1]);
logger.info("电桩号=" + obj[2]);
logger.info("功能码=" + "051C");
logger.info("充电端口=" + obj[3]);
logger.info("充电方式=" + obj[4]);
// 获取卡余额时候已转为16进制整数
logger.info("充电预设值=" + trans(obj[5].toString()));
logger.info("辅助电源电压=" + obj[6]);
// 高低位转换即可
logger.info("充电卡号=" + cardIdTrans(list.get(0)));
logger.info("卡余额=" + trans(list.get(1)));
logger.info(
"处理后的客户端数据展示结束------------------------------------");
logger.info("");
// 开始请求
try {
logger.info("ip=" + ip);
logger.info("port=" + port);
Socket sockett = new Socket(ip, port);
BufferedInputStream bufiss = new BufferedInputStream(
sockett.getInputStream());
OutputStream oss = sockett.getOutputStream();
byte[] by = CRC16.HexStringToBinary(packageData);
// 如果套接字已经连接成功
if (sockett.isConnected()) {
logger.info("socket连接上了");
oss.write(by);
oss.flush();
// 接收到网关发送过来的数据包总长度
byte[] buf = new byte[26];
int len = 0;
while ((len = bufiss.read(buf)) != -1) {
// 字节数组转为16进制字符串
String hexString = CRC16.bytesToHexString(buf);
logger.info("服务端:" + hexString);
if (hexString
.equals("A3110B0000000000000000000000000000000000000000000000")) {
break;
}
String A3 = hexString.substring(0, 2);
String B3 = hexString.substring(50, 52);
if (A3.equals("A3") && B3.equals("B3")) {
logger.info("服务端正确的数据:" + hexString);
flag = handleScanMessage(flag, hexString);
if (stateCode != Integer.MAX_VALUE){
// 出现故障码或者充电已经结束,退出监听
break;
}
if (flag) {
flag1 = true;
break;
}
}
}
}
bufiss.close();
oss.close();
sockett.close();
logger.info("socket正常断开");
} catch (Exception e) {
logger.info("连接失败!");
e.printStackTrace();
return "2";
}
if (flag1) {
logger.info("开启充电成功!");
return packageData;
} else {
// 整型最大值代表服务端那边报错或者开启充电成功,后者不可能在这里出现,在上一括号中进行;
// 其他故障码(包括充电已经结束)
logger.info("故障state=" + stateCode);
return "" + stateCode;
}
}
/**
* 初始化数据包中的内容
*
* @param list
* 卡号及余额
* @param obj
* 用户上传的充电数据
* @param button
* 开启充电01,关闭充电02
* @return
*/
public String initStartData(List<String> list, Object[] obj, String button) {
// 16进制扩大一百倍的余额
String money = list.get(1);
// 16进制的卡号
String cardId = list.get(0);
// 充电预设值
String prevalue = obj[5].toString();
// 低位在前
money = trans(money);
// 低位在前
prevalue = trans(prevalue);
// 充电卡号反转
cardId = cardIdTrans(cardId);
StringBuilder data = new StringBuilder();
// data = gateid + pileid + functioncode + basedata
data.append(obj[1].toString()).append(obj[2].toString()).append("051C")
.append(button).append(obj[3].toString())
.append(obj[4].toString()).append(prevalue)
.append(obj[6].toString()).append(cardId).append(money)
.append("0000");
return data.toString();
}
/**
* 将值大小转为符合高定位在前,低电位在后
*/
public String trans(String str) {
int length = str.length();
// 预设值剩余的0位数
int len;
// 如果为奇数,则必须在16进制字符串的前边加上一个"0"
if (length % 2 != 0) {
length++;
str = "0" + str;
}
String line = str;
char[] ch = line.toCharArray();
String[] lineArray = new String[line.length() / 2];
int k = 0;
for (int i = 0; i < lineArray.length; i++) {
String string = "";
for (int j = 0; j < 2; j++) {
string += ch[k];
k++;
}
lineArray[i] = string;
}
str = "";
for (int i = lineArray.length - 1; i >= 0; i--) {
str += lineArray[i];
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 充电桩管理系统(源码).zip
资源推荐
资源详情
资源评论
收起资源包目录
充电桩管理系统(源码).zip (339个子文件)
.babelrc 108B
mvnw.cmd 5KB
.editorconfig 243B
.gitignore 274B
.gitignore 268B
.gitignore 127B
index.html 206B
favicon.ico 4KB
ChargingPile.iml 336B
maven-wrapper.jar 46KB
SocketImpl.java 19KB
CRC16.java 11KB
Base64.java 9KB
UserServiceImpl.java 9KB
Customer.java 8KB
CommonUtil.java 8KB
WebMvcConfigurer.java 7KB
User.java 6KB
ShiroConfiguration.java 5KB
PileTrans.java 5KB
PushMsg.java 5KB
ScanServiceImpl.java 5KB
LoginServiceImpl.java 5KB
LogInterceptor.java 5KB
LoginController.java 4KB
User.java 4KB
UserRealm.java 3KB
GlobalExceptionHandler.java 3KB
UserMapper.java 3KB
LoginServiceImpl.java 3KB
ChargingpileServiceImpl.java 3KB
CustomUtils.java 3KB
AccessServiceImpl.java 3KB
ScheduleServiceImpl.java 3KB
ChargingpileController.java 2KB
PileType.java 2KB
CustomerServiceImpl.java 2KB
RoleController.java 2KB
ScanController.java 2KB
AppUsers.java 2KB
UserController.java 2KB
UserLog.java 2KB
CustomerController.java 2KB
BatteryTypeController.java 2KB
PileStateController.java 2KB
PileTypeController.java 2KB
IpAddr.java 2KB
UserAdviceServiceImpl.java 2KB
AppFindCost.java 2KB
PileTypeServiceImpl.java 2KB
AjaxPermissionsAuthorizationFilter.java 2KB
Interceptor.java 2KB
AppPay.java 2KB
MessageServiceImpl.java 2KB
CostServiceImpl.java 2KB
ChargingStationController.java 2KB
ChargingStationServiceImpl.java 1KB
ThreeDESUtil.java 1KB
UserService.java 1KB
Access.java 1KB
BatteryTypeServiceImpl.java 1KB
ScheduleController.java 1KB
PileStateServiceImpl.java 1KB
AppEmptycardsServiceImpl.java 1KB
AppEmptycardsController.java 1KB
LoginController.java 1KB
MD5.java 1KB
KaptchaConfigurer.java 1KB
CostController.java 1KB
ChargeCostController.java 1KB
CustomerServiceImpl.java 1KB
RateTypeServiceImpl.java 1KB
ChargeCostServiceImpl.java 1KB
AlipaytradeServiceImpl.java 1KB
MoneyController.java 1KB
PileMapper.java 1KB
MainsiteErrorController.java 1KB
ErrorEnum.java 1KB
AppLoginLog.java 1KB
AccessController.java 1KB
UserAdviceController.java 1KB
WebMvcConfigurer.java 1KB
UserLogServiceImpl.java 1KB
PileServiceDataServiceImpl.java 1010B
AlipaytradeController.java 992B
CommonJsonException.java 976B
One2Many.java 959B
PileTransStep3ServiceImpl.java 947B
RateTypeController.java 944B
VChargingProcController.java 926B
PileChargingProcServiceImpl.java 924B
ChargeQueryServiceImpl.java 921B
CommonException.java 919B
MessageController.java 918B
PileChargingProcController.java 912B
SocketDtlServiceImpl.java 908B
VChargingProcServiceImpl.java 898B
ChargeCountServiceImpl.java 880B
DashBoardServiceImpl.java 877B
ChargeQueryController.java 874B
共 339 条
- 1
- 2
- 3
- 4
资源评论
土豆片片
- 粉丝: 1558
- 资源: 5641
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功