想要实现:设备通过tcp连接服务器,框架用的是worker或者gateway

想要实现:设备通过tcp连接服务器,服务器实时处理以后实时转发消息给某个网页(可以用websocket),框架用的是worker或者gateway,求高人指点

阅读 2.8k
1 个回答

有几种方式可以做到
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();

以上好处架构清晰简单,但是只能单进程
参考手册 http://doc.workerman.net/work...

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提供了很多长连接直接可以用的接口,非常方便

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题