使用 simps/mqtt 调用阿里云的微消息队列 MQTT 版
Posted 沈唁志
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 simps/mqtt 调用阿里云的微消息队列 MQTT 版相关的知识,希望对你有一定的参考价值。
微消息队列 MQTT 版[1] 是专为移动互联网(MI)、物联网(IoT)领域设计的消息产品,覆盖互动直播、金融支付、智能餐饮、即时聊天、移动 Apps、智能设备、车联网等多种应用场景;通过对 MQTT、WebSocket 等协议的全面支持,连接端和云之间的双向通信,实现 C2C、C2B、B2C 等业务场景之间的消息通信,可支撑千万级设备与消息并发。
在阿里云的文档中 php 推荐的 SDK 是 Mosquitto-PHP[2] ,这是一个基于回调和异步操作的 PHP MQTT 扩展,同时还依赖 libmosquitto
。
而 simps/mqtt[3] 是纯 PHP 代码实现的协议解析,客户端实现基于 Swoole 的同步阻塞客户端和协程客户端,可以用于 PHP-FPM 和 CLI 两种模式。
并且 simps/mqtt[4] 支持 MQTT 5.0 协议,是 PHP 首个支持 MQTT 5.0 协议的类库,后期如果阿里云的微消息队列 MQTT 版支持了 MQTT 5.0 协议,可以无缝升级。
以下为使用 simps/mqtt 来实现之前所提供的 Mosquitto-PHP 的示例代码
git clone https://github.com/simps-cloud/aliyun-mqtt.git
cd aliyun-mqtt
composer install
示例代码仅实现了测试逻辑,具体业务使用还需要进一步完善。
-
配置文件
config.php[5]
return [
'access_key' => '', // 阿里云帐号 AccessKey
'secret_key' => '', // 阿里云帐号 SecretKey
'end_point' => '', // 接入点地址,购买实例后从控制台获取
'instance_id' => '', // 实例 ID,购买后从控制台获取
'topic' => '', // MQTT Topic,其中第一级 Topic 需要在 MQTT 控制台提前申请
'group_id' => '', // MQTT 客户端ID 前缀, GroupID,需要在 MQTT 控制台申请
];
-
单独使用 MQTT 消息收发示例
sendMessageToMQTT.php[6]
include __DIR__ . '/vendor/autoload.php';
use Simps\MQTT\Client;
use Simps\MQTT\Config\ClientConfig;
use function Swoole\Coroutine\run;
run(function () {
$config = require_once __DIR__ . '/config.php';
// MQTT 客户端ID 后缀,DeviceId,业务方自由指定,需要保证全局唯一,禁止 2 个客户端连接使用同一个 ID
$deviceId = Client::genClientID();
$qos = 0;
$port = 1883;
$keepalive = 90;
$cleanSession = true;
$clientId = $config['group_id'] . '@@@' . $deviceId;
echo "ClientId: {$clientId}", PHP_EOL;
// 设置鉴权参数,参考 MQTT 客户端鉴权代码计算 username 和 password
$username = 'Signature|' . $config['access_key'] . '|' . $config['instance_id'];
$sigStr = hash_hmac("sha1", $clientId, $config['secret_key'], true);
$password = base64_encode($sigStr);
echo "UserName: {$username} \r\nPassword: {$password}", PHP_EOL;
// 初始化客户端配置
$clientConfig = new ClientConfig();
$clientConfig->setUserName($username)
->setPassword($password)
->setClientId($clientId)
->setKeepAlive($keepalive)
->setMaxAttempts(0)
->setSwooleConfig([
'open_mqtt_protocol' => true,
'package_max_length' => 2 * 1024 * 1024,
]);
try {
// 初始化客户端
$client = new Client($config['end_point'], $port, $clientConfig);
$connect = $client->connect($cleanSession);
// 连接状态
var_dump($connect);
$topics[$config['topic']] = $qos;
$subStatus = $client->subscribe($topics);
// 订阅状态
var_dump($subStatus);
$publishStatus = $client->publish($config['topic'], "Hello MQTT PHP Demo", $qos);
// 发布状态
var_dump($publishStatus);
$buffer = $client->recv();
// 订阅消息接收
var_dump($buffer);
echo 'Finished';
} catch (\Throwable $e) {
echo $e->getMessage();
}
});
-
MQTT 签名示例
connectUseSignatureMode.php[7]
-
MQTT Token 示例
connectUseTokenMode.php[8]
-
MQTT 发送顺序消息 RocketMQ 订阅顺序消息示例
sendOrderMessage.php[9]
-
P2P 消息收发模式
sendP2PMessageToMQTT.php[10]
参考资料
微消息队列 MQTT 版: https://www.aliyun.com/product/mq4iot
[2]Mosquitto-PHP: https://github.com/mgdm/Mosquitto-PHP
[3]simps/mqtt: https://github.com/simps/mqtt
[4]simps/mqtt: https://github.com/simps/mqtt
[5]config.php: https://github.com/simps-cloud/aliyun-mqtt/blob/main/config.php
[6]sendMessageToMQTT.php: https://github.com/simps-cloud/aliyun-mqtt/blob/main/sendMessageToMQTT.php
[7]connectUseSignatureMode.php: https://github.com/simps-cloud/aliyun-mqtt/blob/main/connectUseSignatureMode.php
[8]connectUseTokenMode.php: https://github.com/simps-cloud/aliyun-mqtt/blob/main/connectUseTokenMode.php
[9]sendOrderMessage.php: https://github.com/simps-cloud/aliyun-mqtt/blob/main/sendOrderMessage.php
[10]sendP2PMessageToMQTT.php: https://github.com/simps-cloud/aliyun-mqtt/blob/main/sendP2PMessageToMQTT.php
以上是关于使用 simps/mqtt 调用阿里云的微消息队列 MQTT 版的主要内容,如果未能解决你的问题,请参考以下文章