mac
2023-12-01 593303fa91fd541844b204ec913c462d7855a31e
HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLModBusConnect.java
@@ -11,9 +11,9 @@
import com.hdl.sdk.link.common.utils.LogUtils;
import com.hdl.sdk.link.core.bean.LinkRequest;
import com.hdl.sdk.link.core.bean.LinkResponse;
import com.hdl.sdk.link.core.bean.ModbusResponse;
import com.hdl.sdk.link.core.bean.ZigbeeResponse;
import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
import com.hdl.sdk.link.core.callback.BaseCallBack;
import com.hdl.sdk.link.core.callback.ModbusCallBack;
import com.hdl.sdk.link.core.callback.ZigbeeCallBack;
import com.hdl.sdk.link.core.config.HDLLinkConfig;
@@ -25,12 +25,12 @@
 */
public class HDLModBusConnect {
    private static final String TAG="HDLModbusConnect";
    private static final String TAG = "HDLModbusConnect";
    private static HDLModBusConnect instance;
    /**
     * 内部用,主要是处理处理掉透传主题及link主题后,还原Zigbee原生数据及主题用
     * 内部用,主要是处理处理掉透传主题及link主题后,还原modbus原生数据及主题用
     */
    private final String zigbeeAllTopic = "/Modbus";
    private final String allTopic = "/Modbus";
    /**
     * 返回当前实例,不存在就创建并同时注册监听事件
@@ -51,10 +51,10 @@
     * @param eventListener
     */
    public void registerListener(EventListener eventListener) {
        if(null==eventListener){
        if (null == eventListener) {
            return;
        }
        EventDispatcher.getInstance().register(zigbeeAllTopic, eventListener);
        EventDispatcher.getInstance().register(allTopic, eventListener);
    }
    /**
@@ -63,10 +63,10 @@
     * @param eventListener
     */
    public void removeListener(EventListener eventListener) {
        if(null==eventListener){
        if (null == eventListener) {
            return;
        }
        EventDispatcher.getInstance().remove(zigbeeAllTopic, eventListener);
        EventDispatcher.getInstance().remove(allTopic, eventListener);
    }
    /**
@@ -76,62 +76,56 @@
        final EventListener eventListener = new EventListener() {
            @Override
            public void onMessage(Object msg) {
//                try {
//                    if (msg instanceof LinkResponse) {
//                        LinkResponse linkResponse = (LinkResponse) msg;
//                        String body = linkResponse.getData();
//                        int index = body.indexOf("{");
//                        //zigbee回复的数据前有主题,后面才是数据
//                        if (index <= 0)
//                            return;
//
//                        String zigbeeTopic = body.substring(0, index).trim();
//                        //zigbee的负载数据
//                        String bodyData = body.substring(index);
//
//                        ZigbeeResponse zigbeeResponse = new ZigbeeResponse();
//                        zigbeeResponse.setTopic(zigbeeTopic);
//                        zigbeeResponse.setData(bodyData);
//                        String oid = null;
//                        //是否是通过主网关透传主题
//                        if (linkResponse.getTopic().contains("/slaveoid/")) {
//                            oid = linkResponse.getTopic().split("/")[8];
//                        } else {
//                            oid = linkResponse.getTopic().split("/")[2];
//                        }
//                        zigbeeResponse.setOid(oid);
//                        for (GatewayBean gatewayBean : HDLLinkLocalGateway.getInstance().getGatewayList()) {
//                            if (oid.equals(gatewayBean.getGatewayId()) || oid.equals(gatewayBean.getDevice_mac()) || oid.equals(gatewayBean.getOid())) {
//                                //上面的oid可能是网关id或者mac或者是oid,不管是哪个统一使用oid表示方式
//                                zigbeeResponse.setOid(gatewayBean.getOid());
//                                break;
//                            }
//                        }
//                        EventDispatcher.getInstance().post(zigbeeTopic, zigbeeResponse);
//                        //发布Zigbee原生主题及数据
//                        EventDispatcher.getInstance().post(zigbeeAllTopic, zigbeeResponse);
//                    }
//                } catch (Exception e) {
//                    LogUtils.e(TAG,"LinkResponse转ZigbeeResponse异常:"+ e.getMessage());
//                }
                try {
                    if (msg instanceof LinkResponse) {
                        LinkResponse linkResponse = (LinkResponse) msg;
                        if (linkResponse.getTopic() == null || !linkResponse.getTopic().contains("custom/native/inverter/up")) {
                            return;
                        }
                        byte[] data = linkResponse.getByteData();
                        ModbusResponse modbusResponse = new ModbusResponse();
                        String topic = "Modbus" + data[0] + data[1];
                        modbusResponse.setTopic(topic);
                        modbusResponse.setData(data);
                        String oid = null;
                        //是否是通过主网关透传主题
                        if (linkResponse.getTopic().contains("/slaveoid/")) {
                            oid = linkResponse.getTopic().split("/")[8];
                        } else {
                            oid = linkResponse.getTopic().split("/")[2];
                        }
                        modbusResponse.setOid(oid);
                        for (GatewayBean gatewayBean : HDLLinkLocalGateway.getInstance().getGatewayList()) {
                            if (oid.equals(gatewayBean.getGatewayId()) || oid.equals(gatewayBean.getDevice_mac()) || oid.equals(gatewayBean.getOid())) {
                                //上面的oid可能是网关id或者mac或者是oid,不管是哪个统一使用oid表示方式
                                modbusResponse.setOid(gatewayBean.getOid());
                                break;
                            }
                        }
                        EventDispatcher.getInstance().post(topic, modbusResponse);
                        //发布Zigbee原生主题及数据
//                        EventDispatcher.getInstance().post(allTopic, modbusResponse);
                    }
                } catch (Exception e) {
                    LogUtils.e(TAG, "LinkResponse转ModbusResponse异常:" + e.getMessage());
                }
            }
        };
        //注册直接通讯的主题,包括直接和主网关通讯或者直接和从网关通讯
        registerListener(String.format(TopicConstant.NATIVE_MODBUS_UP, "+"), eventListener);
        registerListener(String.format(TopicConstant.NATIVE_MODBUS_DOWN_REPLY, "+"), eventListener);
        //        registerListener(String.format(TopicConstant.NATIVE_ZIGBEE_UP_SLAVE, "+", "+"), eventListener);
        //registerListener(String.format(TopicConstant.NATIVE_MODBUS_DOWN_REPLY, "+"), eventListener);
        //registerListener(String.format(TopicConstant.NATIVE_ZIGBEE_UP_SLAVE, "+", "+"), eventListener);
    }
    /**
     * 发送原生数据
     *
     * @param gatewayOidOrGatewayId 目标网关的oid或者网关Id
     * @param responeTopic          回复主题
     * @param payload               发送数据
     * @param baseCallBack        结果回调
     * @param baseCallBack          结果回调
     */
    public void Send(String gatewayOidOrGatewayId,String responeTopic, String payload, final ModbusCallBack baseCallBack) {
    public void Send(String gatewayOidOrGatewayId, byte[] payload, final ModbusCallBack baseCallBack) {
        //如果本地有链接这个网关,则用本地连接
        GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getGatewayByOidOrGatewayId(gatewayOidOrGatewayId);
        if (null == gatewayBean) {
@@ -145,22 +139,24 @@
        String tempTopic = String.format(TopicConstant.NATIVE_MODBUS_DOWN, gatewayOidOrGatewayId);
        LinkRequest request = new LinkRequest(tempTopic, payload, gatewayBean.getIsLocalEncrypt());
        if ("true".equals(gatewayBean.getMaster())) {
            request.setCloudTopic(String.format(TopicConstant.NATIVE_MODBUS_DOWN, HDLLinkConfig.getInstance().getGatewayId()));
        } else {
            request.setCloudTopic(String.format(TopicConstant.NATIVE_MODBUS_DOWN_SLAVE, HDLLinkConfig.getInstance().getGatewayId(), gatewayOidOrGatewayId));
        }
        request.setReplyTopic(responeTopic);
        long timeout = 2 * 1000;
//        if ("true".equals(gatewayBean.getMaster())) {
        request.setCloudTopic(String.format(TopicConstant.NATIVE_MODBUS_DOWN, HDLLinkConfig.getInstance().getGatewayId()));
//        } else {
//            request.setCloudTopic(String.format(TopicConstant.NATIVE_MODBUS_DOWN_SLAVE, HDLLinkConfig.getInstance().getGatewayId(), gatewayOidOrGatewayId));
//        }
        request.setReplyTopic("Modbus" + payload[0] + payload[1]);
        long timeout = 5 * 1000;
        new HDLConnectHelper(timeout, 1, gatewayBean.getIp_address(), 8586, request, new HDLConnectHelper.HdlSocketListener() {
            @Override
            public void onSucceed(Object msg) {
//                if (msg instanceof String) {
//                    if (null != baseCallBack) {
//                        baseCallBack.onSuccess(msg+"");
//                    }
//                }
                if (msg instanceof int[]) {
                    if (null != baseCallBack) {
                        baseCallBack.onSuccess((int[]) msg);
                    }
                } else {
                    LogUtils.e("发送Modbus回调对象类型非数组类型,类型是" + msg.getClass());
                }
            }
            @Override
@@ -171,7 +167,6 @@
            }
        }, true).send();
    }
    /**
@@ -261,12 +256,12 @@
    /**
     * 处理zigbee回复的数据
     *
     * @param responeTopic   回复主题
     * @param linkResponse   回复的透传数据
     * @param responeTopic 回复主题
     * @param linkResponse 回复的透传数据
     */
    private static String getZigbeeData(String responeTopic, LinkResponse linkResponse) {
        //主题为空不处理
        if(TextUtils.isEmpty(responeTopic)){
        if (TextUtils.isEmpty(responeTopic)) {
            return null;
        }