thinkphp8 利用think-worker 单服务器同时可使用tcp(Gateway)websocket和mqtt客户端 实现物联网设备接入和主动下发指令(推送消息)
1.安装tp8
composer create-project topthink/think tp
2.安装tp集成的workerman:(自带GatewayWorker)
composer require topthink/think-worker
3.安装GatewayClient(TCP绑定设备下发指令用)
composer require workerman/gatewayclient
4.安装workerman/mqtt:
composer require workerman/mqtt
介绍:GatewayWorker使用经典的Gateway和Worker进程模型。Gateway进程负责维持客户端连接,并转发客户端的数据给BusinessWorker进程处理,BusinessWorker进程负责处理实际的业务逻辑(默认调用Events.php处理业务),并将结果推送给对应的客户端。Gateway服务和BusinessWorker服务可以分开部署在不同的服务器上,实现分布式集群。
要注意的几个点:
1.businessWorker Events里onWorkerStart启动时同时连接mqtt服务器 :
php think worker:gateway
namespace appworker;
use GatewayWorkerLibGateway;
use WorkermanWorker;
use thinkacadeDb;
use WorkermanMqttClient as MqttClient;
use WorkermanLibTimer;
use thinkacadeLog;
use appmodelCompany as CompanyModel;
/**
* Worker 命令行服务类
*/
class TcpEvents
{
private static $mqtt = null;
/**
* @var true
*/
private static bool $mqtt_connected;
/**
* onWorkerStart 事件回调
* 当businessWorker进程启动时触发。每个进程生命周期内都只会触发一次
*
* @access public
* @param WorkermanWorker $businessWorker
* @return void
*/
public static function onWorkerStart(Worker $businessWorker)
{
$options = [
'username' => 'MQTT',
'password' => 'MQTTPW',
];
$mqtt = new MqttClient('mqtt://0.0.0.0:1883',$options);
$mqtt->onConnect = function($mqtt) {
$mqtt->subscribe('YK/#');
self::$mqtt_connected = true;//mqtt连接成功 下面判断用
};
$mqtt->onMessage = function($topic, $content, $mqtt){
var_dump($topic.'主题信息:', $content);
if($content == 'getParam'){
$arr = array('topic'=>'TPR/869219071430769/setParam', 'content'=>'{"F