作者 钟来

Default Changelist

@@ -168,3 +168,6 @@ @@ -168,3 +168,6 @@
168 "1":"id1,id2,id3", 168 "1":"id1,id2,id3",
169 "0":"id1,id2,id3" 169 "0":"id1,id2,id3"
170 } 170 }
  171 +
  172 +3、订阅主题 POST_REQ/+,下位机定时提交数据时,上位机返回数据解析情况
  173 +payload返回一个int数据:0 topic解析为空,不做消息解析;1 设备不存在,不做解析;2 消息正常解析;3 消息异常
@@ -13,4 +13,5 @@ public interface ThingsModelBase<T> { @@ -13,4 +13,5 @@ public interface ThingsModelBase<T> {
13 String getView(); 13 String getView();
14 String getSaveView(); 14 String getSaveView();
15 Object getCmdView(Object value); 15 Object getCmdView(Object value);
  16 + boolean checkValue();
16 } 17 }
@@ -38,4 +38,9 @@ public class ArrayModelOutput extends ThingsModelItemBase<JSONArray> @@ -38,4 +38,9 @@ public class ArrayModelOutput extends ThingsModelItemBase<JSONArray>
38 public Object getCmdView(Object object) { 38 public Object getCmdView(Object object) {
39 return object; 39 return object;
40 } 40 }
  41 +
  42 + @Override
  43 + public boolean checkValue() {
  44 + return true;
  45 + }
41 } 46 }
@@ -42,4 +42,9 @@ public class BoolModelOutput extends ThingsModelItemBase<Boolean> @@ -42,4 +42,9 @@ public class BoolModelOutput extends ThingsModelItemBase<Boolean>
42 public Object getCmdView(Object object) { 42 public Object getCmdView(Object object) {
43 return object; 43 return object;
44 } 44 }
  45 +
  46 + @Override
  47 + public boolean checkValue() {
  48 + return true;
  49 + }
45 } 50 }
@@ -43,4 +43,14 @@ public class DecimalModelOutput extends ThingsModelItemBase<BigDecimal> @@ -43,4 +43,14 @@ public class DecimalModelOutput extends ThingsModelItemBase<BigDecimal>
43 public Object getCmdView(Object object) { 43 public Object getCmdView(Object object) {
44 return object; 44 return object;
45 } 45 }
  46 +
  47 + @Override
  48 + public boolean checkValue() {
  49 + BigDecimal bigDecimal = getValue();
  50 + if(null != bigDecimal && bigDecimal.compareTo(min)>=0 && bigDecimal.compareTo(max)<=0)
  51 + {
  52 + return true;
  53 + }
  54 + return false;
  55 + }
46 } 56 }
@@ -67,6 +67,11 @@ public class EnumModelOutput extends ThingsModelItemBase<Object> @@ -67,6 +67,11 @@ public class EnumModelOutput extends ThingsModelItemBase<Object>
67 return conversion(object,clas); 67 return conversion(object,clas);
68 } 68 }
69 69
  70 + @Override
  71 + public boolean checkValue() {
  72 + return true;
  73 + }
  74 +
