概述
关于阿里云的微服务消息队列, 目前官方网站在接入示例部分给出了多种语言的 SDK 参考示例, 但是还没有关于 PHP 的 SDK 及接入示例参考. 下面主要介绍在使用目前主流的第三方 SDK phpMQTT 的过程中遇到的问题及解决办法.
主要流程
参数准备
在使用 MQTT 的过程中, 关于参数的配置是一个比较让人头疼的问题, 很多用户都在配置参数的过程中遇到过问题, 这里建议用户首先使用第三方的工具 MQTT.fx 完成参数的配置调通工作, 后续在代码中直接使用即可, 避免在参数配置的过程中犯错. 具体可以参考博客: 如何使用 MQTT.fx 连接微服务消息队列.
包的引用
用户可以直接参考 GitHub 官方链接 https://github.com/bluerhinos/phpMQTT , 使用 Composer 的方式加载包, 也可以直接下载整个项目使用.
- SendDemo
- <?PHP
- use Bluerhinos\phpMQTT;
- require("phpMQTT.php");
- $server = "******.mqtt.aliyuncs.com"; // change if necessary
- $port = 1883; // change if necessary
- $username = "******"; // set your username
- $password = "******"; // set your password
- $client_id = "GID_******@@@devicename"; // make sure this is unique for connecting to sever - you could use uniqid()
- $mqtt = new phpMQTT($server, $port, $client_id);
- if ($mqtt->connect(true, NULL, $username, $password)) {
- $mqtt->publish("mqtt_topic/notice/", "Hello World PHP! at" . date("r"), 0);
- $mqtt->close();
- echo "send success!";
- } else {
- echo "Time out!\n";
- }
- ?>
问题分析及解决
现象
用户使用在上面介绍的工具测试可行的参数直接配置到代码中, 会报: Uninitialized string offset 的错误, 跟踪到源码, 发现:
$string = $this->read(4)
并未读入任何信息, 但是参数的配置又没有什么问题, 部分用户发现使用同样的代码连接自己的 MQTT 服务器可以正常连接.
原因
目前 phpMQTT 仅支持 mqttv3.1, 但是目前阿里云的微服务消息队列使用的是 v3.1.1 协议, MQTT v3.1.1 协议名称长度 4, 而 3.1 的协议长度为 6.
解决方案
源码:
- $buffer .= chr(0x06); $i++;
- $buffer .= chr(0x4d); $i++;
- $buffer .= chr(0x51); $i++;
- $buffer .= chr(0x49); $i++;
- $buffer .= chr(0x73); $i++;
- $buffer .= chr(0x64); $i++;
- $buffer .= chr(0x70); $i++;
- $buffer .= chr(0x03); $i++;
调整为:
- $buffer .= chr(0x04); $i++;
- $buffer .= chr(0x4d); $i++;
- $buffer .= chr(0x51); $i++;
- $buffer .= chr(0x54); $i++;
- $buffer .= chr(0x54); $i++;
- $buffer .= chr(0x04); $i++;
测试效果
1, 发送端使用调整后的源码运行 SendDemo;
2, 接收监听:
参考链接
- https://github.com/bluerhinos/phpMQTT
- GitHub Issue https://github.com/bluerhinos/phpMQTT/issues/61
来源: https://yq.aliyun.com/articles/686437