package com.hdl.sdk.link.core.connect; import android.text.TextUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.hdl.link.error.ErrorUtils; import com.hdl.link.error.HDLLinkCode; import com.hdl.sdk.link.common.event.EventDispatcher; import com.hdl.sdk.link.common.event.EventListener; import com.hdl.sdk.link.common.exception.HDLLinkException; import com.hdl.sdk.link.common.utils.IdUtils; import com.hdl.sdk.link.common.utils.LogUtils; import com.hdl.sdk.link.common.utils.gson.GsonConvert; import com.hdl.sdk.link.core.bean.LinkRequest; import com.hdl.sdk.link.core.bean.LinkResponse; import com.hdl.sdk.link.core.bean.RealLinkResponse; import com.hdl.sdk.link.core.bean.gateway.GatewayBean; import com.hdl.sdk.link.core.bean.response.BaseLocalResponse; import com.hdl.sdk.link.core.callback.RealLinkCallBack; import com.hdl.sdk.link.core.config.HDLLinkConfig; import com.hdl.sdk.link.gateway.HDLLinkLocalGateway; import java.util.ArrayList; import java.util.List; /** * Created by hxb on 2021/12/8. * 原生通讯相关接口 */ public class HDLRealLinkConnect { private static final String TAG = "HDLRealLinkConnect"; private static HDLRealLinkConnect instance; /** * 返回当前实例,不存在就创建并同时注册监听事件 * * @return */ public static HDLRealLinkConnect getInstance() { if (null == instance) { instance = new HDLRealLinkConnect(); instance.initEventListener(); } return instance; } /** * 初始化监听事件 */ private void initEventListener() { final EventListener eventListener = new EventListener() { @Override public void onMessage(Object msg) { try { if (msg instanceof LinkResponse) { LinkResponse linkResponse = (LinkResponse) msg; //透传数据不处理 if (linkResponse.getTopic() == null || linkResponse.getTopic().contains("/custom/native/")) { return; } JSONObject jsonObject = JSON.parseObject(linkResponse.getData()); String id = jsonObject.getString("id"); Integer code = jsonObject.getInteger("code"); RealLinkResponse realLinkResponse = new RealLinkResponse(); String topic = String.format(linkResponse.getTopic() + "/s%", id);//用topic+信息id表示唯一 realLinkResponse.setTopic(topic); realLinkResponse.setData(linkResponse.getData()); realLinkResponse.setByteData(linkResponse.getByteData()); realLinkResponse.setHdlLinkCode(ErrorUtils.getByCode(code)); String oid = linkResponse.getTopic().split("/")[2]; //是否是通过主网关透传主题 if (linkResponse.getTopic().contains("/slaveoid/")) { oid = linkResponse.getTopic().split("/")[8]; } realLinkResponse.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表示方式 realLinkResponse.setOid(gatewayBean.getOid()); break; } } EventDispatcher.getInstance().post(topic, realLinkResponse); } } catch (Exception e) { LogUtils.e(TAG, "LinkResponse转RealLinkResponse异常:" + e.getMessage()); } } }; EventDispatcher.getInstance().registerAllTopicsListener(eventListener); } /** * 发送原生数据 * * @param gatewayOidOrGatewayId 目标网关的oid或者网关Id * @param payload 发送数据 * @param realLinkCallBack 结果回调 */ public void Send(String gatewayOidOrGatewayId, String topic, String payload, final RealLinkCallBack realLinkCallBack) { Send(gatewayOidOrGatewayId, topic, payload, 4, realLinkCallBack);//默认4秒超时 } /** * 发送原生数据 * * @param gatewayOidOrGatewayId 目标网关的oid或者网关Id * @param payload 发送数据 * @param timeout 超时时间(s) * @param realLinkCallBack 结果回调 */ public void Send(String gatewayOidOrGatewayId, String topic, String payload, int timeout, final RealLinkCallBack realLinkCallBack) { if(TextUtils.isEmpty(gatewayOidOrGatewayId)||TextUtils.isEmpty(payload)||TextUtils.isEmpty(payload)) { LogUtils.i(TAG, String.format("部分数据为空,gatewayOidOrGatewayId:%s,topic:%s,payload:%s", gatewayOidOrGatewayId, topic, payload)); realLinkCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR)); return; } String time = String.valueOf(System.currentTimeMillis()); final BaseLocalResponse> data = new BaseLocalResponse<>(); data.setId(IdUtils.getUUId()); data.setTime_stamp(time); List objectList = new ArrayList<>(); objectList.add(JSONObject.parseObject(payload)); data.setObjects(objectList); LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt()); request.setReplyTopic(String.format(request.getReplyTopic() + "/s%", data.getId()));//用topic+消息id表示唯一 long awaitTime = timeout * 1000L; new HDLConnectHelper(awaitTime, 1, HDLLinkConfig.getInstance().getIpAddress(), 8586, request, new HDLConnectHelper.HdlSocketListener() { @Override public void onSucceed(Object object) { if (object instanceof RealLinkResponse) { if (realLinkCallBack != null) { HDLLinkCode hdlLinkCode = ((RealLinkResponse) object).getHdlLinkCode(); Integer code = hdlLinkCode.getCode(); //有的话只有200才会成功 if (code.intValue() == 200 || code.intValue() == 0) { realLinkCallBack.onSuccess((RealLinkResponse) object); } else { realLinkCallBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode)); } } } else { LogUtils.e(TAG, "发送Link回调对象类型非数组类型,类型是" + object.getClass()); } } @Override public void onFailure(HDLLinkCode hdlLinkCode) { if (realLinkCallBack != null) { realLinkCallBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode)); } } }, true, gatewayOidOrGatewayId).send(); } }