用workerman和设备建立连接后给设备发请求,收不到设备响应的数据 详情报文如图,蓝色框的是和设备建立连接后我这边发送的请求,红色框的是设备的响应,而workerman onMessage收到的还是绿色框的数据。
完整的PHP代码:
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
global $http_worker;
// 创建一个Worker监听8001端口,使用http协议通讯
$http_worker = new Worker("http://0.0.0.0:8001");
// 启动4个进程对外提供服务
$http_worker->count = 1;
// 新增加一个属性,用来保存uid到connection的映射
$http_worker->uidConnections = array();
// 接收到浏览器发送的数据时回复hello world给浏览器
$http_worker->onMessage = function (TcpConnection $connection, Request $request) use ($http_worker) {
// 向浏览器发送hello world
if ($request->method() === 'PUT') {
$device = json_decode($request->rawBody(), true);
if (isset($device['SerialNumber'])) {
// 保存uid到connection的映射,这样可以方便的通过uid查找connection
$http_worker->uidConnections[$device['SerialNumber']] = $connection;
}
// 收到设备基础信息
var_dump($device);
$res = $connection->send('');
var_dump($res);
} else if ($request->method() === 'GET') {
/**
* 和设备建立连接后,用浏览器触发给设备发请求 http://127.0.0.1:8001/?id=21024125409SM5003983
*/
$serialNumber = $request->get('id'); // 21024125409SM5003983
if (isset($http_worker->uidConnections[$serialNumber])) {
echo 'send to device' . PHP_EOL;
$uri = '/SDCAPI/V1.0/AuthIaas/ActivaionStatus';
$send_buffer = "GET $uri HTTP/1.1\r\n";
$send_buffer .= "Host: 10.168.11.120\r\n";
$send_buffer .= "Accept-Encoding: gzip,deflate\r\n";
$send_buffer .= "Connection: keep-alive\r\n";
$send_buffer .= "\r\n";
$http_worker->uidConnections[$serialNumber]->send($send_buffer, true);
} else {
echo '未知的客户端' . PHP_EOL;
}
}
};
$http_worker->onError = function ($connection_to_baidu, $code, $msg) {
echo "Error code:$code msg:$msg\n";
};
// 运行worker
Worker::runAll();
设备不识别你发的数据,连接被设备重置断开了
是指蓝色框的请求数据设备不识别?但红框的数据是设备响应的,也是符合预期的
看起来是设备发给workerman一个Continuation请求,workerman不识别返回了 400 Bad Request,然后断开了连接
我也是这么想的,而且workerman好像还重启了,因为端口后设备那边会主动在发起长连接,成功后再发设备的基本信息过来,这信息通过onMessage收到了,也就是感觉又重新走了一遍
重启的话workerman界面会提示,应该没重启
那就奇怪了我给设备发信息$http_worker->uidConnections[$serialNumber]->send($send_buffer, true);后,onMessage被触发了,但数据是绿框的内容,但抓包工具上显示设备只推了一次绿框的数据
用GatewayWorker tcp接受设备的信息 websocket转发给浏览器
通过浏览器触发的那个get请求是发给设备的,而设备响的数据没触发onMessage而抓包有抓到设备响应的信息
$connection->uidConnections[$serialNumber]->send($send_buffer, true); 发送那改成这个试试
不行,$http_worker->uidConnections[$serialNumber]->send($send_buffer, true)是能请求到设备,但是被响应的数据收不到