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

基于 Paho 集成安全 Agent 最佳實(shí)踐

更新時(shí)間:

前置條件

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

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

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

文件名

說(shuō)明

CMakeLists.txt

工程的整體配置文件。

src/samples/MQTTAsync_publish.c

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

src/samples/aliot_mqtt_sign.c

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

src/samples/CMakeLists.txt

Demo 的工程配置文件。

首先構(gòu)建出 Paho 的庫(kù)文件,可參考上面的最佳實(shí)踐進(jìn)行。

然后通過(guò) cmake 可以構(gòu)建出供設(shè)備連接物聯(lián)網(wǎng)平臺(tái)的程序示例。本文檔后續(xù)將基于這個(gè)示例展示如果通過(guò)改造上述 MQTTAsync_publish.c 源碼進(jìn)一步集成 IoT 安全 Agent。

(2)需要安裝 IoT 安全運(yùn)營(yíng)中心 Agent

在調(diào)試設(shè)備上,下載并安裝 IoT 安全運(yùn)營(yíng)中心 Agent,請(qǐng)參考安裝 Agent文檔完成安裝。

安裝好 IoT 安全運(yùn)營(yíng)中心 Agent 之后,請(qǐng)確認(rèn)調(diào)試設(shè)備的 /usr/<lib/lib64>/ (CPU 架構(gòu) 32 位是 lib,64 位是 lib64)目錄當(dāng)中存在 libsessionmux.so。這個(gè)例子當(dāng)中正是使用 libsessionmux.so 庫(kù)來(lái)復(fù)用 Paho 創(chuàng)建的通道給 IoT 安全運(yùn)營(yíng)中心 Agent,供其向服務(wù)端收發(fā)數(shù)據(jù)。

1. 改造上云程序并接入安全 Agent

以 src/samples/MQTTAsync_publish.c 為例,講述如何進(jìn)一步通過(guò)微改造,接入 IoT 安全運(yùn)營(yíng)中心 Agent。

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

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

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

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

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

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

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

...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTAsync.h"
...
/* 接入IoT安全運(yùn)營(yíng)中心, 包含下面兩個(gè)文件, 并定義一個(gè)全局會(huì)話變量 */
#include "sagent_defs.h"
#include "session_mux.h"

static channel_session_t *sec_session = NULL;

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

/* 接入IoT安全運(yùn)營(yíng)中心消息回調(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)用,說(shuō)明 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安全運(yùn)營(yíng)中心, 在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ù)中,對(duì)來(lái)自 IoT 安全運(yùn)營(yíng)中心服務(wù)端的下行 topic 進(jìn)行過(guò)濾并轉(zhuǎn)發(fā)給安全 Agent。

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

 /* 接入IoT安全運(yùn)營(yíng)中心, 處理相關(guān)的報(bào)文 */
 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. 編譯和測(cè)試

將 IoT 安全運(yùn)營(yíng)中心 Agent 相應(yīng)架構(gòu)的 libsessionmux.so 拷貝至交叉編譯環(huán)境 $sysroot/usr/local/lib 下,并將對(duì)應(yīng)的 include 目錄中的頭文件拷貝至 $sysroot/usr/local/include 目錄。

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

INCLUDE_DIRECTORIES(
 .
 ${PROJECT_SOURCE_DIR}/src
 ${PROJECT_BINARY_DIR}
 # 新增頭文件搜索路徑
 /usr/local/include
)

# 新增動(dòng)態(tài)庫(kù)搜索路徑
LINK_DIRECTORIES( /usr/local/lib )
...
# 新增一個(gè) sample 應(yīng)用程序 MQTTAsync_security, 依賴上面兩個(gè)源文件
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,進(jìn)入 build 子目錄并執(zhí)行:

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

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

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

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

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

# 來(lái)到 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í)行這個(gè)程序,傳入?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. 固件升級(jí)和生產(chǎn)參考

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

  • /system/dps

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

  • /usr/lib/libsessionmux.so

  • /usr/lib64/libsessionmux.so // 64 位架構(gòu),指向 /usr/lib/libsessionmux.so 的軟鏈接

4. 示例代碼

可以通過(guò)閱讀和編譯運(yùn)行下面源代碼,進(jìn)行快速體驗(yàn),并跑通一個(gè)Paho 接入物聯(lián)網(wǎng)平臺(tái) + 安全 Agent 的例子。源文件和 Makefile:下載

實(shí)踐步驟:

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

  2. 解壓縮附件 demo 包,將 CMakeLists.txt 和 MQTTAsync_security.c 放置到 Paho/src/samples 目錄,并經(jīng)頭文件和動(dòng)態(tài)庫(kù)放置到相應(yīng)的位置,按照上文方法進(jìn)行編譯執(zhí)行即可。

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