设备第一次登录生成的clientid和第二次的clientid不一致

dou号

问题描述

设备登录后绑定对应的设备和clientid,称此时的clientid为id1,设备30分钟会发送一次登录指令,当设备再次发送登录指令时,有时候会出现clientid不一样的情况,称此时的clientid为id2,,那么此时就出现了一台设备,两个clientid的情况,此时设备的心跳指令会在id2的通道进行收发,那么超时之后,id1就会触发onclose。触发onclose时,会更新数据库里面设备的状态,这样就会出现设备在线,但数据库里面的设备离线的情况,所以我需要在onclose里面需要判断设备是否绑定有多个clientid,如果有多个则不去更新数据库设备的状态,我该如何判断呢?可以调用Gateway::getClientIdByUid这个函数吗?

310 2 1
2个回答

Gin

第二次登陆把 clientID2 存到库里边 覆盖clientid1

  • dou号 2024-06-25

    请问怎么覆盖

  • Gin 2024-06-25

    存数据库

  • dou号 2024-06-25

    我这边clientid并没有写入数据库的操作,我可以在登录时调用Gateway::getClientIdByUid,
    如果返回的clientid和当前clientid不一致,将之前的clientid进行解绑,这样可以吗?如果解绑了,$session还有效吗?
    或者我通过Gateway::closeClient($client_id)将第一次登录的clientid关闭?

  • Gin 2024-06-25

    掉线后 getClientIdByUid 是获取不到之前的 clientid的

  • dou号 2024-06-25

    现在是设备新的登录指令过来了但是之前的clientid还没有掉线,在心跳检测时间内,两个clientid同时存在的情况

  • Gin 2024-06-25

    你这是逻辑处理的问题, 第一次登陆 存$_SESSION信息(设备序列号啥的), 第二次登陆 判断session是否设置了信息, 设置则不处理

  • dou号 2024-06-25

    第二次登录后clientid已经变了,是不是意味着通道也变了,那么第一次登录的clientid所在的通道的session在第二次登录的clientid里面,是无法读取吧

  • Gin 2024-06-25

    为什么会变, 值客户端主动断开连接了? 重连了? 不同的clientid中的session不互通

  • dou号 2024-06-25

    这边也不太清楚,可能涉及到设备的问题,我这边监控onmessage里面的信息,发现设备在未断开的时候,发送了一条新的登录指令过来,新的clientid

  • Gin 2024-06-25

    你看看 onconnect 连接了几次

  • dou号 2024-06-25

    谢谢解答

walkor

一般做法如下:
1、设备上线时用Gateway::bindUid($client_id, $device_id);将client_id与设备id绑定
2、client_id断开时通过Gateway::isUidOnline($device_id); 判断设备是否离线
3、给设备发送数据的时候直接用Gateway::sendToUid($device_id);发送数据

client_id是临时数据,不应该存数据库

  • dou号 2024-06-25

    第二条,是指在onclose里面调用Gateway::isUidOnline($device_id)来判断设备是否离线是吗

  • walkor 2024-06-25

  • dou号 2024-06-25

    好的,谢谢

×
🔝