國內物聯網平台(1)
——百度物接入IoT Hub
馬智
物接入IoT Hub - 架構

- 全托管的雲服務,幫助建立設備與雲端之間安全可靠的雙向連接
- 支撐海量設備的數據收集、監控、故障預測等各種物聯網場景
物接入IoT Hub - 功能
- 通信協議:支持MQTT
- 數據安全:設備級認證、策略授權;雙向安全連接、SSL傳輸
-
開發語言:支持多種開發語言、兼容主流硬件設備
- 支持C、C#、Python、Java、PHP等
- 支持CLI命令行工具(Python)
- 分析服務:對接百度大數據服務
物接入IoT Hub – 概念
| 概念 |
描述 |
| MQTT |
MQTT是基於二進制消息的發布/訂閱(Publish/Subscribe)模式的協議, |
| endpoint |
IoT Hub 的服務實例,代表一個完整的IoT Hub 服務。 |
| thing |
表示IoT Hub 設備, |
| principal |
principal是一個抽象概念,表示設備(thing)的身份。 |
| policy |
為身份principal設置對應的策略policy,一個principal對應一個policy。 |
| permission |
為每一個policy設置一組權限permission,其中包括主題topic,和對該主題的操作權限operation。 |
| topic |
每一個policy都需要指定一個主題項目(topic),在進行使用IoT Hub 服務之前, |
| operation |
對topic的操作權限。目前基於MQTT協議,IoT Hub 支持創建發布PUBLISH和訂閱SUBSCRIBE兩種權限。 |
MQTT協議
MQTT(Message Queuing Telemetry Transport)是一個客戶端服務端架構的發布/訂閱模式的消息傳輸協議。它的設計思想是輕巧、開放、簡單、規范,易於實現。這些特點使得它對很多場景來說都是很好的選擇,特別是對於受限的環境如機器與機器的通信(M2M)以及物聯網環境(IoT)。
客戶端
- 發布應用消息給其它相關的客戶端。
- 訂閱以請求接受相關的應用消息
- 取消訂閱以移除接受應用消息的請求。
- 從服務端斷開連接。
服務端
- 接受來自客戶端的網絡連接
- 接受客戶端發布的應用消息
- 處理客戶端的訂閱和取消訂閱請求。
- 轉發應用消息給符合條件的客戶端訂閱。
MQTT vs HTTPS:
- 吞吐量:93倍
- 發送數據電量消耗: 1/11
- 接收數據電量消耗:1/170
- 連接保持電量消耗:1/2
- 網絡開銷:1/8
物接入IoT Hub – 操作流程

目前每個賬戶只能創建2個endpoint,100個things,100個principal。
物接入IoT Hub – 連接類型
-
IoT Hub為每個實例提供3種默認連接方式
- TCP:端口1883,不支持傳輸數據加密,可以通過MQTT.fx客戶端連接。
- SSL:端口1884,支持SSL/TLS加密傳輸,MQTT.fx客戶端連接
- WSS:端口8884,支持WebSocket瀏覽器方式連接,同樣包含SSL加密
tcp://yourendpoint.mqtt.iot.gz.baiduce.com:1883
ssl://yourendpoint.mqtt.iot.gz.baiduce.com:1884
wss://yourendpoint.mqtt.iot.gz.baidubce.com:8884
物接入IoT Hub – 運維界面

創建設備

創建身份

創建策略

生成秘鑰
物接入IoT Hub – MQTT客戶端類型
- Websockets Client:百度開放雲基於瀏覽器開發的mqtt客戶端
- MQTT.fx:目前主流的mqtt客戶端,可以快速驗證是否可以與IoT Hub 服務交流發布或訂閱消息
- Paho:Eclipse基金會提供的開源MQTT客戶端實現,可以很好的支持百度開放雲物接入IoT Hub 服務以實現設備互聯和物聯網應用。
物接入IoT Hub – Paho客戶端源碼示例
訂閱一棟辦公樓內第五層的溫度值
通過NetBeans 來展示如何通過代碼來與物接入服務發送或者接受消息。新建一個Java應用程序類型的Maven項目,右擊"依賴關系"選擇添加依賴關系,查詢org.eclipse.paho,並加入對org.eclipse.paho.client.mqttv3的依賴。
| package com.baidu.iot; import java.io.InputStream; import java.security.KeyStore; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.MqttMessage; public class Thermometer { public static void main(String[] args) throws Exception { String endpoint = "hostname"; //輸入創建實例endpoint返回的hostname String username = "yourendpoint/yourthing"; //輸入創建thing返回的username String password = "Dm3yyvOHb7zt/uRWsPgsfsgbnj7CxuVMc+uDbf4j960="; //輸入創建principal返回的password String topic = "building-b/floor-5/temperature-1"; //訂閱的消息主題,本例是指訂閱b號樓第五層的溫度 TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509"); tmf.init((KeyStore)null); TrustManager[] trustManagers = tmf.getTrustManagers();
SSLContext ctx = SSLContext.getInstance("TLS"); ctx.init(null, trustManagers, null); MqttConnectOptions options = new MqttConnectOptions(); options.setCleanSession(true); options.setUserName(username); options.setPassword(password.toCharArray()); options.setSocketFactory(ctx.getSocketFactory()); MqttClient client = new MqttClient(endpoint, "java-client"); client.connect(options); MqttMessage message = new MqttMessage(); message.setPayload("15".getBytes()); client.publish(topic, message); client.disconnect(); } } |
物接入IoT Hub – 與大數據分析服務對接