70 private static Object conversion(Object data ,String clas) { 75 private static Object conversion(Object data ,String clas) {
71 try { 76 try {
72 return stringToTarget(String.valueOf(data),Class.forName(clas)); 77 return stringToTarget(String.valueOf(data),Class.forName(clas));
@@ -57,4 +57,19 @@ public class IntegerModelOutput extends ThingsModelItemBase<Integer> @@ -57,4 +57,19 @@ public class IntegerModelOutput extends ThingsModelItemBase<Integer>
57 BigDecimal bigDecimal = new BigDecimal(object.toString()); 57 BigDecimal bigDecimal = new BigDecimal(object.toString());
58 return bigDecimal.multiply(new BigDecimal(acy)).intValue(); 58 return bigDecimal.multiply(new BigDecimal(acy)).intValue();
59 } 59 }
  60 +
  61 + @Override
  62 + public boolean checkValue() {
  63 + if(null != getValue() )
  64 + {
  65 + BigDecimal bigDecimal = new BigDecimal(getValue());
  66 +
  67 + if(bigDecimal.compareTo(min)>=0 && bigDecimal.compareTo(max)<=0)
  68 + {
  69 + return true;
  70 + }
  71 +
  72 + }
  73 + return false;
  74 + }
60 } 75 }
@@ -7,7 +7,7 @@ import lombok.Data; @@ -7,7 +7,7 @@ import lombok.Data;
7 * 字符串可以适配所有 7 * 字符串可以适配所有
8 */ 8 */
9 @Data 9 @Data
10 -public class StringModelOutput extends ThingsModelItemBase<Object> 10 +public class StringModelOutput extends ThingsModelItemBase<String>
11 { 11 {
12 private int maxLength; 12 private int maxLength;
13 13
@@ -30,4 +30,13 @@ public class StringModelOutput extends ThingsModelItemBase<Object> @@ -30,4 +30,13 @@ public class StringModelOutput extends ThingsModelItemBase<Object>
30 public Object getCmdView(Object object) { 30 public Object getCmdView(Object object) {
31 return object; 31 return object;
32 } 32 }
  33 +
  34 + @Override
  35 + public boolean checkValue() {
  36 + if(null != getValue() && getValue().length()<maxLength)
  37 + {
  38 + return true;
  39 + }
  40 + return false;
  41 + }
33 } 42 }
@@ -97,6 +97,10 @@ public class DataModeAnalysisService { @@ -97,6 +97,10 @@ public class DataModeAnalysisService {
97 97
98 thingsModelBase.addValue(jsData.get(key)); 98 thingsModelBase.addValue(jsData.get(key));
99 99
  100 + if(!thingsModelBase.checkValue())
  101 + {
  102 + continue;
  103 + }
100 ThingsModelItemBase thingsModelItemBase = (ThingsModelItemBase) thingsModelBase; 104 ThingsModelItemBase thingsModelItemBase = (ThingsModelItemBase) thingsModelBase;
101 //记录数据日志 105 //记录数据日志
102 if(1==thingsModelItemBase.getIs_save_log() && null != serverDto.getDeviceSensorDataList()) 106 if(1==thingsModelItemBase.getIs_save_log() && null != serverDto.getDeviceSensorDataList())
@@ -10,6 +10,7 @@ import com.zhonglai.luhui.mqtt.comm.factory.Topic; @@ -10,6 +10,7 @@ import com.zhonglai.luhui.mqtt.comm.factory.Topic;
10 import com.zhonglai.luhui.mqtt.comm.util.ByteUtil; 10 import com.zhonglai.luhui.mqtt.comm.util.ByteUtil;
11 import com.zhonglai.luhui.mqtt.service.db.DeviceService; 11 import com.zhonglai.luhui.mqtt.service.db.DeviceService;
12 import lombok.SneakyThrows; 12 import lombok.SneakyThrows;
  13 +import org.apache.commons.beanutils.BeanUtils;
13 import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; 14 import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
14 import org.eclipse.paho.client.mqttv3.MqttCallbackExtended; 15 import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
15 import org.eclipse.paho.client.mqttv3.MqttException; 16 import org.eclipse.paho.client.mqttv3.MqttException;
@@ -53,6 +54,9 @@ public class MqttCallback implements MqttCallbackExtended { @@ -53,6 +54,9 @@ public class MqttCallback implements MqttCallbackExtended {
53 54
54 @Override 55 @Override
55 public void messageArrived(String s, MqttMessage mqttMessage) { 56 public void messageArrived(String s, MqttMessage mqttMessage) {
  57 + Topic desttopic = new Topic(s);
  58 + desttopic.setPayloadtype("POST_REQ");
  59 +
56 //接收到消息 60 //接收到消息
57 StringBuffer buffer = new StringBuffer(); 61 StringBuffer buffer = new StringBuffer();
58 buffer.append("topic:"); 62 buffer.append("topic:");
@@ -65,11 +69,14 @@ public class MqttCallback implements MqttCallbackExtended { @@ -65,11 +69,14 @@ public class MqttCallback implements MqttCallbackExtended {
65 buffer.append(ByteUtil.hexStringToSpace(ByteUtil.toHexString(mqttMessage.getPayload()))); 69 buffer.append(ByteUtil.hexStringToSpace(ByteUtil.toHexString(mqttMessage.getPayload())));
66 buffer.append("\r\n"); 70 buffer.append("\r\n");
67 buffer.append("\r\n"); 71 buffer.append("\r\n");
  72 +
  73 + try {
68 Topic topic = new Topic(s); 74 Topic topic = new Topic(s);
69 if(null == topic) 75 if(null == topic)
70 { 76 {
71 log.error("消息{},topic为空,不做解析"); 77 log.error("消息{},topic为空,不做解析");
72 log.error("消息《"+s+"》解析为空 》》》内容:\r\n"+buffer.toString()); 78 log.error("消息《"+s+"》解析为空 》》》内容:\r\n"+buffer.toString());
  79 + terminalService.publish(desttopic.generateSendMessageTopic(),"0");
73 return; 80 return;
74 } 81 }
75 82
@@ -82,13 +89,13 @@ public class MqttCallback implements MqttCallbackExtended { @@ -82,13 +89,13 @@ public class MqttCallback implements MqttCallbackExtended {
82 if(null == iotDevice) 89 if(null == iotDevice)
83 { 90 {
84 log.info("设备{}不存在",topic.getClientid()); 91 log.info("设备{}不存在",topic.getClientid());
  92 + terminalService.publish(desttopic.generateSendMessageTopic(),"1");
85 return; 93 return;
86 } 94 }
87 if("ONLINE".equals(topic.getTopicType().toUpperCase())) 95 if("ONLINE".equals(topic.getTopicType().toUpperCase()))
88 { 96 {
89 topic.setPayloadtype("String"); 97 topic.setPayloadtype("String");
90 } 98 }
91 - try {  
92 //转化为协议对象 99 //转化为协议对象
93 BusinessDto businessDto = BusinessDtoClassNew.newBean(topic.getPayloadtype(),data).analyticalModel(iotDevice.getThings_model_value()); 100 BusinessDto businessDto = BusinessDtoClassNew.newBean(topic.getPayloadtype(),data).analyticalModel(iotDevice.getThings_model_value());
94 101
@@ -106,8 +113,17 @@ public class MqttCallback implements MqttCallbackExtended { @@ -106,8 +113,17 @@ public class MqttCallback implements MqttCallbackExtended {
106 113
107 //数据持久化 114 //数据持久化
108 dataPersistenceService.persistence(topic,dto); 115 dataPersistenceService.persistence(topic,dto);
  116 +
  117 + terminalService.publish(desttopic.generateSendMessageTopic(),"2");
  118 + log.info("{}payload解析完成",s);
109 } catch (Exception e) { 119 } catch (Exception e) {
110 log.error(s+"消息解析异常",e); 120 log.error(s+"消息解析异常",e);
  121 + try {
  122 + terminalService.publish(desttopic.generateSendMessageTopic(),"3");
  123 + } catch (MqttException ex) {
  124 + log.error(s+"消息解析异常时返回的执行结果消息异常",ex);
  125 + }
  126 +
111 } 127 }
112 } 128 }
113 129
@@ -45,10 +45,10 @@ mqtt: @@ -45,10 +45,10 @@ mqtt:
45 clientId: ${random.uuid} 45 clientId: ${random.uuid}
46 #公司id 46 #公司id
47 roleid: 2 47 roleid: 2
48 - mqtt_usernames: 6_WP 48 + mqtt_usernames: NWDB_2023
49 #订阅的topic 49 #订阅的topic
50 topics: ADD_POST,ALL_POST,DB_TOPIC_DISTRIBUTE,GET/+,online,PUT_REQ/+,READ_REQ/+ 50 topics: ADD_POST,ALL_POST,DB_TOPIC_DISTRIBUTE,GET/+,online,PUT_REQ/+,READ_REQ/+
51 - sub_clientid: '866569062386039' 51 + sub_clientid: '+'
52 topicconfig: "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}/{{messageid}}" 52 topicconfig: "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}/{{messageid}}"
53 top_return_map: '{"PUT":"PUT_REQ","READ":"READ_REQ"}' 53 top_return_map: '{"PUT":"PUT_REQ","READ":"READ_REQ"}'
54 username: sysuser 54 username: sysuser