架構 java
數據通道算法
爲設備和物聯網應用程序提供發佈和接收消息的安全通道。數據通道目前支持CCP協議和MQTT協議。sql
安全認證&權限策略json
爲每一個設備頒發阿里雲IoT的憑證,依賴憑證才能鏈接阿里雲IoT。數組
設備共享平臺安全
規則引擎服務器
設備快照(待上線)架構
應用場景app
功能異步
名詞解釋
概念 |
描述 |
產品 |
同類設備的集合,方便管理設備 |
AppKey |
阿里雲IoT爲產品頒發的惟一標識 |
AppSecret |
阿里雲IoT爲產品頒發的產品密鑰,和AppKey成對出現 |
設備ID |
對應的英文名稱:DeviceId。阿里雲IoT爲設備頒發的惟一標識 |
設備祕鑰 |
對應的英文名稱:DeviceSecret。阿里雲IoT爲設備頒發的設備祕鑰,和設備ID成對出現 |
RPC |
設備端向雲端發送數據協議,這隻適用CCP協議接入的設備 |
RRPC |
由雲端發起,可是指望設備端響應的數據交互協議,這隻適用CCP協議接入的設備 |
Topic |
用做消息的路由轉發,例如設備A將消息發佈到Topic:123中,設備B能夠訂閱Topic:123獲得消息。CCP協議和MQT協議都支持 |
發佈 |
對應的英文名稱:Pub。設備端的發佈協議,操做Topic的權限,意思是具備往Topic中發佈消息的權限 |
訂閱 |
對應的英文名稱:Sub。設備端的訂閱協議,操做Topic的權限,意思是具備從Topic中訂閱消息的權限 |
阿里雲物聯網套件限制
限制類別 |
描述 |
產品個數 |
目前限制產品個數上限是10個 |
添加設備 |
目前只能在控制檯上添加設備,並且單次操做添加不能5萬,單個產品不能超過1億 |
設備數據上報地址 |
目前只能支持本帳號下的ECS或SLB的IP地址訪問以及ACE的域名訪問 |
Topic的長度 |
不能超過128字節 |
CCP協議包大小 |
不能超過256K |
MQTT協議包大小 |
不能超過256K |
設備受權操做 |
不能超過50個 |
受權操做 |
1.單個設備端不能對帶有通配符的Topic進行發佈或者訂閱消息;2.服務端不能對帶有通配符的Topic進行發佈消息 |
規則引擎 |
同一個帳號不超過100個規則 |
規則引擎 |
數據格式必須是JSON才能使用規則引擎 |
規則引擎 |
一條規則中轉發數據的操做不能超過10個 |
設備接入雲端的協議
全鏈路加密
整個通訊鏈鋸以RSA,AES加密,保證數據傳輸的安全。
消息實時到達
當設備與阿里雲IoT創建數據通道後,阿里雲IoT會與設備保持長鏈接,減小握手時間,保證消息的實時到達。
支持數據透傳
設備數據能夠基於數據通道以二進制方式透傳的方式傳到本身的服務器上(只支持在阿里雲上購買的產品),阿里雲IoT不會保存設備業務數據,從而保證用戶對數據的安全可控性。
支持多種通訊模式
數據通道支持RPC/RRPC以及Pub/Sub兩種通訊模式,知足用戶不一樣的應用場景。
設備接入雲端的協議 – 基於CCP接入
基於CCP接入雲端,主要包含兩大流程:
A:設備使用控制檯申請的密鑰進行簽名請求受權,簽名使用 hmacmd5算法(可選 hmacsha1),簽名內容=devieceid+appkey,使用key=appSecret+deviceSecret
B:服務器驗證簽名合法,並返回pubkey證書
C:設備生成隨機密鑰seedkey,使用pubkey RSA加密傳輸給服務器
D:服務器確認返回令牌 sid ,同時返回簽名sign,簽名內容=sid,簽名的key=appSecret+deviceSecret,同時返回動態負載的接入服務器ip供設備鏈接
E:客戶端使用私鑰seedkey解密令牌,進行數據通訊,客戶端可選協議模式支持ccp\mqtt\coap...
設備接入雲端的協議 – 基於MQTT接入
基於MQTT接入雲端,主要包含兩大流程:
A:設備使用控制檯申請的密鑰進行簽名請求受權,簽名使用 hmacmd5算法(可選 hmacsha一、md5),簽名內容=devieceid+appkey,使用key=appSecret+deviceSecret
B:服務器驗證簽名合法,並返回pubkey證書(X.509格式base64)
C:設備使用pubkey證書TLS協議鏈接MQTT
通訊模式
IoT Hub支持兩種通訊模式:
通訊模式 - RPC/Revert-RPC
RPC/Revert-RPC(CCP協議具備的通訊模式)
通訊模式 - Pub/Sub
Pub/Sub(CCP協議和MQTT都支持)
身份和安全
設備身份
爲設備頒發憑證,包括產品證書和設備證書,設備證書與設備是一對一的關係,確保設備的惟一合法性。設備經過CCP協議或者MQTT協議接入數據通道以前,都須要進行設備認證,設備認證須要攜帶產品證書和設備證書進行認證。
通訊安全
採用RSA-512bit、AES算法來保證數據通道的傳輸安全。
受權
提供設備級的受權粒度。
對於設備端,設備必須具備權限,才能夠往某個Topic發佈訂閱消息,這讓用戶能夠徹底控制Topic的消息轉發,幫助用戶控制數據的安全性;
對於服務端,服務端基於阿里雲AK默認具備該帳號下Topic的操做權限,可是若是想要操做其餘帳號下的Topic須要相應的權限。
規則引擎
例子:
SELECT crypto(userId,'SHA1') md2, (a+1) al, color c, config.flag flag, deviceId(),CASE col.a WHEN 1 THEN 'Y' ELSE 'N' END flagFROM"/12345/#"WHEREc is not null and b<0
select參數和where條件可使用消息的payload屬性做爲列,不支持子查詢。
規則引擎
1 - FROM "topic"
當有符合topic規則的消息到達時,消息的payload數據以json形式被上下文環境使用(若是消息格式不合法,將忽略此消息),您可使用topic()函數引用具體的topic值。
2- SELECT
select的屬性來源於消息的payload,可使用json表達式形式引用,也能夠來源於函數好比deviceId()。
3- WHERE
規則觸發條件,條件表達式。當符合topic的消息到達時,這條消息觸發規則的條件。
4- json表達式
select和where能夠直接使用json表達式。 json表達式支持屬性,也支持數組。若是payload數據解析出錯將會致使規則運行失敗。 轉發數據action中的表達式須要使用 ${表達式} 來使用。
平臺功能與界面 – 建立產品
平臺功能與界面 – 產品信息
平臺功能與界面 – 添加設備
平臺功能與界面 – 設備信息
平臺功能與界面 – 設備受權
平臺功能與界面 – 批量下載設備ID
平臺功能與界面 – 服務配置
服務配置的全部功能目前只支持CCP協議接入的設備,MQTT協議接入的設備不能使用該功能
平臺功能與界面 – Topic管理
CCP協議和MQTT協議都支持Pub/Sub的通訊方式,Pub/Sub是基於Topic路由轉發消息的。Topic是動態建立的,用戶能夠經過服務端調用OpenAPI或者設備端調用協議方法往某個Topic中發佈消息,雲端自動判斷該Topic是否存在,不存在即建立。
平臺功能與界面 – Topic信息
消息內容將會轉換成二進制分發給訂閱者。因此若是發佈的是JSON格式的消息,訂閱者只能拿到轉碼事後的二進制數據,若是想要拿到JSON數據,須要再進行UTF-8轉換成JSON。
阿里雲物聯網套件OPEN API
阿里雲物聯網套件Open API分爲如下3類:
控制指令接口只適用CCP協議接入的設備;
設備互聯接口和受權相關接口適用於CCP或者MQTT協議接入的設備。
阿里雲物聯網套件OPEN API
調用方式
經過向API的服務端地址發送HTTP GET請求,並按照接口說明在請求中加入相應請求參數來完成的;根據請求的處理狀況,系統會返回處理結果。
請求結構
阿里雲物聯網套件OPEN API
簽名機制
IOT服務會對每一個訪問的請求進行身份驗證,因此不管使用HTTP仍是HTTPS協議提交請求,都須要在請求中包含簽名(Signature)信息。
IOT服務經過使用Access Key ID和Access Key Secret進行對稱加密的方法來驗證請求的發送者身份。
Access Key ID和Access Key Secret由阿里雲官方頒發給訪問者(能夠經過阿里雲官方網站申請和管理),
其中Access Key ID用於標識訪問者的身份;Access Key Secret是用於加密簽名字符串和服務器端驗證簽名字符串的密鑰,必須嚴格保密,只有阿里雲和用戶知道。
物聯網IOT服務端SDK
目前僅支持Java SDK和PHP SDK
API列表
API名稱 |
說明 |
SubRequest |
[設備互聯] 服務端訂閱某些Topic(Topic規則) |
PubRequest |
[設備互聯] 服務端發佈消息到某個Topic |
UnsubRequest |
[設備互聯] 服務端取消訂閱某個Topic |
RevertRpcRequest |
[控制指令] 推送數據到設備並獲得設備的回執消息 |
PushByteMessageRequest |
[控制指令] 推送數據到設備不須要獲得設備返回數據 |
物聯網IOT服務端SDK示例(以Java爲例)
一、引入SDK
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-iot</artifactId> <version>2.0.1</version> </dependency> |
二、初始化
String accessKey = "<your accessKey>"; String accessSecret = "<your accessSecret>"; IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou",accessKey, accessSecret); DefaultAcsClient client = new DefaultAcsClient(profile);//初始化SDK客戶端 |
三、發起調用(以推送數據到設備爲例)
RevertRpcRequest rpcRequest = new RevertRpcRequest(); rpcRequest.setDeviceId("11a936267d2a4b6eb7b4cb8549fc1fa7");//設備接入時候獲得ID rpcRequest.setAppKey(appKey);//設備接入時候填寫的appKey rpcRequest.setTimeOut(5000); //超時時間,單位毫秒.若是超過這個時間設備沒反應則返回"TIMEOUT" rpcRequest.setRpcContent("aGVsbG8gd29ybGQ=");//推送給設備的數據.數據要求二進制數據作一次BASE64編碼.(示例裏面是"helloworld"編碼後的值) RevertRpcResponse rpcResponse = client.getAcsResponse(rpcRequest); System.out.println(rpcResponse.getResponseContent());//獲得設備返回的數據信息. System.out.println(rpcResponse.getRpcCode());//對應的響應碼( TIMEOUT/SUCCESS/OFFLINE等) |