Y_ANXI 2 лет назад
Родитель
Сommit
7274171ff9

+ 2 - 1
pom.xml

@@ -29,10 +29,11 @@
             <artifactId>tio-core</artifactId>
             <version>3.5.0.v20190822-RELEASE</version>
         </dependency>
+
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
-            <version>5.7.12</version>
+            <version>5.8.16</version>
         </dependency>
         <dependency>
             <groupId>org.eclipse.paho</groupId>

+ 31 - 0
src/main/java/com/yunfei/adapter/accept/FuncHandleBeanInit.java

@@ -0,0 +1,31 @@
+package com.yunfei.adapter.accept;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.Set;
+
+@Component
+public class FuncHandleBeanInit {
+
+    private ApplicationContext context;
+
+    @Autowired
+    public FuncHandleBeanInit(ApplicationContext applicationContext) {
+        this.context = applicationContext;
+    }
+
+    public Object getBean(String name) {
+        Map<String, Object> beansWithAnnotation = context.getBeansWithAnnotation(Function.class);
+        Set<String> strings = beansWithAnnotation.keySet();
+        for (String key : strings) {
+            Function annotation = beansWithAnnotation.get(key).getClass().getAnnotation(Function.class);
+            if (annotation.name().equals(name)) {
+                return beansWithAnnotation.get(key);
+            }
+        }
+        throw new RuntimeException("Bean查找失败");
+    }
+}

+ 15 - 0
src/main/java/com/yunfei/adapter/accept/Function.java

@@ -0,0 +1,15 @@
+package com.yunfei.adapter.accept;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 保险后台权限校验
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD, ElementType.TYPE})
+public @interface Function {
+    String name() default "";
+}

+ 27 - 10
src/main/java/com/yunfei/adapter/accept/MqttSubscriber.java

@@ -1,6 +1,8 @@
 package com.yunfei.adapter.accept;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.yunfei.adapter.http.uniagro.UniagroHttp;
 import jakarta.annotation.PostConstruct;
 import jakarta.annotation.Resource;
