package com.hdl.sdk.link.gateway;
|
|
import android.text.TextUtils;
|
|
import com.google.gson.Gson;
|
import com.google.gson.JsonArray;
|
import com.google.gson.JsonElement;
|
import com.google.gson.JsonObject;
|
import com.google.gson.JsonParser;
|
import com.google.gson.reflect.TypeToken;
|
import com.hdl.sdk.link.HDLLinkLocalSdk;
|
import com.hdl.sdk.link.R;
|
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.IdUtils;
|
import com.hdl.sdk.link.common.utils.IpUtils;
|
import com.hdl.sdk.link.common.utils.LogUtils;
|
import com.hdl.sdk.link.common.utils.SPUtils;
|
import com.hdl.sdk.link.common.utils.ThreadToolUtils;
|
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.gateway.GatewayBean;
|
import com.hdl.sdk.link.core.bean.response.BaseLocalResponse;
|
import com.hdl.sdk.link.core.callback.GatewayCallBack;
|
import com.hdl.sdk.link.core.callback.HDLLinkCallBack;
|
import com.hdl.sdk.link.core.callback.HDLLinkTCallBack;
|
import com.hdl.sdk.link.core.config.HDLLinkConfig;
|
import com.hdl.sdk.link.core.connect.HDLConnectHelper;
|
|
import org.json.JSONArray;
|
import org.json.JSONException;
|
import org.json.JSONObject;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* Created by hxb on 2021/12/23.
|
*/
|
public class HDLLinkLocalGateway {
|
//instance
|
private volatile static HDLLinkLocalGateway instance;
|
|
//getInstance
|
public static synchronized HDLLinkLocalGateway getInstance() {
|
if (instance == null) {
|
synchronized (HDLLinkLocalGateway.class) {
|
if (instance == null) {
|
instance = new HDLLinkLocalGateway();
|
}
|
}
|
}
|
return instance;
|
}
|
|
/**
|
* 网关列表,记录所有搜索到的网关,可能包含断线的网关
|
*/
|
private final List<GatewayBean> gatewayBeanList = new ArrayList();
|
|
/**
|
* 获取缓存的网关列表,可能包含断线的网关
|
*
|
* @return 网关列表
|
*/
|
public List<GatewayBean> getGatewayList() {
|
return gatewayBeanList;
|
}
|
|
/**
|
* 通过oid或者网关ID或者AMC获取内存中的网关,注意,如果是远程通讯,gatewayBeanList要平台上绑定的主网关及从网关进去,要不获取不到网关信息
|
*
|
* @param oidOrGatewayId
|
* @return
|
*/
|
public GatewayBean getGatewayByOidOrGatewayId(String oidOrGatewayId) {
|
if (TextUtils.isEmpty(oidOrGatewayId)) {
|
return null;
|
}
|
for (GatewayBean gatewayBean : gatewayBeanList) {
|
if (oidOrGatewayId.equals(gatewayBean.getOid())
|
|| oidOrGatewayId.equals(gatewayBean.getGatewayId())
|
|| oidOrGatewayId.equals(gatewayBean.getDevice_mac())
|
|| oidOrGatewayId.equals(gatewayBean.getIp_address())
|
)
|
return gatewayBean;
|
}
|
return null;
|
}
|
|
/**
|
* 通过IP获取网关信息
|
*
|
* @param ipAddress
|
* @return
|
*/
|
public GatewayBean getGatewayByIpAddress(String ipAddress) {
|
if (TextUtils.isEmpty(ipAddress)) {
|
return null;
|
}
|
for (GatewayBean gatewayBean : gatewayBeanList) {
|
if (ipAddress.equals(gatewayBean.getIp_address()))
|
return gatewayBean;
|
}
|
return null;
|
}
|
|
/**
|
* 通过spk获取网关,这个也支持获取毫米波
|
*
|
* @param spkList 集合
|
* @return 返回网关列表
|
*/
|
public List<GatewayBean> getGatewayBySpk(List<String> spkList) {
|
if (spkList.size() == 0) {
|
return this.getGatewayList();
|
}
|
List<GatewayBean> gatewayBeanList = new ArrayList<>();
|
for (GatewayBean gatewayBean : this.getGatewayList()) {
|
if (spkList.contains(gatewayBean.getGatewayType()))
|
gatewayBeanList.add(gatewayBean);
|
}
|
return gatewayBeanList;
|
}
|
|
/**
|
* 获取网关列表 去掉红外宝这种设备
|
*
|
* @param spkList 集合
|
* @return 返回网关列表
|
*/
|
public List<GatewayBean> getGatewayByGatewayType(List<String> spkList) {
|
if (spkList.size() == 0) {
|
return this.getGatewayList();
|
}
|
List<GatewayBean> gatewayBeanList = new ArrayList<>();
|
for (GatewayBean gatewayBean : this.getGatewayList()) {
|
if ((spkList.contains(gatewayBean.getGatewayType()))
|
&& !"MIR01R-LK.10".equals(gatewayBean.getDevice_model())
|
&& !"MSMWP-LK.30".equals(gatewayBean.getDevice_model()))
|
gatewayBeanList.add(gatewayBean);
|
}
|
return gatewayBeanList;
|
}
|
|
/**
|
* 获取本地网关对象(包括毫米波)
|
*
|
* @param macAndSid 设备mac
|
* @return 找到返回GatewayBean, 未找到返回null.
|
*/
|
public GatewayBean getLocalGateway(String macAndSid) {
|
if (TextUtils.isEmpty(macAndSid)) {
|
return null;
|
}
|
for (GatewayBean gatewayBean : this.getGatewayList()) {
|
if (macAndSid.equals(gatewayBean.getDevice_mac())
|
|| macAndSid.equals(gatewayBean.getSid())) {
|
return gatewayBean;
|
}
|
}
|
return null;
|
}
|
|
/**
|
* 获取当前住宅的主网关;
|
*
|
* @param homeId 住宅id
|
* @return 找到返回GatewayBean, 未找到返回null.
|
*/
|
public GatewayBean findMainGateway(String homeId) {
|
for (GatewayBean gatewayBean : this.getGatewayList()) {
|
if (gatewayBean.getMaster().equals("true")
|
&& gatewayBean.getHomeId().equals(homeId)
|
&& gatewayBean.getGatewayType().equals("AGATEWAY")) {
|
return gatewayBean;
|
}
|
}
|
return null;
|
}
|
|
/**
|
* 判断住宅是否有主网关
|
*
|
* @param homeId
|
* @return
|
*/
|
public boolean hasMainGateway(String homeId) {
|
boolean hasMain = false;
|
for (GatewayBean gatewayBean : this.getGatewayList()) {
|
if (gatewayBean.getMaster().equals("true")
|
&& gatewayBean.getHomeId().equals(homeId)
|
&& gatewayBean.getGatewayType().equals("AGATEWAY")) {
|
hasMain = true;
|
}
|
}
|
return hasMain;
|
}
|
|
/**
|
* 搜索网关,只发一次,没有回调
|
*/
|
public void serchGatewayOneTime() {
|
String time = String.valueOf(System.currentTimeMillis());
|
JsonObject jsonObject = new JsonObject();
|
jsonObject.addProperty("id", IdUtils.getUUId());
|
jsonObject.addProperty("time_stamp", time);
|
LinkRequest message = new LinkRequest(TopicConstant.GATEWAY_SEARCH,
|
jsonObject.toString(), false);
|
|
String ipAddress = IpUtils.getBroadcastAddress();
|
new HDLConnectHelper(1, ipAddress, message, false).send();
|
}
|
|
|
/**
|
* 创新所有在线的网关,包括当前住宅的及没有绑定过的网关
|
*
|
* @param callBack 回调
|
*/
|
public void refreshGatewayByHome(String homeId, GatewayCallBack callBack) {
|
refreshGatewayByHome(homeId, true, callBack);
|
}
|
|
/**
|
* 根据住宅id获取网关
|
*
|
* @param homeId 过滤的住宅id
|
* @param needEmptyHomeIdGateway 网关的住宅id为空时,是否可以加入网关列表
|
* @param callBack 回调方法
|
*/
|
public void refreshGatewayByHome(String homeId, boolean needEmptyHomeIdGateway, GatewayCallBack callBack) {
|
refreshGatewayByHomeIdAndSpk(homeId, this.getGatewayTypeList(), needEmptyHomeIdGateway, callBack);
|
}
|
|
/**
|
* 根据住宅id获取网关
|
*
|
* @param homeId 过滤的住宅id
|
* @param needEmptyHomeIdGateway 网关的住宅id为空时,是否可以加入网关列表
|
* @param callBack 回调方法
|
*/
|
public void refreshWifiMillimeterZT(boolean needEmptyHomeIdGateway, GatewayCallBack callBack) {
|
refreshGatewayBySpk(this.getWifiMillimeterZTTypeList(), needEmptyHomeIdGateway, callBack);
|
}
|
|
/**
|
* 获取网络设备,包括网关及毫米波等网络设备
|
*
|
* @param spk 网络设备spk
|
* @param needEmptyHomeIdGateway 是否需要空住宅Id设备
|
* @param callBack 回调
|
*/
|
public void refreshGatewayBySpk(List<String> spk, boolean needEmptyHomeIdGateway, GatewayCallBack callBack) {
|
String topicReply = TopicConstant.GATEWAY_SEARCH_REPLY;
|
final List<GatewayBean> tempGatewayBeanList = new ArrayList<>();
|
EventListener eventListener = getSearchGatewayEvent(spk, needEmptyHomeIdGateway, tempGatewayBeanList);
|
EventDispatcher.getInstance().register(topicReply, eventListener);
|
|
ThreadToolUtils.getInstance().newFixedThreadPool(1).execute(new Runnable() {
|
@Override
|
public void run() {
|
int count = 5;
|
while (0 < count--) {
|
try {
|
//搜索网关
|
serchGatewayOneTime();
|
Thread.sleep(300L);
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}
|
}
|
//超出次数后移除监听事件
|
EventDispatcher.getInstance().remove(topicReply, eventListener);
|
if (callBack != null) {
|
if (tempGatewayBeanList.size() == 0) {
|
callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_GATEWAY_FAILURE_ERROR));
|
} else {
|
callBack.onSuccess(tempGatewayBeanList);
|
}
|
}
|
}
|
});
|
}
|
|
/**
|
* 获取网络设备,包括网关及毫米波等网络设备
|
*
|
* @param homeId 住宅Id
|
* @param spk 网络设备spk
|
* @param needEmptyHomeIdGateway 是否需要空住宅Id设备
|
* @param callBack 回调
|
*/
|
public void refreshGatewayByHomeIdAndSpk(String homeId, List<String> spk, boolean needEmptyHomeIdGateway, GatewayCallBack callBack) {
|
String topicReply = TopicConstant.GATEWAY_SEARCH_REPLY;
|
final List<GatewayBean> tempGatewayBeanList = new ArrayList<>();
|
EventListener eventListener = getSearchGatewayEvent(homeId, spk, needEmptyHomeIdGateway, tempGatewayBeanList);
|
EventDispatcher.getInstance().register(topicReply, eventListener);
|
|
ThreadToolUtils.getInstance().newFixedThreadPool(1).execute(new Runnable() {
|
@Override
|
public void run() {
|
int count = 5;
|
while (0 < count--) {
|
try {
|
//搜索网关
|
serchGatewayOneTime();
|
Thread.sleep(300L);
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}
|
}
|
//超出次数后移除监听事件
|
EventDispatcher.getInstance().remove(topicReply, eventListener);
|
if (callBack != null) {
|
if (tempGatewayBeanList.size() == 0) {
|
callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_GATEWAY_FAILURE_ERROR));
|
} else {
|
callBack.onSuccess(tempGatewayBeanList);
|
}
|
}
|
}
|
});
|
}
|
|
/**
|
* 创新所有在线的网关,包括当前住宅的及没有绑定过的网关
|
*
|
* @param callBack 回调
|
*/
|
public void refreshGateway(GatewayCallBack callBack) {
|
refreshGateway(callBack,this.getGatewayTypeList());
|
}
|
|
|
public void refreshGateway(GatewayCallBack callBack, List<String> spks) {
|
String topicReply = TopicConstant.GATEWAY_SEARCH_REPLY;
|
final List<GatewayBean> tempGatewayBeanList = new ArrayList<>();
|
EventListener eventListener = getSearchGatewayEvent(spks, tempGatewayBeanList);
|
EventDispatcher.getInstance().register(topicReply, eventListener);
|
ThreadToolUtils.getInstance().newFixedThreadPool(1).execute(new Runnable() {
|
@Override
|
public void run() {
|
int count = 5;
|
while (0 < count--) {
|
try {
|
//搜索网关
|
serchGatewayOneTime();
|
Thread.sleep(300L);
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}
|
}
|
|
|
//超出次数后移除监听事件
|
EventDispatcher.getInstance().remove(topicReply, eventListener);
|
if (callBack != null) {
|
if (tempGatewayBeanList.size() == 0) {
|
callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_GATEWAY_FAILURE_ERROR));
|
} else {
|
|
callBack.onSuccess(tempGatewayBeanList);
|
}
|
}
|
}
|
});
|
}
|
|
// /**
|
// * 获取搜索网关事件
|
// *
|
// * @param homeId
|
// * @return
|
// */
|
// private EventListener getSearchGatewayEvent(String homeId, final List<GatewayBean> tempGatewayBeanList) {
|
// return getSearchGatewayEvent(homeId,true,tempGatewayBeanList);
|
// }
|
|
|
// /**
|
// * 获取搜索网关事件
|
// *
|
// * @param homeId
|
// * @return
|
// */
|
// private EventListener getSearchGatewayEvent(String homeId, boolean needEmptyHomeIdGateway, final List<GatewayBean> tempGatewayBeanList) {
|
// //注册搜索网关监听
|
// return new EventListener() {
|
// @Override
|
// public void onMessage(Object msg) {
|
// if (!(msg instanceof LinkResponse)) {
|
// return;
|
// }
|
// GatewayBean gateway = getGatewayBeanByResponse((LinkResponse) msg);
|
// if (gateway == null) {
|
// return;
|
// }
|
// gateway.setOnline(true);
|
// gateway.setIsLocalGateWay(true);//本地搜索到的网关标识为本地网关
|
//
|
// //只加载住宅一样的或者网关还没有配置过的,或者不需要住宅id为空的网关
|
// if (homeId.equals(gateway.getHomeId()) || (needEmptyHomeIdGateway == true && TextUtils.isEmpty(gateway.getHomeId()))) {
|
// //更新缓存网关,会记录所有收到的网关,以为了保存网关的IP信息
|
// updateGatewayList(gatewayBeanList, gateway);
|
// //更新当前读取网关的列表,这个列表每次都是清空再读取
|
// updateGatewayList(tempGatewayBeanList, gateway);
|
// }
|
// }
|
// };
|
// }
|
|
/**
|
* 获取搜索网关事件
|
*
|
* @return
|
*/
|
private EventListener getSearchGatewayEvent(List<String> spk, boolean needEmptyHomeIdGateway, final List<GatewayBean> tempGatewayBeanList) {
|
//注册搜索网关监听
|
return new EventListener() {
|
@Override
|
public void onMessage(Object msg) {
|
if (!(msg instanceof LinkResponse)) {
|
return;
|
}
|
GatewayBean gateway = getGatewayBeanByResponse((LinkResponse) msg);
|
if (gateway == null) {
|
return;
|
}
|
gateway.setOnline(true);
|
gateway.setIsLocalGateWay(true);//本地搜索到的网关标识为本地网关
|
if ("av.zk.aiks".equals(gateway.getGatewayType())) {
|
/** 将主网关的homeid设置到埃克斯主机
|
*/
|
// gateway.setHomeId(homeId);
|
}
|
//只加载住宅一样的或者网关还没有配置过的,或者不需要住宅id为空的网关
|
//更新缓存网关,会记录所有收到的网关,以为了保存网关的IP信息
|
updateGatewayList(gatewayBeanList, gateway);
|
//非搜索的网关类似返回
|
if (spk.contains(gateway.getGatewayType())) {
|
//更新当前读取网关的列表,这个列表每次都是清空再读取
|
updateGatewayList(tempGatewayBeanList, gateway);
|
}
|
}
|
};
|
}
|
|
/**
|
* 获取搜索网关事件
|
*
|
* @param homeId
|
* @return
|
*/
|
private EventListener getSearchGatewayEvent(String homeId, List<String> spk, boolean needEmptyHomeIdGateway, final List<GatewayBean> tempGatewayBeanList) {
|
//注册搜索网关监听
|
return new EventListener() {
|
@Override
|
public void onMessage(Object msg) {
|
if (!(msg instanceof LinkResponse)) {
|
return;
|
}
|
GatewayBean gateway = getGatewayBeanByResponse((LinkResponse) msg);
|
if (gateway == null) {
|
return;
|
}
|
gateway.setOnline(true);
|
gateway.setIsLocalGateWay(true);//本地搜索到的网关标识为本地网关
|
if ("av.zk.aiks".equals(gateway.getGatewayType())) {
|
/** 将主网关的homeid设置到埃克斯主机
|
*/
|
// gateway.setHomeId(homeId);
|
}
|
//只加载住宅一样的或者网关还没有配置过的,或者不需要住宅id为空的网关
|
if (homeId.equals(gateway.getHomeId()) || (needEmptyHomeIdGateway == true && TextUtils.isEmpty(gateway.getHomeId()))) {
|
//更新缓存网关,会记录所有收到的网关,以为了保存网关的IP信息
|
updateGatewayList(gatewayBeanList, gateway);
|
//非搜索的网关类似返回
|
if (spk.contains(gateway.getGatewayType())) {
|
//更新当前读取网关的列表,这个列表每次都是清空再读取
|
updateGatewayList(tempGatewayBeanList, gateway);
|
}
|
}
|
}
|
};
|
}
|
|
/**
|
* 获取搜索网关事件 这边不过滤homeId
|
*
|
* @return
|
*/
|
private EventListener getSearchGatewayEvent(List<String> spk, final List<GatewayBean> tempGatewayBeanList) {
|
//注册搜索网关监听
|
return new EventListener() {
|
@Override
|
public void onMessage(Object msg) {
|
if (!(msg instanceof LinkResponse)) {
|
return;
|
}
|
GatewayBean gateway = getGatewayBeanByResponse((LinkResponse) msg);
|
if (gateway == null) {
|
return;
|
}
|
gateway.setIsLocalGateWay(true);//本地搜索到的网关标识为本地网关
|
//升级网关驱动 需要显示所有网关
|
//⚠️这边不需要添加到gatewayBeanList 因为这个是网关离线升级的时候的功能
|
// updateGatewayList(gatewayBeanList, gateway);
|
//更新当前读取网关的列表,这个列表每次都是清空再读取
|
if (spk.contains(gateway.getGatewayType())) {
|
//更新当前读取网关的列表,这个列表每次都是清空再读取
|
updateGatewayList(tempGatewayBeanList, gateway);
|
}
|
}
|
};
|
}
|
|
/**
|
* 更新收到的网关到列表
|
*
|
* @param gatewayBeans
|
* @param gateway 当前收到的网关
|
*/
|
synchronized void updateGatewayList(final List<GatewayBean> gatewayBeans, GatewayBean gateway) {
|
|
if (TextUtils.isEmpty(gateway.getOid()) || TextUtils.isEmpty(gateway.getDevice_mac())) {
|
LogUtils.e("网关Mac或者Oid为空,无效网关");
|
return;
|
}
|
|
boolean isFound = false;//是否在内存中找到网关对象
|
//找出mac一样的网关更新最新数据
|
for (int i = 0; i < gatewayBeans.size(); i++) {
|
GatewayBean tempGatewayBean = gatewayBeans.get(i);
|
if (tempGatewayBean.getDevice_mac().equals(gateway.getDevice_mac())) {
|
/**
|
* 如果已经有uid 需要设置
|
*/
|
if(null!=tempGatewayBean.getUids()&&tempGatewayBean.getUids().size()>0){
|
gateway.setUids(tempGatewayBean.getUids());
|
}
|
isFound = true;
|
gatewayBeans.set(i, gateway);
|
gateway.setAesKey(tempGatewayBean.getAesKey());//保留云端获取的aeskey
|
|
// break;
|
}
|
}
|
|
//清除oid一样,mac不一样的网关缓存。一般是在网关替换的情况空间出现
|
for (int i = 0; i < gatewayBeans.size(); i++) {
|
if (gatewayBeans.get(i).getDevice_mac().equals(gateway.getDevice_mac()) && !gatewayBeans.get(i).getOid().equals(gateway.getOid())) {
|
gatewayBeans.remove(i--);
|
}
|
}
|
|
//没有找到就添加
|
if (!isFound) {
|
gatewayBeans.add(gateway);
|
}
|
}
|
|
|
/**
|
* 获取网关对象
|
*
|
* @param linkResponse
|
* @return
|
*/
|
private GatewayBean getGatewayBeanByResponse(LinkResponse linkResponse) {
|
String data = linkResponse.getData();
|
if (!TextUtils.isEmpty(data)) {
|
final BaseLocalResponse<GatewayBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewayBean>>() {
|
}.getType());
|
return response.getObjects();
|
}
|
return null;
|
}
|
|
|
/*
|
* 绑定网关
|
* */
|
public void SetGatewayRemoteInfo(String master, String mac, String regionUrl, String ip, boolean isEncrypt, HDLLinkCallBack callBack) {
|
String topic = String.format(TopicConstant.GATEWAY_EDIT_REMOTE, mac);
|
|
JsonObject jObject = new JsonObject();
|
if (master.equals("true")) {
|
jObject.addProperty("server_addr", regionUrl);
|
jObject.addProperty("remote", "true");
|
} else {
|
jObject.addProperty("server_addr", "");
|
jObject.addProperty("remote", "false");
|
}
|
|
JsonObject sendJsonObj = new JsonObject();
|
sendJsonObj.add("objects", jObject);
|
String time = String.valueOf(System.currentTimeMillis());
|
sendJsonObj.addProperty("time_stamp", time);
|
sendJsonObj.addProperty("id", IdUtils.getUUId());
|
String sendStr = sendJsonObj.toString();
|
|
LinkRequest message = new LinkRequest(topic, sendStr, isEncrypt);
|
new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
|
@Override
|
public void onSucceed(Object msg) {
|
if (callBack == null) return;
|
callBack.onSuccess("1");
|
}
|
|
@Override
|
public void onFailure(HDLLinkCode hdlLinkCode) {
|
if (callBack == null) return;
|
callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
|
}
|
}, true).send();
|
}
|
|
/*
|
* 绑定网关
|
* */
|
public void SetGatewayRemoteInfo(String homeId, String master, String mac, String regionUrl, String ip, boolean isEncrypt, HDLLinkCallBack callBack) {
|
String topic = String.format(TopicConstant.GATEWAY_EDIT_REMOTE, mac);
|
|
JsonObject jObject = new JsonObject();
|
if (master.equals("true")) {
|
jObject.addProperty("server_addr", regionUrl);
|
jObject.addProperty("remote", "true");
|
} else {
|
jObject.addProperty("server_addr", "");
|
jObject.addProperty("remote", "false");
|
}
|
jObject.addProperty("homeId", homeId);
|
JsonObject sendJsonObj = new JsonObject();
|
sendJsonObj.add("objects", jObject);
|
String time = String.valueOf(System.currentTimeMillis());
|
sendJsonObj.addProperty("time_stamp", time);
|
sendJsonObj.addProperty("id", IdUtils.getUUId());
|
String sendStr = sendJsonObj.toString();
|
|
LinkRequest message = new LinkRequest(topic, sendStr, isEncrypt);
|
new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
|
@Override
|
public void onSucceed(Object msg) {
|
if (callBack == null) return;
|
callBack.onSuccess("1");
|
}
|
|
@Override
|
public void onFailure(HDLLinkCode hdlLinkCode) {
|
if (callBack == null) return;
|
callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
|
}
|
}, true).send();
|
}
|
|
/*
|
* 绑定网关
|
* 编辑homeId给网关
|
* */
|
public void bindGateway(String master, String mac, String homeId, String regionUrl, String ip, boolean isEncrypt, HDLLinkCallBack callBack) {
|
String topic = String.format(TopicConstant.GATEWAY_EDIT_REMOTE, mac);
|
|
JsonObject jObject = new JsonObject();
|
jObject.addProperty("homeId", homeId);
|
// if(master.equals("true")) {
|
// jObject.addProperty("server_addr", regionUrl);
|
// jObject.addProperty("remote", "true");
|
// }else {
|
// jObject.addProperty("server_addr", "");
|
// jObject.addProperty("remote", "false");
|
// }
|
|
JsonObject sendJsonObj = new JsonObject();
|
sendJsonObj.add("objects", jObject);
|
String time = String.valueOf(System.currentTimeMillis());
|
sendJsonObj.addProperty("time_stamp", time);
|
sendJsonObj.addProperty("id", IdUtils.getUUId());
|
String sendStr = sendJsonObj.toString();
|
|
LinkRequest message = new LinkRequest(topic, sendStr, isEncrypt);
|
new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
|
@Override
|
public void onSucceed(Object msg) {
|
if (callBack == null) return;
|
callBack.onSuccess("1");
|
}
|
|
@Override
|
public void onFailure(HDLLinkCode hdlLinkCode) {
|
if (callBack == null) return;
|
callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
|
}
|
}, true).send();
|
}
|
|
/*
|
* 绑定毫米波
|
* 编辑homeId给毫米波
|
* */
|
public void bindMillimeterGateway(String homeId, String regionUrl, String ip, String mac, String master, boolean isEncrypt, HDLLinkCallBack callBack) {
|
String topic = String.format(TopicConstant.GATEWAY_EDIT_LOCAL, mac);
|
|
JsonObject jObject = new JsonObject();
|
jObject.addProperty("master", master);
|
|
JsonObject sendJsonObj = new JsonObject();
|
sendJsonObj.add("objects", jObject);
|
String time = String.valueOf(System.currentTimeMillis());
|
sendJsonObj.addProperty("time_stamp", time);
|
sendJsonObj.addProperty("id", IdUtils.getUUId());
|
String sendStr = sendJsonObj.toString();
|
|
LinkRequest message = new LinkRequest(topic, sendStr, isEncrypt);
|
new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
|
@Override
|
public void onSucceed(Object msg) {
|
if ("true".equals(master)) {
|
String longStr1 = SPUtils.getString("longitude");
|
String latStr1 = SPUtils.getString("latitude");
|
if (!TextUtils.isEmpty(longStr1) && !TextUtils.isEmpty(latStr1)) {
|
HDLLinkLocalSdk.getInstance().gatewayLocation(mac, longStr1, latStr1, isEncrypt, new HDLLinkTCallBack<String>() {
|
@Override
|
public void onSuccess(String data) {
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
}
|
});
|
}
|
}
|
if (callBack == null) return;
|
callBack.onSuccess("1");
|
SetGatewayRemoteInfo(homeId, master, mac, regionUrl, ip, isEncrypt, new HDLLinkCallBack() {
|
@Override
|
public void onSuccess(String msg) {
|
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
|
}
|
});
|
}
|
|
@Override
|
public void onFailure(HDLLinkCode hdlLinkCode) {
|
if (callBack == null) return;
|
callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
|
}
|
}, true).send();
|
}
|
|
/*
|
* 初始化网关
|
* */
|
public void initializeGateway(String mac, String oid, String ip, boolean isEncrypt, HDLLinkCallBack callBack) {
|
String topic = String.format(TopicConstant.GATEWAY_INITIALIZE_REMOTE, oid);
|
|
JsonObject sendJsonObj = new JsonObject();
|
String time = String.valueOf(System.currentTimeMillis());
|
sendJsonObj.addProperty("time_stamp", time);
|
sendJsonObj.addProperty("id", IdUtils.getUUId());
|
JsonObject jObject = new JsonObject();
|
jObject.addProperty("device_mac", mac);
|
sendJsonObj.add("objects", jObject);
|
String sendStr = sendJsonObj.toString();
|
|
LinkRequest message = new LinkRequest(topic, sendStr, isEncrypt);
|
new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
|
@Override
|
public void onSucceed(Object msg) {
|
if (callBack == null) return;
|
callBack.onSuccess("1");
|
}
|
|
@Override
|
public void onFailure(HDLLinkCode hdlLinkCode) {
|
if (callBack == null) return;
|
callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
|
}
|
}, true).send();
|
}
|
|
/*
|
* 设置主从网关标记
|
* */
|
public void setMasterGateway(String regionUrl, String ip, String mac, String master, boolean isEncrypt, HDLLinkCallBack callBack) {
|
String topic = String.format(TopicConstant.GATEWAY_EDIT_LOCAL, mac);
|
|
JsonObject jObject = new JsonObject();
|
jObject.addProperty("master", master);
|
|
JsonObject sendJsonObj = new JsonObject();
|
sendJsonObj.add("objects", jObject);
|
String time = String.valueOf(System.currentTimeMillis());
|
sendJsonObj.addProperty("time_stamp", time);
|
sendJsonObj.addProperty("id", IdUtils.getUUId());
|
String sendStr = sendJsonObj.toString();
|
|
LinkRequest message = new LinkRequest(topic, sendStr, isEncrypt);
|
new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
|
@Override
|
public void onSucceed(Object msg) {
|
if ("true".equals(master)) {
|
String longStr1 = SPUtils.getString("longitude");
|
String latStr1 = SPUtils.getString("latitude");
|
if (!TextUtils.isEmpty(longStr1) && !TextUtils.isEmpty(latStr1)) {
|
HDLLinkLocalSdk.getInstance().gatewayLocation(mac, longStr1, latStr1, isEncrypt, new HDLLinkTCallBack<String>() {
|
@Override
|
public void onSuccess(String data) {
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
}
|
});
|
}
|
}
|
if (callBack == null) return;
|
callBack.onSuccess("1");
|
SetGatewayRemoteInfo(master, mac, regionUrl, ip, isEncrypt, new HDLLinkCallBack() {
|
@Override
|
public void onSuccess(String msg) {
|
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
|
}
|
});
|
}
|
|
@Override
|
public void onFailure(HDLLinkCode hdlLinkCode) {
|
if (callBack == null) return;
|
callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
|
}
|
}, true).send();
|
}
|
|
/**
|
* 设置网关入网从机模式
|
*/
|
public void AuthGateway(String ip, String mac, HDLLinkCallBack callBack) {
|
String topic = String.format(TopicConstant.GATEWAY_AUTH, mac);
|
|
JsonObject sendJsonObj = new JsonObject();
|
String time = String.valueOf(System.currentTimeMillis());
|
sendJsonObj.addProperty("time_stamp", time);
|
sendJsonObj.addProperty("id", IdUtils.getUUId());
|
JsonObject jObject = new JsonObject();
|
jObject.addProperty("spk", "LINKDEVICE");
|
jObject.addProperty("time", "120");
|
sendJsonObj.add("objects", jObject);
|
|
|
String sendStr = sendJsonObj.toString();
|
LinkRequest message = new LinkRequest(topic, sendStr, false);
|
new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
|
@Override
|
public void onSucceed(Object msg) {
|
callBack.onSuccess("");
|
}
|
|
@Override
|
public void onFailure(HDLLinkCode hdlLinkCode) {
|
callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
|
}
|
}, true).send();
|
}
|
|
/**
|
* 设置网关入网从机模式
|
*/
|
public void AuthGateway(String ip, String mac) {
|
String topic = String.format(TopicConstant.GATEWAY_AUTH, mac);
|
|
JsonObject sendJsonObj = new JsonObject();
|
String time = String.valueOf(System.currentTimeMillis());
|
sendJsonObj.addProperty("time_stamp", time);
|
sendJsonObj.addProperty("id", IdUtils.getUUId());
|
JsonObject jObject = new JsonObject();
|
jObject.addProperty("spk", "LINKDEVICE");
|
jObject.addProperty("time", "120");
|
sendJsonObj.add("objects", jObject);
|
|
|
String sendStr = sendJsonObj.toString();
|
LinkRequest message = new LinkRequest(topic, sendStr, false);
|
new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
|
@Override
|
public void onSucceed(Object msg) {
|
}
|
|
@Override
|
public void onFailure(HDLLinkCode hdlLinkCode) {
|
}
|
}, true).send();
|
}
|
|
/**
|
* 设置网关入网从机模式 网关338可以使用
|
*/
|
public void AuthGatewayNewVersion(String ip, String mac, String slaveMac, HDLLinkCallBack callBack) {
|
String topic = String.format(TopicConstant.GATEWAY_AUTH, mac);
|
|
JsonObject sendJsonObj = new JsonObject();
|
String time = String.valueOf(System.currentTimeMillis());
|
sendJsonObj.addProperty("time_stamp", time);
|
sendJsonObj.addProperty("id", IdUtils.getUUId());
|
JsonObject jObject = new JsonObject();
|
jObject.addProperty("spk", "LINKDEVICE");
|
jObject.addProperty("mac", slaveMac);
|
jObject.addProperty("time", "120");
|
sendJsonObj.add("objects", jObject);
|
|
|
String sendStr = sendJsonObj.toString();
|
LinkRequest message = new LinkRequest(topic, sendStr, false);
|
new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
|
@Override
|
public void onSucceed(Object msg) {
|
callBack.onSuccess("");
|
}
|
|
@Override
|
public void onFailure(HDLLinkCode hdlLinkCode) {
|
callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
|
}
|
}, true).send();
|
}
|
|
/*
|
* 获取网关信息
|
* */
|
public void getGatewayInfo(String ip, String mac, boolean isEncrypt, HDLLinkCallBack callBack) {
|
String topic = String.format(TopicConstant.GATEWAY_GET, mac);
|
|
JsonObject sendJsonObj = new JsonObject();
|
String time = String.valueOf(System.currentTimeMillis());
|
sendJsonObj.addProperty("time_stamp", time);
|
sendJsonObj.addProperty("id", IdUtils.getUUId());
|
String sendStr = sendJsonObj.toString();
|
|
LinkRequest message = new LinkRequest(topic, sendStr, isEncrypt);
|
new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
|
@Override
|
public void onSucceed(Object msg) {
|
if (callBack == null) return;
|
callBack.onSuccess("1");
|
}
|
|
@Override
|
public void onFailure(HDLLinkCode hdlLinkCode) {
|
if (callBack == null) return;
|
callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
|
}
|
}, true).send();
|
}
|
|
|
/**
|
* 发送数据到Link网关
|
*
|
* @param ip 网关IP
|
* @param mac 网关mac
|
* @param isEncrypt 是否加密
|
* @param topic 请求主题
|
* @param jObject 负载数据<没有填null></>
|
* @param sendPath 发送路径<类名+方法名>class->methodName</>
|
*/
|
public void sendDataToLinkGateway(String ip, String mac, boolean isEncrypt,
|
String topic, Object jObject, String sendPath, HDLLinkCallBack callBack) {
|
String topicSend = topic.replace("%s", mac);
|
//组装需要发送的数据
|
String sendStr = createSendData(jObject);
|
// LogUtils.i("sendDataToLinkGateway->" + sendPath + "->本地发送\r\n" + topicSend + "\r\n" + sendStr);
|
LinkRequest message = new LinkRequest(topicSend, sendStr, isEncrypt);
|
GatewayBean gatewayBean = this.getLocalGateway(mac);
|
if (gatewayBean != null) {
|
message.setCloudTopic(topic.replace("%s", gatewayBean.getGatewayId()));
|
}
|
new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
|
@Override
|
public void onSucceed(Object msg) {
|
if (callBack == null) return;
|
try {
|
JSONObject jsonObject = new JSONObject(new Gson().toJson(msg));
|
if (jsonObject.has("data")) {
|
callBack.onSuccess(jsonObject.getString("data"));
|
}
|
} catch (Exception e) {
|
callBack.onSuccess(e.getMessage());
|
}
|
// LogUtils.i("sendDataToLinkGateway->"+sendPath+"->本地接收数据\r\n"+msg.toString());
|
}
|
|
@Override
|
public void onFailure(HDLLinkCode hdlLinkCode) {
|
if (callBack == null) return;
|
callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
|
// LogUtils.i("sendDataToLinkGateway->" + sendPath + "->本地接收数据->失败(-200)");
|
}
|
}, true, mac).send();
|
}
|
|
/**
|
* 发送数据到Link网关
|
*
|
* @param mac 网关mac
|
* @param isEncrypt 是否加密
|
* @param topic 请求主题
|
* @param jObject 负载数据<没有填null></>
|
* @param sendPath 发送路径<类名+方法名>class->methodName</>
|
*/
|
public void sendDataToLinkGateway(String mac, boolean isEncrypt,
|
String topic, Object jObject, String sendPath, HDLLinkCallBack callBack) {
|
GatewayBean gatewayBean = this.getLocalGateway(mac);
|
if (gatewayBean == null) {
|
callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
|
return;
|
}
|
String topicSend = topic.replace("%s", mac);
|
//组装需要发送的数据
|
String sendStr = createSendData(jObject);
|
// LogUtils.i("sendDataToLinkGateway->" + sendPath + "->本地发送\r\n" + topicSend + "\r\n" + sendStr);
|
LinkRequest message = new LinkRequest(topicSend, sendStr, isEncrypt);
|
message.setCloudTopic(topic.replace("%s", gatewayBean.getGatewayId()));
|
new HDLConnectHelper(gatewayBean.getIp_address(), message, new HDLConnectHelper.HdlSocketListener() {
|
@Override
|
public void onSucceed(Object msg) {
|
if (callBack == null) return;
|
try {
|
JSONObject jsonObject = new JSONObject(new Gson().toJson(msg));
|
if (jsonObject.has("data")) {
|
callBack.onSuccess(jsonObject.getString("data"));
|
}
|
} catch (Exception e) {
|
callBack.onSuccess(e.getMessage());
|
}
|
// LogUtils.i("sendDataToLinkGateway->"+sendPath+"->本地接收数据\r\n"+msg.toString());
|
}
|
|
@Override
|
public void onFailure(HDLLinkCode hdlLinkCode) {
|
if (callBack == null) return;
|
callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
|
// LogUtils.i("sendDataToLinkGateway->" + sendPath + "->本地接收数据->失败(-200)");
|
}
|
}, true, mac).send();
|
}
|
|
|
/**
|
* 发送数据到Link网关
|
*
|
* @param mac 网关mac
|
* @param topic 请求主题
|
* @param jObject 负载数据<没有填null></>
|
* @param sendPath 发送路径<类名+方法名>class->methodName</>
|
*/
|
public void sendDataToLinkGateway(String mac,
|
String topic, Object jObject, String sendPath, HDLLinkCallBack callBack) {
|
GatewayBean gatewayBean = this.getLocalGateway(mac);
|
if (gatewayBean == null) {
|
callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
|
return;
|
}
|
String topicSend = topic.replace("%s", gatewayBean.getOid());
|
//组装需要发送的数据
|
String sendStr = createSendData(jObject);
|
// LogUtils.i("sendDataToLinkGateway->" + sendPath + "->本地发送\r\n" + topicSend + "\r\n" + sendStr);
|
LinkRequest message = new LinkRequest(topicSend, sendStr, gatewayBean.getIsLocalEncrypt());
|
message.setCloudTopic(topic.replace("%s", gatewayBean.getGatewayId()));
|
new HDLConnectHelper(gatewayBean.getIp_address(), message, new HDLConnectHelper.HdlSocketListener() {
|
@Override
|
public void onSucceed(Object msg) {
|
if (callBack == null) return;
|
try {
|
JSONObject jsonObject = new JSONObject(new Gson().toJson(msg));
|
if (jsonObject.has("data")) {
|
callBack.onSuccess(jsonObject.getString("data"));
|
}
|
} catch (Exception e) {
|
callBack.onSuccess(e.getMessage());
|
}
|
// LogUtils.i("sendDataToLinkGateway->"+sendPath+"->本地接收数据\r\n"+msg.toString());
|
}
|
|
|
@Override
|
public void onFailure(HDLLinkCode hdlLinkCode) {
|
if (callBack == null) return;
|
callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
|
// LogUtils.i("sendDataToLinkGateway->" + sendPath + "->本地接收数据->失败(-200)");
|
}
|
}, true, mac).send();
|
}
|
|
|
/**
|
* 组装需要发送的数据
|
*
|
* @param jObject 负载数据<没有填null>
|
* @return 返回json字符串
|
*/
|
private String createSendData(Object jObject) {
|
//topic = String.format(TopicConstant.GATEWAY_EDIT_LOCAL, mac);
|
JsonObject sendJsonObj = new JsonObject();
|
if (jObject != null) {
|
if (jObject instanceof JsonObject) {
|
sendJsonObj.add("objects", (JsonObject) jObject);
|
} else if (jObject instanceof JsonArray) {
|
sendJsonObj.add("objects", (JsonArray) jObject);
|
} else if (jObject instanceof JSONArray) {
|
JsonArray array = GsonConvert.getGson().fromJson(jObject.toString(), new TypeToken<JsonArray>() {
|
}.getType());
|
sendJsonObj.add("objects", array);
|
}
|
}
|
String time = String.valueOf(System.currentTimeMillis());
|
sendJsonObj.addProperty("time_stamp", time);
|
sendJsonObj.addProperty("id", IdUtils.getUUId());
|
return sendJsonObj.toString();
|
}
|
|
/**
|
* 支持网关类型
|
*
|
* @return 类型列表
|
*/
|
private List<String> getGatewayTypeList() {
|
List<String> typeList = new ArrayList<>();
|
typeList.add("AGATEWAY");//网关
|
typeList.add("av.zk.aiks");//埃克斯影音主机
|
typeList.add("sensor.mmv_sleep");//毫米波spk
|
typeList.add("sensor.mmv_pose");//毫米波spk
|
typeList.add("sensor.hdl_mmw_pose");//Wi-Fi毫米波ZT版本spk
|
return typeList;
|
}
|
|
private List<String> getWifiMillimeterZTTypeList() {
|
List<String> typeList = new ArrayList<>();
|
typeList.add("sensor.hdl_mmw_pose");//Wi-Fi毫米波ZT版本spk
|
return typeList;
|
}
|
}
|