package com.hdl.sdk.link.core.connect;
|
|
|
import android.text.TextUtils;
|
|
import com.hdl.sdk.link.common.config.TopicConstant;
|
import com.hdl.sdk.link.common.event.EventDispatcher;
|
import com.hdl.sdk.link.common.event.EventListener;
|
import com.hdl.sdk.link.common.exception.HDLLinkCode;
|
import com.hdl.sdk.link.common.exception.HDLLinkException;
|
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.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;
|
import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
|
|
/**
|
* Created by hxb on 2021/12/8.
|
* 原生通讯相关接口
|
*/
|
public class HDLModBusConnect {
|
|
private static final String TAG="HDLModbusConnect";
|
private static HDLModBusConnect instance;
|
/**
|
* 内部用,主要是处理处理掉透传主题及link主题后,还原Zigbee原生数据及主题用
|
*/
|
private final String zigbeeAllTopic = "/Modbus";
|
|
/**
|
* 返回当前实例,不存在就创建并同时注册监听事件
|
*
|
* @return
|
*/
|
public static HDLModBusConnect getInstance() {
|
if (null == instance) {
|
instance = new HDLModBusConnect();
|
instance.initEventListener();
|
}
|
return instance;
|
}
|
|
/**
|
* 注册监听Zigbee所有原生主题及数据
|
*
|
* @param eventListener
|
*/
|
public void registerListener(EventListener eventListener) {
|
if(null==eventListener){
|
return;
|
}
|
EventDispatcher.getInstance().register(zigbeeAllTopic, eventListener);
|
}
|
|
/**
|
* 移除监听Zigbee原生主题及数据
|
*
|
* @param eventListener
|
*/
|
public void removeListener(EventListener eventListener) {
|
if(null==eventListener){
|
return;
|
}
|
EventDispatcher.getInstance().remove(zigbeeAllTopic, eventListener);
|
}
|
|
/**
|
* 初始化监听事件
|
*/
|
private void initEventListener() {
|
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());
|
// }
|
}
|
};
|
//注册直接通讯的主题,包括直接和主网关通讯或者直接和从网关通讯
|
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);
|
}
|
|
/**
|
* 发送原生数据
|
*
|
* @param gatewayOidOrGatewayId 目标网关的oid或者网关Id
|
* @param responeTopic 回复主题
|
* @param payload 发送数据
|
* @param baseCallBack 结果回调
|
*/
|
public void Send(String gatewayOidOrGatewayId,String responeTopic, String payload, final ModbusCallBack baseCallBack) {
|
//如果本地有链接这个网关,则用本地连接
|
GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getGatewayByOidOrGatewayId(gatewayOidOrGatewayId);
|
if (null == gatewayBean) {
|
LogUtils.i("找不到网关,Oid是" + gatewayOidOrGatewayId);
|
if (null != baseCallBack) {
|
baseCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
|
}
|
return;
|
}
|
|
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;
|
|
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+"");
|
// }
|
// }
|
}
|
|
@Override
|
public void onFailure(HDLLinkCode hdlLinkCode) {
|
if (null != baseCallBack) {
|
baseCallBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
|
}
|
}
|
}, true).send();
|
}
|
|
|
|
/**
|
* 发送原生透传命令数据
|
*
|
* @param gatewayOidOrGatewayId 目标网关的oid或者网关Id
|
* @param responeTopic 回复主题
|
* @param payload 发送数据
|
* @param zigbeeCallBack 结果回调
|
*/
|
public void SendThrough(String gatewayOidOrGatewayId, String responeTopic, String payload, final ZigbeeCallBack zigbeeCallBack) {
|
// //如果本地有链接这个网关,则用本地连接
|
// GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getGatewayByOidOrGatewayId(gatewayOidOrGatewayId);
|
// if (null == gatewayBean) {
|
// LogUtils.i("找不到网关,Oid是" + gatewayOidOrGatewayId);
|
// if (null != zigbeeCallBack) {
|
// zigbeeCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
|
// }
|
// return;
|
// }
|
// boolean isLocal = gatewayBean.getIsLocalGateway();
|
// //如果是本地通讯
|
// if (isLocal == true) {
|
//
|
// String tempTopic = String.format("/user/%s/custom/native/zigbee/down", gatewayOidOrGatewayId);
|
// String tempTopicReply = String.format("/user/%s/custom/native/zigbee/up", gatewayOidOrGatewayId);
|
//
|
// final boolean[] isCallBack = {false};
|
// //透传命令主题处理
|
// final EventListener eventListener = new EventListener() {
|
// @Override
|
// public void onMessage(Object msg) {
|
// if (msg instanceof LinkResponse) {
|
// LinkResponse linkResponse = (LinkResponse) msg;
|
// //TODO 如果配置从网关的信息,通过主网关转达,这里oid要判断下
|
// String body = getZigbeeData(responeTopic, linkResponse);
|
// if (null != body) {
|
// isCallBack[0] = true;
|
// removeListener(tempTopicReply, this);
|
// if (null != zigbeeCallBack) {
|
// zigbeeCallBack.onSuccess(body);
|
// }
|
// }
|
// }
|
// }
|
// };
|
// //注册监听
|
// registerListener(tempTopicReply, eventListener);
|
//
|
// //一定时间后还没有接收到数据,就回调失败
|
// ScheduledExecutorService scheduledExecutorService = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
|
// scheduledExecutorService.schedule(new Runnable() {
|
// @Override
|
// public void run() {
|
// removeListener(tempTopicReply, eventListener);
|
// scheduledExecutorService.shutdownNow();
|
// if (!isCallBack[0]) {
|
// if (null != zigbeeCallBack) {
|
// zigbeeCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_Zigbee_FAILURE_ERROR));
|
// }
|
// }
|
// }
|
// }, 5, TimeUnit.SECONDS);
|
//
|
// //本地发送
|
// LinkRequest request = new LinkRequest(tempTopic, payload, gatewayBean.getIsLocalEncrypt());
|
// new HDLConnectHelper(gatewayBean.getIp_address(), request,true).send();
|
// } else {
|
// //请求主题
|
// String tempTopic = null;
|
// //回复主题
|
// String tempTopicReply = null;
|
//
|
// //远程发送
|
// if ("true".equals(gatewayBean.getMaster())) {
|
// tempTopic = String.format("/user/%s/custom/native/zigbee/down", com.hdl.sdk.link.core.config.HDLLinkConfig.getInstance().getGatewayId());
|
// tempTopicReply = String.format("/user/%s/custom/native/zigbee/up", com.hdl.sdk.link.core.config.HDLLinkConfig.getInstance().getGatewayId());
|
// } else {
|
// tempTopic = String.format("/user/%s/custom/native/zigbee/slaveoid/%s/down", com.hdl.sdk.link.core.config.HDLLinkConfig.getInstance().getGatewayId(), gatewayOidOrGatewayId);
|
// tempTopicReply = String.format("/user/%s/custom/native/zigbee/slaveoid/%s/up", com.hdl.sdk.link.core.config.HDLLinkConfig.getInstance().getGatewayId(), "+");
|
// }
|
// //TODO 后续完善云端的发送接收方法
|
// }
|
}
|
|
|
/**
|
* 处理zigbee回复的数据
|
*
|
* @param responeTopic 回复主题
|
* @param linkResponse 回复的透传数据
|
*/
|
private static String getZigbeeData(String responeTopic, LinkResponse linkResponse) {
|
//主题为空不处理
|
if(TextUtils.isEmpty(responeTopic)){
|
return null;
|
}
|
|
String body = linkResponse.getData();
|
int index = body.indexOf("{");
|
//zigbee回复的数据前有主题,后面才是数据
|
if (index <= 0)
|
return null;
|
|
String zigbeeTopic = body.substring(0, index).trim();
|
//zigbee的负载数据
|
String bodyData = body.substring(index);
|
|
//不是当前请求的数据,不处理
|
if (!zigbeeTopic.startsWith(responeTopic)) {
|
return null;
|
}
|
|
return bodyData;
|
//Zigbee以前的接收逻辑
|
// HdlZbGatewayReceiveLogic.Current.ZigbeeOldReceiveLogic(reportTopic, bodyData, gatewayMac);
|
}
|
|
/**
|
* 注册监听
|
*/
|
static void registerListener(String responseTopic, EventListener eventListener) {
|
if (!TextUtils.isEmpty(responseTopic)) {
|
EventDispatcher.getInstance().register(responseTopic, eventListener);
|
}
|
}
|
|
/**
|
* 移除监听
|
*/
|
static void removeListener(String responseTopic, EventListener eventListener) {
|
if (!TextUtils.isEmpty(responseTopic)) {
|
EventDispatcher.getInstance().remove(responseTopic, eventListener);
|
}
|
}
|
}
|