裝置通過MQTT協議雲網關接入物聯網平台時,裝置身份可以由自訂認證認證,裝置可以使用認證中CN資訊進行註冊。本文以MQTT協議雲網關三方認證的阿里雲FC認證為例,介紹如何將裝置接入物聯網平台。
使用前必讀
本文操作步驟以普通使用者權限為例。如果您在操作過程中涉及到管理員權限才能執行的操作,可嘗試使用sudo
命令執行。
前提條件
已購買尊享型企業版執行個體。本樣本購買華東2(上海)地區的尊享型執行個體。具體操作,請參見購買企業版執行個體。
背景資訊
物聯網平台提供MQTT雲網關功能,支援裝置通過Function Compute提供的三方認證、自訂認證、OCSP、自訂通訊Topic等能力認證並接入物聯網平台進行通訊,實現多種物聯網業務情境。
MQTT協議雲網關裝置認證和通訊說明,請參見MQTT協議雲網關概述。
準備工作
本文樣本使用開發環境:Ubuntu 22.04版本作業系統。
步驟一:產生自訂認證
登入Ubuntu作業系統。
執行以下命令產生裝置端和服務端的根憑證檔案
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
根據根憑證檔案
root-ca.crt
,自訂服務端認證。執行以下命令產生服務端密鑰檔案
server.key
。openssl genrsa -out server.key 2048
執行命令
touch openssl.cnf
建立檔案openssl.cnf
。執行命令
vi openssl.cnf
進入檔案,填入以下內容後按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
執行以下命令產生服務端請求檔案
server.csr
。openssl req -new -key server.key -config openssl.cnf -out server.csr
執行以下命令產生服務端認證檔案
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
執行以下命令驗證服務端認證。
openssl verify -CAfile root-ca.crt server.crt
根據根憑證檔案
root-ca.crt
,自訂裝置端認證。執行以下命令產生裝置端密鑰檔案
client.key
。openssl genrsa -out client.key 2048
執行以下命令產生裝置端認證請求檔案
client.csr
,設定CN為Client_123
。openssl req -new -key client.key -out client.csr -subj "/CN=Client_123"
執行以下命令產生裝置端認證檔案
client.crt
。openssl x509 -req -days 365 -sha256 -in client.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out client.crt
執行以下命令驗證裝置端認證。
openssl verify -CAfile root-ca.crt client.crt
自訂認證檔案如下:
步驟二:建立裝置認證的FC函數
在頂部功能表列,選擇華東2(上海)地區,然後在服務列表頁面,單擊建立服務。
在建立服務面板,填寫服務名稱,例如:IoT_Service,然後單擊確定。
在函數管理頁面,單擊建立函數。
在建立函數頁面,配置以下配置項,然後單擊建立。
在函數詳情頁面,將範例程式碼替換為以下代碼,單擊部署代碼。
認證函數將裝置認證的CN作為deviceName返回。
# -*- coding: utf-8 -*- import logging import json import time import enum import random import string class Request: def __init__(self, json_str): self.clientId = None self.username = None self.password = None self.certificateCommonName = None for key, value in json.loads(json_str).items(): setattr(self, key, value) class Response: def __init__(self): self.deviceName = None self.result = 'true' self.message = 'success' def handler(self, request): # 將裝置認證的CN作為deviceName返回 self.deviceName = request.certificateCommonName return json.dumps(self.__dict__) def handler(event, context): request = Request(event) return Response().handler(request)
步驟三:建立雲網關產品
在執行個體概覽頁面,單擊目標尊享型執行個體。
在左側導覽列,選擇裝置管理 > 雲網關,單擊添加雲網關。
配置如下資訊,單擊確定。
服務端認證為
server.crt
,服務端認證私密金鑰為server.key
,裝置根憑證為root-ca.crt
。參數詳細說明,請參見添加雲網關。在雲網關列表,複製網關URL儲存。
步驟四:開發裝置端程式
返回Ubuntu作業系統。
執行以下命令,安裝依賴庫。
sudo apt-get install build-essential gcc make cmake cmake-gui cmake-curses-gui sudo apt-get install libssl-dev
執行以下命令,安裝MQTT開源庫Paho。
git clone https://github.com/eclipse/paho.mqtt.c.git mkdir build && cd build cmake ../paho.mqtt.c -DPAHO_WITH_SSL=TRUE -DCMAKE_INSTALL_PREFIX="/usr/lib" make -j sudo make install && cd ..
執行命令
touch aiot_mqtt_demo.c
建立裝置類比程式檔案aiot_mqtt_demo.c
。執行命令
vi aiot_mqtt_demo.c
進入檔案,填入以下內容。#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include "MQTTClient.h" int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message) { printf("message recv < topic [%s], payload [%s]\n", topicName, (char *)message->payload); MQTTClient_freeMessage(&message); MQTTClient_free(topicName); return 1; } int main(int argc, char* argv[]) { MQTTClient client; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer; int rc; /* 建立一個mqtt_client, 待替換 */ const char *host = "ssl://iot-0****.igw.iothub.aliyuncs.com:1883"; const char *client_id = "12345"; MQTTClient_create(&client, host, client_id, MQTTCLIENT_PERSISTENCE_NONE, NULL); MQTTClient_setCallbacks(client, NULL, NULL, msgarrvd, NULL); /* 配置建連參數:認證、使用者名稱、密碼,待替換*/ ssl_opts.trustStore = "root-ca.crt"; ssl_opts.privateKey = "client.key"; ssl_opts.keyStore = "client.crt"; conn_opts.ssl = &ssl_opts; conn_opts.username = "sdk_test01"; conn_opts.password = "hello123"; /* mqtt完成建連 */ if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) { printf("Failed to connect, return code %d\n", rc); exit(EXIT_FAILURE); } printf("connect success username %s, password %s\n", conn_opts.username, conn_opts.password); /* 訂閱訊息 */ MQTTClient_subscribe(client, "/user/aiot_mqtt_demo_downraw", 1); /* 產生訊息並迴圈發布訊息 */ MQTTClient_message pubmsg = MQTTClient_message_initializer; const char *topic = "/user/aiot_mqtt_demo_upraw"; pubmsg.payload = "Hello Service!"; pubmsg.payloadlen = (int)strlen(pubmsg.payload); pubmsg.qos = 1; for(int i = 0; i < 100; i++) { MQTTClient_publishMessage(client, topic, &pubmsg, NULL); printf("message send > topic [%s], payload [%s]\n", topic, (char *)pubmsg.payload); sleep(10); } /* 中斷連線並刪除client */ MQTTClient_disconnect(client, 10000); MQTTClient_destroy(&client); return rc; }
在以上代碼中修改實際裝置相關參數,然後按Esc鍵,輸入
:wq
儲存檔案aiot_mqtt_demo.c
。參數
說明
host
MQTT雲網關裝置接入地址,格式為
ssl://${網關接入地址}:${連接埠號碼}
。${網關接入地址}
和${連接埠號碼}
為本文“步驟三:建立雲網關產品”中複製儲存的網關URL中的網域名稱和自訂連接埠號碼。client_id
(可選)用戶端ID,需自訂,長度不可超過64個字元。建議使用裝置的MAC地址或SN碼,方便您識別區分不同的用戶端。
ssl_opts.trustStore
裝置端根憑證
root-ca.crt
的路徑。ssl_opts.privateKey
裝置端密鑰檔案
client.key
的路徑。ssl_opts.keyStore
裝置端認證檔案
client.crt
的路徑。conn_opts.username
MQTT的userName。
userName支援英文字母、數字、短劃線(-)、底線(_)、at(@)、英文句號(.)和英文冒號(:),長度限制為4~32個字元。userName在產品維度下不可重複。
conn_opts.password
MQTT的password。
password支援英文字母、數字、短劃線(-)、底線(_)、at(@)、英文句號(.)和英文冒號(:),長度限制為1~32個字元。
本樣本相關庫的安裝、認證的製作和裝置程式的開發完成,如下所示: