用getwayworker和手表端建立一個(gè)長(zhǎng)連接,手表每次開機(jī)會(huì)給服務(wù)器發(fā)過(guò)來(lái)登錄包,登錄包里面還有設(shè)備id,后面的數(shù)據(jù)不會(huì)再有設(shè)備id,服務(wù)器進(jìn)行相關(guān)處理綁定client_id和設(shè)備id并記錄,以后接收的數(shù)據(jù)依靠client_id區(qū)分是哪臺(tái)設(shè)備?,F(xiàn)在遇到一個(gè)問(wèn)題,這個(gè)client_id突然發(fā)生變化,導(dǎo)致在系統(tǒng)中根據(jù)此client_id找不到相應(yīng)的設(shè)備id,并且長(zhǎng)時(shí)間由于之前的client_id沒(méi)有數(shù)據(jù)傳輸斷開連接,這個(gè)手表的數(shù)據(jù)沒(méi)有辦法再進(jìn)行判斷存儲(chǔ)。其實(shí)就是手表扔和服務(wù)器進(jìn)行著連接,client_id在沒(méi)有經(jīng)過(guò)登錄包情況下突然發(fā)生變化導(dǎo)致系統(tǒng)根據(jù)這個(gè)新的client_id找不到設(shè)備,致使這臺(tái)設(shè)備的數(shù)據(jù)也就中斷。有沒(méi)有大神遇到過(guò)這種問(wèn)題,知道怎么解決
憑設(shè)備id,向手表推送數(shù)據(jù)。
client_id變了說(shuō)明連接斷了,重新發(fā)起鏈接了,可以在close和connect里面重新處理client_id和設(shè)備id的關(guān)系映射
clientID是一個(gè) buff,內(nèi)部包含了gateway的ip端口和numIndex 打包壓縮成hex的,你可以反向解析
業(yè)務(wù)不應(yīng)該依賴client_id,應(yīng)該依賴設(shè)備id
。client_id是一個(gè)臨時(shí)id,不應(yīng)該存儲(chǔ)使用。
正確做法,設(shè)備發(fā)起登錄時(shí)利用 Gateway::bindUid($client_id, $設(shè)備id);
綁定,
然后以后所有操作都是操作設(shè)備id,比如發(fā)送信息用 Gateway::sendToUid($設(shè)備id, 數(shù)據(jù))
,
判斷設(shè)備是否在線用 Gateway::isUidOnline(設(shè)備id);
Gateway::bindUid($client_id, $設(shè)備id)這個(gè)我已經(jīng)綁定過(guò),如果通過(guò)服務(wù)器給手表下發(fā)指令是可以直接用設(shè)備id下發(fā)的,還有一個(gè)就是要接收設(shè)備傳出過(guò)來(lái)的tcp數(shù)據(jù),不知道什么情況這個(gè)接收數(shù)據(jù)老是中斷,現(xiàn)在排查出來(lái)的原因是兩個(gè):(1)設(shè)備網(wǎng)絡(luò)不好會(huì)斷開(2)傳輸過(guò)來(lái)的數(shù)據(jù)連接id突然發(fā)生變化,這個(gè)是在沒(méi)有發(fā)生登錄情況下連接id變了,沒(méi)辦法發(fā)生綁定關(guān)系,所以系統(tǒng)拿著這個(gè)連接id找不到相應(yīng)的設(shè)備致使傳輸數(shù)據(jù)中斷
對(duì)接長(zhǎng)連接,有幾個(gè)基本操作:
1.連接時(shí)候用設(shè)備id和客戶端id,請(qǐng)求接口綁定;
2.做好心跳
3.做好重連機(jī)制(低段位的肯定在onClose注冊(cè)個(gè)斷線重連,這種基本就是傻)
重連機(jī)制:
1.創(chuàng)建一個(gè)全局生命周期的定時(shí)器(注意只能創(chuàng)建一次,無(wú)限制創(chuàng)建定時(shí)器客戶端會(huì)崩)
2.連接建立后,周期性的每30s向服務(wù)器發(fā)送心跳包,比如ping
3.服務(wù)器收到客戶端心跳包ping時(shí),回復(fù)pong
4.客戶端僅記錄最后收到pong的時(shí)間戳
4.由全局定時(shí)器檢查網(wǎng)絡(luò)狀況是否良好
if (lastPong + 30 *1.5 < now) {
//超時(shí)重連 todo
}
謝謝啦 知道是設(shè)備的連接id突然變了導(dǎo)致的,但是沒(méi)找下好的解決辦法,我嘗試把新的連接id摧毀,發(fā)現(xiàn)摧毀后設(shè)備會(huì)重新自動(dòng)發(fā)起連接,倒是也能解決我的問(wèn)題,謝謝大神的方案