Bootstrap

硬件设备心跳问题排查

问题:心跳永久断开 重试机制也未生效
参与方:设备硬件方  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;
    }
}
;