| | |
| | | */ |
| | | public class HDLModBusConnect { |
| | | |
| | | private static final String TAG="HDLModbusConnect"; |
| | | private static final String TAG = "HDLModbusConnect"; |
| | | private static HDLModBusConnect instance; |
| | | /** |
| | | * 内部用,主要是处理处理掉透传主题及link主题后,还原modbus原生数据及主题用 |
| | |
| | | * @param eventListener |
| | | */ |
| | | public void registerListener(EventListener eventListener) { |
| | | if(null==eventListener){ |
| | | if (null == eventListener) { |
| | | return; |
| | | } |
| | | EventDispatcher.getInstance().register(allTopic, eventListener); |
| | |
| | | * @param eventListener |
| | | */ |
| | | public void removeListener(EventListener eventListener) { |
| | | if(null==eventListener){ |
| | | if (null == eventListener) { |
| | | return; |
| | | } |
| | | EventDispatcher.getInstance().remove(allTopic, eventListener); |
| | |
| | | try { |
| | | if (msg instanceof LinkResponse) { |
| | | LinkResponse linkResponse = (LinkResponse) msg; |
| | | if(linkResponse.getTopic()==null||!linkResponse.getTopic().contains("custom/native/inverter/")) |
| | | { |
| | | if (linkResponse.getTopic() == null || !linkResponse.getTopic().contains("custom/native/inverter/up")) { |
| | | return; |
| | | } |
| | | byte []data = linkResponse.getByteData(); |
| | | ModbusResponse modbusResponse= new ModbusResponse(); |
| | | modbusResponse.setTopic("Modbus"+data[0]+data[1]); |
| | | byte[] data = linkResponse.getByteData(); |
| | | ModbusResponse modbusResponse = new ModbusResponse(); |
| | | String topic = "Modbus" + data[0] + data[1]; |
| | | modbusResponse.setTopic(topic); |
| | | modbusResponse.setData(data); |
| | | String oid = null; |
| | | //是否是通过主网关透传主题 |
| | |
| | | break; |
| | | } |
| | | } |
| | | EventDispatcher.getInstance().post(allTopic, modbusResponse); |
| | | |
| | | EventDispatcher.getInstance().post(topic, modbusResponse); |
| | | //发布Zigbee原生主题及数据 |
| | | // EventDispatcher.getInstance().post(allTopic, zigbeeResponse); |
| | | // EventDispatcher.getInstance().post(allTopic, modbusResponse); |
| | | } |
| | | } catch (Exception e) { |
| | | LogUtils.e(TAG,"LinkResponse转ModbusResponse异常:"+ e.getMessage()); |
| | | 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 payload 发送数据 |
| | | * @param baseCallBack 结果回调 |
| | | * @param baseCallBack 结果回调 |
| | | */ |
| | | public void Send(String gatewayOidOrGatewayId, byte []payload, final ModbusCallBack baseCallBack) { |
| | | public void Send(String gatewayOidOrGatewayId, byte[] payload, final ModbusCallBack baseCallBack) { |
| | | //如果本地有链接这个网关,则用本地连接 |
| | | GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getGatewayByOidOrGatewayId(gatewayOidOrGatewayId); |
| | | if (null == gatewayBean) { |
| | |
| | | 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("Modbus"+payload[0]+payload[1]); |
| | | 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 Byte[]) { |
| | | if (msg instanceof int[]) { |
| | | if (null != baseCallBack) { |
| | | baseCallBack.onSuccess((byte[])msg); |
| | | baseCallBack.onSuccess((int[]) msg); |
| | | } |
| | | }else{ |
| | | LogUtils.e("发送Modbus回调对象类型非数组类型,类型是"+msg.getClass()); |
| | | } else { |
| | | LogUtils.e("发送Modbus回调对象类型非数组类型,类型是" + msg.getClass()); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | }, true).send(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | |
| | | /** |
| | | * 处理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; |
| | | } |
| | | |