2021与蓝度共同重构项目,服务端
chenjiantian
2021-12-08 f8555ffb6f16017b62c48d5b90e3716029eef6ff
通信协议完善
已修改9个文件
已添加4个文件
已重命名4个文件
已复制1个文件
348 ■■■■ 文件已修改
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/AmqpMessageListener.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/A2Frame.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/FrameBuilder.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A1TernaryCodeReqInnerFrame.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A5LightBrightnessReqInnerFrame.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A5LightHeartbeatReqInnerFrame.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A5LightResetReqInnerFrame.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A1DeviceMacRespInnerFrame.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A1TernaryCodeRespInnerFrame.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A5LightBrightnessRespInnerFrame.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A5LightHeartbeatRespInnerFrame.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/BaseInvokeSyncService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/dto/CommonReportMessage.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/dto/WrapResponseCommonFrame.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5LightDataEnum.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/mainboard/MainBoardInvokeSyncService.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/topic/ICustomizeTopic.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/test/java/com/sandu/ximon/admin/BaseTopicTests.java 111 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/AmqpMessageListener.java
@@ -52,8 +52,8 @@
            String topic = message.getStringProperty("topic");
            String messageId = message.getStringProperty("messageId");
            log.info("收到订阅" + topic + "," + messageId);
            log.info(content);
