فهرست منبع

添加井盖消息处理

pengshaojie 6 سال پیش
والد
کامیت
3badf9cafe

+ 2 - 0
wsm-admin-dao/src/main/java/com/wsm/admin/dao/IDeviceDao.java

@@ -8,4 +8,6 @@ import org.springframework.stereotype.Repository;
 public interface IDeviceDao extends IBaseDao<Device, Long> {
 
     Device findByDeviceId16Hex(String deviceId16Hex);
+
+    Device findByDeviceId(String deviceId);
 }

+ 2 - 0
wsm-admin-service/src/main/java/com/wsm/admin/service/IDeviceService.java

@@ -6,4 +6,6 @@ import com.wsm.common.service.IBaseService;
 public interface IDeviceService extends IBaseService<Device, Long> {
 
     Device findByDeviceId16Hex(String deviceId16Hex);
+
+    Device findByDeviceId(String deviceId);
 }

+ 5 - 0
wsm-admin-service/src/main/java/com/wsm/admin/service/impl/DeviceServiceImpl.java

@@ -24,4 +24,9 @@ public class DeviceServiceImpl extends BaseServiceImpl<Device, Long> implements
     public Device findByDeviceId16Hex(String deviceId16Hex) {
         return deviceDao.findByDeviceId16Hex(deviceId16Hex);
     }
+
+    @Override
+    public Device findByDeviceId(String deviceId) {
+        return deviceDao.findByDeviceId(deviceId);
+    }
 }

+ 25 - 0
wsm-admin-web/src/main/java/com/wsm/admin/api/DeviceController.java

@@ -0,0 +1,25 @@
+package com.wsm.admin.api;
+
+import com.wsm.admin.service.IDeviceService;
+import com.wsm.common.api.BaseController;
+import com.wsm.common.util.AjaxJson;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/device")
+public class DeviceController extends BaseController {
+
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private IDeviceService deviceService;
+
+    @RequestMapping(value = {"/list"})
+    public AjaxJson list() {
+       return AjaxJson.success(deviceService.findAll());
+    }
+}

+ 154 - 44
wsm-admin-web/src/main/java/com/wsm/admin/handle/UdpServerHandler.java

@@ -1,5 +1,6 @@
 package com.wsm.admin.handle;
 
+import com.alibaba.fastjson.JSONObject;
 import com.wsm.admin.model.Device;
 import com.wsm.admin.model.DeviceStatus;
 import com.wsm.admin.service.IDeviceService;
@@ -14,9 +15,10 @@ import io.netty.channel.SimpleChannelInboundHandler;
 import io.netty.channel.socket.DatagramPacket;
 import io.netty.util.CharsetUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.messaging.simp.SimpMessagingTemplate;
 
 import java.sql.Timestamp;