@@ -8,28 +10,33 @@ import org.eclipse.paho.client.mqttv3.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.lang.reflect.Method;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
+import java.util.Map;
 
 @Service
 public class MqttSubscriber implements MqttCallback {
 
     @Autowired
     private MqttClient mqttClient;
-    @Resource
-    private UniagroHttp uniagroHttp;
 
+    @Resource
+    private FuncHandleBeanInit beanInit;
     private HashMap<String, String> map = new HashMap<>();
-    private String topic = "/adapter/write/#";
+    private String[] topic = {
+            "/JP/A1030119BCE5EC92/adapter/write",
+            "/PY/9100/adapter/write"
+    };
 
     @PostConstruct
     public void init() throws MqttException {
         mqttClient.setCallback(this);
         mqttClient.connect();
         mqttClient.subscribe(topic);
-
         map.put("ZZ", "uniagro");
         map.put("PY", "uniagro");
+        map.put("JP", "NHH");
     }
 
     @Override
@@ -40,13 +47,21 @@ public class MqttSubscriber implements MqttCallback {
     @Override
     public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
         try {
-            String[] split = new String(mqttMessage.getPayload(), StandardCharsets.UTF_8).split("/");
-            String deviceId = split[4];
-            String product = split[3];
+            String[] split = s.split("/");
+            String deviceId = split[2];
+            String product = split[1];
+            JSONObject obj = JSON.parseObject(new String(mqttMessage.getPayload(), StandardCharsets.UTF_8));
+            if (!obj.containsKey("functionId")) {
+                return;
+            }
             if (map.get(product) != null) {
-                if (map.get(product).equals("uniagro")) {
-                    HashMap<String, Object> hashMap = JSON.parseObject(new String(mqttMessage.getPayload(), StandardCharsets.UTF_8), HashMap.class);
-                    uniagroHttp.write(deviceId, hashMap);
+                Object bean = beanInit.getBean(map.get(product));
+                Method[] declaredMethods = bean.getClass().getDeclaredMethods();
+                for (Method declaredMethod : declaredMethods) {
+                    if(declaredMethod.getName().equals(obj.get("functionId"))){
+                        declaredMethod.setAccessible(true);
+                        declaredMethod.invoke(bean, new String(mqttMessage.getPayload(), StandardCharsets.UTF_8));
+                    }
                 }
             }
         } catch (Exception e) {
@@ -59,4 +74,6 @@ public class MqttSubscriber implements MqttCallback {
     public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
         // 消息交付完成时的处理逻辑
     }
+
+
 }

+ 34 - 0
src/main/java/com/yunfei/adapter/accept/NhhFunction.java

@@ -0,0 +1,34 @@
+package com.yunfei.adapter.accept;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.HashMap;
+
+public class NhhFunction {
+    public void NHHJp(JSONObject obj) {
+        if (!obj.containsKey("inputs")) {
+            return;
+        }
+        JSONArray inputs = obj.getJSONArray("inputs");
+        HashMap<String, Object> jpParams = this.getJpParams();
+        for (int i = 0; i < inputs.size(); i++) {
+            JSONObject jsonObject = inputs.getJSONObject(i);
+            if (jpParams.containsKey(jsonObject.getString("name"))) {
+                jpParams.put(jsonObject.getString("name"), jsonObject.get("value"));
+            }
+        }
+        System.err.println(jpParams);
+    }
+
+    private HashMap<String, Object> getJpParams() {
+        HashMap<String, Object> params = new HashMap<>();
+        params.put("sn", null);
+        params.put("cmd_type", null);
+        params.put("run", 0);
+        params.put("speed", 0);
+        params.put("control_pressure", 0);
+        params.put("compress", 0);
+        return params;
+    }
+}

+ 73 - 0
src/main/java/com/yunfei/adapter/accept/UniagroFunction.java

@@ -0,0 +1,73 @@
+package com.yunfei.adapter.accept;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.yunfei.adapter.http.uniagro.UniagroHttp;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+
+@Component
+@Function(name = "uniagro")
+public class UniagroFunction {
+    @Resource
+    private UniagroHttp uniagroHttp;
+    @Function
+    public void buttonCommand(String msg) {
+        JSONObject obj = JSON.parseObject(msg);
+        HashMap<String, Object> params = new HashMap<>();
+        JSONArray inputs = obj.getJSONArray("inputs");
+        if (obj.getString("functionId").equals("buttonCommand")) {
+            params.put("type", "Button");
+            for (int i = 0; i < inputs.size(); i++) {
+                if (inputs.getJSONObject(i).get("name").equals("commandName")) {
+                    JSONObject parameter = new JSONObject();
+                    parameter.put("commandName", inputs.getJSONObject(i).get("value"));
+                    params.put("parameter", parameter);
+                }
+            }
+        }
+        String write = uniagroHttp.write(obj.getString("deviceId"), params);
+    }
+
+    @Function
+    public void switchCommand(String msg){
+        JSONObject obj = JSON.parseObject(msg);
+        HashMap<String, Object> params = new HashMap<>();
+        JSONArray inputs = obj.getJSONArray("inputs");
+        params.put("type", "Switch");
+        JSONObject parameter = new JSONObject();
+        for (int i = 0; i < inputs.size(); i++) {
+            if (inputs.getJSONObject(i).getString("name").equals("commandName")) {
+                parameter.put("commandName", inputs.getJSONObject(i).get("value"));
+            }
+            if (inputs.getJSONObject(i).getString("name").equals("value")) {
+                parameter.put("state", inputs.getJSONObject(i).get("value"));
+            }
+        }
+        params.put("parameter", parameter);
+        String write = uniagroHttp.write(obj.getString("deviceId"), params);
+        System.err.println(write);
+    }
+
+    @Function
+    public void SetValue(String msg){
+        JSONObject obj = JSON.parseObject(msg);
+        HashMap<String, Object> params = new HashMap<>();
+        JSONArray inputs = obj.getJSONArray("inputs");
+        params.put("type", "SetValue");
+        JSONObject parameter = new JSONObject();
+        for (int i = 0; i < inputs.size(); i++) {
+            if (inputs.getJSONObject(i).getString("name").equals("commandName")) {
+                parameter.put("commandName", inputs.getJSONObject(i).get("value"));
+            }
+            if (inputs.getJSONObject(i).getString("name").equals("value")) {
+                parameter.put("state", inputs.getJSONObject(i).get("value"));
+            }
+        }
+        params.put("parameter", parameter);
+        String write = uniagroHttp.write(obj.getString("deviceId"), params);
+    }
+}

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
src/main/java/com/yunfei/adapter/http/uniagro/UniagroConfig.java


+ 10 - 3
src/main/java/com/yunfei/adapter/http/uniagro/UniagroHttp.java

@@ -1,6 +1,8 @@
 package com.yunfei.adapter.http.uniagro;
 
 import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Component;
 
@@ -47,12 +49,17 @@ public class UniagroHttp {
      */
     public String write(String deviceId, HashMap<String, Object> params) {
         try {
+            String jsonString = JSON.toJSONString(params);
+            JSONObject jsonObject = JSON.parseObject(jsonString);
             String url = domain + setDevice.replace("{id}", deviceId);
-            String body = HttpUtil.createPost(url).header("Authorization","Bearer "+config.token).form(params).execute().body();
-//            log.info("写入设备" + deviceId + "参数为:" + params + ",响应数据为:" + body);
+            String body = HttpUtil.createPost(url)
+                    .header("Authorization","Bearer "+config.token)
+                    .body(jsonString)
+                    .execute()
+                    .body();
             return body;
         } catch (Exception e) {
-//            e.printStackTrace();
+            e.printStackTrace();
             return null;
         }
     }

+ 1 - 1
src/main/java/com/yunfei/adapter/http/uniagro/UniagroHttpAspect.java

@@ -39,7 +39,7 @@ public class UniagroHttpAspect {
     }
 
     private void login(){
-        String loginUrl = "login.uniagro.cn/connect/token";
+        String loginUrl = "https://login.uniagro.cn/connect/token";
         Map<String, Object> params = BeanUtil.beanToMap(config);
         params.put("grant_type","password");
         String body = HttpUtil.createPost(loginUrl).form(params).contentType("application/x-www-form-urlencoded").execute().body();

+ 6 - 1
src/main/java/com/yunfei/adapter/http/uniagro/runner/ScheduledTasks.java

@@ -47,10 +47,15 @@ public class ScheduledTasks {
             if(data.containsKey("angle")){
                 this.putInputs(result,data.getJSONObject("angle"));
             }
+
+            if(data.containsKey("connected")){
+                result.put("connected", data.get("connected"));
+            }
         }
         if (obj.containsKey("timeStamp")) {
             result.put("timeStamp", obj.get("timeStamp"));
         }
+
         if (obj.containsKey("deviceType")) {
             result.put("deviceType", obj.get("deviceType"));
         }
@@ -58,7 +63,7 @@ public class ScheduledTasks {
             this.putInputs(result,obj.getJSONObject("data").getJSONObject("detail"));
         }
         JSONObject property = new JSONObject();
-        property.put("property",result);
+        property.put("properties",result);
         return property.toJSONString();
     }
 

+ 18 - 9
src/main/java/com/yunfei/adapter/tcp/TcpHandle.java

@@ -1,5 +1,6 @@
 package com.yunfei.adapter.tcp;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.yunfei.adapter.forword.MqttPublisher;
 import jakarta.annotation.Resource;
@@ -11,9 +12,6 @@ import org.tio.core.intf.Packet;
 import org.tio.server.intf.ServerAioHandler;
 
 import java.nio.ByteBuffer;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
 
 @Component
 public class TcpHandle implements ServerAioHandler {
@@ -34,17 +32,28 @@ public class TcpHandle implements ServerAioHandler {
         return null;
     }
 
-//    @Override
-//    public ByteBuffer encode(Packet packet, GroupContext groupContext, ChannelContext channelContext) {
-//        return null;
-//    }
-
     @Override
     public void handler(Packet packet, ChannelContext channelContext) throws Exception {
         DefPacket defPackage = (DefPacket) packet;
         byte[] body = defPackage.getBody();
         String msg = new String(body);
         String[] split = msg.split(",");
-        mqttPublisher.publish("/NHH/" + split[1] + "/property/report", msg);
+        mqttPublisher.publish("/NHH/" + split[1] + "/property/report", this.NHH(split));
+    }
+
+    private String NHH(String[] split){
+        //20230221-11:30:30,A1030119BCE5EC92,250,249,46,1,2600,0,0,0
+        JSONObject obj = new JSONObject();
+        obj.put("time",split[0]); //数据时间:20230221-11:30:30
+        obj.put("sn",split[1]); //设备编号:A1030119BCE5EC92
+        obj.put("sleep",split[2]);//设定速度:250  单位:分米/时
+        obj.put("runtime",split[3]); //管道水压:46   单位:MPa/100
+        obj.put("water_pressure",split[4]); //运行状态:1	   说明:0、停止,1、运行
+        obj.put("run",split[5]); //运行状态:1	   说明:0、停止,1、运行
+        obj.put("flow_count",split[6]); // 实时流量:2600 单位:升/时
+        obj.put("last",split[7]); // 末层状态:0    说明:0、非末层,1、末层
+        obj.put("run_surplus",split[8]); //近机倒计时:0  单位:分
+        obj.put("over",split[9]); // 完工停机状态: 说明:0、停止,1、运行
+        return obj.toJSONString();
     }
 }