提交修改
This commit is contained in:
@@ -27,6 +27,7 @@ import javax.annotation.Resource;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@@ -109,7 +110,18 @@ public class IECF6113ProtocolService implements IProtocol {
|
||||
* }
|
||||
* </p>
|
||||
*
|
||||
* {"AD6":0.20666666666667,"AD15":0.22,"AD14":0.22,"AD7":0.20666666666667,"AD11":0.20666666666667,
|
||||
* "AD1":18.886666666667,"AD4":0.22,"AD3":0.22,"AD10":0.22,"AD8":15.526666666667,"AD16":0.22,"AD12":0.22,
|
||||
* "AD13":0.22,"AD9":0.20666666666667,"AD2":0.22,"AD5":0.22}
|
||||
* {"I0.1":0,"I0.3":0,"I0.4":0,"I0.6":0,"I0.5":0,"I0.2":0}
|
||||
* {"K0":1001,"温度":17.9375,"K1":48303.94921875,"标况流量":0,"工况流量":0,"压力":96.8515625}
|
||||
* {"lng":"104.1536100","lat":"030.8336398","PAD":4185,"CSQ":28}
|
||||
*/
|
||||
private static final Set<String> EXCLUDE_KEYS = new HashSet<>(Arrays.asList(
|
||||
"AD1", "AD2", "AD3","AD4", "AD5", "AD6","AD7", "AD8", "AD9","AD10", "AD11", "AD12",
|
||||
"AD13", "AD14", "AD15","AD16", "I0.1", "I0.2","I0.3", "I0.4", "I0.5","I0.6","lng", "lat", "PAD", "CSQ",
|
||||
"K0", "K1", "温度","温度1", "标况流量", "工况流量", "压力"
|
||||
));
|
||||
@Override
|
||||
public DeviceReport decode(DeviceData deviceData, String clientId) {
|
||||
try {
|
||||
@@ -120,37 +132,38 @@ public class IECF6113ProtocolService implements IProtocol {
|
||||
log.info(data);
|
||||
}else{
|
||||
Map<String,Object> values = JSON.parseObject(data, Map.class);
|
||||
if (values.containsKey("AD1") || values.containsKey("lng") || values.containsKey("I0.1")||values.containsKey("PAD")){
|
||||
// if (values.containsKey("AD1") || values.containsKey("lng") || values.containsKey("I0.1")||values.containsKey("PAD")||values.containsKey("K1")){
|
||||
// 初始化纬度变量,使用BigDecimal来存储高精度值
|
||||
BigDecimal latitude = new BigDecimal("39.9042");
|
||||
// 初始化经度变量,同样使用BigDecimal
|
||||
BigDecimal longitude = new BigDecimal("116.4074");
|
||||
for (Map.Entry<String, Object> entry : values.entrySet()) {
|
||||
// JSONArray value = (JSONArray) entry.getValue();
|
||||
ThingsModelSimpleItem simpleItem = new ThingsModelSimpleItem();
|
||||
simpleItem.setTs(DateUtils.getNowDate());
|
||||
simpleItem.setId(entry.getKey());
|
||||
simpleItem.setValue(entry.getValue()+"");
|
||||
result.add(simpleItem);
|
||||
if(values.containsKey("lng")) {
|
||||
if (entry.getKey().equals("lng")) {
|
||||
longitude = new BigDecimal(entry.getValue() + "");
|
||||
}
|
||||
if (entry.getKey().equals("lat")) {
|
||||
latitude = new BigDecimal(entry.getValue() + "");
|
||||
// if (EXCLUDE_KEYS.contains(entry.getKey())){
|
||||
ThingsModelSimpleItem simpleItem = new ThingsModelSimpleItem();
|
||||
simpleItem.setTs(DateUtils.getNowDate());
|
||||
simpleItem.setId(entry.getKey());
|
||||
simpleItem.setValue(entry.getValue()+"");
|
||||
result.add(simpleItem);
|
||||
if(values.containsKey("lng")) {
|
||||
if (entry.getKey().equals("lng")) {
|
||||
longitude = new BigDecimal(entry.getValue() + "");
|
||||
|
||||
}
|
||||
if (entry.getKey().equals("lat")) {
|
||||
latitude = new BigDecimal(entry.getValue() + "");
|
||||
|
||||
}
|
||||
//更新设备经纬度信息
|
||||
Device device = new Device();
|
||||
device.setSerialNumber(deviceData.getSerialNumber());
|
||||
device.setLatitude(latitude);
|
||||
device.setLongitude(longitude);
|
||||
device.setLatitude(latitude);
|
||||
deviceService.updateDeviceStatus(device);
|
||||
}
|
||||
}
|
||||
// }
|
||||
}
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
reportMessage.setThingsModelSimpleItem(result);
|
||||
reportMessage.setClientId(clientId);
|
||||
reportMessage.setSerialNumber(clientId);
|
||||
@@ -166,7 +179,8 @@ public class IECF6113ProtocolService implements IProtocol {
|
||||
* 3.查询输入开关量 GKB29810,IPUT,
|
||||
* 4.更改上报时间 GKB29810,JCZ,{"TIME":20}
|
||||
* 5.通 信 控制 GKB29810,MODBUS, {"KO":12}
|
||||
* 6.开关量输出控制 GKB29810,OUT,{"Q0.1":0,"Q0.2":0,"Q0.3":0,"Q0.4":0,"Q0.5":0,"Q0.6":0}GKB29810,0UT,{"Q0.1":1 ,"Q0.2":1,"Q0.3":1,"Q0.4":1,"Q0.5":1 "Q0.6":1)
|
||||
* 6.开关量输出控制 GKB29810,OUT,{"Q0.1":0,"Q0.2":0,"Q0.3":0,"Q0.4":0,"Q0.5":0,"Q0.6":0}
|
||||
* GKB29810,0UT,{"Q0.1":1 ,"Q0.2":1,"Q0.3":1,"Q0.4":1,"Q0.5":1 "Q0.6":1)
|
||||
* @param message
|
||||
* @return
|
||||
*/
|
||||
@@ -176,17 +190,59 @@ public class IECF6113ProtocolService implements IProtocol {
|
||||
FunctionCallBackBo callBack = new FunctionCallBackBo();
|
||||
JSONObject params = message.getParams();
|
||||
// Map<String,Object> values = JSON.parseObject(data, Map.class);
|
||||
ValueItem valueItem = new ValueItem();
|
||||
// JSONObject subJson = new JSONObject();
|
||||
// for (Map.Entry<String, Object> entry : params.entrySet()) {
|
||||
// String key = entry.getKey();
|
||||
// if (checkVariable(key)) {
|
||||
// subJson.put(key, params.get(key));
|
||||
// }
|
||||
// }
|
||||
// if (!subJson.isEmpty()) {
|
||||
// String msg = "GKB29810,MODBUS, " + subJson.toJSONString();
|
||||
// callBack.setSources(msg);
|
||||
// callBack.setMessage(msg.getBytes());
|
||||
// }
|
||||
// 调用方法检查并获取以前缀开头的键和值
|
||||
Map<String, Object> modresult = getValidKeyValuesToMap(params);
|
||||
// 输出结果
|
||||
if (!modresult.isEmpty()) {
|
||||
StringBuilder msg = new StringBuilder("GKB29810,MODBUS,{\"");
|
||||
modresult.forEach((k, v) -> {
|
||||
msg.append(k).append("\":").append(v).append(",");
|
||||
});
|
||||
// 删除最后一个逗号
|
||||
if (msg.charAt(msg.length() - 1) == ',') {
|
||||
msg.deleteCharAt(msg.length() - 1);
|
||||
}
|
||||
// 添加结尾的双引号和大括号
|
||||
msg.append("}");
|
||||
callBack.setSources(msg.toString());
|
||||
callBack.setMessage(msg.toString().getBytes());
|
||||
}
|
||||
|
||||
// 调用方法检查并获取以前缀开头的键和值
|
||||
Map<String, Object> chinaresult = getChineseKeyValues(params);
|
||||
// 输出结果
|
||||
if (!chinaresult.isEmpty()) {
|
||||
StringBuilder msg = new StringBuilder("GKB29810,MODBUS,{\"");
|
||||
chinaresult.forEach((k, v) -> {
|
||||
msg.append(k).append("\":").append(v).append(",");
|
||||
});
|
||||
// 删除最后一个逗号
|
||||
if (msg.charAt(msg.length() - 1) == ',') {
|
||||
msg.deleteCharAt(msg.length() - 1);
|
||||
}
|
||||
// 添加结尾的双引号和大括号
|
||||
msg.append("}");
|
||||
callBack.setSources(msg.toString());
|
||||
callBack.setMessage(msg.toString().getBytes());
|
||||
}
|
||||
|
||||
if(params.containsKey("select")) {
|
||||
String msg = params.get("select") + "";
|
||||
callBack.setSources(msg);
|
||||
callBack.setMessage(msg.getBytes());
|
||||
}
|
||||
if(params.containsKey("MODBUS")){
|
||||
String msg ="GKB29810,MODBUS," + params.get("MODBUS");
|
||||
callBack.setSources(msg);
|
||||
callBack.setMessage(msg.getBytes());
|
||||
}
|
||||
if(params.containsKey("OUT")){
|
||||
String msg = params.get("OUT") + "";
|
||||
callBack.setSources(msg);
|
||||
@@ -246,4 +302,88 @@ public class IECF6113ProtocolService implements IProtocol {
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// 生成所有符合规则的变量集合
|
||||
private static Set<String> generateAllValidVariables() {
|
||||
Set<String> validVariables = new HashSet<>();
|
||||
// 生成字节型变量
|
||||
for (int i = 0; i <= 30000; i++) {
|
||||
validVariables.add("MB" + i);
|
||||
validVariables.add("VB" + i);
|
||||
}
|
||||
// 生成字型变量
|
||||
for (int i = 0; i <= 30000; i++) {
|
||||
validVariables.add("MW" + i);
|
||||
validVariables.add("VW" + i);
|
||||
}
|
||||
// 生成双字型变量
|
||||
for (int i = 0; i <= 30000; i++) {
|
||||
validVariables.add("MD" + i);
|
||||
validVariables.add("VD" + i);
|
||||
}
|
||||
// 生成其他变量
|
||||
for (int i = 0; i <= 30000; i++) {
|
||||
validVariables.add("M" + i);
|
||||
validVariables.add("D" + i);
|
||||
validVariables.add("Y" + i);
|
||||
validVariables.add("N" + i);
|
||||
validVariables.add("Q" + i);
|
||||
}
|
||||
return validVariables;
|
||||
}
|
||||
|
||||
// 获取包含在指定变量范围内的 params 变量的键和值
|
||||
public static JSONObject getValidKeyValues(JSONObject params) {
|
||||
Set<String> validVariables = generateAllValidVariables();
|
||||
JSONObject validKeyValues = new JSONObject();
|
||||
for (String key : params.keySet()) {
|
||||
if (validVariables.contains(key)) {
|
||||
validKeyValues.put(key, params.get(key));
|
||||
}
|
||||
}
|
||||
return validKeyValues;
|
||||
}
|
||||
|
||||
// 检测 params 中的键是否在有效变量范围内
|
||||
public static boolean checkParams(JSONObject params) {
|
||||
Set<String> validVariables = generateAllValidVariables();
|
||||
for (String key : params.keySet()) {
|
||||
if (validVariables.contains(key)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// 获取包含在指定变量范围内的 params 变量的键和值,并存储到 Map 中
|
||||
public static Map<String, Object> getValidKeyValuesToMap(JSONObject params) {
|
||||
Set<String> validVariables = generateAllValidVariables();
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
for (String key : params.keySet()) {
|
||||
if (validVariables.contains(key)) {
|
||||
result.put(key, params.get(key));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// 检查字符串是否包含中文
|
||||
private static boolean containsChinese(String str) {
|
||||
String regex = ".*[\u4e00-\u9fa5].*";
|
||||
return Pattern.matches(regex, str);
|
||||
}
|
||||
|
||||
// 获取 params 里名字包含中文的变量的键和值
|
||||
public static Map<String, Object> getChineseKeyValues(JSONObject params) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
for (String key : params.keySet()) {
|
||||
if (containsChinese(key)) {
|
||||
result.put(key, params.get(key));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user