package com.hdl.sdk.hdl_core.HDLDeviceManger.Core;
|
|
import android.util.Log;
|
|
import java.io.IOException;
|
import java.net.DatagramPacket;
|
import java.net.DatagramSocket;
|
import java.net.InetAddress;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Timer;
|
import java.util.TimerTask;
|
|
|
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.ZigbeeBean.ZigbeeGatewayInfoBean;
|
import com.hdl.sdk.hdl_core.HDLDeviceManger.Callback.PushCallback;
|
import com.hdl.sdk.hdl_core.Util.LogUtil.HDLLog;
|
import com.hdl.sdk.hdl_core.Util.NetUtil.NetWorkUtil;
|
import com.hdl.sdk.hdl_core.Util.TransformUtil.StringUtil;
|
|
import org.eclipse.paho.client.mqttv3.MqttClient;
|
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
|
import org.eclipse.paho.client.mqttv3.MqttException;
|
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
|
|
public class SearchZigbeeGateway {
|
private static final String TAG = "SearchZigbeeGateway";
|
public static List<ZigbeeGatewayInfoBean> zigbeeGatewayInfoBeanList = new ArrayList<>();
|
public static Timer searchTimer = null;
|
private static DatagramSocket datagramSocket; // 数据报套接字
|
private static boolean isStop = false;
|
|
public interface OnSearchListener {
|
void onSuccess(List<ZigbeeGatewayInfoBean> zigbeeGatewayInfoBeanList);
|
|
void onEorror(Exception e);
|
}
|
|
public static void release() {
|
if (datagramSocket != null) {
|
isStop = true;
|
datagramSocket.disconnect();
|
datagramSocket = null;
|
}
|
}
|
|
public static void sendSearchGateway(final OnSearchListener onSearchListener) {
|
if (searchTimer != null) {
|
searchTimer.cancel();
|
searchTimer.purge();
|
searchTimer = null;
|
}
|
zigbeeGatewayInfoBeanList.clear();
|
final ZigbeeGatewayInfoBean zigbeeGatewayInfoBean = new ZigbeeGatewayInfoBean();
|
zigbeeGatewayInfoBean.setCount(0);
|
searchTimer = new Timer();
|
searchTimer.schedule(new TimerTask() {
|
@Override
|
public void run() {
|
if (zigbeeGatewayInfoBean.getCount() < 20) {
|
zigbeeGatewayInfoBean.setCount(zigbeeGatewayInfoBean.getCount() + 1);
|
try {
|
byte[] sendBytes = new byte[44];
|
sendBytes[0] = (byte) 0xFE;
|
sendBytes[1] = 0x29;
|
sendBytes[2] = 0;
|
sendBytes[3] = 0;
|
sendBytes[4] = 0;
|
sendBytes[5] = 0;
|
sendBytes[6] = 0;
|
//获取所有网关(无需houseID模式),后面要改
|
sendBytes[7] = 0x67;
|
sendBytes[8] = 0x65;
|
sendBytes[9] = 0x74;
|
sendBytes[10] = 0x61;
|
sendBytes[11] = 0x6c;
|
sendBytes[12] = 0x6c;
|
sendBytes[13] = 0x67;
|
sendBytes[14] = 0x77;
|
for (int i = 15; i < sendBytes.length - 1; i++) {
|
sendBytes[i] = 0;
|
}
|
sendBytes[sendBytes.length - 1] = 0x02;
|
//Log.d(TAG, "sendBytes: "+StringUtil.ByteArrToHex(sendBytes,0,sendBytes.length));
|
InetAddress address = InetAddress.getByName(NetWorkUtil.getLocalBroadCast());
|
DatagramPacket packet = new DatagramPacket(
|
sendBytes,
|
sendBytes.length,
|
address, 7624);
|
datagramSocket = new DatagramSocket();
|
datagramSocket.send(packet);
|
|
byte[] receiveBytes = new byte[1024];
|
DatagramPacket dataPacket = new DatagramPacket(receiveBytes, receiveBytes.length);
|
datagramSocket.receive(dataPacket);
|
//是否主网关-01为主网关-00为从网关
|
String IsDomain = StringUtil.Byte2Hex(dataPacket.getData()[44]);
|
int headLength = 1 + 2 + 4 + 36 + 1 + 1 + 4;
|
if (receiveBytes.length > headLength) {
|
//网关名称长度
|
String str = StringUtil.Byte2Hex(dataPacket.getData()[49]);
|
int GwNameLength = Integer.parseInt(str, 16);
|
|
//网关名称
|
byte[] gwnamebyte = new byte[GwNameLength];
|
for (int i = 0; i < GwNameLength; i++) {
|
gwnamebyte[i] = dataPacket.getData()[i + 50];
|
}
|
String GwName = new String(gwnamebyte, 0, gwnamebyte.length);
|
|
//网关id长度
|
String str1 = StringUtil.Byte2Hex(dataPacket.getData()[50 + GwNameLength]);
|
int GwIdLength = Integer.parseInt(str1, 16);
|
|
//获取网关id
|
byte[] gatewayId = new byte[GwIdLength];
|
for (int i = 0; i < GwIdLength; i++) {
|
gatewayId[i] = dataPacket.getData()[i + 51 + GwNameLength];
|
}
|
|
if (gatewayId.length > 1) {
|
String stringGateWayId = new String(gatewayId, 0, gatewayId.length);
|
Log.d(TAG, "网关id: " + stringGateWayId);
|
|
ZigbeeGatewayInfoBean zigbeeGatewayInfoBean = new ZigbeeGatewayInfoBean();
|
zigbeeGatewayInfoBean.setGatewayId(stringGateWayId);
|
zigbeeGatewayInfoBean.setIpAddress(dataPacket.getAddress().getHostAddress());
|
if (IsDomain.equals("01")) {
|
zigbeeGatewayInfoBean.setDomain(true);
|
} else {
|
zigbeeGatewayInfoBean.setDomain(false);
|
}
|
zigbeeGatewayInfoBean.setGatewayName(GwName);
|
boolean isExit = false;
|
for (int i = 0; i < zigbeeGatewayInfoBeanList.size(); i++) {
|
if (zigbeeGatewayInfoBeanList.get(i).getGatewayId()
|
.equals(zigbeeGatewayInfoBean.getGatewayId())) {
|
isExit = true;
|
break;
|
}
|
}
|
if (!isExit) {
|
zigbeeGatewayInfoBeanList.add(zigbeeGatewayInfoBean);
|
Log.d(TAG, "addList:成功添加 ");
|
}
|
}
|
}
|
datagramSocket.close();
|
} catch (Exception e) {
|
Log.d(TAG, "run: " + e.toString());
|
e.printStackTrace();
|
datagramSocket.close();
|
onSearchListener.onEorror(e);
|
}
|
} else {
|
if (searchTimer != null) {
|
//执行完搜索后到这
|
searchTimer.cancel();
|
searchTimer.purge();
|
searchTimer = null;
|
onSearchListener.onSuccess(SearchZigbeeGateway.zigbeeGatewayInfoBeanList);
|
}
|
}
|
}
|
}, 1, 500);
|
}
|
}
|