日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

基于 Paho 集成安全 Agent 最佳實踐

前置條件

(1)確認(rèn)現(xiàn)有設(shè)備通過 Paho 實現(xiàn)接入阿里云物聯(lián)網(wǎng)平臺:

假設(shè)廠商現(xiàn)有設(shè)備當(dāng)中,是借鑒了阿里云物聯(lián)網(wǎng)平臺 Paho 客戶端最佳實踐Paho 客戶端最佳實踐而接入的。

設(shè)備端開發(fā)環(huán)境中存在開源 Paho 庫以及接入物聯(lián)網(wǎng)平臺的 Paho 客戶端 Demo 包。Demo 程序主要包括以下一些文件:

文件名

說明

CMakeLists.txt

工程的整體配置文件。

src/samples/MQTTAsync_publish.c

該文件包含設(shè)備與物聯(lián)網(wǎng)平臺連接和通信的邏輯代碼。

src/samples/aliot_mqtt_sign.c

該文件中的代碼用于生成 MQTT 建連參數(shù)。應(yīng)用程序調(diào)用該文件中定義的aiotMqttSign() 函數(shù),計算出連接參數(shù) username、password 和 clientId。

src/samples/CMakeLists.txt

Demo 的工程配置文件。

首先構(gòu)建出 Paho 的庫文件,可參考上面的最佳實踐進行。然后通過 cmake 可以構(gòu)建出供設(shè)備連接物聯(lián)網(wǎng)平臺的程序示例。本文檔后續(xù)將基于這個示例展示如果通過改造上述 MQTTAsync_publish.c 源碼進一步集成 IoT 安全 Agent。

(2)需要安裝 IoT 安全運營中心 Agent

在調(diào)試設(shè)備上,下載并安裝 IoT 安全運營中心 Agent,安裝過程中上云方式選擇“接入公有云安全運營中心”。

安裝好 IoT 安全運營中心 Agent 之后,請確認(rèn)調(diào)試設(shè)備的 /usr/local/lib/ 目錄當(dāng)中存在 libsessionmux.so 且 /usr/local/include/ 目錄當(dāng)中存在 sagent_defs.h 以及 session_mux.h 兩個頭文件。這個例子當(dāng)中正是使用 libsessionmux.so 庫來復(fù)用 Paho 創(chuàng)建的通道給 IoT 安全運營中心 Agent,供其向服務(wù)端收發(fā)數(shù)據(jù)。

安裝好 IoT 安全運營中心 Agent 之后,執(zhí)行下面的命令替換上云方式:

sudo service dpsd stop
sudo cp /system/dps/etc/service.ini /system/dps/etc/service_linux.ini
sudo cp /system/dps/etc/service_custom.ini /system/dps/etc/service.ini
sudo service dpsd start

1. 改造連接物聯(lián)網(wǎng)平臺程序并接入安全 Agent

以 src/samples/MQTTAsync_publish.c 為例,講述如何進一步通過微改造,接入 IoT 安全運營中心 Agent。

不論設(shè)備制造商在開發(fā)物聯(lián)網(wǎng)平臺接入時,使用了何種 SDK(包括但不限于阿里云物聯(lián)網(wǎng)平臺 LinkSDK、Paho、libmosquitto 等),這樣的改造都遵循一定規(guī)律,具有一定的要領(lǐng),主要有下面 4 點:

  • 需要同時啟動 IoT 安全 Agent 服務(wù)程序和物聯(lián)網(wǎng)平臺連接程序。

  • 要在設(shè)備自身的物聯(lián)網(wǎng)平臺接入程序源碼里,定義一個 IoT 安全 Agent 的上行數(shù)據(jù)處理回調(diào),當(dāng) IoT 安全 Agent 有數(shù)據(jù)發(fā)送請求時,這個回調(diào)會被調(diào)用,此時利用當(dāng)前的 MQTT publish 接口幫助發(fā)送數(shù)據(jù)給 IoT 安全運營中心云服務(wù)。同時這個回調(diào)函數(shù)定義當(dāng)中也需要調(diào)用 MQTT subscribe 接口幫助 IoT 安全 Agent 訂閱來自 IoT 安全運營中心云服務(wù)的下行 topic。

  • 在設(shè)備調(diào)用 MQTT 客戶端接口成功連接到物聯(lián)網(wǎng)平臺之后,要調(diào)用 IoT 安全 Agent 提供的連接附著接口,并向接口輸入 ProductKey,DeviceName,MQTT 連接句柄,以及上面第 2 條當(dāng)中定義的回調(diào)函數(shù)句柄。

  • 在 MQTT 數(shù)據(jù)接收處理函數(shù)中,對下行 topic 進行匹配過濾,如果是發(fā)送給 IoT 安全 Agent 的 topic,則調(diào)用 IoT 安全 Agent 提供的接口發(fā)送給 Agent。

下面的改造步驟將全程貫穿上面 4 個要領(lǐng),請逐一理解。

