電腦端頁面去控制設(shè)備
在頁面端我開啟了一個websocket 用workerman建了一個websocket的進程,頁面端有個開啟設(shè)備按鈕,我會把開啟命令發(fā)送給websocket ,但是workerman的websocket收到后,要去連接設(shè)備提供的IP+端口,建立通訊后,收發(fā)數(shù)據(jù)包,意味著是服務(wù)器要主動去連接設(shè)備,在websocket里需要怎么去做呀,請指教,謝謝
https://wenda.workerman.net/question/5438 這里有g(shù)atewayWorker做法,硬件tcp與瀏覽器websocket互相通訊,可以參考。
以下是workerman的做法
你的需求里workerman要去連設(shè)備提供的IP+端口,這要求設(shè)備暴露在公網(wǎng)下。如果設(shè)備在一個局域網(wǎng)里,workerman一般是無法主動連上設(shè)備的。但是反過來設(shè)備主動連workerman是沒問題的。所以你要考慮到底是workerman主動連設(shè)備,還是設(shè)備主動連workerman。
如果確實是workerman主動連設(shè)備,可以用AsyncTcpConnection去連。代碼類似:
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Timer;
$worker = new Worker('websocket://0.0.0.0:1234');
$all_connections = [];
$worker->onMessage = function($con, $data) {
// 假設(shè)已知設(shè)備ip和端口
$ip = 'xxxx'; $port = xx;
// 獲取與設(shè)備的連接
$device_connection = get_connection($ip, $port);
// 設(shè)備發(fā)來數(shù)據(jù)時
$device_connection->onMessage = function($device_connection, $data){
};
// 給設(shè)備發(fā)數(shù)據(jù)
$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);
// 與設(shè)備的連接關(guān)閉時,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;
}