src/main/java/com/fzzy/gateway/entity/GatewayDevice.java
@@ -23,11 +23,16 @@ @PropertyDef(label = "ç³»ç»ID") private String id; @Column(name = "DeVICE_ID_", length = 100) @Column(name = "DEVICE_SN_", length = 50) @PropertyDef(label = "设å¤åºåå·") private String deviceSn; @Column(name = "DEVICE_ID_", length = 100) @PropertyDef(label = "设å¤ID") private String deviceId; @Column(name = "DeVICE_NAME_", length = 50) @Column(name = "DEVICE_NAME_", length = 50) @PropertyDef(label = "åç§°") private String deviceName; src/main/java/com/fzzy/gateway/sc2023/api/GatewayRemoteManager.java
@@ -12,15 +12,26 @@ @Component public class GatewayRemoteManager implements ApplicationContextAware { public static Map<String, GatewayRemoteService> remoteMap1 = new HashMap<>(); public static Map<String, GatewayRemoteService> remoteMap = new HashMap<>(); public static Map<String, GatewaySyncService> syncMap = new HashMap<>(); @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { Map<String, GatewayRemoteService> serviceMap = applicationContext.getBeansOfType(GatewayRemoteService.class); Map<String, GatewayRemoteService> serviceMap1 = applicationContext.getBeansOfType(GatewayRemoteService.class); for (String key : serviceMap.keySet()) { remoteMap1.put(serviceMap.get(key).getProtocol(), serviceMap.get(key)); for (String key : serviceMap1.keySet()) { remoteMap.put(serviceMap1.get(key).getProtocol(), serviceMap1.get(key)); } Map<String, GatewaySyncService> serviceMap2 = applicationContext.getBeansOfType(GatewaySyncService.class); for (String key : serviceMap2.keySet()) { syncMap.put(serviceMap2.get(key).getProtocol(), serviceMap2.get(key)); } } @@ -31,7 +42,18 @@ * @return */ public GatewayRemoteService getRemoteService(String protocol) { return remoteMap1.get(protocol); return remoteMap.get(protocol); } /** * æ ¹æ®å®ç°åè®®è·åå½åå®ç°æ¹æ³ * * @param protocol * @return */ public GatewaySyncService getSyncService(String protocol) { return syncMap.get(protocol); } } src/main/java/com/fzzy/gateway/sc2023/api/GatewaySyncService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,62 @@ package com.fzzy.gateway.sc2023.api; import com.fzzy.gateway.sc2023.data.*; /** * ç½å ³è®¾å¤åæ¥æ¥å£ï¼æ ¹æ®ä¸å¡éæ±å®ä¹æ¥å£ */ public interface GatewaySyncService { /** * åè®®å®ä¹ * * @return */ String getProtocol(); /** * 忥å°ç£ ä¿¡æ¯ * * @return */ public WeightInfo syncWeightInfo(SyncReqData reqData); /** * 车çè¯å«è·å * * @return */ public LprData syncLpr(SyncReqData reqData); /** * 身份è¯è¯»å¡å¨ * * @return */ public IdCardData syncIdCard(SyncReqData reqData); /** * æ¨éæ¥æç»LED * <p> * TODO>>>>>å½åæ¥å£ææ¡£ç䏿 * * @return */ public String push2Led(SyncReqData reqData); /** * åæ¥ç²®æ ä¿¡æ¯ * * @param reqData * @return */ public GrainData syncGrain(SyncReqData reqData); } src/main/java/com/fzzy/gateway/sc2023/data/GrainData.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,37 @@ package com.fzzy.gateway.sc2023.data; import lombok.Data; /** * ç²®æ ä¿¡æ¯ */ @Data public class GrainData { private String messageId; private String deviceId; private String avgTemperature; private String minTemperature; private String maxTemperature; private String collectTime; private String minX; private String minY; private String minZ; private String maxX; private String maxY; private String maxZ; private String apISource = "apiTemperature"; } src/main/java/com/fzzy/gateway/sc2023/data/IdCardData.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ package com.fzzy.gateway.sc2023.data; import lombok.Data; /** * 身份è¯ä¿¡æ¯ */ @Data public class IdCardData { private String dentityCard;//读åå°ç身份è¯å·,è¿è¡å¯¹ç§°å å¯ private String userName;//ç¨æ·å§å private String address;//å°å } src/main/java/com/fzzy/gateway/sc2023/data/LprData.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ package com.fzzy.gateway.sc2023.data; import lombok.Data; /** * 车çè¯å«ç»æ */ @Data public class LprData { private String deviceId; private String carNumber; private String position = "big"; } src/main/java/com/fzzy/gateway/sc2023/data/SyncReqData.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.fzzy.gateway.sc2023.data; public class SyncReqData { private String productId; private String deviceId; private String messageType; private String messageId; private String functionId; private String jsonData; } src/main/java/com/fzzy/gateway/sc2023/data/WebSocketPacket.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,23 @@ package com.fzzy.gateway.sc2023.data; import com.alibaba.fastjson2.JSONObject; import lombok.Data; @Data public class WebSocketPacket { private WebSocketPacketHeader headers; private String messageType; private String messageId; private String functionId; private String deviceId; private JSONObject properties; private long timestamp; } src/main/java/com/fzzy/gateway/sc2023/data/WebSocketPacketHeader.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.fzzy.gateway.sc2023.data; import lombok.Data; @Data public class WebSocketPacketHeader { private String productId; private String keepOnlineTimeoutSeconds; private String keepOnline; private String deviceName; private String orgId; } src/main/java/com/fzzy/gateway/sc2023/data/WeightInfo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ package com.fzzy.gateway.sc2023.data; import lombok.Data; /** * ç§°éä¿¡æ¯è¿å */ @Data public class WeightInfo { private String deviceId; private boolean exceed; private Double grossWeight; private Double netWeight; private Double tareWeight = 0.0; private String weightUnit = "KG"; } src/main/java/com/fzzy/gateway/sc2023/websocket/WebSocketDevice.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,107 @@ package com.fzzy.gateway.sc2023.websocket; import com.alibaba.fastjson.JSONObject; import com.fzzy.gateway.sc2023.data.WebSocketPacket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * */ @Slf4j @Component @ServerEndpoint(value = "/device/${productId}/${deviceId}/message/property/report") public class WebSocketDevice { private static Map<String, Session> sessionPool = new ConcurrentHashMap<>(); private static Map<String, String> sessionIds = new ConcurrentHashMap<>(); // ä¸æä¸ªå®¢æ·ç«¯çè¿æ¥ä¼è¯ï¼éè¦éè¿å®æ¥ç»å®¢æ·ç«¯åéæ°æ® private Session session; @OnOpen public void onOpen(Session session, @PathParam("productId") String productId, @PathParam("deviceId") String deviceId, @PathParam("clientId") String clientId ) throws Exception { this.session = session; String key = productId + "-" + deviceId; sessionPool.put(key, session); sessionIds.put(session.getId(), key); log.info("new webSocket,clientId={}", key); } @OnClose public void onClose() { String key = sessionIds.get(session.getId()); sessionPool.remove(key); sessionIds.remove(session.getId()); log.info("WebSocketè¿æ¥å ³é={}", key); } /** * æ¶å°å端åéçä¿¡æ¯ * * @param message * @param session */ @OnMessage public void onMessage(String message, Session session) { log.info("æ¥èªå®¢æ·ç«¯ä¿¡æ¯:\n" + message); } @OnError public void onError(Session session, Throwable error) { log.error("åçé误"); String key = sessionIds.get(session.getId()); sessionPool.remove(key); sessionIds.remove(session.getId()); error.printStackTrace(); } /** * @param packet */ public static void sendByPacket(WebSocketPacket packet) { if (StringUtils.isEmpty(packet.getDeviceId())) { log.error("WebSocketä¿¡æ¯æ¨é失败ï¼è®¾å¤ç¼ç 为空ã"); return; } String tag = packet.getDeviceId(); // é忍é Session session; for (String key : sessionPool.keySet()) { if (key.indexOf(tag) != -1) { session = sessionPool.get(key); session.getAsyncRemote().sendText( JSONObject.toJSONString(packet)); } } } } src/main/java/com/fzzy/gateway/sc2023/websocket/WebSocketDeviceLed.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,107 @@ package com.fzzy.gateway.sc2023.websocket; import com.alibaba.fastjson.JSONObject; import com.fzzy.gateway.sc2023.data.WebSocketPacket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * */ @Slf4j @Component @ServerEndpoint(value = "/device-message-sender/${productId}/${deviceId}") public class WebSocketDeviceLed { private static Map<String, Session> sessionPool = new ConcurrentHashMap<>(); private static Map<String, String> sessionIds = new ConcurrentHashMap<>(); // ä¸æä¸ªå®¢æ·ç«¯çè¿æ¥ä¼è¯ï¼éè¦éè¿å®æ¥ç»å®¢æ·ç«¯åéæ°æ® private Session session; @OnOpen public void onOpen(Session session, @PathParam("productId") String productId, @PathParam("deviceId") String deviceId, @PathParam("clientId") String clientId ) throws Exception { this.session = session; String key = productId + "-" + deviceId; sessionPool.put(key, session); sessionIds.put(session.getId(), key); log.info("new webSocket,clientId={}", key); } @OnClose public void onClose() { String key = sessionIds.get(session.getId()); sessionPool.remove(key); sessionIds.remove(session.getId()); log.info("WebSocketè¿æ¥å ³é={}", key); } /** * æ¶å°å端åéçä¿¡æ¯ * * @param message * @param session */ @OnMessage public void onMessage(String message, Session session) { log.info("æ¥èªå端çä¿¡æ¯:\n" + message); } @OnError public void onError(Session session, Throwable error) { log.error("åçé误"); String key = sessionIds.get(session.getId()); sessionPool.remove(key); sessionIds.remove(session.getId()); error.printStackTrace(); } /** * @param packet */ public static void sendByPacket(WebSocketPacket packet) { if (StringUtils.isEmpty(packet.getDeviceId())) { log.error("WebSocketä¿¡æ¯æ¨é失败ï¼è®¾å¤ç¼ç 为空ã"); return; } String tag = packet.getDeviceId(); // é忍é Session session; for (String key : sessionPool.keySet()) { if (key.indexOf(tag) != -1) { session = sessionPool.get(key); session.getAsyncRemote().sendText( JSONObject.toJSONString(packet)); } } } }