作者 钟来

添加plc004数据监听

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>lh-device-protocol-parser</artifactId>
<groupId>com.zhonglai.luhui</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>lh-device-plc004</artifactId>
<dependencies>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-device-protocol-factory</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
... ...
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.JsonObject;
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;
import com.zhonglai.luhui.device.protocol.factory.dto.NoticeMessageDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
/**
* 指令控制监听实现
*/
public class DeviceCommandListenServiceImpl implements DeviceCommandServiceFactory {
private static final String topicModel = "/{{roleid}}/{{username}}/{{topicType}}/{{clientid}}";
private static final Logger log = LoggerFactory.getLogger(DeviceCommandListenServiceImpl.class);
@Override
public NoticeMessageDto read(String deviceId, JsonObject jsonObject) {
return null;
}
@Override
public NoticeMessageDto write(String deviceId, JsonObject jsonObject) {
ParserDeviceHostDto parserDeviceHostDto = DeviceCach.getDeviceHost(deviceId);
Topic topic = getWriteTopic(deviceId,parserDeviceHostDto.getIotProduct());
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);
}
}
return noticeMessageDto;
}
@Override
public boolean notice(String deviceId, JsonObject jsonObject) {
return false;
}
private Topic getWriteTopic(String deviceId, IotProduct iotProduct)
{
Topic topic = new Topic();
topic.setTopicType("PUT");
topic.setClientid(deviceId);
topic.setRoleid(iotProduct.getRole_id()+"");
topic.setUsername(iotProduct.getMqtt_username());
return topic;
}
}
... ...
... ... @@ -26,6 +26,7 @@
<module>lh-device-http-public</module>
<module>lh-device-modbus</module>
<module>lh-device-uyu</module>
<module>lh-device-plc004</module>
</modules>
<description>
设备协议解析工厂
... ...
... ... @@ -19,7 +19,8 @@ spring:
mqtt:
#链接地址
broker: tcp://175.24.61.68:1883
# broker: tcp://175.24.61.68:1883
broker: tcp://47.112.163.61:1883
#唯一标识
clientId: ${random.uuid}
topicconfig: "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}/{{messageid}}"
... ... @@ -28,7 +29,7 @@ mqtt:
client:
#客户端操作时间
operationTime: 10
productids: 27,23
productids: 17
#rocketmq配置信息
rocketmq:
... ...