Workerman怎么用MQTT协议_实现物联网通信方法【方法】

冬芳同学_8630

冬芳同学_8630

2026-03-13

815人浏览

原创

不能。Workerman 本身不内置 MQTT 协议栈,需借助官方扩展 workerman/mqtt 实现,该扩展基于 Workerman 构建,支持 MQTT v3.1.1,提供 Server 类并需显式调用 listen() 启动监听。

workerman怎么用mqtt协议_实现物联网通信方法【方法】

Workerman 能不能直接跑 MQTT 服务?

不能。Workerman 本身不内置 MQTT 协议栈,也没有 MQTTServer 类。它只提供 TCP/UDP/WebSocket 底层通信能力,MQTT 是应用层协议,必须自己解析或借助第三方库。

常见错误现象:Connection refused 或客户端连上就断,往往是因为误以为启动了 MQTT 服务,实际只是开了个裸 TCP 端口。

正确做法是:用 Workerman 搭建一个自定义的 Worker,监听 TCP 端口,再在 onMessage 里手动处理 MQTT 的 CONNECT、PUBLISH、SUBSCRIBE 等报文——但这极容易出错,不推荐从零写。

推荐方案:用 workerman/mqtt 扩展包

workerman/mqtt 是官方维护的轻量 MQTT 服务端实现,基于 Workerman 构建,支持 MQTT v3.1.1,能直接响应标准客户端(如 MQTTX、mosquitto_sub)。

安装方式:

composer require workerman/mqtt

关键点:

LiblibAI电商营销
LiblibAI电商营销

LiblibAI电商营销是一款AI电商图片工具,LiblibAI 电商营销场景模型工具:丰富的 LoRA 模型。

下载
  • MQTT\Server 是核心类,不是 Worker 子类,但内部依赖 Workerman 启动
  • 必须显式调用 $server->listen(),否则不会真正监听端口
  • 默认不启用 TLS,若需 ssl:// 连接,得额外配置 context 参数并监听 8883
  • 订阅关系由内存管理,重启即丢失;如需持久化,得自己对接 Redis 或数据库

怎么写一个可运行的 MQTT 服务端?

最小可用示例(保存为 mqtt_server.php):

use Workerman\MQTT\Server;

$server = new Server('0.0.0.0', 1883);
$server->onConnect = function ($connection) {
    echo "Client connected: {$connection->getRemoteIp()}\n";
};
$server->onSubscribe = function ($connection, $topics) {
    echo "Client subscribed to: " . implode(', ', array_keys($topics)) . "\n";
};
$server->onPublish = function ($connection, $topic, $payload, $qos) {
    echo "Received on {$topic}: {$payload} (QoS={$qos})\n";
    // 可在此做转发、存库、触发业务逻辑
};
$server->listen();

运行命令:

php mqtt_server.php start -d

注意:

  • 别漏掉 -d,否则进程前台运行,关终端就停
  • 如果本地测试,mosquitto_pub -h 127.0.0.1 -p 1883 -t 'test' -m 'hello' 可验证通路
  • onPublish 回调里不能阻塞太久,否则影响并发;重逻辑建议投递到 TaskWorker

为什么消息收不到?几个高频坑

不是代码写错,而是协议细节没对齐:

  • 客户端用 MQTT v5 连接 v3.1.1 服务端会静默断开,workerman/mqtt 当前不支持 v5
  • 主题(topic)区分大小写,sensor/temp 和 SENSOR/TEMP 是两个不同主题
  • QoS=1/2 的消息,客户端未正确回复 PUBACK/PUBREC,服务端会反复重发,导致连接异常中断
  • Workerman 主进程被 kill 后,子进程可能残留,用 ps aux | grep mqtt_server 清理干净再重启

最常被忽略的一点:MQTT 的「遗嘱消息(Will Message)」和「Clean Session」标志位,会影响客户端重连时的订阅恢复行为——这和 Workerman 无关,但调试时若没意识到,会误判为服务端问题。

相关专题

更多
Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

2026.05.20

226

15

Workerman实时通信与长连接开发教程
Workerman实时通信与长连接开发教程

WWorkerman实时通信与长连接开发教程聚合实时通信、聊天室、长连接、消息推送、AI流式输出等Workerman高并发开发内容。

2026.05.20

222

12

Workerman异步通信与TCP服务器开发
Workerman异步通信与TCP服务器开发

Workerman异步通信与TCP服务器开发专题整理Workerman异步通信、TCP服务、HTTP服务、WebSocket开发与高并发PHP服务器教程。

2026.05.20

227

13

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

2026.11.12

100

15

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

2026.11.12

60

15

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

2026.11.12

60

15

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

160

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

120

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

120

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习