(1)在 Paho 源碼目錄樹的 src/samples 下,復(fù)制 MQTTAync_publish.c 為 MQTTAync_security.c,并確認(rèn)aliot_mqtt_sign.c 也在 samples 目錄下(也可以直接試用第 6 章附件中的代碼放置在 src/samples 目錄下),并在 MQTTAync_security.c 源碼額外包含兩個 .h 文件,并定義一個全局變量:

...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTAsync.h"
...
/* 接入IoT安全運營中心, 包含下面兩個文件, 并定義一個全局會話變量 */
#include "sagent_defs.h"
#include "session_mux.h"

static channel_session_t *sec_session = NULL;

(2)定義一個函數(shù),用于處理 IoT 安全運營中心 Agent 的發(fā)送消息事件,直接復(fù)制粘貼即可。

/* 接入IoT安全運營中心消息回調(diào) */
ipc_error_t demo_security_message_handler(void *context, pid_t pid, char *message, uint16_t length) {
 int rc = 0;
 channel_session_t *session = (channel_session_t *) context;
 MQTTAsync client = NULL;
 char topic[MAX_TOPIC_NAME_LEN] = { 0 };

 if (NULL != session) {
 fprintf(stdout, "[SOC] cloud_session found : %s\n", session->session_name);
 client = (MQTTAsync)session->custom_context;
 get_session_pub_topic(session, topic, MAX_TOPIC_NAME_LEN);
 } else {
 fprintf(stderr, "[SOC] channel session is empty\n");
 }

 if (0 == strncmp(message, IPC_DPS_CONNECTED, length)) {
 /* 訂閱 MQTT topic */
 char sec_topic_sub[MAX_TOPIC_NAME_LEN] = { 0 };
 get_session_sub_topic(session, sec_topic_sub, MAX_TOPIC_NAME_LEN);
 if ((rc = MQTTAsync_subscribe(client, sec_topic_sub, 0, NULL)) != MQTTASYNC_SUCCESS) {
 fprintf(stderr, "[SOC] Failed to start subscribe, return code %d\n", rc);
 }
 return 0;
 }

 if (NULL != client) {
 MQTTAsync_message pubmsg = MQTTAsync_message_initializer;

 fprintf(stdout, "[SOC] upstream message\n");
 dump_binary_string(message, length, 128);

 pubmsg.payload = message;
 pubmsg.payloadlen = (int)length;
 pubmsg.qos = 0;
 pubmsg.retained = 0;
 rc = MQTTAsync_sendMessage(client, topic, &pubmsg, NULL);
 fprintf(stdout, "[SOC] MQTTAsync_sendMessage result = %d\n", rc);
 } else {
 fprintf(stderr, "[SOC] MQTT client as custom context is empty\n");
 }

 return 0;
}

(3)在 Demo 程序 Paho MQTT Async 異步建立連接成功之后的 onConnect 回調(diào)函數(shù)里,調(diào)用 IoT 安全 Agent 提供的接口:

void onConnect(void *context, MQTTAsync_successData *response) {
 // 此函數(shù)被調(diào)用,說明 MQTT 連接建立成功了
 MQTTAsync client = (MQTTAsync)context;
 MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
 MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
 int rc;

 printf("Successfully connected\n");
 opts.onSuccess = onSend;
 opts.onFailure = onSendFailure;
 opts.context = client;
 pubmsg.payload = PAYLOAD;
 pubmsg.payloadlen = (int)strlen(PAYLOAD);
 pubmsg.qos = QOS;
 pubmsg.retained = 0;
 if ((rc = MQTTAsync_sendMessage(client, user_topic, &pubmsg, &opts)) != MQTTASYNC_SUCCESS) {
 printf("Failed to start sendMessage, return code %d\n", rc);
 exit(EXIT_FAILURE);
 }

 /* 接入IoT安全運營中心, 在MQTT連接成功之后, 調(diào)用下面的函數(shù)
 * 參數(shù)分別為:product_key, device_name, 定義的消息回調(diào), mqtt_handler句柄 */
 sec_session = attach_to_security_service(product_key, // 傳入 ProductKey
 device_name, // 傳入 DeviceName
 demo_security_message_handler, // 傳入第 2 步中定義的回調(diào)函數(shù)指針
 client, // 傳入 MQTT handler
 "aliot");
}

(4)在 Paho MQTT Aync 異步消息接收處理函數(shù)中,對來自 IoT 安全運營中心服務(wù)端的下行 topic 進行過濾并轉(zhuǎn)發(fā)給安全 Agent。

