如何使用phpMQTT連線阿里雲微服務訊息佇列for IoT
阿新 • • 發佈:2019-01-13
概述
關於阿里雲的微服務訊息佇列,目前官方網站在接入示例部分給出了多種語言的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、接收監聽: