天天看點

如何使用phpMQTT連接配接阿裡雲微服務消息隊列for IoT

作者:俏巴

概述

關于阿裡雲的微服務消息隊列,目前官方網站在 接入示例 部分給出了多種語言的SDK參考示例,但是還沒有關于php的SDK及接入示例參考。下面主要介紹在使用目前主流的第三方SDK phpMQTT的過程中遇到的問題及解決辦法。

主要流程

參數準備

在使用MQTT的過程中,關于參數的配置是一個比較讓人頭疼的問題,很多使用者都在配置參數的過程中遇到過問題,這裡建議使用者首先使用第三方的工具MQTT.fx完成參數的配置調通工作,後續在代碼中直接使用即可,避免在參數配置的過程中犯錯。具體可以參考部落格: 如何使用MQTT.fx連接配接微服務消息隊列。

包的引用

使用者可以直接參考GitHub

官方連結

,使用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、接收監聽:

如何使用phpMQTT連接配接阿裡雲微服務消息隊列for IoT

參考連結

phpMQTT GitHub Issue