client_id重复

dou号

如图所示,我的两台设备50127和50128,在onMessage()里打印出对应的client_id时,却发现两台设备对应的client_id一样,之前一直没遇到过这种情况。文档中说client_id是唯一的,请问大神这是什么原因导致的?

2102 1 0
1个回答

blogdaren

理论上不应该出现这种情况, 因为 gateway 的 client_id 唯一性策略是:  
gateway_local_ip + gateway_local_port + connection_id

  • dou号 2019-10-17

    能解释一下这三个参数吗?我又试了一下,出现这个问题可能跟我的方式有关。我是使用软件模拟设备发送指令,软件连接上后,接连发送不同设备的登录指令,可能因为中间没有断开重连,所以client_id不一样,我试了软件连接后,发送设备指令,然后断开重连,再发送另一台设备指令,两台设备的client_id就不一样了。

  • blogdaren 2019-10-17

    顺次含义分别是:

    1. gateway所在服务器的每个gateway进程的内部监听IP
    2. gateway所在服务器的每个gateway进程的内部监听端口
    3. 每个客户端到gateway进程的连接ID
  • dou号 2019-10-21

    大神,按照这个策略,如果我的设备在同一个局域网内,那么连到gateway进程的id会不会一样啊,这样的话client_id也就可能相同了

  • blogdaren 2019-10-21

    那么连到gateway进程的id, 即$connection_id 可能会相同,但是 $client_id 不会相同的。

  • dou号 2019-10-21

    @614:$connection_id相同的话,如果设备连的是同一个gateway进程,那么$client_id不就一样了吗?

  • blogdaren 2019-10-21

    当连接同一个 gateway进程时, $connection_id 不可能相同;
    当连接到不同的gateway进程时, $connection_id 可能相同;

  • dou号 2019-10-21

    每个gateway进程的内部监听ip和端口都是不一样的是吗

  • blogdaren 2019-10-21

    对,每个 gateway进程内部监听的的 ip:port 组合是不一样的。

  • dou号 2019-10-21

    好的,谢谢解答

  • blogdaren 2019-10-21

    OK, 不客气。

  • dou号 2019-10-21

    @614:大神,还有一个问题,我的设备在登录的时候会将设备id存入session,然后去更新我的数据库,显示已登录,设备断开的时候按照手册说会出发onclose()函数,我在该函数里面先根据session去取设备id,然后根据设备id去更新我数据库里面的设备状态。这是我目前的一个设备状态更新逻辑,但是发现有部分设备出现了明明已经掉线,但是却并没有更新数据库的设备状态,现在怀疑是不是出发onclose()的时候没有获取到session值,请问大神有什么看法

  • blogdaren 2019-10-21

    逻辑看上去没有什么问题,但是操作onclose回调要注意两点:
    1、确保任何断必要情况下都能正常触发该回调,否则参看手册心跳部分说明;
    2、操作session 要用 $_SESSION,不能用 Gateway::getSession();
    3、还有可能就是出现在你数据库业务逻辑自身更新的环节;

    如果还不行,那只能你自己追踪日志了,没有上下文环境,更不好说了。

  • dou号 2019-10-21

    @614:好的,再次感谢

年代过于久远,无法发表回答
🔝