設(shè)備從自建平臺平滑遷移至阿里云物聯(lián)網(wǎng)平臺
背景信息
隨著物聯(lián)網(wǎng)領(lǐng)域企業(yè)的業(yè)務(wù)規(guī)模逐漸擴大、終端設(shè)備不斷增多,自建MQTT集群水平擴展和持續(xù)運維的成本越來越高,急需尋找一個高可靠、高安全、低成本、免運維的物聯(lián)網(wǎng)全托管服務(wù),同時保證已經(jīng)在全國各地鋪貨的存量設(shè)備零改造,實現(xiàn)MQTT服務(wù)的遷移。
阿里云物聯(lián)網(wǎng)平臺推出的云網(wǎng)關(guān)完美解決了企業(yè)設(shè)備規(guī)模壯大后遇到的穩(wěn)定性和可擴展性瓶頸,遷移過程設(shè)備端無需改動,僅調(diào)整MQTT域名指向阿里云IoT實例創(chuàng)建的云網(wǎng)關(guān)域名即可。
使用限制
設(shè)備接入地址是域名,且用戶有對域名CNAME重定向的權(quán)限。
MQTT協(xié)議KeepAlive的時間范圍是30s~1200s。
步驟一:設(shè)備接入
購買阿里云物聯(lián)網(wǎng)平臺的尊享型企業(yè)版實例。
在實例概覽頁簽下方,單擊購買實例。
選擇版本為阿里云企業(yè)版,類型為尊享型。其它參數(shù)說明,請參見購買企業(yè)版實例。
創(chuàng)建云網(wǎng)關(guān)產(chǎn)品。設(shè)備接入云網(wǎng)關(guān)有兩種認(rèn)證方式:
說明本示例使用Ubuntu操作系統(tǒng)。
(推薦)一方認(rèn)證
用戶上傳設(shè)備認(rèn)證信息(username、password),由物聯(lián)網(wǎng)平臺完成驗證。
生成和保存證書。
登錄Ubuntu操作系統(tǒng)。
執(zhí)行以下命令生成設(shè)備端和服務(wù)端的根證書文件
root-ca.crt
。openssl req \ -new \ -newkey rsa:2048 \ -days 365 \ -nodes \ -x509 \ -subj "/C=CN/O=Aliyun IOT/CN=IoT CA" \ -keyout root-ca.key \ -out root-ca.crt
根據(jù)根證書文件
root-ca.crt
,自定義服務(wù)端證書。執(zhí)行以下命令生成服務(wù)端密鑰文件
server.key
。openssl genrsa -out server.key 2048
執(zhí)行命令
touch openssl.cnf
新建文件openssl.cnf
。執(zhí)行命令
vi openssl.cnf
進入文件,填入以下內(nèi)容后按Esc鍵,輸入:wq
保存。[policy_match] countryName = cn stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [req] default_bits = 2048 distinguished_name = req_distinguished_name req_extensions = req_ext x509_extensions = v3_req prompt = no [req_distinguished_name] commonName = Server [req_ext] subjectAltName = @alt_names [v3_req] subjectAltName = @alt_names [alt_names] DNS.1 = *.mqtt.iothub.aliyuncs.com DNS.2 = *.igw.iothub.aliyuncs.com
執(zhí)行以下命令生成服務(wù)端請求文件
server.csr
。openssl req -new -key server.key -config openssl.cnf -out server.csr
執(zhí)行以下命令生成服務(wù)端證書文件
server.crt
。openssl x509 -req -days 365 -sha256 -in server.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out server.crt -extensions v3_req -extfile openssl.cnf
執(zhí)行以下命令驗證服務(wù)端證書。
openssl verify -CAfile root-ca.crt server.crt
返回物聯(lián)網(wǎng)平臺控制臺,單擊目標(biāo)企業(yè)版實例的卡片,在左側(cè)導(dǎo)航欄,選擇設(shè)備管理>云網(wǎng)關(guān)。按照下圖配置參數(shù),更多參數(shù)說明請參見創(chuàng)建云網(wǎng)關(guān)產(chǎn)品(MQTT)。
配置證書。
選擇證書配置方式為手動輸入。
配置服務(wù)端證書為生成的
server.crt
文件,服務(wù)端證書私鑰為生成的server.key
文件。
三方認(rèn)證
物聯(lián)網(wǎng)平臺轉(zhuǎn)發(fā)(HTTPS請求)設(shè)備認(rèn)證信息(Username、Password、Clientid),由用戶完成認(rèn)證。如果設(shè)備的Username和Password相同,只有Clientid不同,此時適合使用三方認(rèn)證。
您可以選擇阿里云函數(shù)計算或外部HTTPS,作為三方認(rèn)證的調(diào)用方式。本示例采用函數(shù)計算FC作為三方認(rèn)證調(diào)用方式。函數(shù)計算的更多信息,請參見快速創(chuàng)建函數(shù)。
登錄函數(shù)計算控制臺,
創(chuàng)建服務(wù)。
在頂部菜單欄,選擇地域,然后在服務(wù)列表頁面,單擊創(chuàng)建服務(wù)。
在左側(cè)導(dǎo)航欄,單擊服務(wù)及函數(shù)。配置名稱、描述等信息,然后單擊確定。
創(chuàng)建函數(shù)。
在頂部菜單欄,選擇地域,然后在服務(wù)列表頁面,單擊目標(biāo)服務(wù)。
在函數(shù)管理頁面,單擊創(chuàng)建函數(shù)。按下圖配置參數(shù),然后單擊確定。
編寫處理函數(shù)腳本。以下腳本解析HTTPS請求body中的username,并將username當(dāng)作deviceName返回。根據(jù)實際使用場景,也可以將clientid作為deviceName返回。
var getRawBody = require('raw-body'); var body = require('body'); exports.handler = (req, resp, context) => { getRawBody(req, function(err, body) { var resp_body = {}; var recv_body = JSON.parse(body.toString()); console.log(JSON.stringify(recv_body)); resp_body.deviceName = recv_body["username"]; resp.send(JSON.stringify(resp_body, null, ' ')); }); }
拷貝函數(shù)的公網(wǎng)訪問地址,作為物聯(lián)網(wǎng)平臺云網(wǎng)關(guān)產(chǎn)品的設(shè)備認(rèn)證HTTPS URL。
生成和保存證書。
登錄Ubuntu操作系統(tǒng)。
執(zhí)行以下命令生成設(shè)備端和服務(wù)端的根證書文件
root-ca.crt
。openssl req \ -new \ -newkey rsa:2048 \ -days 365 \ -nodes \ -x509 \ -subj "/C=CN/O=Aliyun IOT/CN=IoT CA" \ -keyout root-ca.key \ -out root-ca.crt
根據(jù)根證書文件
root-ca.crt
,自定義服務(wù)端證書。執(zhí)行以下命令生成服務(wù)端密鑰文件
server.key
。openssl genrsa -out server.key 2048
執(zhí)行命令
touch openssl.cnf
新建文件openssl.cnf
。執(zhí)行命令
vi openssl.cnf
進入文件,填入以下內(nèi)容后按Esc鍵,輸入:wq
保存。[policy_match] countryName = cn stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [req] default_bits = 2048 distinguished_name = req_distinguished_name req_extensions = req_ext x509_extensions = v3_req prompt = no [req_distinguished_name] commonName = Server [req_ext] subjectAltName = @alt_names [v3_req] subjectAltName = @alt_names [alt_names] DNS.1 = *.mqtt.iothub.aliyuncs.com DNS.2 = *.igw.iothub.aliyuncs.com
執(zhí)行以下命令生成服務(wù)端請求文件
server.csr
。openssl req -new -key server.key -config openssl.cnf -out server.csr
執(zhí)行以下命令生成服務(wù)端證書文件
server.crt
。openssl x509 -req -days 365 -sha256 -in server.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out server.crt -extensions v3_req -extfile openssl.cnf
執(zhí)行以下命令驗證服務(wù)端證書。
openssl verify -CAfile root-ca.crt server.crt
單擊目標(biāo)企業(yè)版實例的卡片,在左側(cè)導(dǎo)航欄,選擇設(shè)備管理>云網(wǎng)關(guān)。配置如下參數(shù),更多參數(shù)說明,請參見創(chuàng)建云網(wǎng)關(guān)產(chǎn)品(MQTT)。
協(xié)議為MQTT。
認(rèn)證類型為三方認(rèn)證。
三方認(rèn)證調(diào)用方式為函數(shù)計算FC。
配置證書。
選擇證書配置方式為手動輸入。
配置服務(wù)端證書為生成的
server.crt
文件,服務(wù)端證書私鑰為生成的server.key
文件。
注冊設(shè)備認(rèn)證信息。
一方認(rèn)證
上傳設(shè)備信息。
在實例概覽頁面,單擊目標(biāo)尊享型實例。
在左側(cè)導(dǎo)航欄選擇 ,找到已創(chuàng)建的云網(wǎng)關(guān)產(chǎn)品,單擊右側(cè)操作欄的管理設(shè)備。
在設(shè)備頁面,單擊批量添加。
在批量添加設(shè)備對話框,單擊下載.csv模板下載表格模板。
在模板中填寫SN、MQTT Username和MQTT Password,然后保存文件。
重要MQTT Username和MQTT Password必填,SN可不填。
MQTT Username支持英文字母、數(shù)字、短劃線(-)、下劃線(_)、at(@)、英文句號(.)和英文冒號(:),長度限制為4~32個字符。MQTT Username在產(chǎn)品維度下不可重復(fù)。
MQTT Password 支持英文字母、數(shù)字、短劃線(-)、下劃線(_)、at(@)、英文句號(.)和英文冒號(:),長度限制為1~32個字符。
一個文件中最多可包含1萬條設(shè)備記錄。請不要導(dǎo)入重復(fù)的設(shè)備。
回到批量添加設(shè)備對話框,單擊上傳文件,將填好的表格上傳至物聯(lián)網(wǎng)平臺控制臺,單擊確認(rèn)。
若批量上傳的設(shè)備列表中有不合法的輸入信息,將出現(xiàn)錯誤提示。請單擊下載不合法列表,查看不合法的輸入信息,并進行修正,再重新上傳文件。
三方認(rèn)證
三方認(rèn)證方式不需要提前上傳設(shè)備信息,物聯(lián)網(wǎng)平臺會在設(shè)備建連三方認(rèn)證成功后,創(chuàng)建設(shè)備。
步驟二:應(yīng)用開發(fā)
用戶的業(yè)務(wù)服務(wù)器,可以通過物聯(lián)網(wǎng)平臺服務(wù)端訂閱能力實現(xiàn)設(shè)備上報消息的實時訂閱。也可以通過物聯(lián)網(wǎng)平臺提供的API對設(shè)備進行下行控制。
服務(wù)端訂閱設(shè)備消息
設(shè)備連接物聯(lián)網(wǎng)平臺后,數(shù)據(jù)直接上報至物聯(lián)網(wǎng)平臺,平臺上的數(shù)據(jù)可以通過AMQP通道流轉(zhuǎn)至您的服務(wù)器。本文為您介紹通過配置AMQP服務(wù)端訂閱,實現(xiàn)企業(yè)服務(wù)器通過接入AMQP客戶端,接收車輛設(shè)備數(shù)據(jù)的完整流程。
為消息消費端配置消費組身份,用于企業(yè)服務(wù)器通過消費組獲取轉(zhuǎn)發(fā)的消息。
在左側(cè)導(dǎo)航欄,選擇消息轉(zhuǎn)發(fā)>服務(wù)端訂閱。
單擊消費組列表頁簽,單擊創(chuàng)建消費組。
在創(chuàng)建消費組對話框中,設(shè)置消費組名稱為車輛數(shù)據(jù),單擊確認(rèn)。
在創(chuàng)建消費組對話框中,設(shè)置消費組名稱為車機,單擊確認(rèn)。創(chuàng)建消費組成功后,跳轉(zhuǎn)到消費組詳情頁面,查看消費組ID。復(fù)制并保存消費組ID值,用于AMQP客戶端接入。
為目標(biāo)云網(wǎng)關(guān)產(chǎn)品配置服務(wù)端訂閱,用于您的服務(wù)器直接訂閱產(chǎn)品下多種類型的消息。
在左側(cè)導(dǎo)航欄,選擇消息轉(zhuǎn)發(fā)>服務(wù)端訂閱。
在服務(wù)端訂閱頁面的訂閱列表頁簽下,單擊創(chuàng)建訂閱。
在創(chuàng)建訂閱對話框,按下圖配置參數(shù)后,單擊確認(rèn)。推送消息類型默認(rèn)配置為設(shè)備上報消息、設(shè)備狀態(tài)變化通知。更多消息類型,請參見配置AMQP服務(wù)端訂閱。
在Ubuntu系統(tǒng)執(zhí)行以下命令,下載AMQP服務(wù)端訂閱的Demo文件。
說明本步驟的AMQP Demo文件使用Java語言。
wget https://linkkit-export.oss-cn-shanghai.aliyuncs.com/quick_deploy/amqp-demo.zip
執(zhí)行以下命令,解壓文件。
unzip amqp-demo.zip
在
amqp-demo/src/main/java/com/aliyun/iotx/demo/AmqpClient.java
文件中,參照下表,修改JMS客戶端接入物聯(lián)網(wǎng)平臺代碼中的參數(shù)值。說明文件中添加了結(jié)束程序的代碼
(Thread.sleep(60 * 1000);)
,即程序啟動成功,運行一分鐘后會結(jié)束。實際場景中,您可根據(jù)業(yè)務(wù)需求自行設(shè)置程序啟動邏輯。參數(shù)
示例
說明
accessKey
LTAI4GFGQvKuqHJhFa******
登錄物聯(lián)網(wǎng)平臺控制臺,將鼠標(biāo)移至賬號頭像上,然后單擊AccessKey管理,獲取AccessKey ID和AccessKey Secret。
accessSecret
iMS8ZhCDdfJbCMeA005sieKe******
iotInstanceId
iot-cn-6ja***
實例ID。您可在控制臺的實例概覽頁面查看。
productKey
k00p****
產(chǎn)品key,可以通過設(shè)備管理>設(shè)備詳情頁查看
deviceName
de***
設(shè)備name,可以通過設(shè)備管理>設(shè)備詳情頁查看
consumerGroupId
VWhGZ2QnP7kxWpeSSjt******
已創(chuàng)建的車輛數(shù)據(jù)消費組ID。
clientId
12345
客戶端ID,可自定義,長度不可超過64個字符。建議設(shè)置為您的AMQP客戶端所在服務(wù)器UUID、MAC地址、IP等唯一標(biāo)識,方便您識別區(qū)分不同的客戶端。AMQP客戶端接入成功后,在控制臺的車輛數(shù)據(jù)的消費組詳情頁面,顯示該參數(shù)。
connectionCount
4
啟動AMQP客戶端的連接數(shù),最大不超過64個。用于實時消息推送的擴容。消費組詳情頁面會以${clientId}+"-"+數(shù)字形式,顯示連接的客戶端。其中數(shù)字最小值為0。
host
iot-***.amqp.iothub.aliyuncs.com
AMQP接入域名。您可在控制臺中實例的實例詳情頁面,單擊查看開發(fā)配置,單擊AMQP頁簽查看。
在
pom.xml
文件中,已添加相關(guān)Maven依賴。在amqp-demo
根目錄執(zhí)行以下命令,重新加載Maven變更,構(gòu)建項目。在amqp-demo/target
目錄下生成可部署的JAR包。mvn clean package
在
amqp-demo/target
目錄執(zhí)行以下命令,運行生成的JAR包。java -jar demo-0.0.1-SNAPSHOT-jar-with-dependencies.jar
返回類似如下日志信息,表示AMQP客戶端已接入物聯(lián)網(wǎng)平臺并成功接收消息。
云端下發(fā)消息給設(shè)備
設(shè)備連接到物聯(lián)網(wǎng)平臺后,您可以通過物聯(lián)網(wǎng)平臺提供的云端API向設(shè)備發(fā)送指令。
本步驟基于Java SDK使用說明,調(diào)用Pub接口通過自定義Topic向設(shè)備發(fā)布消息。
在服務(wù)端訂閱設(shè)備消息時下載的
amqp-demo/src/main/java/com/aliyun/iotx/demo/AmqpClient.java
文件中:在文件開頭添加以下依賴。
import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.iot.model.v20180120.PubRequest; import com.aliyuncs.iot.model.v20180120.PubResponse; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile;
在
processMessage
方法中添加以下代碼塊。try { DefaultProfile.addEndpoint("cn-shanghai", "cn-shanghai", "Iot", "iot.cn-shanghai.aliyuncs.com"); } catch (Exception e) { System.out.println("DefaultProfile exception"); } IClientProfile profile = DefaultProfile.getProfile("cn-shanghai", "${accessKey}", "${accessSecret}"); DefaultAcsClient defaultAcsClient = new DefaultAcsClient(profile); PubRequest pubRequest = new PubRequest(); pubRequest.setIotInstanceId("${instanceId}"); pubRequest.setProductKey("${productKey}"); // 要發(fā)送的消息主體。您需要將消息原文轉(zhuǎn)換成二進制數(shù)據(jù),并進行Base64編碼,從而生成消息主體。注意您的設(shè)備收到的會是Base64解碼后的數(shù)據(jù)。 pubRequest.setMessageContent("eyJ0ZXN0IjoidGFzayBwdWIgYnJvYWRjYXN0In0="); // 發(fā)送給設(shè)備的topic,您可以自定義 pubRequest.setTopicFullName("/${productKey}/${deviceName}/user/get"); PubResponse response = null; try { response = defaultAcsClient.getAcsResponse(pubRequest); } catch (Exception e) { logger.error("執(zhí)行失敗:e:" + e.getMessage()); }
參數(shù)
示例
說明
accessKey
LTAI4GFGQvKuqHJhFa******
登錄物聯(lián)網(wǎng)平臺控制臺,將鼠標(biāo)移至賬號頭像上,然后單擊AccessKey管理,獲取AccessKey ID和AccessKey Secret。
accessSecret
iMS8ZhCDdfJbCMeA005sieKe******
InstanceId
iot-cn-6ja***
實例ID。您可在控制臺的實例概覽頁面查看。
productKey
k00p****
產(chǎn)品key,可以通過設(shè)備管理>設(shè)備詳情頁查看。
deviceName
device1
設(shè)備名稱,可以通過設(shè)備管理>設(shè)備詳情頁查看。
在
amqp-demo
根目錄執(zhí)行以下命令,重新加載Maven變更,構(gòu)建項目。在amqp-demo/target
目錄下生成可部署的JAR包。mvn clean package
在
amqp-demo/target
目錄執(zhí)行以下命令,運行上一步驟生成的JAR文件。java -jar demo-0.0.1-SNAPSHOT-jar-with-dependencies.jar
步驟三:存量設(shè)備遷移
更新設(shè)備的接入域名。
創(chuàng)建云網(wǎng)關(guān)設(shè)備完成后,需更新設(shè)備的接入域名:
若設(shè)備已配置接入域名,可配置CNAME解析到云網(wǎng)關(guān)連接域名(云網(wǎng)關(guān)URL)。域名解析詳細(xì)操作,請參見云解析DNS。
若設(shè)備未配置接入域名,需將云網(wǎng)關(guān)URL配置到設(shè)備中。更多信息,請參見MQTT協(xié)議的設(shè)備接入。
云網(wǎng)關(guān)URL獲取方法,請參見查看云網(wǎng)關(guān)URL。
將設(shè)備接入物聯(lián)網(wǎng)平臺。
在Ubuntu系統(tǒng)執(zhí)行以下命令,安裝GCC和Make。
sudo apt-get install gcc make
執(zhí)行以下命令,獲取Demo文件。
wget https://linkkit-export.oss-cn-shanghai.aliyuncs.com/quick_deploy/LinkSDKdemo.zip
執(zhí)行以下命令,解壓Demo文件。
unzip LinkSDKdemo.zip
打開
./LinkSDKdemo/demos/mqtt_x509_auth_demo.c
文件,配置如下參數(shù)。參數(shù)
說明
示例值
client_cert
在步驟一配置自定義證書時生成
client.crt
、client.key
和root-ca.crt
。依次在命令行執(zhí)行以下命令,并將輸出結(jié)果填入這三個參數(shù)。
sed 's/^/\"/g;s/$/\\r\\n\" \\/g' client.crt
sed 's/^/\"/g;s/$/\\r\\n\" \\/g' client.key
sed 's/^/\"/g;s/$/\\r\\n\" \\/g' root-ca.crt
"-----BEGIN CERTIFICATE-----\r\n" \
"MIICx*****JD\r\n" \
...
"Hb4id*******VKsg==\r\n" \
"-----END CERTIFICATE-----\r\n"
client_private_key
"-----BEGIN RSA PRIVATE KEY-----\r\n" \
"MIIE***********************uDR\r\n" \
…
"qws************************fEPh\r\n" \
"-----END RSA PRIVATE KEY-----\r\n"
server_root_ca
"-----BEGIN CERTIFICATE-----\r\n" \
"MIIC4j********EwJD\r\n" \
...
"OTEx********AoM\r\n" \
"-----END CERTIFICATE-----"
MQTT_HOST
云網(wǎng)關(guān)URL和云網(wǎng)關(guān)端口。
在左側(cè)導(dǎo)航欄,選擇設(shè)備管理> 云網(wǎng)關(guān)。
iot-0******t-0****E.igw.iothub.aliyuncs.com
MQTT_PORT
1883
USER_NAME
設(shè)備的MQTT UserName、設(shè)備的MQTT PassWord、設(shè)備的Product Key。
在左側(cè)導(dǎo)航欄,選擇設(shè)備管理> 設(shè)備。單擊目標(biāo)設(shè)備的DeviceName/備注名稱,在頁面上方查看。
Dev********01
PASSWORD
devp********01
PRODUCT_KEY
g1********p
在Link SDK根目錄下。執(zhí)行
make
命令編譯,生成的可執(zhí)行文件為./output/mqtt-x509-auth-demo
。在Link SDK根目錄下,執(zhí)行以下命令,運行可執(zhí)行文件。
./output/mqtt-x509-auth-demo
在設(shè)備端查看運行結(jié)果。
[1691724132.669][LK-0313] MQTT user calls aiot_mqtt_connect api, connect establish tcp connection with server(host='iot-0*****t-02****E.igw.iothub.aliyuncs.com', port=[1883]) success to establish tcp, fd=5 local port: 63275 [1691724132.696][LK-1000] establish mbedtls connection with server(host='iot-0*****t-02****E.igw.iothub.aliyuncs.com', port=[1883]) [1691724132.780][LK-1000] success to establish mbedtls connection, (cost 45366 bytes in total, max used 52318 bytes) [1691724132.827][LK-0313] MQTT connect success in 158 ms AIOT_MQTTEVT_CONNECT [1691724132.827][LK-0309] sub: /k00***/Device001URN001/user/get [1691724132.828][LK-0309] pub: /k00****/Device001URN001/user/update [LK-030A] > 68 65 6C 6C 6F 20 77 6F 72 6C 64 21 | hello world!
設(shè)備連接成功后。
在左側(cè)導(dǎo)航欄,選擇設(shè)備管理>設(shè)備,查看設(shè)備狀態(tài)。
在左側(cè)導(dǎo)航欄,選擇監(jiān)控運維>日志服務(wù),查看設(shè)備上報的消息及日志。
相關(guān)鏈接
云網(wǎng)關(guān)設(shè)備接入物聯(lián)網(wǎng)平臺實現(xiàn)通信的詳細(xì)說明,請參見消息通信說明。
您可使用MQTT.fx工具模擬云網(wǎng)關(guān)設(shè)備接入物聯(lián)網(wǎng)平臺進行通信。具體操作,請參見設(shè)備使用MQTT.fx接入(一方認(rèn)證)。