workerman收不到设备响应信息,抓包能看到设备的报文

calvin

问题描述

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

six

设备不识别你发的数据,连接被设备重置断开了

  • calvin 2023-08-24

    是指蓝色框的请求数据设备不识别?但红框的数据是设备响应的,也是符合预期的

  • six 2023-08-24

    看起来是设备发给workerman一个Continuation请求,workerman不识别返回了 400 Bad Request,然后断开了连接

  • calvin 2023-08-24

    我也是这么想的,而且workerman好像还重启了,因为端口后设备那边会主动在发起长连接,成功后再发设备的基本信息过来,这信息通过onMessage收到了,也就是感觉又重新走了一遍

  • six 2023-08-24

    重启的话workerman界面会提示,应该没重启

  • calvin 2023-08-24

    那就奇怪了我给设备发信息$http_worker->uidConnections[$serialNumber]->send($send_buffer, true);后,onMessage被触发了,但数据是绿框的内容,但抓包工具上显示设备只推了一次绿框的数据

不败少龙

用GatewayWorker tcp接受设备的信息 websocket转发给浏览器

  • calvin 2023-08-24

    通过浏览器触发的那个get请求是发给设备的,而设备响的数据没触发onMessage而抓包有抓到设备响应的信息

  • 不败少龙 2023-08-24

    $connection->uidConnections[$serialNumber]->send($send_buffer, true); 发送那改成这个试试

  • calvin 2023-08-24

    不行,$http_worker->uidConnections[$serialNumber]->send($send_buffer, true)是能请求到设备,但是被响应的数据收不到

🔝