问题:心跳永久断开 重试机制也未生效
参与方:设备硬件方 sdk提供方(放在平台方代码中) 平台方
提出的疑点:
1.网络问题
2.设备不发送心跳
3.sdk处理心跳失败
4.平台心跳连接池加入移除不对
5.平台下发任务导致心跳失败
硬件和sdk通过mqtt协议维持心跳 http上报事件
硬件接入sdk,回调加入连接池 断开回调移除连接池 心跳失败三次移除连接池
设备方抓包 sdk方抓包
tcpdump -i any -n -vvv src x.x.x -w capture.pcap 抓指定源ip
tcpdump -i any port 7660 -w capture.pcap 抓指定端口
wireshark分析包
tcpdump -i eth0 tcp port 3000 -A -w capture.pcap 指定网卡协议 端口
将时间更改为 UTC 要更改时间显示格式,请转到“视图”菜单,操作到“时间显示格式”,然后将值从“自捕获开始以来的秒数”更改为“UTC 日期和时间”。
ip.src_host == x.x.x or ip.src_host == x.x.x 过滤
分析设备最后一次发心跳时间很久之后停止发送了,原因是sdk网络波动导致心跳失败回调接口未正确处理数据
平台想下发快一点 并发下发任务 设备方并发处理能力有问题
查看sdk代码和接口文档
sdk启动过程 server类 报警类
main{
CreateInstance;
//初始化 回调函数
StartListen
}
private static boolean CreateInstance()
{
if(net== null)
{
synchronized (SDK.class)
{
String strDllPath = "";
if(osSelect.isWindows())
strDllPath = System.getProperty("user.dir") + "\\lib\\.dll";
else if(osSelect.isLinux())
//Linux系统加载库路径
strDllPath = System.getProperty("user.dir") + "/lib/.so";
hCNet = (HCNet) Native.loadLibrary(strDllPath, SDK.class);
}
}
return true;
}
FRegisterCallBack 认证 注册 关闭等流程
平台方维持连接池 注册加入连接池 关闭移除连接池 定时任务3次失败移除连接池(自己判断心跳)
/**
* 单例模式
*/
public class DeviceStore implements Serializable {
/** 构造器 **/
private static final DeviceStore instance = new DeviceStore();
/**
* 单例
*/
public static DeviceStore getInstance() {
return instance;
}
private List<String> deviceIds;
public int add(String deviceId) {
if(deviceIds == null) {
// null时初始化
deviceIds = new ArrayList<String>();
}
if(StringUtils.isNotBlank(deviceId)) {
// 添加成功
deviceIds.add(deviceId);
return 1;
} else {
return 0;
}
}
public int remove(String deviceId) {
if(deviceIds == null || deviceIds.isEmpty()) {
return -1;
} else {
if(deviceIds.remove(deviceId)) {
// 正常删除
return 1;
} else {
return 0;
}
}
}
public List<String> get() {
return deviceIds;
}
}