用workerman和設(shè)備建立連接后給設(shè)備發(fā)請(qǐng)求,收不到設(shè)備響應(yīng)的數(shù)據(jù) 詳情報(bào)文如圖,藍(lán)色框的是和設(shè)備建立連接后我這邊發(fā)送的請(qǐng)求,紅色框的是設(shè)備的響應(yīng),而workerman onMessage收到的還是綠色框的數(shù)據(jù)。
完整的PHP代碼:
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
global $http_worker;
// 創(chuàng)建一個(gè)Worker監(jiān)聽8001端口,使用http協(xié)議通訊
$http_worker = new Worker("http://0.0.0.0:8001");
// 啟動(dòng)4個(gè)進(jìn)程對(duì)外提供服務(wù)
$http_worker->count = 1;
// 新增加一個(gè)屬性,用來保存uid到connection的映射
$http_worker->uidConnections = array();
// 接收到瀏覽器發(fā)送的數(shù)據(jù)時(shí)回復(fù)hello world給瀏覽器
$http_worker->onMessage = function (TcpConnection $connection, Request $request) use ($http_worker) {
// 向?yàn)g覽器發(fā)送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;
}
// 收到設(shè)備基礎(chǔ)信息
var_dump($device);
$res = $connection->send('');
var_dump($res);
} else if ($request->method() === 'GET') {
/**
* 和設(shè)備建立連接后,用瀏覽器觸發(fā)給設(shè)備發(fā)請(qǐng)求 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";
};
// 運(yùn)行worker
Worker::runAll();
設(shè)備不識(shí)別你發(fā)的數(shù)據(jù),連接被設(shè)備重置斷開了
是指藍(lán)色框的請(qǐng)求數(shù)據(jù)設(shè)備不識(shí)別?但紅框的數(shù)據(jù)是設(shè)備響應(yīng)的,也是符合預(yù)期的
看起來是設(shè)備發(fā)給workerman一個(gè)Continuation請(qǐng)求,workerman不識(shí)別返回了 400 Bad Request,然后斷開了連接
我也是這么想的,而且workerman好像還重啟了,因?yàn)槎丝诤笤O(shè)備那邊會(huì)主動(dòng)在發(fā)起長(zhǎng)連接,成功后再發(fā)設(shè)備的基本信息過來,這信息通過onMessage收到了,也就是感覺又重新走了一遍
那就奇怪了我給設(shè)備發(fā)信息$http_worker->uidConnections[$serialNumber]->send($send_buffer, true);后,onMessage被觸發(fā)了,但數(shù)據(jù)是綠框的內(nèi)容,但抓包工具上顯示設(shè)備只推了一次綠框的數(shù)據(jù)
用GatewayWorker tcp接受設(shè)備的信息 websocket轉(zhuǎn)發(fā)給瀏覽器
通過瀏覽器觸發(fā)的那個(gè)get請(qǐng)求是發(fā)給設(shè)備的,而設(shè)備響的數(shù)據(jù)沒觸發(fā)onMessage而抓包有抓到設(shè)備響應(yīng)的信息
$connection->uidConnections[$serialNumber]->send($send_buffer, true); 發(fā)送那改成這個(gè)試試
不行,$http_worker->uidConnections[$serialNumber]->send($send_buffer, true)是能請(qǐng)求到設(shè)備,但是被響應(yīng)的數(shù)據(jù)收不到