@@ -24,6 +26,8 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
+import static java.lang.Long.parseLong;
+
 /**
  * 接受UDP消息并且处理
  *
@@ -49,6 +53,7 @@ public class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket
     }
 
     private static final Map<String, String> deviceStatusMap = new HashMap<>();
+    private static final Map<String, String> jgDeviceStatusMap = new HashMap<>();
 
     static {
         deviceStatusMap.put("08", "硬件版本号");
@@ -75,6 +80,10 @@ public class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket
         deviceStatusMap.put("984", "温感低压");
         deviceStatusMap.put("966", "喷淋打开");
         deviceStatusMap.put("965", "喷淋关闭");
+
+        jgDeviceStatusMap.put("ERC52", "水浸事件");
+        jgDeviceStatusMap.put("ERC51", "井盖掀翻");
+        jgDeviceStatusMap.put("ERC50", "井盖倾斜/抬起");
     }
 
     @Override
@@ -83,62 +92,163 @@ public class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket
         log.warn("Received UDP Msg:" + receiveMsg);
 
         if (StringUtils.isNotEmpty(receiveMsg)){
+            String feedback = "";
+            // 井盖
+            if (receiveMsg.startsWith("2B")){
+                feedback = handleYG(receiveMsg);
+                //byte[] data = feedback.getBytes("ASCII");
+            }else if (receiveMsg.startsWith("68")){
+                feedback = handleJG(receiveMsg);
+            }
+            //在这里可以返回一个UDP消息给对方
+            ctx.write(new DatagramPacket(
+                    Unpooled.copiedBuffer(feedback , CharsetUtil.UTF_8), packet.sender()));
+        }else{
+            log.error("Received Error UDP Message:" + receiveMsg);
+        }
+    }
 
-            String[] str = ASCIIUtil.turnToArray(receiveMsg);
-            Device device = deviceService.findByDeviceId16Hex(ASCIIUtil.getDevice(str));
-
-            String type = str[6];
-            switch (type){
-                // 心跳
-                case "02":
-                    break;
-                // 状态
-                case "04":
-                    int total = Integer.valueOf(str[16]);
-                    for (int i = 0, length = 3; i < total; i++){
-                        String a = str[17 + i * length];
-                        //String b = str[18 + i * length];
-                        String c = str[19 + i * length];
-                        // 状态异常
-                        if (!org.springframework.util.StringUtils.isEmpty(deviceStatusMap.get(a+c)) && device != null){
-                            DeviceStatus status =  new DeviceStatus();
-                            status.setContent(deviceStatusMap.get(a+c));
-                            status.setDevice(device);
-                            status.setStatus((byte)0);
-                            deviceStatusService.save(status);
-                            log.warn(device.getDeviceId() + ":"+ status.getContent());
-
-                            messagingTemplate.convertAndSend("/topic/device", status);
-                        }
-                    }
-                    break;
-                // 报警
-                case "09":
-                    // 报警
-                    String hex = ASCIIUtil.hexStringToString(str[24]+str[25]+str[26]);
-                    if (!org.springframework.util.StringUtils.isEmpty(deviceStatusMap.get(hex)) && device != null){
+    private String handleJG(String receiveMsg) {
+        StringBuffer feedback = new StringBuffer("68");
+        StringBuffer lStr = new StringBuffer("4B");
+
+        log.warn("======接收到井盖传感器推送信息======");
+        String[] str = ASCIIUtil.turnToArray(receiveMsg);
+        String afn  = str[12];
+        String fn = str[14]+str[15]+str[16]+str[17];
+        String frameNumber = str[13];
+//        log.warn("afn:"+afn);
+//        log.warn("fn:"+fn);
+//        log.warn("倒数第一个字符:"+str[str.length-1]);
+//        log.warn("倒数第二个字符:"+str[str.length-2]);
+
+        String deviceId = ASCIIUtil.getJGDeviceID(str);
+        log.warn("设备号:"+deviceId);
+
+        lStr.append(ASCIIUtil.getFeedBackJGDeviceID(str)).append("04").append(afn).append(frameNumber).append(fn);
+        String body = receiveMsg.substring(36, receiveMsg.length()-4);
+        String[] bodyStr = ASCIIUtil.turnToArray(body);
+        log.warn("数据体是:" + body);
+
+        if (StringUtils.isNotEmpty(body)){
+            StringBuffer feedbackBody = new StringBuffer();
+            feedbackBody.append("00").append("00").append("EE").append("32131031C318").append("00000000000000000000000000000000000000")
+                    .append("EE").append("C0").append("A8").append("01").append("E1").append("2008").append("EE").append(ASCIIUtil.getFeedBackJGDeviceID(str))
+                    .append("55").append("00000000").append("EE").append("1008").append("00000000000000000000");
+            lStr.append(feedbackBody);
+
+            log.warn("推送的是心跳、告警数据");
+            int count = (int) parseLong(bodyStr[0], 10);
+            log.warn("总共是:"+count + "个事件");
+
+            for (int i = 0, length = 26; i < count; i++){
+                log.warn("=======第"+(i+1)+"个事件=======");
+                String eventStr = body.substring(8 + i*length, (8 + i*length)+26);
+                log.warn("======="+eventStr +"=======");
+                String[] eventStrArr = ASCIIUtil.turnToArray(eventStr);
+                String type = "ERC" + parseLong(eventStrArr[0], 16);
+                if (jgDeviceStatusMap.get(type) != null){
+                    log.warn("======="+jgDeviceStatusMap.get(type)+"=======\n");
+
+                    String dateStr = eventStrArr[6]+eventStrArr[5]+eventStrArr[4]+eventStrArr[3]+eventStrArr[2];
+                    DateTime dateTime = DateTime.parse(dateStr, DateTimeFormat.forPattern("yyMMddHHmm"));
+
+                    log.warn("=======时间"+dateTime.toDate()+"=======\n");
+
+                    Device device = deviceService.findByDeviceId(deviceId);
+                    if (device != null){
                         DeviceStatus status =  new DeviceStatus();
-                        status.setContent(deviceStatusMap.get(hex));
+                        status.setContent(jgDeviceStatusMap.get(type));
                         status.setDevice(device);
                         status.setStatus((byte)1);
+                        status.setCreateTime(dateTime.toDate());
+                        status.setUpdateTime(dateTime.toDate());
                         deviceStatusService.save(status);
                         log.warn(device.getDeviceId() + ":"+ status.getContent());
 
-                        messagingTemplate.convertAndSend("/topic/device", status);
+                        JSONObject result = new JSONObject();
+                        result.put("id", device.getDeviceId());
+                        result.put("deviceType", device.getDeviceType());
+                        result.put("status", "ERC"+type);
+                        messagingTemplate.convertAndSend("/topic/device", result.toJSONString());
                     }
-                    break;
+                }
             }
+        }else{
+            log.warn("推送的是上报完毕报文");
+        }
+        StringBuffer a = new StringBuffer(ASCIIUtil.toBinary(lStr.toString().length()/2)).append("10");
+        StringBuffer zero = new StringBuffer();
+        for (int i = 0; i < 16-a.length(); i++){
+            zero.append("0");
+        }
+        zero.append(a);
+        String ab = ASCIIUtil.binaryString2hexString(zero.toString());
+        String[] abArr = ASCIIUtil.turnToArray(ab);
+        feedback.append(abArr[1]).append(abArr[0]).append(abArr[1]).append(abArr[0]).append("68");
+        lStr.append(ASCIIUtil.makeChecksum(lStr.toString()));
+        lStr.append("16");
+        feedback.append(lStr);
+        return feedback.toString().toUpperCase();
+    }
 
-            String feedback = ASCIIUtil.getOKFeedback(str);
-            //byte[] data = feedback.getBytes("ASCII");
+    private String handleYG(String receiveMsg) {
+        log.warn("======接收到烟感传感器推送信息======");
+        String[] str = ASCIIUtil.turnToArray(receiveMsg);
+        Device device = deviceService.findByDeviceId16Hex(ASCIIUtil.getYGDeviceID(str));
 
-            //在这里可以返回一个UDP消息给对方,告知已接收到UDP消息,但考虑到这是UDP消息,此处可以注释掉
-            ctx.write(new DatagramPacket(
-                    Unpooled.copiedBuffer(feedback , CharsetUtil.UTF_8), packet.sender()));
+        String type = str[6];
+        switch (type){
+            // 心跳
+            case "02":
+                break;
+            // 状态
+            case "04":
+                int total = Integer.valueOf(str[16]);
+                for (int i = 0, length = 3; i < total; i++){
+                    String a = str[17 + i * length];
+                    //String b = str[18 + i * length];
+                    String c = str[19 + i * length];
+                    // 状态异常
+                    if (!org.springframework.util.StringUtils.isEmpty(deviceStatusMap.get(a+c)) && device != null){
+                        DeviceStatus status =  new DeviceStatus();
+                        status.setContent(deviceStatusMap.get(a+c));
+                        status.setDevice(device);
+                        status.setStatus((byte)0);
+                        deviceStatusService.save(status);
+                        log.warn(device.getDeviceId() + ":"+ status.getContent());
 
-        }else{
-            log.error("Received Error UDP Messsage:" + receiveMsg);
+                        JSONObject result = new JSONObject();
+                        result.put("id", device.getDeviceId());
+                        result.put("deviceType", device.getDeviceType());
+                        result.put("status", a+c);
+
+                        messagingTemplate.convertAndSend("/topic/device", result.toJSONString());
+                    }
+                }
+                break;
+            // 报警
+            case "09":
+                // 报警
+                String hex = ASCIIUtil.hexStringToString(str[24]+str[25]+str[26]);
+                if (!org.springframework.util.StringUtils.isEmpty(deviceStatusMap.get(hex)) && device != null){
+                    DeviceStatus status =  new DeviceStatus();
+                    status.setContent(deviceStatusMap.get(hex));
+                    status.setDevice(device);
+                    status.setStatus((byte)1);
+                    deviceStatusService.save(status);
+                    log.warn(device.getDeviceId() + ":"+ status.getContent());
+
+                    JSONObject result = new JSONObject();
+                    result.put("id", device.getDeviceId());
+                    result.put("deviceType", device.getDeviceType());
+                    result.put("status", hex);
+                    messagingTemplate.convertAndSend("/topic/device", result.toJSONString());
+                }
+                break;
         }
+
+        return ASCIIUtil.getOKFeedback(str);
     }
 
     @Override

+ 0 - 1
wsm-admin-web/src/main/java/com/wsm/admin/init/StartupUdpEvent.java

@@ -22,7 +22,6 @@ public class StartupUdpEvent implements ApplicationListener<ContextRefreshedEven
             UdpServer udpServer = (UdpServer)StartupUdpEvent.getBean(UdpServer.class);
             udpServer.run(2000);
 
-
         } catch (Exception e) {
             log.error("Exception", e);
         }

+ 21 - 9
wsm-application/src/main/resources/templates/login.html

@@ -38,23 +38,35 @@
             <div class="code"><img src="/kaptcha" onclick="random(this)" width="116" height="36" id="vdc"
                                    title="看不清,点击换一张"/></div>
         </div>
-        <button class="layui-btn login_btn" lay-submit="">登录</button>
+        <button class="layui-btn login_btn" lay-submit lay-filter="login">登录</button>
         <input id="rememberMe" name="rememberMe" type="checkbox" value="true" title="记住我"/>
     </form>
 </div>
 <script type="text/javascript" src="/plugins/layui/layui.js"></script>
 <script th:inline="javascript">
-    /*<![CDATA[*/
-    var message = [[${message}]];
-    /*]]>*/
 
     layui.use(['element', 'form', 'layer'], function () {
-        $ = layui.jquery;
-        var form = layui.form, layer = layui.layer;
+        var form = layui.form, layer = layui.layer, $ = layui.jquery;
+
+        form.on('submit(login)', function (data) {
+            $.ajax({
+                url: data.form.action,
+                type: data.form.method,
+                data: $(".layui-form").serialize(),
+                dataType: 'json',
+                success: function (data) {
+                    if (data.code == 0) {
+                        location.href = "/admin/index";
+                    } else {
+                        layer.msg(data.msg, {time: 1000});
+                        $('.login_btn').attr('disabled',false);
+                        $("#vdc").trigger("click");
+                    }
+                }
+            });
+            return false;
+        });
 
-        if (message) {
-            layer.msg(message, {time: 2000});
-        }
     });
 
     //跳出 iframe 框架