int messageArrived(void *context, char *topicName, int topicLen, MQTTAsync_message *m) {
 /* not expecting any messages */

 /* 接入IoT安全運營中心, 處理相關(guān)的報文 */
 if (NULL != sec_session) {
 char topic[MAX_TOPIC_NAME_LEN] = { 0 };
 get_session_sub_topic(sec_session, topic, MAX_TOPIC_NAME_LEN);
 if (0 == strncmp(topicName, topic, topicLen)) {
 fprintf(stdout, "[SOC] downstream message\n");
 dump_binary_string(m->payload, m->payloadlen, 128);
 send_to_session(sec_session, m->payload, m->payloadlen);
 }
 }

 return 1;
}

2. 編譯和測試

將源代碼拷貝到目標(biāo)設(shè)備上,或者將 IoT 安全運營中心 Agent 相應(yīng)架構(gòu)的 libsessionmux.so 拷貝至交叉編譯環(huán)境 $sysroot/usr/local/lib 下開始編譯。

在 Paho 源碼樹中,修改 src/samples/CMakeList.txt,添加 MQTTAync_security 應(yīng)用程序構(gòu)建,并為這個應(yīng)用程序添加上述示范程序?qū)?libsessionmux 的依賴:

# 新增一個 sample 應(yīng)用程序 MQTTAsync_security, 依賴上面兩個源文件
ADD_EXECUTABLE(MQTTAsync_security MQTTAsync_security.c aliot_mqtt_sign.c)
...
# 追加安全 Agent 依賴的 SEC_AGENT_LIB
TARGET_LINK_LIBRARIES(MQTTAsync_security paho-mqtt3a sessionmux)
...

在 Paho 代碼根目錄下創(chuàng)建目錄 build,進入 build 子目錄并執(zhí)行:

mkdir build //在工程的根目錄下執(zhí)行
cd build
cmake ..
make -j

其它 GNU 構(gòu)建工具,例如 scons 或者 make 均僅需加入對 /usr/local/lib/libsessionmux.so 和對它的兩個頭文件位于 /usr/local/include 的查找依賴即可,本文不再一一舉例。

構(gòu)建出 build/src/samples/MQTTAync_security 可執(zhí)行程序,執(zhí)行時傳入物聯(lián)網(wǎng)平臺實例 ID,ProductKey,DeviceName,DeviceSecret。

并確保目標(biāo)設(shè)備已安裝好 IoT 安全運營中心 Linux Agent,安全服務(wù)啟動狀態(tài)下(sudo systemctl start dpsd.serviec 啟動)運行參考程序,即可連接 IoT 安全運營中心,并在安全運營中心控制臺資產(chǎn)列表中看到上線設(shè)備。

# 首先確認(rèn) IoT 安全 Agent 服務(wù)已啟動
root@bloodless-vm-ubuntu:~/project/Paho# service dpsd status
dpsd start/running, process 1144

# 來到 Paho/build 目錄,執(zhí)行 cmake 和 make
root@bloodless-vm-ubuntu:~/project/Paho# cd build/
root@bloodless-vm-ubuntu:~/project/Paho/build# cmake ..
...
root@bloodless-vm-ubuntu:~/project/Paho/build# make
... 

# 構(gòu)建生成 Paho/build/src/samples/MQTTAsync_security 可執(zhí)行程序
# 執(zhí)行這個程序,傳入?yún)?shù) iot_instance_id, product_key, device_name, device_secret
root@bloodless-vm-ubuntu:~/project/Paho/build# cd src/samples/
root@bloodless-vm-ubuntu:~/project/Paho/build/src/samples# ./MQTTAsync_security iot_instance_id product_key device_name device_secret

3. 固件升級和生產(chǎn)參考

通過上面的改造,在目標(biāo)設(shè)備上已經(jīng)形成了阿里云物聯(lián)網(wǎng)平臺接入+安全 Agent 的協(xié)同工作。如果您的設(shè)備固件是通過 rootfs 燒錄方式在產(chǎn)線上進行生產(chǎn),或者是采用 rootfs 進行全量或者差分 FOTA,請注意為固件更新添加以下一些文件系統(tǒng)路徑:

  • /system/dps

  • /etc/systemd/system/dpsd.service 或者 /etc/init/dpsd.conf

  • /usr/lib/libsessionmux.so 或者 /usr/lib64/libsessionmux.so

  • /usr/local/include

4. 示例代碼

可以通過閱讀和編譯運行下面源代碼,進行快速體驗,并跑通一個Paho 接入物聯(lián)網(wǎng)平臺 + 安全 Agent 的例子。

源文件和 Makefile:下載

實踐步驟:

(1)安裝 IoT 安全運營中心 Agent,安裝時選擇使用已經(jīng)在物聯(lián)網(wǎng)平臺上注冊的產(chǎn)品。

(2)按照阿里云物聯(lián)網(wǎng)平臺 Paho 上云最佳實踐部署 Paho 源碼。

(3)解壓縮附件 demo 包,將 CMakeLists.txt 和 MQTTAync_security.c 放置到 Paho/src/samples 目錄,按照上文方法進行編譯執(zhí)行即可。運行測試程序之前需要首先執(zhí)行:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

后續(xù)步驟:確認(rèn)集成效果