有几种方式可以做到
1、最简单的方式,开一个worker进程即监听tcp,又监听websocket,这样在一个进程里方便互相操作连接传递数据
use Workerman\Worker;
// 监听tcp端口,硬件连这个端口
$iot_worker = new Worker('tcp://0.0.0.0:1234');
// 两个协议互通这种方式只能单进程
$iot_worker->count = 1;
// 进程启动时增加一个5678端口的websocket协议的监听,网页用ws连5678端口
$iot_worker->onWorkerStart = function(){
// 声明为全局变量,方便其它地方获取到这个容器对象
global $ws_worker;
// 监听5678端口,协议websocket
$ws_worker = new Worker('websocket://0.0.0.0:5678');
// 网页ws发来数据的时候的处理,可根据需要做处理,这里省略
$ws_worker->onMessage = function($ws_connection, $data){...};
$ws_worker->listen();
};
// 硬件发来消息的回调
$iot_worker->onMessage = function($connection, $data){
// 得到$ws_worker容器
global $ws_worker;
// 遍历容器里的连接给所有网页推送硬件发来的数据
foreach($ws_worker->connections as $ws_connection) {
$ws_connection->send($data);
}
};
// 启动workerman
Worker::runAll();
2、开A B两组worker进程,A组进程监听tcp,B组进程监听websocket,利用channel通讯,可以参考workerman手册
http://doc.workerman.net/comp...
http://doc.workerman.net/comp...
好处是可以分布式部署,可以多进程多服务器集群
3、用gatewayWorker,开一组tcp端口的gateway进程+一组websocket的进程,参考手册
http://doc2.workerman.net/mul...
好处是同样可以分部署部署,可以多进程多服务器集群,并且gatewayWorker提供了很多长连接直接可以用的接口,非常方便