websocket+tcp

test123456

电脑端页面去控制设备
在页面端我开启了一个websocket 用workerman建了一个websocket的进程,页面端有个开启设备按钮,我会把开启命令发送给websocket ,但是workerman的websocket收到后,要去连接设备提供的IP+端口,建立通讯后,收发数据包,意味着是服务器要主动去连接设备,在websocket里需要怎么去做呀,请指教,谢谢

2117 1 1
1个回答

walkor

https://wenda.workerman.net/question/5438 这里有gatewayWorker做法,硬件tcp与浏览器websocket互相通讯,可以参考。

以下是workerman的做法

你的需求里workerman要去连设备提供的IP+端口,这要求设备暴露在公网下。如果设备在一个局域网里,workerman一般是无法主动连上设备的。但是反过来设备主动连workerman是没问题的。所以你要考虑到底是workerman主动连设备,还是设备主动连workerman。

如果确实是workerman主动连设备,可以用AsyncTcpConnection去连。代码类似:

use Workerman\Connection\AsyncTcpConnection;
use Workerman\Timer;
$worker = new Worker('websocket://0.0.0.0:1234');
$all_connections = [];
$worker->onMessage = function($con, $data) {
    // 假设已知设备ip和端口
    $ip = 'xxxx'; $port = xx;
    // 获取与设备的连接
    $device_connection = get_connection($ip, $port);
    // 设备发来数据时
    $device_connection->onMessage = function($device_connection, $data){

    };
    // 给设备发数据
    $device_connection->send('xxxxx');

};

function get_connection($ip, $port)
{
    static $all_connections = [];
    $addr = $ip.":".$port;
    if (isset($all_connections[addr])) {
        return $all_connections[addr];
    }
    $con_to_device = new AsyncTcpConnection('tcp://'.$addr);
    // 与设备的连接关闭时,1秒后重新自动连接
    $con_to_device->onClose = function($con_to_device){
        $con_to_device->reconnect(1);
    };
    $con_to_device->connect();
    $all_connections[addr] = $con_to_device;
    return $con_to_device;
}
年代过于久远,无法发表回答
🔝