有个设备收发数据均使用16进制数据,我用gateway来发送16进制数据时,设备没有任何消息返回。
前台发送一段16进制序列,比如 55AA0002000A0C 。
我在网上查了很多发送16进制数据的方法,第一种发送数据前用hex2bin($data)将16进制数据转换成二进制发送;第二种则是pack("H*",$data);第三种是尝试将序列分解成2个一组的数组,然后使用chr(hexdec($data[$i]))的方式循环发送,这3种方法用gateway发送之后,设备都没有反应。之后我尝试用我自己写的一个tcp socket的demo来用这3种方法发送,设备都能成功返回数据。
这是怎么回事?有什么办法解决吗
你发送简单的数据 你硬件那边能收到数据吗? 就比如你发送123456这样简单的数据过去看看你的硬件能否接收到数据 我用你说的第一中就可以 你看看你的web端后服务器端和你的终端是否能互通
这个是不行的,设备端只处理固定格式的16进制数据。
那你怎么确保你的三端是互通的?总不能靠猜的吧 如果你的三端都是没有互通的那么你在怎么发送数据你的硬件也是没发收到数据啊 你现在用tcp能返回数据但是你用web却不能 那么只能说明你用web发送的时候你硬件那边根本没有接收到你发的数据他又怎么可能给你返回数据呢 是不是?
1、gateway 用tcp协议。
2、接收数据的时候在Events.php里的onMessage里接收
3、改Events.php里的代码要执行 php start.php reload重新加载才能生效
4、改start_gateway.php的代码要 php start.php restart重启才生效
注意这几点就不会有问题了
设备端用的就是tcp协议,web端用websocket协议。我是使用两个worker,端口不同,但同在一个event.php里的onmessage处理数据,web端通过MySQL操作能成功获取设备端的client_id,所以发送对象没有问题,web端要发送的16进制数据onmessage也能收的到,设备端一直在线没有掉线的情况。
因为gateway不是后台启动,每次调试我都是直接关闭然后重新打开的。
问题还是在于怎么发16进制数据过去才能让设备端识别然后返回数据。
你用Gateway::sendToAll(hex2bin('16进制数据')); 试下,排除client_id错误问题
楼主解决了吗?我这里遇到了一模一样的问题
$bin_string=pack('H*','7e'. bin2hex($tmp).'7e');
Gateway::sendToClient($this->clientId,$response);
这样试试
https://gitee.com/back0893/jt808 可以参考这个网站