Merge remote-tracking branch 'origin/xm-20221107' into xm-20221107
| | |
| | | </root> |
| | | </springProfile> |
| | | |
| | | <springProfile name="xm"> |
| | | <root level="info" > |
| | | <appender-ref ref="STDOUT"/> |
| | | </root> |
| | | </springProfile> |
| | | <!-- ç产ç¯å¢. æ¥å¿çº§å«ä¸ºWARNä¸åæ¥å¿æä»¶--> |
| | | <springProfile name="prod,docker"> |
| | | <root level="warn"> |
| | |
| | | <version>5.6.0</version> |
| | | </dependency> |
| | | |
| | | <!--æ¬å°mqttä¾èµ--> |
| | | <dependency> |
| | | <groupId>org.eclipse.paho</groupId> |
| | | <artifactId>org.eclipse.paho.client.mqttv3</artifactId> |
| | | <version>1.2.5</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.openjdk.jol</groupId> |
| | | <artifactId>jol-core</artifactId> |
| | | <version>0.16</version> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | | |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.localMQTT.callback; |
| | | |
| | | import com.sandu.ximon.admin.localMQTT.client.MqttClientManager; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; |
| | | import org.eclipse.paho.client.mqttv3.MqttCallback; |
| | | import org.eclipse.paho.client.mqttv3.MqttConnectOptions; |
| | | import org.eclipse.paho.client.mqttv3.MqttMessage; |
| | | |
| | | /** |
| | | * @author van |
| | | * @version 1.0 |
| | | * msgï¼MQTTåè°æ½è±¡ç±» |
| | | * @date 2022/11/9 16:23 |
| | | */ |
| | | @Slf4j |
| | | public abstract class AbsMqttCallBack implements MqttCallback { |
| | | private String clientId; |
| | | private MqttConnectOptions connectOptions; |
| | | |
| | | public String getClientId() { |
| | | return clientId; |
| | | } |
| | | |
| | | public void setClientId(String clientId) { |
| | | this.clientId = clientId; |
| | | } |
| | | |
| | | public MqttConnectOptions getConnectOptions() { |
| | | return connectOptions; |
| | | } |
| | | |
| | | public void setConnectOptions(MqttConnectOptions connectOptions) { |
| | | this.connectOptions = connectOptions; |
| | | } |
| | | |
| | | /** |
| | | * 失å»è¿æ¥æä½,è¿è¡éè¿ |
| | | * |
| | | * @param throwable å¼å¸¸ |
| | | */ |
| | | @Override |
| | | public void connectionLost(Throwable throwable) { |
| | | try { |
| | | if (null != clientId) { |
| | | if (null != connectOptions) { |
| | | MqttClientManager.getInstance().getMqttClientById(clientId).connect(connectOptions); |
| | | } else { |
| | | MqttClientManager.getInstance().getMqttClientById(clientId).connect(); |
| | | } |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | log.error("{} reconnect failed!", e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ¥æ¶è®¢é
æ¶æ¯ |
| | | * |
| | | * @param topic ä¸»é¢ |
| | | * @param mqttMessage æ¥æ¶æ¶æ¯ |
| | | */ |
| | | @Override |
| | | public void messageArrived(String topic, MqttMessage mqttMessage) { |
| | | String content = new String(mqttMessage.getPayload()); |
| | | log.info("Receive topic[{}],message={}", topic, content); |
| | | handleReceiveMessage(topic, content); |
| | | } |
| | | |
| | | /** |
| | | * æ¶æ¯åéæå |
| | | * |
| | | * @param iMqttDeliveryToken toke |
| | | */ |
| | | @Override |
| | | public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { |
| | | log.info("æ¶æ¯åéæå"); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * å¤çæ¥æ¶çæ¶æ¯ |
| | | * |
| | | * @param topic ä¸»é¢ |
| | | * @param message æ¶æ¯å
容 |
| | | */ |
| | | protected abstract void handleReceiveMessage(String topic, String message); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.localMQTT.callback; |
| | | |
| | | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.Map; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | | /** |
| | | * @author van |
| | | * @version 1.0 |
| | | * msgï¼MQTT订é
åè°ç¯å¢ç±» |
| | | * @date 2022/11/9 16:25 |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class MqttCallBackContext { |
| | | private final Map<String, AbsMqttCallBack> callBackMap = new ConcurrentHashMap<>(); |
| | | |
| | | /** |
| | | * é»è®¤æé 彿° |
| | | * |
| | | * @param callBackMap åè°éå |
| | | */ |
| | | public MqttCallBackContext(Map<String, AbsMqttCallBack> callBackMap) { |
| | | this.callBackMap.clear(); |
| | | callBackMap.forEach((k, v) -> this.callBackMap.put(k, v)); |
| | | } |
| | | |
| | | /** |
| | | * è·åMQTTåè°ç±» |
| | | * |
| | | * @param clientId 客æ·ç«¯ID |
| | | * @return MQTTåè°ç±» |
| | | */ |
| | | public AbsMqttCallBack getCallBack(String clientId) { |
| | | return this.callBackMap.get(clientId); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.localMQTT.callback; |
| | | |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.sandu.ximon.admin.localMQTT.model.LocalMqttMsg; |
| | | import com.sandu.ximon.admin.localMQTT.util.HexFrameUtils; |
| | | import com.sandu.ximon.admin.manager.iot.amqp.AmqpMessageListener; |
| | | import com.sandu.ximon.admin.manager.iot.amqp.processor.AirDataProcessor; |
| | | import com.sandu.ximon.admin.manager.iot.amqp.processor.LightDataProcessor; |
| | | import com.sandu.ximon.admin.manager.iot.amqp.processor.PoleMonitorDataProcessor; |
| | | import com.sandu.ximon.admin.manager.iot.amqp.processor.c3ChargingProcessor; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonReportMessage; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.FrameUtils; |
| | | import com.sandu.ximon.admin.utils.RedisUtils; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.jms.Message; |
| | | import java.util.Map; |
| | | import java.util.concurrent.*; |
| | | import java.util.concurrent.atomic.AtomicInteger; |
| | | |
| | | import static com.sandu.ximon.admin.localMQTT.util.MqttClientUtil.MQTT_RETURN_FRAME_MAP; |
| | | |
| | | /** |
| | | * @author van |
| | | * @version 1.0 |
| | | * msgï¼é»è®¤åè° |
| | | * @date 2022/11/9 16:24 |
| | | */ |
| | | @Slf4j |
| | | @Component("java_server_msg") |
| | | public class MsgMqttCallBack extends AbsMqttCallBack { |
| | | |
| | | private static final String localMqttConnectTypeOfSync = "1"; |
| | | |
| | | private static final String localMqttConnectTypeOfAsync = "2"; |
| | | |
| | | public static final String localMqttSyncFrame = "local_mqtt_sync_frame:"; |
| | | |
| | | |
| | | protected final static ExecutorService EXECUTOR_SERVICE = new ThreadPoolExecutor( |
| | | Runtime.getRuntime().availableProcessors(), |
| | | Runtime.getRuntime().availableProcessors() * 2, 60, TimeUnit.SECONDS, |
| | | new LinkedBlockingQueue<>(50000), new MsgMqttCallBack.NameTreadFactory()); |
| | | |
| | | static class NameTreadFactory implements ThreadFactory { |
| | | |
| | | private final AtomicInteger mThreadNum = new AtomicInteger(1); |
| | | |
| | | @Override |
| | | public Thread newThread(Runnable r) { |
| | | return new Thread(r, "local-MQTT-msg-thread-" + mThreadNum.getAndIncrement()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | protected void handleReceiveMessage(String topic, String message) { |
| | | EXECUTOR_SERVICE.submit(() -> processMessage(topic,message)); |
| | | |
| | | log.info("æ¥æ¶å°æ¶æ¯---MsgMqttCallBack:topic={},message={}", topic, message); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * å¨è¿éå¤çæ¨æ¶å°æ¶æ¯åçå
·ä½ä¸å¡é»è¾ã |
| | | */ |
| | | private void processMessage(String topic,String messageString) { |
| | | try { |
| | | |
| | | String mac = topic.split("/")[3]; |
| | | LocalMqttMsg localMqttMsg = JSON.parseObject(messageString, LocalMqttMsg.class); |
| | | |
| | | if (localMqttMsg.getConnectType().equals(localMqttConnectTypeOfAsync)){ |
| | | // è®¾å¤æ°æ®ä¸æ¥ |
| | | processTask(null,mac, localMqttMsg); |
| | | } |
| | | else if (localMqttMsg.getConnectType().equals(localMqttConnectTypeOfSync)){ |
| | | System.out.println(localMqttMsg.getPayload()); |
| | | MQTT_RETURN_FRAME_MAP.put(mac,localMqttMsg.getPayload()); |
| | | } |
| | | |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å¤çä»»å¡ |
| | | * |
| | | * @param productKey 产åç |
| | | * @param deviceName 产ååç§° |
| | | * @param localMqttMsg 䏿¥æ¶æ¯localMqttMsg |
| | | */ |
| | | private void processTask(String productKey, String deviceName, LocalMqttMsg localMqttMsg) { |
| | | if (localMqttMsg == null) { |
| | | return; |
| | | } |
| | | log.info("å¤ç订é
"); |
| | | log.info(localMqttMsg.toString()); |
| | | CommonFrame frame = HexFrameUtils.transformMessageToFrame(localMqttMsg.getPayload()); |
| | | if (frame.getOrderType().equals(A5OrderEnum.RESPONSE_LIGHT_DATA.getCode())) { |
| | | // åç¯æ°æ®ä¸æ¥å¤ç |
| | | LightDataProcessor.getInstance().process(productKey, deviceName, frame); |
| | | } else if (frame.getOrderType().equals(A5OrderEnum.RESPONSE_C3_DATA.getCode())) { |
| | | // C3å
çµæ¡©ä¸æ¥å¤ç |
| | | c3ChargingProcessor.c3ChargingProcessorgetInstance().process(productKey, deviceName, frame); |
| | | } else if (frame.getOrderType().equals(A5OrderEnum.RESPONSE_ATMOSPHERE_DATA.getCode())) { |
| | | // å¤§æ°æ°æ®æä»¤ä¸æ¥ |
| | | AirDataProcessor.getInstance().process(productKey, deviceName, frame); |
| | | } else if (frame.getOrderType().equals(A5OrderEnum.RESPONSE_POLE_MONITOR_DATA.getCode())) { |
| | | PoleMonitorDataProcessor.getInstance().process(productKey, deviceName, frame); |
| | | } |
| | | } |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.localMQTT.callback; |
| | | |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.sandu.ximon.admin.localMQTT.model.LocalMqttMsg; |
| | | import com.sandu.ximon.admin.localMQTT.util.HexFrameUtils; |
| | | import com.sandu.ximon.admin.manager.iot.amqp.processor.AirDataProcessor; |
| | | import com.sandu.ximon.admin.manager.iot.amqp.processor.LightDataProcessor; |
| | | import com.sandu.ximon.admin.manager.iot.amqp.processor.PoleMonitorDataProcessor; |
| | | import com.sandu.ximon.admin.manager.iot.amqp.processor.c3ChargingProcessor; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.eclipse.paho.client.mqttv3.MqttClient; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.Map; |
| | | import java.util.concurrent.*; |
| | | import java.util.concurrent.atomic.AtomicInteger; |
| | | |
| | | import static com.sandu.ximon.admin.localMQTT.util.MqttClientUtil.MQTT_RETURN_FRAME_MAP; |
| | | |
| | | /** |
| | | * @author van |
| | | * @version 1.0 |
| | | * msgï¼é»è®¤åè° |
| | | * @date 2022/11/9 16:24 |
| | | */ |
| | | @Slf4j |
| | | @Component("java_server_status") |
| | | public class StatusMqttCallBack extends AbsMqttCallBack { |
| | | |
| | | private static final String localMqttConnectStatusConnected = "connected"; |
| | | |
| | | private static final String localMqttConnectStatusDisconnected = "disconnected"; |
| | | |
| | | public static final Map<String, Integer> localMqttConnectStatusMap = new ConcurrentHashMap<>(); |
| | | |
| | | |
| | | protected final static ExecutorService EXECUTOR_SERVICE = new ThreadPoolExecutor( |
| | | Runtime.getRuntime().availableProcessors(), |
| | | Runtime.getRuntime().availableProcessors() * 2, 60, TimeUnit.SECONDS, |
| | | new LinkedBlockingQueue<>(50000), new StatusMqttCallBack.NameTreadFactory()); |
| | | |
| | | static class NameTreadFactory implements ThreadFactory { |
| | | |
| | | private final AtomicInteger mThreadNum = new AtomicInteger(1); |
| | | |
| | | @Override |
| | | public Thread newThread(Runnable r) { |
| | | return new Thread(r, "local-MQTT-msg-thread-" + mThreadNum.getAndIncrement()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | protected void handleReceiveMessage(String topic, String message) { |
| | | EXECUTOR_SERVICE.submit(() -> processMessage(topic,message)); |
| | | |
| | | log.info("æ¥æ¶å°æ¶æ¯---StatusMqttCallBack:topic={},message={}", topic, message); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * å¨è¿éå¤çæ¨æ¶å°æ¶æ¯åçå
·ä½ä¸å¡é»è¾ã |
| | | */ |
| | | private void processMessage(String topic,String messageString) { |
| | | try { |
| | | |
| | | String mac = topic.split("/")[4]; |
| | | String status = topic.split("/")[5]; |
| | | |
| | | System.out.println("----------------------"); |
| | | System.out.println(mac); |
| | | System.out.println(status); |
| | | if (status.equals(localMqttConnectStatusConnected)){ |
| | | // è®¾å¤æ°æ®ä¸æ¥ |
| | | localMqttConnectStatusMap.put(mac,1); |
| | | } |
| | | else if (status.equals(localMqttConnectStatusDisconnected)){ |
| | | localMqttConnectStatusMap.put(mac,0); |
| | | } |
| | | |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.localMQTT.client; |
| | | |
| | | |
| | | import com.sandu.ximon.admin.localMQTT.config.MqttConfig; |
| | | import com.sandu.ximon.admin.localMQTT.model.MqttClientVO; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.eclipse.paho.client.mqttv3.MqttClient; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.PostConstruct; |
| | | import javax.annotation.Resource; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | | /** |
| | | * @author van |
| | | * @version 1.0 |
| | | * msgï¼MQTT客æ·ç«¯å建 |
| | | * @date 2022/11/9 16:31 |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class MqttClientCreate { |
| | | @Autowired |
| | | private MqttConfig mqttConfig; |
| | | |
| | | @Resource |
| | | private MqttClientManager mqttClientManager; |
| | | |
| | | /** |
| | | * åå¨MQTT客æ·ç«¯ |
| | | */ |
| | | public static final Map<String, MqttClient> MQTT_CLIENT_MAP = new ConcurrentHashMap<>(); |
| | | |
| | | /** |
| | | * å建MQTT客æ·ç«¯ |
| | | */ |
| | | @PostConstruct |
| | | public void createMqttClient() { |
| | | System.out.println("createMqttClient"); |
| | | List<MqttClientVO> mqttClientList = mqttConfig.getClientList(); |
| | | |
| | | for (MqttClientVO mqttClient : mqttClientList) { |
| | | //å建客æ·ç«¯ï¼å®¢æ·ç«¯IDï¼demoï¼åè°ç±»è·å®¢æ·ç«¯IDä¸è´ |
| | | System.out.println(mqttClient.getClientId()); |
| | | mqttClientManager.createMqttClient(mqttClient.getClientId(), mqttClient.getSubscribeTopic(), mqttClient.getUserName(), mqttClient.getPassword()); |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.localMQTT.client; |
| | | |
| | | import com.sandu.ximon.admin.localMQTT.callback.AbsMqttCallBack; |
| | | import com.sandu.ximon.admin.localMQTT.callback.MqttCallBackContext; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.eclipse.paho.client.mqttv3.MqttClient; |
| | | import org.eclipse.paho.client.mqttv3.MqttConnectOptions; |
| | | import org.eclipse.paho.client.mqttv3.MqttException; |
| | | import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | |
| | | import static com.sandu.ximon.admin.localMQTT.client.MqttClientCreate.MQTT_CLIENT_MAP; |
| | | |
| | | /** |
| | | * @author van |
| | | * @version 1.0 |
| | | * msgï¼MQTT客æ·ç«¯ç®¡çç±»,妿客æ·ç«¯é常å¤åç»å¯å
¥redisç¼å |
| | | * @date 2022/11/9 16:30 |
| | | */ |
| | | |
| | | @Slf4j |
| | | @Component |
| | | public class MqttClientManager { |
| | | @Value("${customer.mqtt.broker}") |
| | | private String mqttBroker; |
| | | @Resource |
| | | private MqttCallBackContext mqttCallBackContext; |
| | | |
| | | |
| | | public MqttClient getMqttClientById(String clientId) { |
| | | return MQTT_CLIENT_MAP.get(clientId); |
| | | } |
| | | |
| | | private static MqttClientManager mqttClientManager = new MqttClientManager(); |
| | | public static MqttClientManager getInstance() { |
| | | return mqttClientManager; |
| | | } |
| | | /** |
| | | * å建mqtt客æ·ç«¯ |
| | | * |
| | | * @param clientId 客æ·ç«¯ID |
| | | * @param subscribeTopic 订é
主é¢ï¼å¯ä¸ºç©º |
| | | * @param userName ç¨æ·åï¼å¯ä¸ºç©º |
| | | * @param password å¯ç ï¼å¯ä¸ºç©º |
| | | * @return mqtt客æ·ç«¯ |
| | | */ |
| | | public void createMqttClient(String clientId, String subscribeTopic, String userName, String password) { |
| | | MemoryPersistence persistence = new MemoryPersistence(); |
| | | |
| | | try { |
| | | MqttClient client = new MqttClient(mqttBroker, clientId, persistence); |
| | | MqttConnectOptions connOpts = new MqttConnectOptions(); |
| | | if (null != userName && !"".equals(userName)) { |
| | | connOpts.setUserName(userName); |
| | | } |
| | | |
| | | if (null != password && !"".equals(password)) { |
| | | connOpts.setPassword(password.toCharArray()); |
| | | } |
| | | |
| | | connOpts.setCleanSession(true); |
| | | connOpts.setKeepAliveInterval(10); |
| | | |
| | | if (null != subscribeTopic && !"".equals(subscribeTopic)) { |
| | | AbsMqttCallBack callBack = mqttCallBackContext.getCallBack(clientId); |
| | | |
| | | if (null == callBack) { |
| | | callBack = mqttCallBackContext.getCallBack("default"); |
| | | } |
| | | |
| | | callBack.setClientId(clientId); |
| | | callBack.setConnectOptions(connOpts); |
| | | client.setCallback(callBack); |
| | | } |
| | | |
| | | //è¿æ¥mqttæå¡ç«¯broker |
| | | client.connect(connOpts); |
| | | |
| | | if (null != subscribeTopic && !"".equals(subscribeTopic)) { |
| | | client.subscribe(subscribeTopic); |
| | | } |
| | | |
| | | MQTT_CLIENT_MAP.putIfAbsent(clientId, client); |
| | | |
| | | |
| | | |
| | | } catch (MqttException e) { |
| | | log.error("Create mqttClient failed!", e); |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.localMQTT.config; |
| | | |
| | | import com.sandu.ximon.admin.localMQTT.model.MqttClientVO; |
| | | import lombok.Data; |
| | | import org.springframework.boot.context.properties.ConfigurationProperties; |
| | | import org.springframework.context.annotation.Configuration; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author van |
| | | * @version 1.0 |
| | | * msgï¼Mqtté
置类 |
| | | * @date 2022/11/9 16:21 |
| | | */ |
| | | @Data |
| | | @Configuration |
| | | @ConfigurationProperties(prefix = "customer.mqtt") |
| | | public class MqttConfig { |
| | | /** |
| | | * mqtt brokerå°å |
| | | */ |
| | | String broker; |
| | | /** |
| | | * éè¦å建çMQTT客æ·ç«¯ |
| | | */ |
| | | List<MqttClientVO> clientList; |
| | | |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.localMQTT.controller; |
| | | |
| | | import com.sandu.ximon.admin.localMQTT.util.MqttClientUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import static com.sandu.ximon.admin.localMQTT.callback.StatusMqttCallBack.localMqttConnectStatusMap; |
| | | import static java.lang.Thread.sleep; |
| | | |
| | | /** |
| | | * @author van |
| | | * @version 1.0 |
| | | * msgï¼ |
| | | * @date 2022/11/11 14:18 |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/localMQTT") |
| | | @Slf4j |
| | | public class localMQTTTestController { |
| | | |
| | | |
| | | @RequestMapping("/test") |
| | | public String localMQTT() throws InterruptedException { |
| | | |
| | | for (int i = 0; i < 100; i++) { |
| | | |
| | | /* |
| | | * å¼ç¯100 |
| | | * FEA501000BFE010003FFFF0045971477B6D8C2CA |
| | | * 10 |
| | | * FEA501000BFE010003FFFF0AA542FD69D4E6194E |
| | | * å
³ç¯ |
| | | * FEA501000BFE0100030001007130ECA9150640E6 |
| | | * æ¥è¯¢å¿è·³æ¶é´ |
| | | * FEA501000AFE110002FFFF26008FBE3DAC7C0D |
| | | * 设置å¿è·³30ç§ |
| | | * FEA501000CFE210004FFFF001E9BB444E9C75BDB49 |
| | | * 5åé |
| | | * FEA501000CFE210004FFFF012C4A7824285825CB53 |
| | | * */ |
| | | // å¼10 |
| | | String result1 = MqttClientUtil.sendMqttMsg("363832544e5008ff3a32ffff", |
| | | "FEA501000BFE010003FFFF0AA542FD69D4E6194E"); |
| | | log.info("å¼ç¯è¿åç»æ:"+result1); |
| | | sleep(3000); |
| | | // å
³ |
| | | String result2 = MqttClientUtil.sendMqttMsg("363832544e5008ff3a32ffff", |
| | | "FEA501000BFE0100030001007130ECA9150640E6"); |
| | | log.info("å
³ç¯è¿åç»æ:"+result2); |
| | | sleep(3000); |
| | | //// å¿è·³æ¥è¯¢ |
| | | // String result3 = MqttClientUtil.sendMqttMsg("363832544e5008ff3a32ffff", |
| | | // "FEA501000AFE110002FFFF26008FBE3DAC7C0D"); |
| | | // log.info("å¿è·³æ¥è¯¢è¿åç»æ:"+result3); |
| | | // sleep(3000); |
| | | // String result4 = MqttClientUtil.sendMqttMsg("363832544e5008ff3a32ffff", |
| | | // "FEA501001AFE230012FE23000A00017F1019647F111E005428F600EC64EC194EA28A7C"); |
| | | // log.info("宿¶ä»»å¡è¿åç»æ:"+result4); |
| | | // sleep(3000); |
| | | |
| | | // System.out.println("龿¥ç¶æï¼---"+i+"---:"); |
| | | // System.out.println(localMqttConnectStatusMap.get("363832544e5008ff3a32ffff")); |
| | | // sleep(10000); |
| | | |
| | | } |
| | | |
| | | |
| | | return "OK"; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.localMQTT.model; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author van |
| | | * @version 1.0 |
| | | * msgï¼æ¬å°mqttæ¶æ¯ç»æ |
| | | * @date 2022/11/9 13:55 |
| | | */ |
| | | @Data |
| | | public class LocalMqttMsg { |
| | | private String timestamp; |
| | | private String connectType; |
| | | private String msgType; |
| | | private String payload; |
| | | |
| | | public LocalMqttMsg(String timestamp, String connectType, String msgType, String payload) { |
| | | this.timestamp = timestamp; |
| | | this.connectType = connectType; |
| | | this.msgType = msgType; |
| | | this.payload = payload; |
| | | } |
| | | |
| | | public LocalMqttMsg() { |
| | | this.timestamp = String.valueOf(System.currentTimeMillis()); |
| | | this.connectType = "1"; |
| | | this.msgType = "1"; |
| | | this.payload = ""; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.localMQTT.model; |
| | | |
| | | import lombok.Data; |
| | | /** |
| | | * @author van |
| | | * @version 1.0 |
| | | * msgï¼ MQTT客æ·ç«¯ |
| | | * @date 2022/11/9 16:20 |
| | | */ |
| | | @Data |
| | | public class MqttClientVO { |
| | | /** |
| | | * 客æ·ç«¯ID |
| | | */ |
| | | private String clientId; |
| | | /** |
| | | * çå¬ä¸»é¢ |
| | | */ |
| | | private String subscribeTopic; |
| | | /** |
| | | * ç¨æ·å |
| | | */ |
| | | private String userName; |
| | | /** |
| | | * å¯ç |
| | | */ |
| | | private String password; |
| | | /** |
| | | * æ¨éä¸»é¢ |
| | | * */ |
| | | private String publishTopic; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.localMQTT.util; |
| | | |
| | | import cn.hutool.core.codec.Base64; |
| | | import cn.hutool.core.util.HexUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | |
| | | /** |
| | | * @author chenjiantian |
| | | * @date 2021/12/3 17:36 |
| | | */ |
| | | public class HexFrameUtils { |
| | | |
| | | /** |
| | | * æ¬å°MQTT æ¶æ¯ä¸éè¦base64转åï¼ç´æ¥ä½¿ç¨hexéä¿¡ |
| | | * æä¸æ¥çå
容 转åæå¸§å®ä½ç±» |
| | | * @param hex 䏿¥å
容 {{@link com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonReportMessage.Params}} |
| | | * @return 帧å®ä½ç±» |
| | | */ |
| | | public static CommonFrame transformMessageToFrame(String hex) { |
| | | if (hex == null || hex.length() < 18) { |
| | | return null; |
| | | } |
| | | // å°åå
è¿å¶æ°è½¬ä¸ºå¤§å |
| | | hex = hex.toUpperCase(); |
| | | CommonFrame frame = new CommonFrame(); |
| | | // MQTTéä¿¡æ¹å¼(1) |
| | | frame.setConnectType(hex.substring(0, 2)); |
| | | // åè½ç (1) |
| | | frame.setFunctionCode(hex.substring(2, 4)); |
| | | // å½ä»¤ç±»å(1) |
| | | frame.setOrderType(hex.substring(4, 6)); |
| | | // è´è·é¿åº¦(2) |
| | | frame.setPayloadLength(hex.substring(6, 10)); |
| | | // ååºpayload |
| | | frame.setPayload(hex.substring(10, hex.length() - 8)); |
| | | // æ ¡éªç (4) |
| | | frame.setCrc32(hex.substring(hex.length() - 8)); |
| | | // å¤ææ ¡éªæ¯å¦éè¿ |
| | | String content = hex.substring(2, hex.length() - 8); |
| | | frame.setValidate(CRC32Utils.validateFrame(content, frame.getCrc32())); |
| | | |
| | | return frame; |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | System.out.println(HexUtil.hexToInt("FF")); |
| | | System.out.println(transformMessageToFrame("/qWEACrwAQAi//8BAQEYAB4CAAAAAAAAAApcAAAAEAAVAAAAAwAQAagAAMPfU3KbHyny").toString()); |
| | | } |
| | | |
| | | /** |
| | | * å°è®¾å¤ä¸æ¥çå
容解ç |
| | | * |
| | | * @param value 设å¤ä¸æ¥çå
容 |
| | | * @return è§£ç åçå
容ï¼16è¿å¶ |
| | | */ |
| | | public static String decodeReportMessage(String value) { |
| | | if (StrUtil.isBlank(value)) { |
| | | return null; |
| | | } |
| | | byte[] decode = Base64.decode(value.getBytes()); |
| | | return HexUtil.encodeHexStr(decode); |
| | | } |
| | | |
| | | /** |
| | | * å°åå¤åéçå
容ç¼ç |
| | | * @param value å¾
ç¼ç å
容 |
| | | * @return ç¼ç åçå
容 å符串 |
| | | */ |
| | | public static String encodeReportMessage(String value) { |
| | | if (StrUtil.isBlank(value)) { |
| | | return null; |
| | | } |
| | | byte[] bytes = HexUtil.decodeHex(value); |
| | | String encode = Base64.encode(bytes); |
| | | return encode; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.localMQTT.util; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.sandu.ximon.admin.localMQTT.client.MqttClientManager; |
| | | import com.sandu.ximon.admin.localMQTT.model.LocalMqttMsg; |
| | | import com.sandu.ximon.admin.utils.StringUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.eclipse.paho.client.mqttv3.MqttClient; |
| | | import org.eclipse.paho.client.mqttv3.MqttException; |
| | | import org.eclipse.paho.client.mqttv3.MqttMessage; |
| | | |
| | | import java.util.Map; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | | import static java.lang.Thread.sleep; |
| | | |
| | | /** |
| | | * @author van |
| | | * @version 1.0 |
| | | * msgï¼MQTT客æ·ç«¯å·¥å
·ç±» |
| | | * @date 2022/11/9 16:32 |
| | | */ |
| | | @Slf4j |
| | | public class MqttClientUtil { |
| | | |
| | | private static MqttClientUtil mqttClientUtil = new MqttClientUtil(); |
| | | |
| | | public static MqttClientUtil getInstance() { |
| | | return mqttClientUtil; |
| | | } |
| | | |
| | | public static String publishPrefix = "v1/devices/request/"; |
| | | |
| | | |
| | | public static String clientId = "java_server_msg"; |
| | | |
| | | public static final Map<String, String> MQTT_RETURN_FRAME_MAP = new ConcurrentHashMap<>(); |
| | | |
| | | public static String sendMqttMsg(String topic, String content) { |
| | | try { |
| | | LocalMqttMsg localMqttMsg = new LocalMqttMsg(); |
| | | localMqttMsg.setPayload(content); |
| | | |
| | | MqttMessage message = new MqttMessage(JSON.toJSONString(localMqttMsg).getBytes()); |
| | | |
| | | message.setQos(0); |
| | | MqttClient mqttClient = MqttClientManager.getInstance().getMqttClientById(clientId); |
| | | |
| | | if (null == mqttClient) { |
| | | log.error("Not exist mqttClient where it's clientId is {}", clientId); |
| | | return topic; |
| | | } |
| | | |
| | | long start = System.currentTimeMillis(); |
| | | mqttClient.publish(publishPrefix+topic, message); |
| | | log.info("{}",publishPrefix+topic); |
| | | log.info("{}", message); |
| | | |
| | | /** |
| | | * å®ç°ä¼ªåæ¥ |
| | | * */ |
| | | try { |
| | | String returnFrame = null ; |
| | | returnFrame = MQTT_RETURN_FRAME_MAP.get(topic); |
| | | |
| | | for (int i = 0;i < 50;i++){ |
| | | if (StringUtil.strIsNullOrEmpty(returnFrame)){ |
| | | sleep(100); |
| | | returnFrame = MQTT_RETURN_FRAME_MAP.get(topic); |
| | | }else { |
| | | log.info("è¿åæ¶é´ï¼{} ms",System.currentTimeMillis() - start) ; |
| | | String remove = MQTT_RETURN_FRAME_MAP.remove(topic); |
| | | log.info("removeç»æï¼{} ",remove); |
| | | return returnFrame; |
| | | } |
| | | } |
| | | |
| | | |
| | | } catch (InterruptedException e) { |
| | | |
| | | } |
| | | |
| | | } catch (MqttException e) { |
| | | log.error("MqttClient send msg faild!", e); |
| | | return("éä¿¡è¶
æ¶"); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | log.info("å¿è·³ç¸åº"); |
| | | A5LightHeartbeatReportInnerFrame heartbeatReportInnerFrame = new A5LightHeartbeatReportInnerFrame().transformFrame(frame.getPayload()); |
| | | |
| | | if ("363832544e5008ff1741ffff".equals(deviceName)) { |
| | | System.out.println("å¿è·³å
: " + JSON.toJSONString(heartbeatReportInnerFrame)); |
| | | } |
| | | |
| | | if (heartbeatReportInnerFrame.isValidate()) { |
| | | SpringContextHolder.getBean(LightReportDataService.class).saveReportData(deviceName, heartbeatReportInnerFrame.getHeartBeatDataPackage()); |
| | | //å¿è·³å
䏿¥ä¸ä¿å硬件设å¤ä¿¡æ¯ |
| | | // SpringContextHolder.getBean(LightService.class).saveLight(deviceName, heartbeatReportInnerFrame.getHeartBeatDataPackage()); |
| | | SpringContextHolder.getBean(LightService.class).saveLight(deviceName, heartbeatReportInnerFrame.getHeartBeatDataPackage()); |
| | | } |
| | | |
| | | } else if (A5LightReportEnum.Time_Synchronized.getCode().equals(functionCode)) { |
| | |
| | | * @return è´è· |
| | | */ |
| | | String getPayload(); |
| | | |
| | | } |
| | |
| | | */ |
| | | public class A5LightTimerReqInnerFrame implements IRequestInnerFrame { |
| | | |
| | | private final String payload; |
| | | private final String functionCode = A5LightDataEnum.LightTimer.getCode(); |
| | | private final String payloadLength; |
| | | private String payload; |
| | | |
| | | /** |
| | | * @param framePayload å¤ä¸ªè·¯ç¯å®æ¶æä»¤ï¼ |
| | |
| | | } else { |
| | | destinationAddress = lightAddress; |
| | | } |
| | | payload = destinationAddress + framePayload; |
| | | this.payloadLength = SupplementUtils.suppleZero(Integer.toHexString((payload.length() / 2)).toUpperCase(), 4); |
| | | payload = destinationAddress + framePayload ; |
| | | // payload = getEncodeFrame(); |
| | | |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public String getEncodeFrame() { |
| | | String functionCode = A5LightDataEnum.LightTimer.getCode(); |
| | | String payloadLength = SupplementUtils.suppleZero(Integer.toHexString((payload.length() / 2)).toUpperCase(), 4); |
| | | String frame = functionCode + payloadLength + payload; |
| | | |
| | | return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase()); |
| | | } |
| | | |
| | |
| | | import com.aliyuncs.exceptions.ClientException; |
| | | import com.aliyuncs.iot.model.v20180120.*; |
| | | import com.sandu.common.execption.BusinessException; |
| | | import com.sandu.ximon.admin.dto.DeviceStatus; |
| | | import com.sandu.ximon.admin.localMQTT.util.MqttClientUtil; |
| | | import com.sandu.ximon.admin.manager.iot.frame.IRequestFrame; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.dto.InvokeParam; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.dto.WrapResponseCommonFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.DeviceStateEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.topic.IBaseTopic; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.topic.ICustomizeTopic; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.FrameUtils; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.BeanUtils; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Base64; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static com.sandu.ximon.admin.localMQTT.callback.StatusMqttCallBack.localMqttConnectStatusMap; |
| | | |
| | | /** |
| | | * @author chenjiantian |
| | |
| | | |
| | | @Override |
| | | public CommonFrame sendRRPC(String deviceName, InvokeParam invokeParam) { |
| | | InvokeThingServiceResponse.Data data = invokeThing(deviceName, invokeParam, false); |
| | | if (data == null) { |
| | | return null; |
| | | } |
| | | String result = data.getResult(); |
| | | result = result.replace("\\", ""); |
| | | Map map = JSON.parseObject(result, Map.class); |
| | | result = (String) map.get("msg"); |
| | | // InvokeThingServiceResponse.Data data = invokeThing(deviceName, invokeParam, false); |
| | | // if (data == null) { |
| | | // return null; |
| | | // } |
| | | // String result = data.getResult(); |
| | | // result = result.replace("\\", ""); |
| | | // Map map = JSON.parseObject(result, Map.class); |
| | | // result = (String) map.get("msg"); |
| | | String result = MqttClientUtil.sendMqttMsg(deviceName,invokeParam.getFrame()); |
| | | return FrameUtils.transformMessageToFrame(result); |
| | | } |
| | | |
| | | @Override |
| | | public CommonFrame sendRRPC(String deviceName, IRequestFrame iRequestFrame) { |
| | | InvokeParam param = new InvokeParam(); |
| | | param.setOperate("1001"); |
| | | param.setFrame(iRequestFrame.getEncodeFrame()); |
| | | InvokeThingServiceResponse.Data data = invokeThing(deviceName, param, false); |
| | | if (data == null) { |
| | | return null; |
| | | } |
| | | String result = data.getResult(); |
| | | result = result.replace("\\", ""); |
| | | Map map = JSON.parseObject(result, Map.class); |
| | | result = (String) map.get("msg"); |
| | | // InvokeParam param = new InvokeParam(); |
| | | // param.setOperate("1001"); |
| | | // param.setFrame(iRequestFrame.getEncodeFrame()); |
| | | // InvokeThingServiceResponse.Data data = invokeThing(deviceName, param, false); |
| | | // if (data == null) { |
| | | // return null; |
| | | // } |
| | | // String result = data.getResult(); |
| | | // result = result.replace("\\", ""); |
| | | // Map map = JSON.parseObject(result, Map.class); |
| | | // result = (String) map.get("msg"); |
| | | String frame = FrameUtils.transformMessageToFrame(iRequestFrame.getEncodeFrame()).toString(); |
| | | String result = MqttClientUtil.sendMqttMsg(deviceName,frame); |
| | | log.info("èªå®ä¹sendRRPC:请æ±å¸§ï¼{},\n,ååºå¸§:{}",iRequestFrame.toString(),result); |
| | | return FrameUtils.transformMessageToFrame(result); |
| | | } |
| | | |
| | | @Override |
| | | public CommonFrame sendRRPC(String deviceName, IRequestFrame iRequestFrame, boolean resendFlag) { |
| | | InvokeParam param = new InvokeParam(); |
| | | param.setOperate("1001"); |
| | | param.setFrame(iRequestFrame.getEncodeFrame()); |
| | | InvokeThingServiceResponse.Data data = invokeThing(deviceName, param, true); |
| | | if (data == null) { |
| | | return null; |
| | | } |
| | | String result = data.getResult(); |
| | | result = result.replace("\\", ""); |
| | | Map map = JSON.parseObject(result, Map.class); |
| | | result = (String) map.get("msg"); |
| | | // InvokeParam param = new InvokeParam(); |
| | | // param.setOperate("1001"); |
| | | // param.setFrame(iRequestFrame.getEncodeFrame()); |
| | | // InvokeThingServiceResponse.Data data = invokeThing(deviceName, param, true); |
| | | // if (data == null) { |
| | | // return null; |
| | | // } |
| | | // String result = data.getResult(); |
| | | // result = result.replace("\\", ""); |
| | | // Map map = JSON.parseObject(result, Map.class); |
| | | // result = (String) map.get("msg"); |
| | | String frame = FrameUtils.transformMessageToFrame(iRequestFrame.getEncodeFrame()).toString(); |
| | | String result = MqttClientUtil.sendMqttMsg(deviceName,frame); |
| | | return FrameUtils.transformMessageToFrame(result); |
| | | } |
| | | |
| | |
| | | |
| | | @Override |
| | | public List<BatchGetDeviceStateResponse.DeviceStatus> batchGetDeviceState(List<String> deviceNames) { |
| | | BatchGetDeviceStateRequest request = new BatchGetDeviceStateRequest(); |
| | | request.setDeviceNames(deviceNames); |
| | | request.setProductKey(getProductKey()); |
| | | BatchGetDeviceStateResponse response = invokeSync(request); |
| | | if (response != null && response.getSuccess()) { |
| | | return response.getDeviceStatusList(); |
| | | } |
| | | return null; |
| | | List<BatchGetDeviceStateResponse.DeviceStatus> statusList = new ArrayList<>(); |
| | | |
| | | deviceNames.forEach(l -> { |
| | | BatchGetDeviceStateResponse.DeviceStatus deviceStatus = new BatchGetDeviceStateResponse.DeviceStatus(); |
| | | deviceStatus.setDeviceName(l); |
| | | |
| | | if (localMqttConnectStatusMap.get(l)!=null && |
| | | localMqttConnectStatusMap.get(l)== 1){ |
| | | deviceStatus.setStatus("ONLINE"); |
| | | }else { |
| | | deviceStatus.setStatus("OFFLINE"); |
| | | } |
| | | statusList.add(deviceStatus); |
| | | }); |
| | | |
| | | |
| | | return statusList; |
| | | } |
| | | |
| | | /** |
| | |
| | | private final C3mOrderService c3mOrderService; |
| | | |
| | | //æ¯10åéè¿è¡ä¸æ¬¡ å é¤è¶
æ¶è®¢å |
| | | @Scheduled(cron = "0 0/10 * * * ? ") |
| | | // @Scheduled(cron = "0 0/10 * * * ? ") |
| | | public void deleteOvertimeOrders() { |
| | | c3mOrderService.deleteOrderListByCreateTime(); |
| | | log.error("å é¤è¶
æ¶è®¢å宿¶ä»»å¡æ§è¡æå"); |
| | |
| | | private WaterQualityEquipmentService waterQualityEquipmentService; |
| | | private WaterQualityDataService waterQualityDataService; |
| | | |
| | | @Scheduled(cron = "0 0 0/1 * * ?") |
| | | // @Scheduled(cron = "0 0 0/1 * * ?") |
| | | // @Scheduled(cron = "0 0/2 * * * ? ") |
| | | public void UserSubjectRefund() { |
| | | List<WaterQualityEquipmentBo> waterQualityEquipmentList = waterQualityEquipmentService.listWaterQualityEquipment(); |
| | |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static com.sandu.ximon.admin.localMQTT.callback.StatusMqttCallBack.localMqttConnectStatusMap; |
| | | |
| | | /** |
| | | * @author chenjiantian |
| | | * @date 2021/12/13 16:00 |
| | |
| | | |
| | | // è·åæè¿ç䏿¥æ¶é´ |
| | | List<String> deviceCodeList = listLight.stream().map(Light::getDeviceCode).collect(Collectors.toList()); |
| | | //æålist |
| | | |
| | | // //æålist |
| | | List<List<String>> split = CollectionUtil.split(deviceCodeList, 100); |
| | | |
| | | List<BatchGetDeviceStateResponse.DeviceStatus> deviceStatuses = null; |
| | |
| | | |
| | | List<Map<String, Object>> resultList = new ArrayList<>(); |
| | | for (LightControlParam param : paramList) { |
| | | A5LightBrightnessReqInnerFrame lightControlFrame = new A5LightBrightnessReqInnerFrame(param.getBrightness(), param.getLightAddress()); |
| | | A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_LIGHT_DATA.getCode(), lightControlFrame); |
| | | A5LightBrightnessReqInnerFrame |
| | | lightControlFrame = new A5LightBrightnessReqInnerFrame(param.getBrightness(), param.getLightAddress()); |
| | | A5Frame a5Frame = new A5Frame( |
| | | A5OrderEnum.REQUEST_LIGHT_DATA.getCode(), |
| | | lightControlFrame); |
| | | Map<String, Object> map = new HashMap<>(); |
| | | try { |
| | | map.put("deviceCode", param.getDeviceCode()); |
| | | WrapResponseCommonFrame<A5LightBrightnessRespInnerFrame> frame |
| | | = MainBoardInvokeSyncService.getInstance().sendRRPC(param.getDeviceCode(), a5Frame, A5LightBrightnessRespInnerFrame.class); |
| | | = MainBoardInvokeSyncService.getInstance().sendRRPC |
| | | (param.getDeviceCode(), a5Frame, A5LightBrightnessRespInnerFrame.class); |
| | | //å卿§å¶å¸§æä»¤ |
| | | StoreOperationRecordsUtils.storeInnerFrameData(param.getDeviceCode(), "åç¯å¸§-亮度æ§å¶", a5Frame, frame); |
| | | |
| | |
| | | public void timeSynchronizationInitiative(String deviceCode, String lightAddress) { |
| | | //åç¯ä¿¡æ¯ |
| | | Light light = getLight(deviceCode); |
| | | if (light == null) { |
| | | log.error("åç¯ä¸»å¨åæ¥æ¶é´è¯·æ±å¼å¸¸ï¼åç¯ä¿¡æ¯ä¸åå¨ï¼"); |
| | | return; |
| | | } |
| | | // if (light == null) { |
| | | // log.error("åç¯ä¸»å¨åæ¥æ¶é´è¯·æ±å¼å¸¸ï¼åç¯ä¿¡æ¯ä¸åå¨ï¼"); |
| | | // return; |
| | | // } |
| | | //åç¯ä»»å¡ä¿¡æ¯ |
| | | LightTaskPoleRelation lightTaskPoleRelation = SpringContextHolder.getBean(LightTaskPoleRelationService.class) |
| | | .getOne(Wrappers.lambdaQuery(LightTaskPoleRelation.class) |
| | |
| | | import com.sandu.common.util.SpringContextHolder; |
| | | import com.sandu.ximon.admin.dto.LightTaskDto; |
| | | import com.sandu.ximon.admin.dto.SingleLightOrderDto; |
| | | import com.sandu.ximon.admin.manager.iot.frame.A5Frame; |
| | | import com.sandu.ximon.admin.manager.iot.frame.FrameBuilder; |
| | | import com.sandu.ximon.admin.manager.iot.frame.IRequestFrame; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.request.A5LightTimerReqInnerFrame; |
| | |
| | | * @return è¿å帧 |
| | | */ |
| | | public A5LightTimerRespInnerFrame sendTimeRRpc(String framePayload, String deviceCode, String lightAddress) { |
| | | IRequestFrame requestFrame = FrameBuilder.builderA5().innerFrame(new A5LightTimerReqInnerFrame(framePayload, lightAddress)).orderType(A5OrderEnum.REQUEST_LIGHT_DATA.getCode()).build(); |
| | | // IRequestFrame requestFrame = FrameBuilder. |
| | | // builderA5(). |
| | | // innerFrame( |
| | | // new A5LightTimerReqInnerFrame |
| | | // (framePayload, lightAddress) |
| | | // ). |
| | | // orderType(A5OrderEnum.REQUEST_LIGHT_DATA.getCode()). |
| | | // build(); |
| | | |
| | | A5LightTimerReqInnerFrame |
| | | a5LightTimerReqInnerFrame = new A5LightTimerReqInnerFrame(framePayload, lightAddress); |
| | | System.out.println(JSON.toJSONString(a5LightTimerReqInnerFrame) + " --------a5LightTimerReqInnerFrame"); |
| | | |
| | | A5Frame requestFrame = new A5Frame(A5OrderEnum.REQUEST_LIGHT_DATA.getCode(), a5LightTimerReqInnerFrame); |
| | | System.out.println(requestFrame + " --------requestFrame"); |
| | | |
| | | WrapResponseCommonFrame<A5LightTimerRespInnerFrame> responseCommonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(deviceCode, requestFrame, A5LightTimerRespInnerFrame.class); |
| | | WrapResponseCommonFrame<A5LightTimerRespInnerFrame> responseCommonFrame |
| | | = MainBoardInvokeSyncService.getInstance().sendRRPC |
| | | (deviceCode, requestFrame, A5LightTimerRespInnerFrame.class); |
| | | System.out.println(responseCommonFrame + " -----------responseCommonFrame"); |
| | | StoreOperationRecordsUtils.storeInnerFrameData(deviceCode, "åç¯å¸§-æ§ç¯", requestFrame, responseCommonFrame); |
| | | return Optional.ofNullable(responseCommonFrame).map(WrapResponseCommonFrame::getResponseInnerFrame).orElse(null); |
| | |
| | | import java.util.concurrent.atomic.AtomicInteger; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static com.sandu.ximon.admin.localMQTT.callback.StatusMqttCallBack.localMqttConnectStatusMap; |
| | | |
| | | /** |
| | | * ç¯æç¸å
³ |
| | | * |
| | |
| | | * @return 设å¤ç¶æå表 |
| | | */ |
| | | public List<DeviceStatus> listStatusByDeviceCode(ArrayList<String> deviceCodeList) { |
| | | // æå¤§åªè½æ¥50个 |
| | | // æå¤§åªè½æ¥50个 |
| | | List<List<String>> split = CollectionUtil.split(deviceCodeList, 50); |
| | | List<DeviceStatus> statusList = new ArrayList<>(); |
| | | for (List<String> list : split) { |
| | |
| | | } |
| | | } |
| | | } |
| | | // List<DeviceStatus> statusList = new ArrayList<>(); |
| | | // |
| | | // deviceCodeList.forEach(l -> { |
| | | // DeviceStatus deviceStatus = new DeviceStatus(); |
| | | // deviceStatus.setDeviceCode(l); |
| | | // |
| | | // if (localMqttConnectStatusMap.get(l)!=null && |
| | | // localMqttConnectStatusMap.get(l)== 1){ |
| | | // deviceStatus.setStatus(1); |
| | | // }else { |
| | | // deviceStatus.setStatus(0); |
| | | // } |
| | | // statusList.add(deviceStatus); |
| | | // }); |
| | | |
| | | return statusList; |
| | | } |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | spring: |
| | | datasource: |
| | | # æ°æ®åºç¨æ·å |
| | | username: root |
| | | # æ°æ®åºå¯ç |
| | | password: zhxm2512209 |
| | | url: jdbc:mysql://39.103.154.108:2512/xm_dev?useUnicode=true&autoReconnect=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai |
| | | type: com.alibaba.druid.pool.DruidDataSource |
| | | druid: |
| | | connection-init-sqls: set names utf8mb4 |
| | | driver-class-name: com.mysql.cj.jdbc.Driver |
| | | redis: |
| | | host: 39.103.154.108 |
| | | password: zhxm2512209 |
| | | port: 6379 |
| | | database: 0 |
| | | server: |
| | | port: 20017 |
| | | sandu: |
| | | jwt: |
| | | header: Authorization |
| | | # 令çåç¼ |
| | | token-start-with: Bearer |
| | | # å¿
é¡»ä½¿ç¨æå°88ä½çBase64对该令çè¿è¡ç¼ç |
| | | base64-secret: U1GZNSKOH43V19GNIVE8HUYM9H86K657V1D66EAVSL9Q023J4JNWE44BNHCS6V9E66BPKF0KXUI5R1ZOYK2OWZZYALPD07JHOYUROL930UGJQUJDNAEYNTMUS27BHKTJEF9011DGGQ4QT9BN6CM2P9SY2VV2MZKJPCOW9YIGN0VJ |
| | | # 令çè¿ææ¶é´ æ¤å¤åä½/æ¯«ç§ ï¼å¯å¨æ¤ç½ç«çæ https://www.convertworld.com/zh-hans/time/milliseconds.html 1个æ |
| | | token-validity-in-seconds: 2629800000 |
| | | # å¨çº¿ç¨æ·key |
| | | online-key: online-token |
| | | # æ¯å¦å¯å¨redisç¼åç¨æ·ä¿¡æ¯ |
| | | cache-online: false |
| | | #************************æ¬å°ä¸ä¼ æä»¶é
ç½®************************ |
| | | upload: |
| | | #æä»¶æå¡å¨è·¯å¾ |
| | | upload-root-path: E:\file\novafile |
| | | storage: local |
| | | #æå¡å¨æä»¶åç¼ |
| | | real-url: http://localhost/ |
| | | common: |
| | | urlPrefix: http://localhost/ |
| | | quartz: |
| | | enable: true |
| | | |
| | | listenter: |
| | | isOpen: false |
| | | |
| | | minio: |
| | | endpoint: 47.106.172.9 |
| | | port: 9000 |
| | | accessKey: minioadmin |
| | | secretKey: zhxm2512209 |
| | | secure: false |
| | | |
| | | |
| | | # ledå±å¹æå¡å¨å°åï¼æ´æ¹éè¦åæ¶æ´æ¹ï¼ |
| | | realtime-server: |
| | | # command: http://101.132.131.91:8081/payload/ |
| | | # url: http://101.132.131.91:8081/ |
| | | command: http://112.74.63.130:20018/command/ |
| | | url: http://112.74.63.130:20018/ |
| | | |
| | | |
| | | server-conf: |
| | | ip: 127.0.0.1 # 47.106.172.9/101.132.131.91 |
| | | |
| | | |
| | | |
| | | nova-conf: #诺ç¦åè° |
| | | notify-url: http://39.103.154.108:20018/serv/vnnox/progress |
| | | screen-shot-notify-url: http://39.103.154.108:20018/serv/vnnox/screenshot |
| | | status-notify-url: http://39.103.154.108:20018/serv/vnnox/asyncStatus |
| | | |
| | | #iot产åç§é¥ |
| | | iot: |
| | | access_key: LTAI4G27Af8MZEF55phdMQ4y |
| | | access_secret: KUc2yOtr7TRB4FuF5Wr0dWeTblbEuh |
| | | |
| | | #é¿éäºossé
ç½® |
| | | oss-conf: |
| | | end-point: oss-cn-shanghai.aliyuncs.com |
| | | key-id: LTAI5tPdpt5wvJyLipRijFSP |
| | | key-secret: 1ahYfCKd0yTddsUnuDLQzI23MLh4VQ |
| | | bucket-name: ximonsmart |
| | | |
| | | #æ°è¯ºç¦ |
| | | new-nova: |
| | | #ä¾èµå°å |
| | | string-path: C:\Users\Administrator\Desktop\novaWin\bin\viplexcore.dll |
| | | |
| | | new-nova-file: |
| | | upload: |
| | | #æä»¶æå¡å¨è·¯å¾ |
| | | upload-root-path: E:\file\novafile |
| | | storage: local |
| | | #æå¡å¨æä»¶åç¼ |
| | | real-url: http://localhost/ |
| | | |
| | | customer: |
| | | mqtt: |
| | | broker: tcp://127.0.0.1:1883 |
| | | clientList: |
| | | #客æ·ç«¯ID |
| | | - clientId: java_server_msg |
| | | #çå¬ä¸»é¢ |
| | | subscribeTopic: v1/devices/response/+ |
| | | #ç¨æ·å |
| | | userName: server_admin |
| | | #å¯ç |
| | | password: zhxm2512209 |
| | | #ä¸åä¸»é¢ |
| | | publishTopic: v1/devices/request/ |
| | | #çå¬ä¸ä¸çº¿ |
| | | - clientId: java_server_status |
| | | #çå¬ä¸»é¢ |
| | | subscribeTopic: $SYS/brokers/+/clients/# |
| | | #ç¨æ·å |
| | | userName: server_admin |
| | | #å¯ç |
| | | password: zhxm2512209 |
| | | #ä¸åä¸»é¢ |
| | | publishTopic: v1/devices/request/ |
| | |
| | | spring: |
| | | profiles: |
| | | active: prod |
| | | active: xm |
| | | jackson: |
| | | date-format: yyyy-MM-dd HH:mm:ss |
| | | time-zone: GMT+8 |
| | |
| | | |
| | | #主æ¿rrpcéä¿¡PRODUCT_KEY |
| | | #rrpc: |
| | | # key: a1JsfPG4iKW |
| | | # key: a1JsfPG4iKW |
| | | |