我有一台设备与emq进行连接后,因为网络波动原因,导致了异常掉线,此时,由于设置的keep_alive时间未到,在离线订阅事件不能够及时的告知服务器设备掉线了,如果此时我调用 /clients/{clientId} 接口去获取这台设备的信息,包括在离线信息,emq会主动的去检测设备在离线吗?还是说一定需要keep_alive时间到了之后才会去更新设备的状态
在连接建立成功后,如果服务器没有在 Keep Alive 的 [n, n+1) 倍时间内收到来自客户端的任何包,则会认为和客户端之间的连接出现了问题,此时服务器便会断开和客户端的连接。
- 离线是周期性检查,所以实际触发实在在 [n, n+1) 倍范围内
设备连接成功后,在指定的 keep-alive 时间内没有发送数据包,那么会认为设备与EMQ断开连接,这个可以理解
如果我调用了 /clinets/{clientId} 这个接口获取对应客户端信息的话,里面包含了connected这个字段,这个字段是从哪里来的?是通过存储在本地数据库里直接获取的,还是会主动的去进行离线检查?
如果是存在数据库里的话,那可能获取到的连接状态不是最新的,可能得到的结果不是准确的,而如果主动的去进行离线检查的话,如果设备异常断开连接,就可以感知到,获取到的状态是最新的、最准确的
调用/clients/{clientId}后,即便有主动检查,状态也不会是最真实的。因为无论是主动获取还是等webhook通知都需要一个状态评判标准,假如仍以keep-alive的n倍为评判标准的话,还是有误差的。
主动离线检查的时间点正好在keep-alive的n倍时间内的话,还是被认为设备是在线的。
除非:设备端有个判断机制认为是网络断掉情况下,主动断掉与mqtt的链接等,mqtt会第一时间感知到。
设备在断电、网络断掉等情况下,就算有这个主动断开的机制,也没法和EMQ进行通信了啊
我疑惑的点 /clients/{clientId} 接口获取设备状态会不会主动的去检查这个链接是否存在,比如发个数据包给对应的设备,看下设备是否有响应或者别的思路
因为当前的需要,对设备实际状态和API需要是强一致的,如果出现上面的情况, /clients/{clientId}接口没法给出准确的状态的话,就会出问题
我在 dashboard 界面看到的现象是,通过 dashboard 去查询对应的设备,发现在线后,将设备断电,重新搜索这台设备,这个时候就查询不到这台设备了,重复了多次都是如此,而且应该都还在keep-alive的时间内,所以就有了这个疑问