序
前幾篇文章我們介紹了MQTT協(xié)議本身,雖然非常適合物聯(lián)網項目,但是在項目實施的時候有諸多不便:mosquitto等開源產品可擴展性不佳务冕、需要自己簽發(fā)X509證書书释、認證與授權不靈活翘贮、MQTT服務需要自己運維等。所以爆惧,在實施物聯(lián)網服務的時候狸页,應該采用云端的托管服務,以便聚焦物聯(lián)網業(yè)務扯再,而不是為了基礎架構和運維煩惱芍耘。
這次我們將通過百度開放云物聯(lián)網服務IoT來體驗一下云端的MQTT托管服務是一個什么樣的體驗。
背景
百度開放云物聯(lián)網(IoT)服務是一個全托管的云服務熄阻,幫助建立設備與云端之間安全可靠的雙向連接斋竞,以支撐各種類型的物聯(lián)網項目,而無需考慮服務的運維秃殉。
使用物聯(lián)網服務提供如下好處:
- 從設備到云端以及從云端到設備可靠地進行大規(guī)模消息傳輸坝初。
- 對設備認證與權限管理,并保證數(shù)據(jù)安全傳輸钾军。
- 支持多種語言開發(fā)鳄袍,兼容主流硬件設備。
- 與大數(shù)據(jù)服務無縫對接吏恭,以數(shù)據(jù)分析驅動業(yè)務進步畦木。
為了更好地支持設備與云端之間的互聯(lián)互通,百度開放云物聯(lián)網服務原生支持MQTT(Message Queuing Telemetry Transport)協(xié)議砸泛。MQTT是基于二進制消息的發(fā)布/訂閱編程模式的消息協(xié)議十籍,最早由IBM提出的,如今已經成為OASIS規(guī)范唇礁。與HTTP勾栗、CoAP、XMPP等協(xié)議相比盏筐,MQTT協(xié)議有以下的優(yōu)勢:
- MQTT基于TCP围俘,在反控設備的時候比CoAP等基于UDP的協(xié)議更可靠,比如使用3G通訊的時候需要專門實現(xiàn)CoAP over TCP,否則反控很不穩(wěn)定界牡。
- MQTT異步Pub/Sub實現(xiàn)簿寂,好比發(fā)個短信,無需等待對方確認便可以繼續(xù)宿亡,而不像HTTP常遂、CoAP那樣必須等待對方應答才能返回的同步模式。
- MQTT為物聯(lián)網提供了許多體貼的設計挽荠,比如QoS克胳,比如“遺言”等設計。
- MQTT是二進制格式圈匆,比XMPP更輕量級漠另。
總之,通過支持輕量級可擴展的MQTT跃赚,百度開放云物聯(lián)網服務非常適合需要低功耗和網絡帶寬有限的物聯(lián)網場景笆搓,國外的公有云供應商如AWS、Azure纬傲、Bluemix等都以各種形式加入了對MQTT的支持满败。
使用物聯(lián)網服務的參考架構如下:
為了保障安全,開放云物聯(lián)網服務的MQTT通訊都是通過SSL加密的嘹锁,確保消息不會被監(jiān)聽與篡改。
要使用百度物聯(lián)網服務着裹,請到這里申請測試领猾。目前提供的是基于命令行的用戶體驗,可以參考入門指南配置Python環(huán)境并下載命令行工具骇扇。
運維體驗
百度物聯(lián)網服務分為運維人員體驗和開發(fā)人員體驗兩部分摔竿。首先讓我們來看運維人員體驗。
首先需要創(chuàng)建IoT實例少孝,以容納多個設備继低、身份、策略等資源:
bce.py iot create-endpoint --endpoint-name "smart-project"
在實例下面可以創(chuàng)建一或多個設備:
bce.py iot create-thing --endpoint-name "smart-project" --thing-name "sensor-100"
成功創(chuàng)建設備后稍走,系統(tǒng)返回username袁翁,是用來作為標識符與MQTT服務交互的。
下面進行權限管理婿脸,保證設備能夠對特定的主題訂閱發(fā)布消息粱胜。
首先需要創(chuàng)建一個或多個身份(Principal)來代表物聯(lián)網服務中的認證主體。對于物聯(lián)網服務狐树,權限綁定在身份而不是設備上的焙压,這樣用戶可以為每個設備創(chuàng)建不同的身份,或者設備共享一個身份,非常靈活:
bce.py iot create-principal --endpoint-name "smart-project" --principal-name "sensor-principle"
身份創(chuàng)建成功后涯曲,服務返回password野哭。這里需要說明一下,這邊的password其實是個密鑰幻件,只要能提供這個密鑰拨黔,系統(tǒng)便會賦予相應的身份。換句話說傲武,上面創(chuàng)建的sensor-100可以提供這個密鑰以獲得sensor-principle身份蓉驹,sensor-200如果能夠提供同樣的密鑰,系統(tǒng)也會把它辨識成同樣的身份揪利,擁有身份上面所對應的一切權限态兴。
用以下命令把這個身份綁定在設備上:
bce.py iot attach-thing-principal --endpoint-name "smart-project" --thing-name "sensor-100" --principal-name "sensor-principle"
下面創(chuàng)建策略(Policy),以控制對消息主題的訂閱發(fā)布等操作權限疟位。比如瞻润,用于訂閱和發(fā)布某公司B樓第5層的溫度的主題,實現(xiàn)方式如下:
bce.py iot create-policy --endpoint-name "smart-project" --policy-name "b-5-temperature-policy" --topic="building-b/floor-5/temperature" --operation=PUBLISH --operation=SUBSCRIBE
創(chuàng)建策略成功后甜刻,便可以綁定到身份上绍撞,擁有這個身份的設備sensor-100便繼承了對主題的訂閱發(fā)布權限:
bce.py iot attach-principal-policy --endpoint-name "smart-project" --policy-name "b-5-temperature-policy" --principal-name "sensor-principle"
運維人員體驗至此結束,物聯(lián)網服務已經包含了一個設置好了訪問權限的設備得院。
開發(fā)體驗
下面我們看一下開發(fā)人員體驗傻铣。
本質上開發(fā)人員只需要按照MQTT協(xié)議編程即可,具體的規(guī)范請參考http://mqtt.org/祥绞。實際上非洲,由于MQTT是物聯(lián)網的標準協(xié)議,有著豐富的客戶端支持蜕径,比如Eclipse基金會提供的Paho支持Windows/Unix/Mac/Android/RTOS上C/C++/Java/Python/JavaScript/.Net語言的開發(fā)两踏。
這里我們就以NetBeans開發(fā)環(huán)境編寫Java應用為例。新建一個Java應用程序類型的Maven項目兜喻,右擊“依賴關系”選擇添加依賴關系梦染,查詢org.eclipse.paho,并加入對org.eclipse.paho.client.mqttv3的依賴朴皆,并在main函數(shù)中加入以下代碼:
String endpoint = "smart-project";
String username = "smart-project/sensor-100";
String password = "Dm3yyvOHb7zt/uRWadfasdfMc+uDbf4j960=";
String topic = "building-b/floor-5/temperature";
// 創(chuàng)建SSL連接
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init((KeyStore)null);
TrustManager[] trustManagers = tmf.getTrustManagers();
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, trustManagers, null);
// 配置MQTT連接
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);
options.setUserName(username);
options.setPassword(password.toCharArray());
options.setSocketFactory(ctx.getSocketFactory());
// 創(chuàng)建MQTT連接
MqttClient client = new MqttClient(endpoint, "java-client");
client.connect(options);
// 發(fā)送消息
MqttMessage message = new MqttMessage();
message.setPayload("15".getBytes());
client.publish(topic, message);
client.disconnect();
把以上代碼植入智能設備帕识,便可以輕松安全地向云端發(fā)送消息了。從云端向智能設備發(fā)送控制命令也很直觀遂铡,這里就不再贅述了渡冻。
可以看見,采用云端的托管物聯(lián)網服務忧便,把基礎架構與運維交給云服務供應商族吻,使得物聯(lián)網項目實施高效便捷了許多帽借。百度開放云物聯(lián)網服務為物聯(lián)網而生,不但提供了全托管的MQTT服務超歌,在安全性與可擴展性方面也做下足了功夫砍艾,誠意十足。