国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

workerman收不到設(shè)備響應(yīng)信息,抓包能看到設(shè)備的報文

calvin

問題描述

用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();
1149 2 0
2個回答

six

設(shè)備不識別你發(fā)的數(shù)據(jù),連接被設(shè)備重置斷開了

  • calvin 2023-08-24

    是指藍色框的請求數(shù)據(jù)設(shè)備不識別?但紅框的數(shù)據(jù)是設(shè)備響應(yīng)的,也是符合預(yù)期的

  • six 2023-08-24

    看起來是設(shè)備發(fā)給workerman一個Continuation請求,workerman不識別返回了 400 Bad Request,然后斷開了連接

  • calvin 2023-08-24

    我也是這么想的,而且workerman好像還重啟了,因為端口后設(shè)備那邊會主動在發(fā)起長連接,成功后再發(fā)設(shè)備的基本信息過來,這信息通過onMessage收到了,也就是感覺又重新走了一遍

  • six 2023-08-24

    重啟的話workerman界面會提示,應(yīng)該沒重啟

  • calvin 2023-08-24

    那就奇怪了我給設(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ā)給瀏覽器

  • calvin 2023-08-24

    通過瀏覽器觸發(fā)的那個get請求是發(fā)給設(shè)備的,而設(shè)備響的數(shù)據(jù)沒觸發(fā)onMessage而抓包有抓到設(shè)備響應(yīng)的信息

  • 不敗少龍 2023-08-24

    $connection->uidConnections[$serialNumber]->send($send_buffer, true); 發(fā)送那改成這個試試

  • calvin 2023-08-24

    不行,$http_worker->uidConnections[$serialNumber]->send($send_buffer, true)是能請求到設(shè)備,但是被響應(yīng)的數(shù)據(jù)收不到

年代過于久遠,無法發(fā)表回答
??