//            log.info("收到订阅" + topic + "," + messageId);
//            log.info(content);
            if (null != map.get("status")) {
                // ä¸Šä¸‹çº¿ä¸ŠæŠ¥å¤„理
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/A2Frame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.sandu.ximon.admin.manager.iot.frame;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.FunctionCodeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.SupplementUtils;
/**
 * @author chenjiantian
 * @date 2021/12/6 13:54
 * A1 åŠŸèƒ½å°è£…çš„å¸§
 */
public class A2Frame extends BaseRequestFrame implements IRequestFrame {
    private String orderType;
    private String payloadLength;
    private String payload;
    public A2Frame(String orderType, IRequestInnerFrame innerFrame) {
        this.orderType = orderType;
        this.payloadLength = SupplementUtils.suppleZero(Integer.toHexString((innerFrame.getEncodeFrame().length() / 2)).toUpperCase(), 4);
        this.payload = innerFrame.getEncodeFrame();
    }
    @Override
    public String getConnectType() {
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode();
    }
    @Override
    public String getFunctionCode() {
        return FunctionCodeEnum.MAIN_BOARD_CONTROL.getCode();
    }
    @Override
    public String getOrderType() {
        return orderType;
    }
    @Override
    public String getPayloadLength() {
        return payloadLength;
    }
    @Override
    public String getPayload() {
        return payload;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/FrameBuilder.java
@@ -23,6 +23,9 @@
    public static FrameBuilder builderA1() {
        return new FrameBuilder(FunctionCodeEnum.MAIN_BOARD_CONFIG.getCode());
    }
    public static FrameBuilder builderA2() {
        return new FrameBuilder(FunctionCodeEnum.MAIN_BOARD_CONTROL.getCode());
    }
    public static FrameBuilder builderA5() {
        return new FrameBuilder(FunctionCodeEnum.DATA_TRANSPORT_DATA.getCode());
@@ -44,7 +47,9 @@
        }
        if (FunctionCodeEnum.MAIN_BOARD_CONFIG.getCode().equals(functionCode)) {
            iRequestFrame = new A1Frame(orderType, innerFrame);
        } else if (FunctionCodeEnum.DATA_TRANSPORT_DATA.getCode().equals(functionCode)) {
        } else if (FunctionCodeEnum.MAIN_BOARD_CONTROL.getCode().equals(functionCode)) {
            iRequestFrame = new A2Frame(orderType, innerFrame);
        }  else if (FunctionCodeEnum.DATA_TRANSPORT_DATA.getCode().equals(functionCode)) {
            iRequestFrame = new A5Frame(orderType, innerFrame);
        } else {
            throw new RuntimeException("找不到符合条件的请求帧");
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A1TernaryCodeReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import cn.hutool.core.util.HexUtil;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
/**
 * @author chenjiantian
 * @date 2021/12/6 14:46
 * A1->0A/0B/0C
 * è®¾ç½®é˜¿é‡Œäº‘三元码 ProductKey DeviceName DeviceSecret
 */
public class A1TernaryCodeReqInnerFrame implements IRequestInnerFrame {
    private final String ternaryCodeHex;
    /**
     * @param ternaryCode ProductKey/DeviceName/DeviceSecret
     */
    public A1TernaryCodeReqInnerFrame(String ternaryCode) {
        ternaryCodeHex = HexUtil.encodeHexStr(ternaryCode);
    }
    @Override
    public String getEncodeFrame() {
        if (this.ternaryCodeHex.length() % 2 != 0) {
            return "0" + ternaryCodeHex;
        }
        return ternaryCodeHex;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A5LightBrightnessReqInnerFrame.java
ÎļþÃû´Ó ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/LightBrightnessReqInnerFrame.java ÐÞ¸Ä
@@ -14,14 +14,14 @@
 * 0x00:关灯
 * å…¶å®ƒï¼šå¼€ç¯&亮度值"
 */
public class LightBrightnessReqInnerFrame implements IRequestInnerFrame {
public class A5LightBrightnessReqInnerFrame implements IRequestInnerFrame {
    private final String payload;
    /**
     * @param lightLevel äº®åº¦ç­‰çº§ [0,100]
     */
    public LightBrightnessReqInnerFrame(Integer lightLevel) {
    public A5LightBrightnessReqInnerFrame(Integer lightLevel) {
        String destinationAddress = "FFFF";
        //  å°†æ•´åž‹äº®åº¦è½¬æ¢ä¸ºHex
        if (lightLevel < 0) {
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A5LightHeartbeatReqInnerFrame.java
ÎļþÃû´Ó ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/LightHeartbeatReqInnerFrame.java ÐÞ¸Ä
@@ -10,7 +10,7 @@
 * @date 2021/12/6 18:16
 * A5->01->02 è¯»å¿ƒè·³åŒ…
 */
public class LightHeartbeatReqInnerFrame implements IRequestInnerFrame {
public class A5LightHeartbeatReqInnerFrame implements IRequestInnerFrame {
    @Override
    public String getEncodeFrame() {
        String functionCode = A5LightDataEnum.ReadHeartBeat.getCode();
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A5LightResetReqInnerFrame.java
copy from ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/LightHeartbeatReqInnerFrame.java copy to ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A5LightResetReqInnerFrame.java
Îļþ´Ó ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/LightHeartbeatReqInnerFrame.java ¸´ÖÆ
@@ -8,12 +8,12 @@
/**
 * @author chenjiantian
 * @date 2021/12/6 18:16
 * A5->01->02 è¯»å¿ƒè·³åŒ…
 * A5->01->25 æ¸…除单灯累计数据
 */
public class LightHeartbeatReqInnerFrame implements IRequestInnerFrame {
public class A5LightResetReqInnerFrame implements IRequestInnerFrame {
    @Override
    public String getEncodeFrame() {
        String functionCode = A5LightDataEnum.ReadHeartBeat.getCode();
        String functionCode = A5LightDataEnum.LightReset.getCode();
        String payloadLength = "0002";
        String payload = "FFFF";
        String frame = functionCode + payloadLength + payload;
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A1DeviceMacRespInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.response;
import cn.hutool.core.util.HexUtil;
import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame;
import lombok.Data;
import lombok.ToString;
/**
 * @author chenjiantian
 * @date 2021/12/6 14:46
 * A1->0x89
 * 0x89:读取芯片唯一设备地址应答
 * 12字节        1字节    è§£é‡Šï¼šè®¾å¤‡ç±»åž‹00代表MQTT串口,01代表CAT1
 * ç¡¬ä»¶MAC        è®¾å¤‡ç±»åž‹
 */
@Data
@ToString(callSuper = true)
public class A1DeviceMacRespInnerFrame extends BaseResponseInnerFrame<A1DeviceMacRespInnerFrame> {
    /**
     * 12字节 ç¡¬ä»¶MAC
     */
    private String mac;
    /**
     * 1字节 è®¾å¤‡ç±»åž‹ è®¾å¤‡ç±»åž‹00代表MQTT串口,01代表CAT1
     */
    private String type;
    @Override
    public A1DeviceMacRespInnerFrame transformFrame(String payload) {
        mac = payload.substring(0, 24);
        type = payload.substring(24);
        return this;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A1TernaryCodeRespInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.response;
import cn.hutool.core.util.HexUtil;
import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame;
import lombok.Data;
import lombok.ToString;
/**
 * @author chenjiantian
 * @date 2021/12/6 14:46
 * A1->0A/0B/0C
 * è®¾ç½®é˜¿é‡Œäº‘三元码 ProductKey DeviceName DeviceSecret å“åº”内容
 */
@Data
@ToString(callSuper = true)
public class A1TernaryCodeRespInnerFrame extends BaseResponseInnerFrame<A1TernaryCodeRespInnerFrame> {
    /**
     * ä¸‰å…ƒç 
     */
    private String ternaryCode;
    @Override
    public A1TernaryCodeRespInnerFrame transformFrame(String hex) {
        ternaryCode = HexUtil.decodeHexStr(hex);
        return this;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A5LightBrightnessRespInnerFrame.java
ÎļþÃû´Ó ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/LightBrightnessRespInnerFrame.java ÐÞ¸Ä
@@ -12,7 +12,7 @@
 */
@Data
@ToString(callSuper = true)
public class LightBrightnessRespInnerFrame extends BaseResponseInnerFrame<LightBrightnessRespInnerFrame> {
public class A5LightBrightnessRespInnerFrame extends BaseResponseInnerFrame<A5LightBrightnessRespInnerFrame> {
    /**
     * ç›®æ ‡åœ°å€ 2
@@ -24,7 +24,7 @@
    private String responseStatus;
    @Override
    public LightBrightnessRespInnerFrame transformFrame(String hex) {
    public A5LightBrightnessRespInnerFrame transformFrame(String hex) {
        if (hex == null || hex.length() != 22) {
            return null;
        }
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A5LightHeartbeatRespInnerFrame.java
ÎļþÃû´Ó ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/LightHeartbeatRespInnerFrame.java ÐÞ¸Ä
@@ -13,7 +13,7 @@
 */
@Data
@ToString(callSuper = true)
public class LightHeartbeatRespInnerFrame extends BaseResponseInnerFrame<LightHeartbeatRespInnerFrame> {
public class A5LightHeartbeatRespInnerFrame extends BaseResponseInnerFrame<A5LightHeartbeatRespInnerFrame> {
    //  ç›®æ ‡åœ°å€    2
    private String destinationAddress;
@@ -23,7 +23,7 @@
    private String originFrame;
    @Override
    public LightHeartbeatRespInnerFrame transformFrame(String hex) {
    public A5LightHeartbeatRespInnerFrame transformFrame(String hex) {
        //  é•¿åº¦ä¸ä¸€è‡´æ—¶ï¼Œè¿”回null
        if (hex == null || hex.length() != 116) {
            return null;
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/BaseInvokeSyncService.java
@@ -23,22 +23,6 @@
public abstract class BaseInvokeSyncService implements IInvoke, IBaseTopic, ICustomizeTopic {
    /**
     * èŽ·å–äº§å“å—
     *
     * @return äº§å“å—
     */
    public abstract String getProductKey();
    /**
     * å‘送rrpc è¯·æ±‚
     *
     * @param deviceName    è®¾å¤‡å
     * @param iRequestFrame ç¼–码帧
     * @return è¿”回的解码帧实体类
     */
    public abstract CommonFrame sendRRPC(String deviceName, IRequestFrame iRequestFrame);
    /**
     * å‘送rrpc è¯·æ±‚
     *
     * @param deviceName    è®¾å¤‡å
@@ -134,8 +118,15 @@
        return null;
    }
    @Override
    public InvokeThingServiceResponse.Data invokeThing(String deviceName, InvokeParam param) {
     /**
     * è°ƒç”¨è‡ªå®šä¹‰topic
     * https://help.aliyun.com/document_detail/69584.htm?spm=a2c4g.11186623.0.0.25b33982bSQSom#reference-snk-mrz-wdb
     *
     * @param deviceName è®¾å¤‡å
     * @param param      å‚æ•°
     * @return è®¾å¤‡è¿”回的结果
     */
    protected InvokeThingServiceResponse.Data invokeThing(String deviceName, InvokeParam param) {
        // å¡«å……服务调用的参数
        InvokeThingServiceRequest request = new InvokeThingServiceRequest();
        // è®¾å¤‡è¯ä¹¦ä¹‹productKey
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/dto/CommonReportMessage.java
@@ -5,7 +5,7 @@
/**
 * @author chenjiantian
 * @date 2021/12/3 17:27
 * è®¾å¤‡ä¸ŠæŠ¥æ¶ˆæ¯å®žä½“ç±»
 * amqp消息实体类
 */
@Data
public class CommonReportMessage {
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/dto/WrapResponseCommonFrame.java
@@ -13,6 +13,6 @@
@ToString(callSuper = true)
public class WrapResponseCommonFrame<T extends BaseResponseInnerFrame<T>> extends CommonFrame {
    private T responseTransform;
    private T responseInnerFrame;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5LightDataEnum.java
@@ -12,7 +12,10 @@
    //  å®šæ—¶æŽ§åˆ¶
    TimingLightControl("03"),
    //  å…‰æ„ŸæŽ§åˆ¶
    LightSensorControl("04");
    LightSensorControl("04"),
    // æ¸…除单灯累计数据
    LightReset("25");
    A5LightDataEnum(String code) {
        this.code = code;
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/mainboard/MainBoardInvokeSyncService.java
@@ -53,10 +53,13 @@
    @Override
    public <T extends BaseResponseInnerFrame<T>> WrapResponseCommonFrame<T> sendRRPC(String deviceName, IRequestFrame iRequestFrame, Class<T> clz) {
        CommonFrame commonFrame = sendRRPC(deviceName, iRequestFrame);
        if (commonFrame == null) {
            throw new BusinessException("rrpc请求失败");
        }
        WrapResponseCommonFrame<T> responseCommonFrame = new WrapResponseCommonFrame<>();
        BeanUtils.copyProperties(commonFrame, responseCommonFrame);
        try {
            responseCommonFrame.setResponseTransform(clz.newInstance().transformFrame(responseCommonFrame.getPayload()));
            responseCommonFrame.setResponseInnerFrame(clz.newInstance().transformFrame(responseCommonFrame.getPayload()));
        } catch (InstantiationException | IllegalAccessException e) {
            throw new BusinessException(String.format("找不到%s的构造函数", clz.getName()));
        }
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/topic/ICustomizeTopic.java
@@ -1,6 +1,8 @@
package com.sandu.ximon.admin.manager.iot.rrpc.topic;
import com.aliyuncs.iot.model.v20180120.InvokeThingServiceResponse;
import com.sandu.ximon.admin.manager.iot.frame.IRequestFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.InvokeParam;
/**
@@ -11,11 +13,18 @@
public interface ICustomizeTopic {
    /**
     * è°ƒç”¨è‡ªå®šä¹‰topic
     * https://help.aliyun.com/document_detail/69584.htm?spm=a2c4g.11186623.0.0.25b33982bSQSom#reference-snk-mrz-wdb
     * @param deviceName è®¾å¤‡å
     * @param param å‚æ•°
     * @return è®¾å¤‡è¿”回的结果
     * èŽ·å–äº§å“å—
     *
     * @return äº§å“å—
     */
    InvokeThingServiceResponse.Data invokeThing(String deviceName, InvokeParam param);
    String getProductKey();
    /**
     * å‘送rrpc è¯·æ±‚
     *
     * @param deviceName    è®¾å¤‡å
     * @param iRequestFrame ç¼–码帧
     * @return è¿”回的解码帧实体类
     */
    CommonFrame sendRRPC(String deviceName, IRequestFrame iRequestFrame);
}
ximon-admin/src/test/java/com/sandu/ximon/admin/BaseTopicTests.java
@@ -1,40 +1,44 @@
package com.sandu.ximon.admin;
import com.aliyuncs.iot.model.v20180120.QueryDeviceDetailResponse;
import com.aliyuncs.iot.model.v20180120.RegisterDeviceResponse;
import com.sandu.common.execption.BusinessException;
import com.sandu.ximon.admin.manager.iot.frame.A1Frame;
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.EmptyRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.request.LightBrightnessReqInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.request.LightHeartbeatReqInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.response.LightBrightnessRespInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.response.LightHeartbeatRespInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.request.*;
import com.sandu.ximon.admin.manager.iot.frame.inner.response.A1DeviceMacRespInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.response.A1TernaryCodeRespInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.response.A5LightBrightnessRespInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.response.A5LightHeartbeatRespInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.WrapResponseCommonFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A1OrderEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5LightDataEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A2OrderEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@Slf4j
class BaseTopicTests {
    @Test
    void queryDeviceDetail() {
        QueryDeviceDetailResponse.Data data = MainBoardInvokeSyncService.getInstance().queryDeviceDetail("32313243305005ff0431ffff", null);
        QueryDeviceDetailResponse.Data data = MainBoardInvokeSyncService.getInstance().queryDeviceDetail("32313243305007ff3055ffff01", null);
        System.out.println(data.toString());
    }
    @Test
    void rrpcLightControl() {
        LightBrightnessReqInnerFrame lightControlFrame = new LightBrightnessReqInnerFrame(80);
        A5LightBrightnessReqInnerFrame lightControlFrame = new A5LightBrightnessReqInnerFrame(80);
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_LIGHT_DATA.getCode(), lightControlFrame);
        WrapResponseCommonFrame<LightBrightnessRespInnerFrame> frame = MainBoardInvokeSyncService.getInstance()
                .sendRRPC("32313243305008ff1a06ffff", a5Frame, LightBrightnessRespInnerFrame.class);
        WrapResponseCommonFrame<A5LightBrightnessRespInnerFrame> frame = MainBoardInvokeSyncService.getInstance()
                .sendRRPC("32313243305008ff1a06ffff", a5Frame, A5LightBrightnessRespInnerFrame.class);
//        LightControlResponseInnerFrame lightControlResponseInnerFrame = new LightControlResponseInnerFrame();
//        LightControlResponseInnerFrame innerFrame = lightControlResponseInnerFrame.transformFrame(commonFrame.getPayload());
        System.out.println(frame.toString());
@@ -50,20 +54,95 @@
    }
    @Test
    void registerWithReturn() {
        String de = "baseDevice".toLowerCase();
        QueryDeviceDetailResponse.Data data = MainBoardInvokeSyncService.getInstance().queryDeviceDetail("baseDevice", null);
        System.out.println(data.toString());
    void register() {
        String baseMac = "baseDevice";
        String MAINBOARD_PDK = "a1JsfPG4iKW";
        A1Frame a1Frame = new A1Frame(A1OrderEnum.REQUEST_READ_DEVICE_UNIQUE_MAC.getCode(), new EmptyRequestInnerFrame());
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance()
                .sendRRPC(baseMac, a1Frame);
        if(commonFrame == null){
            throw new BusinessException("读取设备唯一ID失败");
        }
        A1DeviceMacRespInnerFrame a1DeviceMacRespInnerFrame = new A1DeviceMacRespInnerFrame().transformFrame(commonFrame.getPayload());
        log.info(commonFrame.toString());
        String uniqueMac = a1DeviceMacRespInnerFrame.getMac();
        uniqueMac = uniqueMac.toLowerCase();
        log.info("唯一码{}",uniqueMac);
        MainBoardInvokeSyncService.getInstance().registerDevice(uniqueMac);
        QueryDeviceDetailResponse.Data deviceDetail = MainBoardInvokeSyncService.getInstance().queryDeviceDetail(uniqueMac, null);
        if(deviceDetail == null){
            throw new BusinessException("注册失败");
        }
        log.info(deviceDetail.toString());
        WrapResponseCommonFrame<A1TernaryCodeRespInnerFrame> productKeyResp = MainBoardInvokeSyncService.getInstance()
                .sendRRPC(baseMac,
                        FrameBuilder.builderA1().innerFrame(new A1TernaryCodeReqInnerFrame(MAINBOARD_PDK))
                                .orderType(A1OrderEnum.REQUEST_SET_PRODUCT_KEY.getCode()).build(),
                        A1TernaryCodeRespInnerFrame.class);
        A1TernaryCodeRespInnerFrame responseInnerFrame = productKeyResp.getResponseInnerFrame();
        if(!MAINBOARD_PDK.equals(responseInnerFrame.getTernaryCode())){
            throw new BusinessException("设备配置ProductKey失败");
        }
        WrapResponseCommonFrame<A1TernaryCodeRespInnerFrame> responseCommonFrame = MainBoardInvokeSyncService.getInstance()
                .sendRRPC(baseMac,
                        FrameBuilder.builderA1().innerFrame(new A1TernaryCodeReqInnerFrame(uniqueMac))
                                .orderType(A1OrderEnum.REQUEST_SET_DEVICE_NAME.getCode()).build(),
                        A1TernaryCodeRespInnerFrame.class);
        A1TernaryCodeRespInnerFrame deviceNameFrame = responseCommonFrame.getResponseInnerFrame();
        if(!uniqueMac.equals(deviceNameFrame.getTernaryCode())){
            throw new BusinessException("设备配置名失败");
        }
        WrapResponseCommonFrame<A1TernaryCodeRespInnerFrame> wrapResponseCommonFrame = MainBoardInvokeSyncService.getInstance()
                .sendRRPC(baseMac,
                        FrameBuilder.builderA1().innerFrame(new A1TernaryCodeReqInnerFrame(deviceDetail.getDeviceSecret()))
                                .orderType(A1OrderEnum.REQUEST_SET_DEVICE_SECRET.getCode()).build(),
                        A1TernaryCodeRespInnerFrame.class);
        A1TernaryCodeRespInnerFrame deviceSecretFrame = wrapResponseCommonFrame.getResponseInnerFrame();
        if (!deviceDetail.getDeviceSecret().equals(deviceSecretFrame.getTernaryCode())) {
            throw new BusinessException("设备密钥失败");
        }
        CommonFrame rebootFrame = MainBoardInvokeSyncService.getInstance()
                .sendRRPC(baseMac,
                        FrameBuilder.builderA2().innerFrame(new EmptyRequestInnerFrame())
                                .orderType(A2OrderEnum.REQUEST_MAIN_BOARD_RESET.getCode()).build());
        if (rebootFrame.getPayload().equals("00")) {
            System.out.println("重启成功");
        }
    }
    @Test
    void LightHeartbeat() {
        IRequestFrame build = FrameBuilder.builderA5()
                .orderType(A5OrderEnum.REQUEST_LIGHT_DATA.getCode())
                .innerFrame(new LightHeartbeatReqInnerFrame())
                .innerFrame(new A5LightHeartbeatReqInnerFrame())
                .build();
        WrapResponseCommonFrame<LightHeartbeatRespInnerFrame> responseCommonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC("32313243305008ff1a06ffff", build, LightHeartbeatRespInnerFrame.class);
        WrapResponseCommonFrame<A5LightHeartbeatRespInnerFrame> responseCommonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC("32313243305008ff1a06ffff", build, A5LightHeartbeatRespInnerFrame.class);
        System.out.println("responseCommonFrame.toString()");
        System.out.println(responseCommonFrame.toString());
    }
    @Test
    void LightReset() {
        String deviceName = "32313243305007ff3055ffff01";
        IRequestFrame build = FrameBuilder.builderA5()
                .orderType(A5OrderEnum.REQUEST_LIGHT_DATA.getCode())
                .innerFrame(new A5LightResetReqInnerFrame())
                .build();
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance()
                .sendRRPC(deviceName, build);
        System.out.println(commonFrame.toString());
        CommonFrame rebootFrame = MainBoardInvokeSyncService.getInstance()
                .sendRRPC(deviceName,
                        FrameBuilder.builderA2().innerFrame(new EmptyRequestInnerFrame())
                                .orderType(A2OrderEnum.REQUEST_MAIN_BOARD_RESET.getCode()).build());
        if (rebootFrame.getPayload().equals("00")) {
            System.out.println("重启成功");
        }
    }
}