获取电表参数数据
分类: springboot 专栏: 物联网项目 标签: 获取电表数据
2024-07-06 16:37:59 273浏览
获取电表参数数据
效果
思路
- 先发一个指令给网关进一步转发给电表
- 等待netty获取到网关客户端给的数据存到redis中
- 从redis中获取到数据返回给前端
注意:由于发指令后,不能立马拿到结果,可能出现redis里还没数据,你这里就要get,那肯定就没有,所以采用两个接口实现,一个接口负责发指令并把数据存redis,一个接口负责从redis里获取数据
核心代码
发送指令
具体代码如下
@Override
public JSONObject getElectrity1(TManagerDevice device, HttpServletRequest request) {
TManagerDevice tManagerDeviceVo = baseMapper.selectById(device.getId());
if (tManagerDeviceVo==null){
throw new RuntimeException("不存在该设备");
}
String deviceCode=tManagerDeviceVo.getDeviceCode();
String gatewayId = tManagerDeviceVo.getGatewayId();
WaterGateway ssDeviceGatewa = waterGatewayDao.selectById(gatewayId);
if (ssDeviceGatewa==null){
throw new RuntimeException("该设备没有任何网关关联它");
}
//拿到处理后的设备编号
String address = ElectricityMeterUtil.deviceAddressConvert(deviceCode);
String ip = "/"+ssDeviceGatewa.getGatewayIp()+":"+ssDeviceGatewa.getGatewayPort();
//获取发送指令
String instruct =getInstruce(address,device.getOperationType());
if (instruct==null){
throw new RuntimeException("获取操作指令失败");
}
// String instruct = ElectricityMeterUtil.getCompleteInstruct(address, InstructConstant.ELECTRICITY_METER_PULL_INSTRUCT);
sendInstructsService.sendInstructs1(instruct,ip,request,deviceCode,device.getOperationType());
}
netty客户端获取数据
//@Override
public void callbackInstructResultMsg(String ip, String returnStr) {
log.info(returnStr);
if (StringUtils.isEmpty(returnStr) || !returnStr.startsWith("FE")) {
return;
}
//获取回调设备编号
String notFEStr = returnStr.substring(returnStr.indexOf("68") + 2);
String deviceType = notFEStr.startsWith("10") ? "w" : "e";
//根据设备号找到数据,并更新数据
if ("e".equals(deviceType)) {
String addressNo = notFEStr.substring(0, notFEStr.indexOf("68"));
//获取设备号
String deviceNo = ElectricityMeterUtil.addressConvertNo(addressNo, true);
String operationType = redisUtils.get(InstructConstant.handleInstructs + deviceNo);
//删除redis中的数据
redisUtils.delete(InstructConstant.handleInstructs + deviceNo);
//电表操作
handleOperation(deviceNo, operationType, notFEStr);
} else {
//水表操作
String deviceCode = handleWaterOperation(notFEStr);
//删除redis中的数据
redisUtils.delete(InstructConstant.handleInstructs + deviceCode);
}
}
/**
* 电表处理操作类型,对不同的类型更新对应设备的信息
*
* @param deviceNo
* @param type
*/
private void handleOperation(String deviceNo, String type, String notFEStr) {
//FE FE 68 *** 68 *****
LambdaQueryWrapper<TManagerDevice> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(TManagerDevice::getDeviceCode, deviceNo);
TManagerDevice vo = new TManagerDevice();
//合总电闸,拉闸或合闸后修改设备表状态
if (InstructTypeConstant.E_MAIN_GATE_NO.getKey().equals(type)) {
vo.setElectricityStatus("1");
tManagerDeviceMapper.update(vo, wrapper);
}
//拉总电闸
if (InstructTypeConstant.E_MAIN_GATE_OFF.getKey().equals(type)) {
vo.setElectricityStatus("0");
tManagerDeviceMapper.update(vo, wrapper);
}
//合A路电闸
if (InstructTypeConstant.E_A_GATE_NO.getKey().equals(type)) {
vo.setElectricityAStatus("1");
tManagerDeviceMapper.update(vo, wrapper);
}
//拉A路电闸
if (InstructTypeConstant.E_A_GATE_OFF.getKey().equals(type)) {
vo.setElectricityAStatus("0");
tManagerDeviceMapper.update(vo, wrapper);
}
//合B路电闸
if (InstructTypeConstant.E_B_GATE_NO.getKey().equals(type)) {
vo.setElectricityBStatus("1");
tManagerDeviceMapper.update(vo, wrapper);
}
//拉B路电闸
if (InstructTypeConstant.E_B_GATE_OFF.getKey().equals(type)) {
vo.setElectricityBStatus("0");
tManagerDeviceMapper.update(vo, wrapper);
}
//获取电表参数信息
if (InstructTypeConstant.E_MAIN_PARSM_INFO.getKey().equals(type)) {
getElectricityParamInfo(notFEStr, deviceNo);
}
//获取电表费控数据
// if(InstructTypeConstant.E_BALANCE_SETUPA.getKey().equals(type)){
// getElectricityBalanceInfo(notFEStr,deviceNo);
// }
}
/**
* 获取电表参数信息
*
* @param str
*/
private void getElectricityParamInfo(String str, String deviceCode) {
//获取数据
String datastr = str.substring(str.indexOf("B3E9") + 4, str.length() - 4);
String dataBCD = ElectricityMeterUtil.hexAddcharacter(datastr, " ");
log.info("getElectricityParamInfo subtract33Data {}", dataBCD);
Map<String, String> map = new HashMap<>();
//A路电压
String aVoltage = datastr.substring(0, 4);
aVoltage = dataChange(aVoltage, 0);
log.info("A路电压:" + aVoltage);
map.put("aVoltage", aVoltage);
//B路电压
String bVoltage = datastr.substring(4, 8);
bVoltage = dataChange(bVoltage, 0);
log.info("B路电压" + bVoltage);
map.put("bVoltage", bVoltage);
//A路电流
String aCurrent = datastr.substring(8, 12);
aCurrent = dataChange(aCurrent, 2);
log.info("A路电流" + aCurrent);
map.put("aCurrent", aCurrent);
//B路电流
String bCurrent = datastr.substring(12, 16);
bCurrent = dataChange(bCurrent, 2);
log.info("B路电流" + bCurrent);
map.put("bCurrent", bCurrent);
//总功率
String sumPower = datastr.substring(16, 22);
sumPower = dataChange(sumPower, 4);
log.info("总功率:" + sumPower);
map.put("sumPower", sumPower);
//A功率
String aPower = datastr.substring(22, 28);
aPower = dataChange(aPower, 4);
log.info("A功率:" + aPower);
map.put("aPower", aPower);
//B功率
String bPower = datastr.substring(28, 34);
bPower = dataChange(bPower, 4);
log.info("B功率:" + bPower);
map.put("bPower", bPower);
//总视在功率
String sumApparentPower = datastr.substring(34, 40);
sumApparentPower = dataChange(sumApparentPower, 4);
log.info("总视在功率:" + sumApparentPower);
map.put("sumApparentPower", sumApparentPower);
//A路视在功率
String aApparentPower = datastr.substring(40, 46);
aApparentPower = dataChange(aApparentPower, 4);
log.info("A路视在功率:" + aApparentPower);
map.put("aApparentPower", aApparentPower);
//B路视在功率
String bApparentPower = datastr.substring(46, 52);
bApparentPower = dataChange(bApparentPower, 4);
log.info("B路视在功率:" + bApparentPower);
map.put("bApparentPower", bApparentPower);
//A路功率因素
String aPowerFactor = datastr.substring(52, 56);
aPowerFactor = dataChange(aPowerFactor, 3);
log.info("A路功率因素:" + aPowerFactor);
map.put("aPowerFactor", aPowerFactor);
//B路功率因素
String bPowerFactor = datastr.substring(56, 60);
bPowerFactor = dataChange(bPowerFactor, 3);
log.info("B路功率因素:" + bPowerFactor);
map.put("bPowerFactor", bPowerFactor);
//电网频率
String frequency = datastr.substring(60);
frequency = dataChange(frequency, 2);
log.info("电网频率:" + frequency);
map.put("frequency", frequency);
redisUtils.set(InstructConstant.SUMMARY_INSTRUCTS + deviceCode, JSON.toJSONString(map));
}
重点是把数据存到redis
redis中获取电表参数数据
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
暂无评论,快来写一下吧
展开评论
他的专栏
他感兴趣的技术