作者 钟来

开发plc004

正在显示 27 个修改的文件 包含 466 行增加120 行删除
... ... @@ -7,12 +7,12 @@ import io.swagger.annotations.ApiModelProperty;
import com.ruoyi.common.tool.BaseEntity;
/**
* 【请填写功能名称】对象 iot_product_label
* 产品标签对象 iot_product_label
*
* @author zhonglai
* @date 2024-07-22
*/
@ApiModel("【请填写功能名称】")
@ApiModel("产品标签")
public class IotProductLabel extends BaseEntity
{
private static final long serialVersionUID = 1L;
... ...
package com.zhonglai.luhui.device.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel("产品payload的属性编号关系")
public class IotProductPayloadModelNumber {
@ApiModelProperty(value="主键")
private Integer id; // int NOT NULL AUTO_INCREMENT COMMENT '主键',
@ApiModelProperty(value="产品id")
private Integer product_id; // int NOT NULL COMMENT '产品id',
@ApiModelProperty(value="编号")
private String number; // varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '编号',
@ApiModelProperty(value="编号名称")
private String number_name; // varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '编号名称',
@ApiModelProperty(value="模型标识符集合(多个用英文逗号分割)")
private String models; // varchar(250) DEFAULT NULL COMMENT '模型标识符集合(多个用英文逗号分割)',
@ApiModelProperty(value="创建时间")
private String create_time; // timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getProduct_id() {
return product_id;
}
public void setProduct_id(Integer product_id) {
this.product_id = product_id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getNumber_name() {
return number_name;
}
public void setNumber_name(String number_name) {
this.number_name = number_name;
}
public String getModels() {
return models;
}
public void setModels(String models) {
this.models = models;
}
public String getCreate_time() {
return create_time;
}
public void setCreate_time(String create_time) {
this.create_time = create_time;
}
}
... ...
package com.zhonglai.luhui.admin.controller.iot;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.dao.service.PublicTemplateService;
import com.zhonglai.luhui.dao.service.impl.PublicServiceImpl;
import com.zhonglai.luhui.device.domain.IotProductPayloadModelNumber;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@Api(tags = "模型编号关系")
@RestController
@RequestMapping("/iot/IotProductPayloadModelNumber")
public class IotProductPayloadModelNumberController extends BaseController {
@Autowired
private PublicTemplateService publicTemplateService;
@Autowired
private PublicServiceImpl publicService;
@ApiOperation(value ="查询列表")
@GetMapping("/list/{productId}")
public TableDataInfo list(@PathVariable Integer productId)
{
startPage();
IotProductPayloadModelNumber iotProductPayloadModelNumber = new IotProductPayloadModelNumber();
iotProductPayloadModelNumber.setProduct_id(productId);
List<Map<String,Object>> list = publicService.getObjectList(iotProductPayloadModelNumber,"*",null,null,0,0);
// List<IotProductPayloadModelNumber> list = publicTemplateService.selectTList(iotProductPayloadModelNumber);
return getDataTable(list);
}
@ApiOperation("获取详细信息")
@PreAuthorize("@ss.hasPermi('iot:product_label:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Integer id)
{
return success(publicTemplateService.getTById(id, IotProductPayloadModelNumber.class));
}
@ApiOperation("新增")
@PreAuthorize("@ss.hasPermi('iot:product_label:add')")
@Log(title = "模型编号关系", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody IotProductPayloadModelNumber iotProductPayloadModelNumber)
{
IotProductPayloadModelNumber ippmn = publicService.getObject(IotProductPayloadModelNumber.class, "product_id,number",iotProductPayloadModelNumber.getProduct_id()+","+iotProductPayloadModelNumber.getNumber());
if(null != ippmn)
{
return AjaxResult.error("改产品对应的编号已经存在,请去列表页面编辑");
}
return toAjax(publicTemplateService.add(iotProductPayloadModelNumber));
}
@ApiOperation("修改")
@PreAuthorize("@ss.hasPermi('iot:product_label:edit')")
@Log(title = "模型编号关系", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody IotProductPayloadModelNumber iotProductPayloadModelNumber)
{
return toAjax(publicTemplateService.edit((iotProductPayloadModelNumber)));
}
@ApiOperation("删除")
@PreAuthorize("@ss.hasPermi('iot:product_label:remove')")
@Log(title = "模型编号关系", businessType = BusinessType.DELETE)
@DeleteMapping("")
public AjaxResult remove(@RequestBody Integer[] ids)
{
return toAjax(publicTemplateService.removeByIds(IotProductPayloadModelNumber.class,ids));
}
}
... ...
... ... @@ -11,6 +11,10 @@
<artifactId>lh-device-plc004</artifactId>
<description>
设备解析paylod自定义编号
</description>
<dependencies>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
... ...
package com.zhonglai.luhui.device.protocol.plc004.analysis;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.device.analysis.comm.dto.ApiClientRePlyDto;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.domain.IotProductPayloadModelNumber;
import com.zhonglai.luhui.device.protocol.factory.analysis.ProtocolParserFactory;
import com.zhonglai.luhui.device.protocol.factory.analysis.topic.*;
import com.zhonglai.luhui.device.protocol.factory.config.DeviceCach;
import com.zhonglai.luhui.device.protocol.factory.config.ProductPayloadModelNumberCach;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
public class PLC004ProtocolParserFactoryImpl implements ProtocolParserFactory<byte[]> {
private static final String topicModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}";
@Override
public Topic analysisTopic(String topicStr) {
Topic topic = TopicUtil.initTopicFromModelStr(topicStr,topicModel);
return topic;
}
@Override
public AnalysisResult analysisPayload(Topic topic, byte[] payload) {
switch (topic.getTopicType())
{
case "online":
return new Online().analysisPayload(payload);
case "ONLINE":
return new Online().analysisPayload(payload);
case "ADD_POST":
return new AddPost().analysisPayload(toformatPayLoad(topic.getClientid(),payload));
case "PUT_REQ":
JsonObject jsonObject = GsonConstructor.get().fromJson(new String(payload),JsonObject.class);
return new AnalysisResult(false, false, null, new ApiClientRePlyDto() {
@Override
public void setReplyMessage(Message message) {
if(jsonObject.has("result") && "1".equals(jsonObject.get("result").getAsString()))
{
message.setCode(MessageCode.DEFAULT_SUCCESS_CODE);
}
}
});
default:
return new AnalysisResult(false,false,null);
}
}
private String toformatPayLoad(String clientid,byte[] payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(new String(payload),JsonObject.class);
ParserDeviceHostDto parserDeviceHostDto = DeviceCach.getDeviceHost(clientid);
if(null != parserDeviceHostDto && null != parserDeviceHostDto.getIotProduct())
{
Integer iotProductid = parserDeviceHostDto.getIotProduct().getId();
JsonObject rj = new JsonObject();
for (String key : jsonObject.keySet())
{
IotProductPayloadModelNumber iotProductPayloadModelNumber = ProductPayloadModelNumberCach.getNumber(iotProductid,key);
if(null != iotProductPayloadModelNumber)
{
String number = iotProductPayloadModelNumber.getNumber();
if(StringUtils.isNotEmpty(number))
{
JsonObject numberjson = rj.getAsJsonObject(number);
if(null == numberjson)
{
numberjson = new JsonObject();
if(StringUtils.isNoneBlank(iotProductPayloadModelNumber.getNumber_name()))
{
numberjson.addProperty("%sysdeviceinfoname%",iotProductPayloadModelNumber.getNumber_name());
}
rj.add(number,numberjson);
}
numberjson.add(key,jsonObject.get(key));
}
}
}
return rj.toString();
}
return new JsonObject().toString();
}
}
... ...
package com.zhonglai.luhui.device.protocol.plc004.analysis;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.analysis.ProtocolParserFactory;
import com.zhonglai.luhui.device.protocol.factory.analysis.topic.Online;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import com.zhonglai.luhui.device.protocol.plc004.analysis.topic.AllPost;
import com.zhonglai.luhui.device.protocol.plc004.analysis.topic.PutReq;
public class Plc004ProtocolParserFactoryImpl implements ProtocolParserFactory<byte[]> {
private static final String topicModel = "/{{roleid}}/{{username}}/{{topicType}}/{{clientid}}";
@Override
public Topic analysisTopic(String topicStr) {
Topic topic = TopicUtil.initTopicFromModelStr(topicStr,topicModel);
return topic;
}
@Override
public AnalysisResult analysisPayload(Topic topic, byte[] payload) {
switch (topic.getTopicType())
{
case "PUT_REQ":
return new PutReq().analysisPayload(payload);
case "ALL_POST":
return new AllPost().analysisPayload(payload);
case "online":
return new Online().analysisPayload(payload);
}
return null;
}
}
package com.zhonglai.luhui.device.protocol.plc004.analysis.topic;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class AllPost {
public AnalysisResult analysisPayload(byte[] payload)
{
String str = new String(payload);
JsonObject jsonObject = GsonConstructor.get().fromJson(str,JsonObject.class);
if(jsonObject.has("data"))
{
jsonObject.add("1", jsonObject.get("data").getAsJsonObject());
return new AnalysisResult(true,false,jsonObject);
}
return new AnalysisResult(false,false,null);
}
}
package com.zhonglai.luhui.device.protocol.plc004.analysis.topic;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.dto.ApiClientRePlyDto;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import java.util.HashMap;
import java.util.Map;
public class PutReq {
public AnalysisResult analysisPayload(byte[] payload)
{
String str = new String(payload);
JsonObject jsonObject = GsonConstructor.get().fromJson(str,JsonObject.class);
if(jsonObject.has("data"))
{
jsonObject.add("1", jsonObject.get("data").getAsJsonObject());
return new AnalysisResult(false, false, jsonObject, new ApiClientRePlyDto() {
@Override
public void setReplyMessage(Message message) {
message.setCode(MessageCode.DEFAULT_SUCCESS_CODE);
message.setData(JSONObject.parseObject(jsonObject.get("data").toString(),HashMap.class));
}
});
}
return new AnalysisResult(false,false,null);
}
}
package com.zhonglai.luhui.device.protocol.plc004.control;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.comm.util.ByteUtil;
import com.zhonglai.luhui.device.analysis.comm.util.DateUtils;
import com.zhonglai.luhui.device.domain.IotProduct;
import com.zhonglai.luhui.device.protocol.factory.config.DeviceCach;
import com.zhonglai.luhui.device.protocol.factory.control.DeviceCommandServiceFactory;
... ... @@ -12,13 +13,14 @@ import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.lang.reflect.Type;
import java.util.Map;
/**
* 指令控制监听实现
*/
public class DeviceCommandListenServiceImpl implements DeviceCommandServiceFactory {
private static final String topicModel = "/{{roleid}}/{{username}}/{{topicType}}/{{clientid}}";
private static final String topicModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}";
private static final Logger log = LoggerFactory.getLogger(DeviceCommandListenServiceImpl.class);
@Override
... ... @@ -34,17 +36,12 @@ public class DeviceCommandListenServiceImpl implements DeviceCommandServiceFacto
NoticeMessageDto noticeMessageDto = new NoticeMessageDto();
noticeMessageDto.setTopic(topic);
noticeMessageDto.setTopicconfig(topicModel);
if (jsonObject.has("1"))
{
JsonObject data = jsonObject.get("1").getAsJsonObject();
if (data.has("3") && data.has("106"))
{
byte[] bytes = new byte[]{(byte) 0xA5, 0x07, 0x01, 0x20, (byte) data.get("3").getAsInt(), (byte) (data.get("106").getAsInt() - 1)};
bytes = Arrays.copyOf(bytes, bytes.length + 1);
bytes[bytes.length - 1] = ByteUtil.calculateChecksum(bytes);
noticeMessageDto.setCommd(bytes);
}
}
//将jsonObject里面的两层键值比如:{"1":{"key","value","key1",1}}提取成一层放在commdjson里面如{"key":"value","key1":1}
JsonObject commdjson = flattenJsonObject(jsonObject);
noticeMessageDto.setCommd(commdjson.toString().getBytes());
return noticeMessageDto;
}
... ... @@ -53,6 +50,39 @@ public class DeviceCommandListenServiceImpl implements DeviceCommandServiceFacto
return false;
}
/**
* 将嵌套的JsonObject扁平化。
*
* @param jsonObject 嵌套的JsonObject
* @return 扁平化的JsonObject
*/
public JsonObject flattenJsonObject(JsonObject jsonObject) {
// 使用Gson将嵌套的JsonObject转换为Map
Type typeOfMap = new TypeToken<Map<String, JsonElement>>(){}.getType();
Map<String, JsonElement> map = GsonConstructor.get().fromJson(jsonObject, typeOfMap);
// 创建一个新的JsonObject用于存储扁平化的结果
JsonObject flatJson = new JsonObject();
// 遍历Map中的所有键值对
for (Map.Entry<String, JsonElement> entry : map.entrySet()) {
JsonElement value = entry.getValue();
// 检查值是否为JsonObject
if (value.isJsonObject()) {
// 如果是JsonObject,则将其键值对添加到flatJson中
JsonObject innerJson = value.getAsJsonObject();
for (Map.Entry<String, JsonElement> innerEntry : innerJson.entrySet()) {
flatJson.add(innerEntry.getKey(), innerEntry.getValue());
}
} else {
// 如果不是JsonObject,则直接添加到flatJson中
flatJson.add(entry.getKey(), value);
}
}
return flatJson;
}
private Topic getWriteTopic(String deviceId, IotProduct iotProduct)
{
... ... @@ -61,6 +91,7 @@ public class DeviceCommandListenServiceImpl implements DeviceCommandServiceFacto
topic.setClientid(deviceId);
topic.setRoleid(iotProduct.getRole_id()+"");
topic.setUsername(iotProduct.getMqtt_username());
topic.setPayloadtype("Json");
return topic;
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
... ... @@ -12,18 +13,14 @@ import com.zhonglai.luhui.device.protocol.factory.comm.DataLogType;
import com.zhonglai.luhui.device.protocol.factory.comm.DeviceDataLog;
import com.zhonglai.luhui.device.protocol.factory.config.PluginsClassLoader;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import com.zhonglai.luhui.device.protocol.factory.plugins.InitPlugins;
import com.zhonglai.luhui.device.protocol.factory.purification.DefaultProtocolPurificationFactoryImpl;
import com.zhonglai.luhui.device.protocol.factory.purification.ProtocolPurificationFactory;
import com.zhonglai.luhui.device.protocol.factory.service.PersistenceDBService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* 协议解析工厂
... ... @@ -53,18 +50,30 @@ public class ProtocolParserAndPurificationFactory<T> {
Topic topic = protocolParserFactory.analysisTopic(topicStr);
//通过解析服务器将数据解析成键值对的形式存储到json对象里面,方便清洗
AnalysisResult analysisResult = protocolParserFactory.analysisPayload(topic,payload);
if(null == analysisResult || null == analysisResult.getJsonObject())
if(null == analysisResult)
{
return null;
}
//通过模式对解析结果进行清洗,获得到的数据就是业务数据
ProtocolPurificationModel protocolPurificationModel = protocolPurificationFactory.purification(iotProduct.getId(),topic,analysisResult);
if(null != protocolPurificationModel)
{
protocolPurificationModel.setNoticeClien(analysisResult.isNoticeClien());
protocolPurificationModel.setNoticeMessage(analysisResult.getNoticeMessage());
protocolPurificationModel.setAllUp(topic.isAllup());
return protocolPurificationModel;
}else {
if(analysisResult.isNoticeClien())
{
protocolPurificationModel = new ProtocolPurificationModel();
protocolPurificationModel.setNoticeClien(analysisResult.isNoticeClien());
protocolPurificationModel.setNoticeMessage(analysisResult.getNoticeMessage());
protocolPurificationModel.setAllUp(topic.isAllup());
return protocolPurificationModel;
}
DeviceDataLog.error(baseTopic.getClientid(), DataLogType.解析消息,"没有找到可以清洗的数据:"+ GsonConstructor.get().toJson(analysisResult));
}
}
DeviceDataLog.error(baseTopic.getClientid(), DataLogType.解析消息,"没有找到可以解析的服务:"+baseTopic.getUsername());
... ...
... ... @@ -2,6 +2,7 @@ package com.zhonglai.luhui.device.protocol.factory.analysis;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.domain.IotProduct;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
/**
... ...
... ... @@ -8,7 +8,12 @@ import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class AddPost {
public AnalysisResult analysisPayload( byte[] payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(new String(payload), JsonObject.class);
return analysisPayload(new String(payload));
}
public AnalysisResult analysisPayload(String payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(payload, JsonObject.class);
return new AnalysisResult(false,false,jsonObject);
}
}
... ...
... ... @@ -8,7 +8,12 @@ import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class AllPost {
public AnalysisResult analysisPayload( byte[] payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(new String(payload), JsonObject.class);
return analysisPayload(new String(payload));
}
public AnalysisResult analysisPayload(String payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(payload, JsonObject.class);
return new AnalysisResult(true,false,jsonObject);
}
}
... ...
... ... @@ -8,7 +8,12 @@ import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class Get {
public AnalysisResult analysisPayload( byte[] payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(new String(payload), JsonObject.class);
return analysisPayload(new String(payload));
}
public AnalysisResult analysisPayload( String payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(payload, JsonObject.class);
return new AnalysisResult(false,false,jsonObject);
}
}
... ...
... ... @@ -7,9 +7,14 @@ import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class Online {
public AnalysisResult analysisPayload( byte[] payload)
{
return analysisPayload( new String(payload));
}
public AnalysisResult analysisPayload( String payload)
{
JsonObject jsonObject = new JsonObject();
JsonObject object = new JsonObject();
object.addProperty("online",new String(payload));
object.addProperty("online",payload);
jsonObject.add("0",object);
return new AnalysisResult(false,false,jsonObject);
}
... ...
... ... @@ -7,7 +7,12 @@ import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class PutReq {
public AnalysisResult analysisPayload(byte[] payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(new String(payload), JsonObject.class);
return analysisPayload(new String(payload));
}
public AnalysisResult analysisPayload(String payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(payload, JsonObject.class);
return new AnalysisResult(false,true,jsonObject);
}
}
... ...
... ... @@ -7,7 +7,12 @@ import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class ReadReq {
public AnalysisResult analysisPayload(byte[] payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(new String(payload), JsonObject.class);
return analysisPayload(new String(payload));
}
public AnalysisResult analysisPayload(String payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(payload, JsonObject.class);
return new AnalysisResult(false,true,jsonObject);
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.config;
import com.zhonglai.luhui.device.domain.IotProductPayloadModelNumber;
import java.util.HashMap;
import java.util.Map;
public class ProductPayloadModelNumberCach {
private static Map<Integer, Map<String, IotProductPayloadModelNumber>> map = new HashMap<>();
public static void putProductPayloadModelNumber(Integer product_id,String model,IotProductPayloadModelNumber iotProductPayloadModelNumber)
{
Map<String, IotProductPayloadModelNumber> productPayloadModelNumber = map.get(product_id);
if(null == productPayloadModelNumber)
{
productPayloadModelNumber = new HashMap<>();
map.put(product_id,productPayloadModelNumber);
}
productPayloadModelNumber.put(model,iotProductPayloadModelNumber);
}
public static IotProductPayloadModelNumber getNumber(Integer product_id,String model)
{
Map<String, IotProductPayloadModelNumber> productPayloadModelNumber = map.get(product_id);
if(null == productPayloadModelNumber)
{
return null;
}
return productPayloadModelNumber.get(model);
}
public static void cleanProduct(Integer product_id)
{
map.remove(product_id);
}
public static void cleanProductPayloadModelNumber(Integer product_id,String model)
{
Map<String, IotProductPayloadModelNumber> productPayloadModelNumber = map.get(product_id);
if(null != productPayloadModelNumber)
{
productPayloadModelNumber.remove(model);
}
}
}
... ...
... ... @@ -62,6 +62,9 @@ public class SysCommandListenService implements RocketMQReplyListener<MessageExt
return new Message(MessageCode.DEFAULT_FAIL_CODE,"订阅未成功请检查原因");
}
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,"订阅成功", Arrays.toString(okProduct.toArray()));
case upProductPayloadModelNumber:
iotThingsModelService.upProductPayloadModelNumberCach(deviceCommand.getData().get("product_ids").getAsInt());
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,"更新产品模型编号关系成功");
default:
return new Message(MessageCode.DEFAULT_FAIL_CODE,"指令类型不存在,请联系管理员");
}
... ...
... ... @@ -38,6 +38,12 @@ public class AnalysisDto {
parserDeviceInfoDto.setConfig(things_model_config);
parserDeviceInfoDto.setId(id);
parserDeviceInfoDto.setUpdateTime(time);
if(things_model_value.has("%sysdeviceinfoname%"))
{
parserDeviceInfoDto.setDeviceInfoName(things_model_value.get("%sysdeviceinfoname%").getAsJsonObject().get("value").getAsString());
things_model_value.remove("%sysdeviceinfoname%");
}
return parserDeviceInfoDto;
}
}
... ...
... ... @@ -32,5 +32,9 @@ public enum CommandType {
/**
* 添加订阅
*/
addSubscribe
addSubscribe,
/**
* 更新产品模型编号关系
*/
upProductPayloadModelNumber
}
... ...
... ... @@ -59,7 +59,10 @@ public abstract class BaseCallback<T> {
//解析和清洗body
ProtocolPurificationModel protocolPurificationModel = protocolParserAndPurificationFactory.analysisAndPurification( oldparserDeviceHostDto.getIotProduct(),s,payload);
if (null == protocolPurificationModel)
{
return null;
}
//缓存更新
int i = deviceCashUpService.upProtocolPurificationModel(protocolPurificationModel,oldparserDeviceHostDto);
... ...
package com.zhonglai.luhui.device.protocol.factory.service;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelDataTypeEnum;
import com.zhonglai.luhui.device.domain.IotProductPayloadModelNumber;
import com.zhonglai.luhui.device.domain.IotProductTranslate;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.device.protocol.factory.config.ProductPayloadModelNumberCach;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ... @@ -41,6 +44,8 @@ public class IotThingsModelService {
map.put(iotProductTranslate.getModel_identifier(),iotProductTranslate.getTranslate_identifier());
}
}
upProductPayloadModelNumberCach(null);
}
... ... @@ -106,4 +111,23 @@ public class IotThingsModelService {
iotProductTranslateMap.put(product_id,map);
}
}
public void upProductPayloadModelNumberCach(Integer product_id)
{
List<IotProductPayloadModelNumber> list = persistenceDBService.getProductPayloadModelNumberList(product_id);
if (null != list && list.size() != 0)
{
for (IotProductPayloadModelNumber iotProductPayloadModelNumber:list)
{
if (StringUtils.isNotEmpty(iotProductPayloadModelNumber.getModels()))
{
String[] models = iotProductPayloadModelNumber.getModels().split(",");
for (String model:models)
{
ProductPayloadModelNumberCach.putProductPayloadModelNumber(iotProductPayloadModelNumber.getProduct_id(),model,iotProductPayloadModelNumber);
}
}
}
}
}
}
... ...
... ... @@ -192,6 +192,11 @@ public class PersistenceDBService {
return defaultDbService.getIotProductTranslateList(product_id);
}
public List<IotProductPayloadModelNumber> getProductPayloadModelNumberList(Integer product_id)
{
return defaultDbService.getProductPayloadModelNumberList(product_id);
}
/**
* 获取默认数据库的操作服务
* @return
... ... @@ -222,7 +227,7 @@ public class PersistenceDBService {
public ParserDeviceHostDto getOldParserDeviceHostDto(String imei)
{
ParserDeviceHostDto oldParserDeviceHostDto = DeviceCach.getDeviceHost(imei);
if(null == oldParserDeviceHostDto)
if(null == oldParserDeviceHostDto) //缓存中不存在
{
IotDevice iotDevice = getDeviceHostById(imei);
if(null == iotDevice)
... ... @@ -249,6 +254,9 @@ public class PersistenceDBService {
oldParserDeviceHostDto.setDevice_life(iotDevice.getDevice_life());
oldParserDeviceHostDto.setDevice_type(iotDevice.getMqtt_username());
oldParserDeviceHostDto.setIotProduct(iotProduct);
//加入缓存
DeviceCach.putDeviceHost(oldParserDeviceHostDto,iotDevice.getDevice_life());
}
return oldParserDeviceHostDto;
}
... ...
... ... @@ -101,11 +101,12 @@ public class DefaultDbService {
iotTerminal.setMqtt_username(oldparserDeviceHostDto.getDevice_type());
iotTerminal.setCreate_time(oldparserDeviceHostDto.getUpdateTime());
iotTerminal.setProduct_id(oldparserDeviceHostDto.getIotProduct().getId());
iotTerminal.setSensor_number(id.substring(-1==id.indexOf("_")?0:id.indexOf("_")+1));
if(StringUtils.isNotEmpty(name))
{
iotTerminal.setName(name);
}else {
iotTerminal.setName(oldparserDeviceHostDto.getIotProduct().getProduct_name()+id);
iotTerminal.setName(oldparserDeviceHostDto.getIotProduct().getProduct_name()+getLastSixChars(iotTerminal.getDevice_id())+"设备的第"+iotTerminal.getSensor_number()+"号终端");
}
baseDao.insert(iotTerminal);
}
... ... @@ -124,6 +125,18 @@ public class DefaultDbService {
return oldparserDeviceInfoDto;
}
/**
* 获取字符串的最后六位字符,如果字符串长度不足六位,则返回整个字符串。
*
* @param input 输入的字符串
* @return 最后的六位字符或整个字符串
*/
private static String getLastSixChars(String input) {
int length = input.length();
// 如果字符串长度小于6,从头开始截取
int startIndex = length >= 6 ? length - 6 : 0;
return input.substring(startIndex);
}
public int updateParserDeviceHostDto(ParserDeviceHostDto parserDeviceHostDto)
{
IotDevice iotDevice = new IotDevice();
... ... @@ -257,4 +270,15 @@ public class DefaultDbService {
{
return baseDao.findBysql("SELECT GROUP_CONCAT(id) ids FROM `iot_product` WHERE subscribe_service_ip = ? GROUP BY subscribe_service_ip",String.class,ip);
}
public List<IotProductPayloadModelNumber> getProductPayloadModelNumberList(Integer product_id)
{
if (null == product_id)
{
return baseDao.findBysql("SELECT * FROM `iot_product_payload_model_number`", IotProductPayloadModelNumber.class);
}
return baseDao.findBysql("SELECT * FROM `iot_product_payload_model_number` WHERE product_id=?", IotProductPayloadModelNumber.class,product_id);
}
}
... ...
... ... @@ -40,6 +40,7 @@ public class MqttServiceListenApplication {
if(null != RunInIDEA)
{
System.setProperty("RunInIDEA",RunInIDEA);
System.setProperty("rocketmq.operationToken","localhost");
}
SpringApplicationBuilder builder = new SpringApplicationBuilder(MqttServiceListenApplication.class);
... ...
... ... @@ -35,6 +35,6 @@ mqtt:
rocketmq:
#nameservice服务器地址(多个以英文逗号隔开)
name-server: 47.115.144.179:9876
consumerGroup: lh-mqtt-service-listen
consumerGroup: ${random.uuid}
topic: deviceCommandListen
operationToken: ${random.uuid}
\ No newline at end of file
operationToken: 120.79.198.245lh-mqtt-service-listen
\ No newline at end of file
... ...