微音讯队列 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.gitcd aliyun-mqttcomposer 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