如图所示,我的两台设备50127和50128,在onMessage()里打印出对应的client_id时,却发现两台设备对应的client_id一样,之前一直没遇到过这种情况。文档中说client_id是唯一的,请问大神这是什么原因导致的?
理论上不应该出现这种情况, 因为 gateway 的 client_id 唯一性策略是: gateway_local_ip + gateway_local_port + connection_id
能解释一下这三个参数吗?我又试了一下,出现这个问题可能跟我的方式有关。我是使用软件模拟设备发送指令,软件连接上后,接连发送不同设备的登录指令,可能因为中间没有断开重连,所以client_id不一样,我试了软件连接后,发送设备指令,然后断开重连,再发送另一台设备指令,两台设备的client_id就不一样了。
顺次含义分别是:
大神,按照这个策略,如果我的设备在同一个局域网内,那么连到gateway进程的id会不会一样啊,这样的话client_id也就可能相同了
那么连到gateway进程的id, 即$connection_id 可能会相同,但是 $client_id 不会相同的。
@614:$connection_id相同的话,如果设备连的是同一个gateway进程,那么$client_id不就一样了吗?
当连接同一个 gateway进程时, $connection_id 不可能相同; 当连接到不同的gateway进程时, $connection_id 可能相同;
每个gateway进程的内部监听ip和端口都是不一样的是吗
对,每个 gateway进程内部监听的的 ip:port 组合是不一样的。
好的,谢谢解答
OK, 不客气。
@614:大神,还有一个问题,我的设备在登录的时候会将设备id存入session,然后去更新我的数据库,显示已登录,设备断开的时候按照手册说会出发onclose()函数,我在该函数里面先根据session去取设备id,然后根据设备id去更新我数据库里面的设备状态。这是我目前的一个设备状态更新逻辑,但是发现有部分设备出现了明明已经掉线,但是却并没有更新数据库的设备状态,现在怀疑是不是出发onclose()的时候没有获取到session值,请问大神有什么看法
逻辑看上去没有什么问题,但是操作onclose回调要注意两点: 1、确保任何断必要情况下都能正常触发该回调,否则参看手册心跳部分说明; 2、操作session 要用 $_SESSION,不能用 Gateway::getSession(); 3、还有可能就是出现在你数据库业务逻辑自身更新的环节;
如果还不行,那只能你自己追踪日志了,没有上下文环境,更不好说了。
@614:好的,再次感谢
理论上不应该出现这种情况, 因为 gateway 的 client_id 唯一性策略是:
gateway_local_ip + gateway_local_port + connection_id
能解释一下这三个参数吗?我又试了一下,出现这个问题可能跟我的方式有关。我是使用软件模拟设备发送指令,软件连接上后,接连发送不同设备的登录指令,可能因为中间没有断开重连,所以client_id不一样,我试了软件连接后,发送设备指令,然后断开重连,再发送另一台设备指令,两台设备的client_id就不一样了。
顺次含义分别是:
大神,按照这个策略,如果我的设备在同一个局域网内,那么连到gateway进程的id会不会一样啊,这样的话client_id也就可能相同了
那么连到gateway进程的id, 即$connection_id 可能会相同,但是 $client_id 不会相同的。
@614:$connection_id相同的话,如果设备连的是同一个gateway进程,那么$client_id不就一样了吗?
当连接同一个 gateway进程时, $connection_id 不可能相同;
当连接到不同的gateway进程时, $connection_id 可能相同;
每个gateway进程的内部监听ip和端口都是不一样的是吗
对,每个 gateway进程内部监听的的 ip:port 组合是不一样的。
好的,谢谢解答
OK, 不客气。
@614:大神,还有一个问题,我的设备在登录的时候会将设备id存入session,然后去更新我的数据库,显示已登录,设备断开的时候按照手册说会出发onclose()函数,我在该函数里面先根据session去取设备id,然后根据设备id去更新我数据库里面的设备状态。这是我目前的一个设备状态更新逻辑,但是发现有部分设备出现了明明已经掉线,但是却并没有更新数据库的设备状态,现在怀疑是不是出发onclose()的时候没有获取到session值,请问大神有什么看法
逻辑看上去没有什么问题,但是操作onclose回调要注意两点:
1、确保任何断必要情况下都能正常触发该回调,否则参看手册心跳部分说明;
2、操作session 要用 $_SESSION,不能用 Gateway::getSession();
3、还有可能就是出现在你数据库业务逻辑自身更新的环节;
如果还不行,那只能你自己追踪日志了,没有上下文环境,更不好说了。
@614:好的,再次感谢