websocket+tcp

0

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

已邀请:

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;
}

要回复问题请先登录注册