diff --git a/emqx-plugin/pom.xml b/emqx-plugin/pom.xml
index 54ad1bc..4b797e4 100644
--- a/emqx-plugin/pom.xml
+++ b/emqx-plugin/pom.xml
@@ -5,7 +5,7 @@
iot-iita-plugins
cc.iotkit.plugins
- 2.10.18
+ 2.10.30
4.0.0
@@ -83,4 +83,4 @@
-
\ No newline at end of file
+
diff --git a/emqx-plugin/src/main/java/cc/iotkit/plugins/emqx/service/EmqxPlugin.java b/emqx-plugin/src/main/java/cc/iotkit/plugins/emqx/service/EmqxPlugin.java
index f71bdd2..6da1f37 100644
--- a/emqx-plugin/src/main/java/cc/iotkit/plugins/emqx/service/EmqxPlugin.java
+++ b/emqx-plugin/src/main/java/cc/iotkit/plugins/emqx/service/EmqxPlugin.java
@@ -36,10 +36,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;
import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.*;
import static cc.iotkit.plugins.emqx.conf.BCDClockGenerator.formatBCDToHex;
import static cc.iotkit.plugins.emqx.conf.BCDClockGenerator.generateBCDTime;
@@ -89,6 +86,18 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
public static final Map> CLIENT_DEVICE_MAP = new HashMap<>();
+ //定义一个线程池,线程池大小时cpu的2倍
+ // 创建线程池,大小为CPU核心数的2倍
+ private static ExecutorService statusThreadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
+ // 创建线程池,大小为CPU核心数的2倍
+ private static ExecutorService threadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
+
+ // 创建线程池,大小为CPU核心数的2倍
+ private static ExecutorService sxsbThreadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
+
+ // 创建线程池,大小为CPU核心数的2倍
+ private static ExecutorService onlineThreadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
+
@PostConstruct
public void init() {
vertx = Vertx.vertx();
@@ -175,6 +184,12 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
log.error("client connect fail: ", s.cause());
}
}).publishHandler(msg -> {
+ // 获取当前线程对象
+ Thread currentThread = Thread.currentThread();
+ // 获取当前线程的 ID
+ long threadId = currentThread.getId();
+ long start = System.currentTimeMillis() ;
+ log.info("threadId=189{}",threadId+":"+start);
String topic = msg.topicName();
log.info("topic={}",topic);
if (topic.contains("/request/")) {
@@ -183,15 +198,15 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
if (topic != null && topic.startsWith("FIGARO/")){
String s = Arrays.asList(topic.split("/")).get(2);
topic = "FIGARO/post/*/"+s;
- // log.info("Client received message on [{}] payload [{}] with QoS [{}]", topic, msg.payload().toJsonObject(), msg.qosLevel());
+ // log.info("Client received message on [{}] payload [{}] with QoS [{}]", topic, msg.payload().toJsonObject(), msg.qosLevel());
}
- // JsonObject payload =msg.payload().toJsonObject();
- // JsonObject payload = parseFrame(msg.payload().getBytes());
+ // JsonObject payload =msg.payload().toJsonObject();
+ // JsonObject payload = parseFrame(msg.payload().getBytes());
JsonObject payload = parseFrame(processToBytes(msg.payload().getBytes()));
System.out.println("payload原始数据++++++++++++++++++++" + payload);
- if(ObjectUtil.isEmpty(payload)){
- return;
- }
+ if(ObjectUtil.isEmpty(payload)){
+ return;
+ }
try {
//客户端连接断开
if (topic.equals("/sys/client/disconnected")) {
@@ -203,7 +218,8 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
if (device == null) {
return;
}
-
+ long start0 = System.currentTimeMillis() ;
+ log.info("threadId=222{}",threadId+":"+start0);
//有消息上报-设备上线
online("*", device.getDeviceName());
@@ -213,7 +229,8 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
if(StringUtils.isBlank(method)){
method = "thing.event.property.post";
}
-
+ long start1 = System.currentTimeMillis() ;
+ log.info("threadId=229{}",threadId+":"+start1);
if (StringUtils.isBlank(method)) {
return;
}
@@ -231,94 +248,121 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
mapRaw.put("rawHex", rawHex);
mapRaw.put("replyHex", replyHex);
Map result = new HashMap<>(mapRaw);
+ long start2 = System.currentTimeMillis() ;
+ log.info("threadId=248{}",threadId+":"+start2);
if(ObjectUtils.isNotEmpty(cmd)&& ObjectUtils.isNotEmpty(data)){
- if(cmd.equals("0x11")){
-
- //4.1 状态信息上报(命令码0x11)
- DeviceStatusParser.parseStatusReportToMap(data).forEach(
- (key, value) -> result.merge(key, value, (v1, v2) -> v2) // 冲突时保留后者
- );
- // params= payload.getJsonObject(DeviceStatusParser.parseStatusReportToMap(data),defParams);
- payload.put("params",result);
- device.setDeviceName(result.get("imei").toString());
- switch(result.get("deviceType").toString()) {
- case "0":
- device.setProductKey("CEMpmANABN7Tt6Jh");
- //家用报警器
- break;
- case "1":
- device.setProductKey("XmXYxjzihseT76As");
- //独立式报警器
- break;
- case "2":
- device.setProductKey("bAASX8tBjYQjBGFP");
+ if(cmd.equals("0x11")){
+
+ //4.1 状态信息上报(命令码0x11)
+ DeviceStatusParser.parseStatusReportToMap(data).forEach(
+ (key, value) -> result.merge(key, value, (v1, v2) -> v2) // 冲突时保留后者
+ );
+ // params= payload.getJsonObject(DeviceStatusParser.parseStatusReportToMap(data),defParams);
+ payload.put("params",result);
+ device.setDeviceName(result.get("imei").toString());
+ switch(result.get("deviceType").toString()) {
+ case "0":
+ device.setProductKey("CEMpmANABN7Tt6Jh");
+ //家用报警器
+ break;
+ case "1":
+ device.setProductKey("XmXYxjzihseT76As");
+ //独立式报警器
+ break;
+ case "2":
+ device.setProductKey("bAASX8tBjYQjBGFP");
//工商业控制器
- break;
- case "3":
- //动火离人设备
- device.setProductKey("WfpZZFkMxxbGfRca");
- case "4":
- //联动控制箱设备
- System.out.println("联动控制箱设备注册++++++++++++++++++++++++++++++++++++++++++");
- device.setProductKey("MQFejp7cyDMH3enG");
- break;
- }
- //注册
- IDeviceAction action1 = DeviceRegister.builder()
- .model("FIGARO")
- .id(UUID.randomUUID().toString())
- .deviceName(device.getDeviceName())
- .productKey(device.getProductKey())
- .params(result)
- .time(System.currentTimeMillis())
- .build();
- thingService.post(pluginInfo.getPluginId(), action1);
-
-
- }else if(cmd.equals("0x12")){
- //4.2 燃气报警器物联网模块数据上报(0x12)
- GasAlarmDataParser.parseHexDataToList(data).forEach(
- (key, value) -> result.merge(key, value, (v1, v2) -> v2));
- payload.put("params",result);
- // GasAlarmDataParser.parseHexDataToList(data);
- }else if(cmd.equals("0x14")){
- //动火离人数据上报与事件上报
- FireSafetyDataReceiver.handleHexData(data).forEach(
- (key, value) -> result.merge(key, value, (v1, v2) -> v2));
- payload.put("params",result);
- }else if(cmd.equals("0x15")){
- //联动控制箱设备状态及参数数据上报
- LinkageControlDataParser.parseHexDataToList(data).forEach(
- (key, value) -> result.merge(key, value, (v1, v2) -> v2));
- payload.put("params",result);
- }
- else if(cmd.equals("0x23")){
- flag=false;
- IoTConfigProtocol.parseReadResponse(data).forEach(
- (key, value) -> result.merge(key, value, (v1, v2) -> v2));
- //读取配置数据
- payload.put("params",result);
-
- //读取配置
- DeviceConfig config = DeviceConfig.builder()
- .id(UUID.randomUUID().toString())
- .deviceName(device.getDeviceName())
- .productKey(device.getProductKey())
- .time(System.currentTimeMillis())
- .config(payload.getJsonObject("params", defParams).getMap())
- .build();
- thingService.post(pluginInfo.getPluginId(), config);
-
-
- }
- else if(cmd.equals("0x24")){
- flag=false;
- //下发配置数据的回复
- // payload.put("params", FireSafetyDataReceiver.handleHexData(data));
- }
+ break;
+ case "3":
+ //动火离人设备
+ device.setProductKey("WfpZZFkMxxbGfRca");
+ case "4":
+ //联动控制箱设备
+ System.out.println("联动控制箱设备注册++++++++++++++++++++++++++++++++++++++++++");
+ device.setProductKey("MQFejp7cyDMH3enG");
+ break;
+ }
+ //注册
+ IDeviceAction action1 = DeviceRegister.builder()
+ .model("FIGARO")
+ .id(UUID.randomUUID().toString())
+ .deviceName(device.getDeviceName())
+ .productKey(device.getProductKey())
+ .params(result)
+ .time(System.currentTimeMillis())
+ .build();
+ long start3= System.currentTimeMillis() ;
+ log.info("threadId=291{}",threadId+":"+start3);
+ statusThreadPool.submit(new Runnable() {
+ @Override
+ public void run() {
+ thingService.post(pluginInfo.getPluginId(), action1);
+ }
+ });
+ long start4= System.currentTimeMillis() ;
+ log.info("threadId=299{}",threadId+":"+start4);
+ }else if(cmd.equals("0x12")){
+ //4.2 燃气报警器物联网模块数据上报(0x12)
+ GasAlarmDataParser.parseHexDataToList(data).forEach(
+ (key, value) -> result.merge(key, value, (v1, v2) -> v2));
+ payload.put("params",result);
+ long start5= System.currentTimeMillis() ;
+ log.info("threadId=306{}",threadId+":"+start5);
+ // GasAlarmDataParser.parseHexDataToList(data);
+ }else if(cmd.equals("0x14")){
+ //动火离人数据上报与事件上报
+ FireSafetyDataReceiver.handleHexData(data).forEach(
+ (key, value) -> result.merge(key, value, (v1, v2) -> v2));
+ payload.put("params",result);
+ long start6= System.currentTimeMillis() ;
+ log.info("threadId=314{}",threadId+":"+start6);
+ }else if(cmd.equals("0x15")){
+ //联动控制箱设备状态及参数数据上报
+ LinkageControlDataParser.parseHexDataToList(data).forEach(
+ (key, value) -> result.merge(key, value, (v1, v2) -> v2));
+ payload.put("params",result);
+ long start7= System.currentTimeMillis() ;
+ log.info("threadId=321{}",threadId+":"+start7);
+ }
+ else if(cmd.equals("0x23")){
+ flag=false;
+ IoTConfigProtocol.parseReadResponse(data).forEach(
+ (key, value) -> result.merge(key, value, (v1, v2) -> v2));
+ //读取配置数据
+ payload.put("params",result);
+
+ //读取配置
+ DeviceConfig config = DeviceConfig.builder()
+ .id(UUID.randomUUID().toString())
+ .deviceName(device.getDeviceName())
+ .productKey(device.getProductKey())
+ .time(System.currentTimeMillis())
+ .config(payload.getJsonObject("params", defParams).getMap())
+ .build();
+ long start8= System.currentTimeMillis() ;
+ log.info("threadId=339{}",threadId+":"+start8);
+ threadPool.submit(new Runnable() {
+ @Override
+ public void run() {
+ thingService.post(pluginInfo.getPluginId(), config);
+ }
+ });
+ long start9= System.currentTimeMillis() ;
+ log.info("threadId=347{}",threadId+":"+start9);
+ }
+ else if(cmd.equals("0x24")){
+ flag=false;
+ //下发配置数据的回复
+// Map mapConfig = FireSafetyDataReceiver.handleHexConfigData(data);
+// if(!mapConfig.isEmpty()) {
+// payload.put("params", mapConfig);
+// }
+// long start10= System.currentTimeMillis() ;
+// log.info("threadId=357{}",threadId+":"+start10);
+ }
}
- // params =
+ // params =
//解析设备数据
}
@@ -328,16 +372,15 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
if (ObjectUtil.isNull(params) || params.isEmpty()){
return;
}
- // System.out.println(payload.getJsonObject("data", defParams));
+ // System.out.println(payload.getJsonObject("data", defParams));
if (ObjectUtils.isNotEmpty(method) && "thing.lifetime.register".equalsIgnoreCase(method)) {
//子设备注册
String subPk = params.getString("productKey");
String subDn = params.getString("deviceName");
String subModel = params.getString("model");
-
- ActionResult regResult = thingService.post(
- pluginInfo.getPluginId(),
- fillAction(
+ long start11= System.currentTimeMillis() ;
+ log.info("threadId=378{}",threadId+":"+start11);
+ ActionResult regResult = thingService.post(pluginInfo.getPluginId(),fillAction(
SubDeviceRegister.builder()
.productKey(device.getProductKey())
.deviceName(device.getDeviceName())
@@ -352,6 +395,8 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
.build()
)
);
+ long start12= System.currentTimeMillis() ;
+ log.info("threadId=395{}",threadId+":"+start12);
if (regResult.getCode() == 0) {
//注册成功
reply(topic, payload, 0);
@@ -379,7 +424,8 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
.params(params.getMap())
.build();
}
-
+ long start13= System.currentTimeMillis() ;
+ log.info("threadId=424{}",threadId+":"+start13);
try {
if(flag) {
reply1(replyHex,device.getDeviceName(), payload);
@@ -395,8 +441,17 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
action.setProductKey(device.getProductKey());
action.setDeviceName(device.getDeviceName());
action.setTime(System.currentTimeMillis());
- thingService.post(pluginInfo.getPluginId(), action);
-
+ long start14= System.currentTimeMillis() ;
+ log.info("threadId=441{}",threadId+":"+start14);
+ IDeviceAction finalAction = action;
+ sxsbThreadPool.submit(new Runnable() {
+ @Override
+ public void run() {
+ thingService.post(pluginInfo.getPluginId(), finalAction);
+ }
+ });
+ long start15= System.currentTimeMillis() ;
+ log.info("threadId=450{}",threadId+":"+start15);
} catch (Exception e) {
log.error("message is illegal.", e);
}
@@ -429,17 +484,22 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
return;
}*/
- //上线
- thingService.post(
- pluginInfo.getPluginId(),
- fillAction(DeviceStateChange.builder()
- .productKey(pk)
- .deviceName(dn)
- .state(DeviceState.ONLINE)
- .build()
- )
- );
- DEVICE_ONLINE.put(dn, true);
+ onlineThreadPool.submit(new Runnable() {
+ @Override
+ public void run() {
+ //上线
+ thingService.post(
+ pluginInfo.getPluginId(),
+ fillAction(DeviceStateChange.builder()
+ .productKey(pk)
+ .deviceName(dn)
+ .state(DeviceState.ONLINE)
+ .build()
+ )
+ );
+ DEVICE_ONLINE.put(dn, true);
+ }
+ });
}
public void offline(String clientId) {
@@ -502,7 +562,7 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
// System.out.println("BCD Time: " + formatBCDToHex(generateBCDTime()));
String replyMessage = buildFrame("01", "01",
mid, cmd, "00" + formatBCDToHex(generateBCDTime()));
- return replyMessage;
+ return replyMessage;
}
public static String formatHexByte(String input) {
// 移除0x前缀并保留纯十六进制字符
@@ -515,8 +575,8 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
}
/**
- * 回复设备
- */
+ * 回复设备
+ */
private void reply1(String replyMessage,String deviceName, JsonObject payload) {
Map payloadReply = new HashMap<>();
if(ObjectUtil.isNull(replyMessage)) {
@@ -543,7 +603,7 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
System.out.println("cmd" + cmd);
// System.out.println(mid + "re++++++++++++++++++++++++++++++++++++++++++++++++++" + cmd);
// System.out.println("BCD Time: " + formatBCDToHex(generateBCDTime()));
- replyMessage = buildFrame("01", "01",
+ replyMessage = buildFrame("01", "01",
mid, cmd, "00" + formatBCDToHex(generateBCDTime()));
}
payloadReply.put("data", replyMessage);
@@ -565,11 +625,11 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
private void reply(String topic, JsonObject payload, int code) {
Map payloadReply = new HashMap<>();
- // System.out.println("BCD Time: " + formatBCDToHex(generateBCDTime()));
- String replyMessage = buildFrame("01","01",
+ // System.out.println("BCD Time: " + formatBCDToHex(generateBCDTime()));
+ String replyMessage = buildFrame("01","01",
"00","01","01"+formatBCDToHex(generateBCDTime()));
- if( StringUtils.isBlank(payload.getString("method"))){
+ if( StringUtils.isBlank(payload.getString("method"))){
payloadReply.put("id", payload.getString("messageID"));
payloadReply.put("method", "thing.event.property.post_reply");
payloadReply.put("code", code);
@@ -578,25 +638,25 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
JsonObject params = null;
JsonObject defParams = JsonObject.mapFrom(new HashMap<>(0));
params = payload.getJsonObject("params", defParams);
- // JsonArray attribute = payload.getJsonArray("params", new JsonArray()); // 提供默认值:ml-citation{ref="1" data="citationList"}
+ // JsonArray attribute = payload.getJsonArray("params", new JsonArray()); // 提供默认值:ml-citation{ref="1" data="citationList"}
- JsonArray attribute = new JsonArray();
- // JsonObject jsonObject = payload.getMap().get("params").getJsonObject("params", defParams);
- attribute.add(payload.getMap().get("params")); // 回退处理为单元素数组:ml-citation{ref="8" data="citationList"}
+ JsonArray attribute = new JsonArray();
+ // JsonObject jsonObject = payload.getMap().get("params").getJsonObject("params", defParams);
+ attribute.add(payload.getMap().get("params")); // 回退处理为单元素数组:ml-citation{ref="8" data="citationList"}
- // JsonArray attribute = payload.getJsonArray("params");
+ // JsonArray attribute = payload.getJsonArray("params");
List points = attribute.getList();
Map attrMap = (Map) points.get(0);
List