+ 6 - 2
wsm-common/src/main/java/com/wsm/common/service/impl/BaseServiceImpl.java

@@ -63,8 +63,12 @@ public abstract class BaseServiceImpl<T extends BaseModel, ID extends Serializab
     @Override
     public void save(T entity) {
         entity.setRecStatus("A");
-        entity.setCreateTime(new Date());
-        entity.setUpdateTime(new Date());
+        if (entity.getCreateTime()  == null){
+            entity.setCreateTime(new Date());
+        }
+        if (entity.getUpdateTime()  == null){
+            entity.setUpdateTime(new Date());
+        }
         getBaseDao().save(entity);
     }
 

+ 111 - 3
wsm-common/src/main/java/com/wsm/common/util/ASCIIUtil.java

@@ -2,6 +2,13 @@ package com.wsm.common.util;
 
 public class ASCIIUtil {
 
+    private static String hexStr =  "0123456789ABCDEF";
+    private static String[] binaryArray =
+            {"0000","0001","0010","0011",
+                    "0100","0101","0110","0111",
+                    "1000","1001","1010","1011",
+                    "1100","1101","1110","1111"};
+
     // 累加
     public static String makeChecksum(String data) {
         if (data == null || data.equals("")) {
@@ -46,6 +53,11 @@ public class ASCIIUtil {
         return String.format("%08x", b);
     }
 
+    /**
+     * 字符串转化成为16进制字符串
+     * @param s
+     * @return
+     */
     public static String strTo16(String s) {
         String str = "";
         for (int i = 0; i < s.length(); i++) {
@@ -83,23 +95,119 @@ public class ASCIIUtil {
         return s;
     }
 
+    public static String hexString2binaryString(String hexString) {
+        if (hexString == null || hexString.length() % 2 != 0)
+            return null;
+        String bString = "", tmp;
+        for (int i = 0; i < hexString.length(); i++) {
+            tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexString.substring(i, i + 1), 16));
+            bString += tmp.substring(tmp.length() - 4);
+        }
+        return bString;
+    }
+
+    public static String binaryString2hexString(String bString) {
+        if (bString == null || bString.equals("") || bString.length() % 8 != 0)
+            return null;
+        StringBuffer tmp=new StringBuffer();
+        int iTmp = 0;
+        for (int i = 0; i < bString.length(); i += 4) {
+            iTmp = 0;
+            for (int j = 0; j < 4; j++) {
+                iTmp += Integer.parseInt(bString.substring(i + j, i + j + 1)) << (4 - j - 1);
+            }
+            tmp.append(Integer.toHexString(iTmp));
+        }
+        return tmp.toString();
+    }
+
+    /**
+     *
+     * @param str
+     * @return 转换为二进制字符串
+     */
+    public static String bytes2BinaryStr(byte[] bArray){
+
+        String outStr = "";
+        int pos = 0;
+        for(byte b:bArray){
+            //高四位
+            pos = (b&0xF0)>>4;
+            outStr+=binaryArray[pos];
+            //低四位
+            pos=b&0x0F;
+            outStr+=binaryArray[pos];
+        }
+        return outStr;
+
+    }
+    /**
+     *
+     * @param bytes
+     * @return 将二进制转换为十六进制字符输出
+     */
+    public static String BinaryToHexString(byte[] bytes){
+
+        String result = "";
+        String hex = "";
+        for(int i=0;i<bytes.length;i++){
+            //字节高4位
+            hex = String.valueOf(hexStr.charAt((bytes[i]&0xF0)>>4));
+            //字节低4位
+            hex += String.valueOf(hexStr.charAt(bytes[i]&0x0F));
+            result +=hex+" ";
+        }
+        return result;
+    }
+    /**
+     *
+     * @param hexString
+     * @return 将十六进制转换为字节数组
+     */
+    public static byte[] HexStringToBinary(String hexString){
+        //hexString的长度对2取整,作为bytes的长度
+        int len = hexString.length()/2;
+        byte[] bytes = new byte[len];
+        byte high = 0;//字节高四位
+        byte low = 0;//字节低四位
+
+        for(int i=0;i<len;i++){
+            //右移四位得到高位
+            high = (byte)((hexStr.indexOf(hexString.charAt(2*i)))<<4);
+            low = (byte)hexStr.indexOf(hexString.charAt(2*i+1));
+            bytes[i] = (byte) (high|low);//高地位做或运算
+        }
+        return bytes;
+    }
+
+
     public static String getOKFeedback(String[] str){
         StringBuffer startBitBuffer = new StringBuffer(str[0]).append(str[1]).append(str[2]).append(str[3]);
-        StringBuffer okBuffer = new StringBuffer(startBitBuffer).append(ASCIIUtil.numToHex16(11)).append(str[6]).append("00").append(ASCIIUtil.strTo16("OK"));
+        StringBuffer okBuffer = new StringBuffer(startBitBuffer).append(numToHex16(11)).append(str[6]).append("00").append(strTo16("OK"));
         okBuffer.append(makeChecksum(okBuffer.toString()));
         return okBuffer.toString();
     }
 
     public static String getErrFeedback(String[] str){
         StringBuffer startBitBuffer = new StringBuffer(str[0]).append(str[1]).append(str[2]).append(str[3]);
-        StringBuffer errorBuffer = new StringBuffer(startBitBuffer).append(ASCIIUtil.numToHex16(13)).append(str[6]).append("00").append(ASCIIUtil.strTo16("ERR")).append("00");
+        StringBuffer errorBuffer = new StringBuffer(startBitBuffer).append(numToHex16(13)).append(str[6]).append("00").append(strTo16("ERR")).append("00");
         errorBuffer.append(makeChecksum(errorBuffer.toString()));
         return errorBuffer.toString();
     }
 
-    public static String getDevice(String[] str){
+    public static String getYGDeviceID(String[] str){
         return new StringBuffer(str[8]).append(str[9]).append(str[10]).append(str[11]).append(str[12]).append(str[13]).append(str[14]).append(str[15]).toString();
     }
 
+    public static String getJGDeviceID(String[] str){
+        return new StringBuffer(str[8]).append(str[7]).append(str[10]).append(str[9]).toString();
+    }
+    public static String getFeedBackJGDeviceID(String[] str){
+        return new StringBuffer(str[7]).append(str[8]).append(str[9]).append(str[10]).toString();
+    }
+
+    public static String toBinary(int str) {
+        return Integer.toBinaryString(str);
+    }
 
 }