feat(plugin): 优化EMQX插件功能并增强设备管理

- 在application.yml中将运行模式从prod改为dev
- 在application-dev.yml中添加generate_statistics配置项以关闭统计信息
- 在AuthVerticle.java中添加MQTT ACL主题路径转换逻辑
- 在DeviceInfoDataCache.java和DeviceInfoDataImpl.java中增加设备状态查询方法
- 在DeviceInfoExpordVo和DeviceInfoImportVo中新增site字段用于设备位置导出导入
- 在DeviceInstallInfo.java中添加多个图片相关字段如泡沫水测漏图片、设备信息图片、门牌号图片
- 在DeviceInstallInfoDataImpl.java中实现findById方法
- 在DeviceInstallInfoExpordVo和DeviceInstallInfoVo中添加切断阀编号和报警器编号导出功能
- 在DeviceInstallInfoServiceImpl.java中完善安装信息查询逻辑
- 在DeviceManagerServiceImpl.java中支持设备状态查询参数
- 在DeviceQueryBo.java中新增deviceStatus字段用于设备状态筛选
- 在feijialuo-emqx-plugin中优化线程池配置并提升并发处理能力
- 在iot-iita-emqx-plugin中调整设备识别规则适配不同平台需求
master
alsszer 6 months ago
parent febc6291b8
commit 2402bd81df

@ -5,7 +5,7 @@
<parent>
<artifactId>iot-iita-plugins</artifactId>
<groupId>cc.iotkit.plugins</groupId>
<version>2.10.18</version>
<version>2.10.30</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -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<String, Set<String>> 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/")) {
@ -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,6 +248,8 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
mapRaw.put("rawHex", rawHex);
mapRaw.put("replyHex", replyHex);
Map<String, Object> 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")){
@ -272,25 +291,38 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
.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;
@ -307,14 +339,26 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
.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;
//下发配置数据的回复
// payload.put("params", FireSafetyDataReceiver.handleHexData(data));
// Map<String, Object> mapConfig = FireSafetyDataReceiver.handleHexConfigData(data);
// if(!mapConfig.isEmpty()) {
// payload.put("params", mapConfig);
// }
// long start10= System.currentTimeMillis() ;
// log.info("threadId=357{}",threadId+":"+start10);
}
}
@ -334,10 +378,9 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
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,6 +484,9 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
return;
}*/
onlineThreadPool.submit(new Runnable() {
@Override
public void run() {
//上线
thingService.post(
pluginInfo.getPluginId(),
@ -441,6 +499,8 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
);
DEVICE_ONLINE.put(dn, true);
}
});
}
public void offline(String clientId) {
String[] parts = clientId.split("_");
@ -678,3 +738,4 @@ public class EmqxPlugin implements PluginCloseListener, IPlugin, Runnable {
return null;
}
}

@ -1,5 +1,5 @@
plugin:
runMode: prod
runMode: dev
mainPackage: cc.iotkit.plugin
emqx:

@ -20,7 +20,7 @@
<version>2.7.11</version>
<relativePath/>
</parent>
<version>2.10.18</version>
<version>2.10.30</version>
<groupId>cc.iotkit.plugins</groupId>
<artifactId>iot-iita-plugins</artifactId>

Loading…
Cancel
Save