有個設(shè)備收發(fā)數(shù)據(jù)均使用16進制數(shù)據(jù),我用gateway來發(fā)送16進制數(shù)據(jù)時,設(shè)備沒有任何消息返回。
前臺發(fā)送一段16進制序列,比如 55AA0002000A0C 。
我在網(wǎng)上查了很多發(fā)送16進制數(shù)據(jù)的方法,第一種發(fā)送數(shù)據(jù)前用hex2bin($data)將16進制數(shù)據(jù)轉(zhuǎn)換成二進制發(fā)送;第二種則是pack("H*",$data);第三種是嘗試將序列分解成2個一組的數(shù)組,然后使用chr(hexdec($data[$i]))的方式循環(huán)發(fā)送,這3種方法用gateway發(fā)送之后,設(shè)備都沒有反應(yīng)。之后我嘗試用我自己寫的一個tcp socket的demo來用這3種方法發(fā)送,設(shè)備都能成功返回數(shù)據(jù)。
這是怎么回事?有什么辦法解決嗎
你發(fā)送簡單的數(shù)據(jù) 你硬件那邊能收到數(shù)據(jù)嗎? 就比如你發(fā)送123456這樣簡單的數(shù)據(jù)過去看看你的硬件能否接收到數(shù)據(jù) 我用你說的第一中就可以 你看看你的web端后服務(wù)器端和你的終端是否能互通
那你怎么確保你的三端是互通的?總不能靠猜的吧 如果你的三端都是沒有互通的那么你在怎么發(fā)送數(shù)據(jù)你的硬件也是沒發(fā)收到數(shù)據(jù)啊 你現(xiàn)在用tcp能返回數(shù)據(jù)但是你用web卻不能 那么只能說明你用web發(fā)送的時候你硬件那邊根本沒有接收到你發(fā)的數(shù)據(jù)他又怎么可能給你返回數(shù)據(jù)呢 是不是?
1、gateway 用tcp協(xié)議。
2、接收數(shù)據(jù)的時候在Events.php里的onMessage里接收
3、改Events.php里的代碼要執(zhí)行 php start.php reload重新加載才能生效
4、改start_gateway.php的代碼要 php start.php restart重啟才生效
注意這幾點就不會有問題了
設(shè)備端用的就是tcp協(xié)議,web端用websocket協(xié)議。我是使用兩個worker,端口不同,但同在一個event.php里的onmessage處理數(shù)據(jù),web端通過MySQL操作能成功獲取設(shè)備端的client_id,所以發(fā)送對象沒有問題,web端要發(fā)送的16進制數(shù)據(jù)onmessage也能收的到,設(shè)備端一直在線沒有掉線的情況。
因為gateway不是后臺啟動,每次調(diào)試我都是直接關(guān)閉然后重新打開的。
問題還是在于怎么發(fā)16進制數(shù)據(jù)過去才能讓設(shè)備端識別然后返回數(shù)據(jù)。
$bin_string=pack('H*','7e'. bin2hex($tmp).'7e');
Gateway::sendToClient($this->clientId,$response);
這樣試試
https://gitee.com/back0893/jt808 可以參考這個網(wǎng)站