2

使用 simps/mqtt 调用阿里云的微消息队列 MQTT 版

 3 years ago
source link: https://qq52o.me/2789.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

使用 simps/mqtt 调用阿里云的微消息队列 MQTT 版

后端开发 / 2021年4月28日 / 0 条评论
simps-mqtt.png!blog

微消息队列 MQTT 版是专为移动互联网 (MI)、物联网 (IoT) 领域设计的消息产品,覆盖互动直播、金融支付、智能餐饮、即时聊天、移动 Apps、智能设备、车联网等多种应用场景;通过对 MQTT、WebSocket 等协议的全面支持,连接端和云之间的双向通信,实现 C2C、C2B、B2C 等业务场景之间的消息通信,可支撑千万级设备与消息并发。

在阿里云的文档中 PHP 推荐的 SDK 是 Mosquitto-PHP ,这是一个基于回调和异步操作的 PHP MQTT 扩展,同时还依赖 libmosquitto

simps/mqtt 是纯 PHP 代码实现的协议解析,客户端实现基于 Swoole 的同步阻塞客户端和协程客户端,可以用于 PHP-FPM 和 CLI 两种模式。

并且 simps/mqtt 支持 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

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

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

  • MQTT Token 示例

connectUseTokenMode.php

  • MQTT 发送顺序消息 RocketMQ 订阅顺序消息示例

sendOrderMessage.php

  • P2P 消息收发模式

sendP2PMessageToMQTT.php

沈唁志 任何个人或团体,未经允许禁止转载本文:《使用 simps/mqtt 调用阿里云的微消息队列 MQTT 版》,谢谢合作!

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK