用workerman和設(shè)備建立連接后給設(shè)備發(fā)請求,收不到設(shè)備響應(yīng)的數(shù)據(jù) 詳情報文如圖,藍色框的是和設(shè)備建立連接后我這邊發(fā)送的請求,紅色框的是設(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)建一個Worker監(jiān)聽8001端口,使用http協(xié)議通訊
$http_worker = new Worker("http://0.0.0.0:8001");
// 啟動4個進程對外提供服務(wù)
$http_worker->count = 1;
// 新增加一個屬性,用來保存uid到connection的映射
$http_worker->uidConnections = array();
// 接收到瀏覽器發(fā)送的數(shù)據(jù)時回復(fù)hello world給瀏覽器
$http_worker->onMessage = function (TcpConnection $connection, Request $request) use ($http_worker) {
// 向瀏覽器發(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ā)請求 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();
設(shè)備不識別你發(fā)的數(shù)據(jù),連接被設(shè)備重置斷開了
我也是這么想的,而且workerman好像還重啟了,因為端口后設(shè)備那邊會主動在發(fā)起長連接,成功后再發(fā)設(shè)備的基本信息過來,這信息通過onMessage收到了,也就是感覺又重新走了一遍
那就奇怪了我給設(shè)備發(fā)信息$http_worker->uidConnections[$serialNumber]->send($send_buffer, true);后,onMessage被觸發(fā)了,但數(shù)據(jù)是綠框的內(nèi)容,但抓包工具上顯示設(shè)備只推了一次綠框的數(shù)據(jù)