本文介紹如何快速移植C語言Link SDK,將搭載MCU+蜂窩模組的設備接入阿里云物聯網平臺。

背景信息

無法直接連網的設備,外接MCU+蜂窩模組后,MCU通過AT指令控制蜂窩模組,設備即可實現連網。通過移植阿里云物聯網平臺提供的C Link SDK,設備即可實現快速上云。

本文以搭載通用MCU+蜂窩模組的設備為例,介紹在MCU開發板上移植Link SDK的過程,將設備接入物聯網平臺,實現物聯網平臺管理與分析設備。

接入方案

開發準備

進行Link SDK移植前,您需準備以下材料。

  • 硬件:
    硬件類型 說明
    MCU開發板
    • 名稱:STM32 Nucleo板
    • 型號:STM32L476RG
    • 系統:FreeRTOS
    • 參考文檔:NUCLEO-L476RG
    蜂窩通信板
    SIM卡
    • 接口型號:Micro
    • 信號:4G
  • 開發工具:
    工具名稱 說明
    STM32CubeMX 用于生成MCU外設初始化代碼的開發工具,版本為6.1.2。
    MDK-Arm 集成開發環境和調試代碼的開發工具,版本為5.26.2.0。
    串口調試工具 用于連接和調試設備的工具,其串口波特率為115200。
  • C Link SDK:

    物聯網平臺控制臺SDK定制頁面,獲取SDK。

    具體操作,請參見獲取SDK。

    說明

    您可以下載示例工程文件,查看C Link SDK移植到示例工程后的結果,并參考其中的配置,將C Link SDK移植到設備。

    定制SDK
  • 設備認證信息:

    進行Link SDK移植前,您需在物聯網平臺控制臺創建產品和設備,獲取設備認證信息,本文使用一機一密的認證方式。具體操作,請參見獲取一機一密設備認證信息。

開發流程

  1. 連接硬件。
    1. 將SIM卡插入蜂窩通信板SIM0卡槽。
      通信板插入SIM卡
    2. 使用杜邦線,將MCU開發板的UART1串口與蜂窩通信板的UART1串口相連。其引腳分別對應如下:
      開發板與通信板連接
      杜邦線序號 接線顏色 蜂窩通信板串口引腳 MCU開發板串口引腳
      黃色 U1_TXD PA10
      綠色 U1_RXD PA9
      藍色 GND GND
    3. 使用杜邦線,將MCU開發板的UART3串口與開發工具的串口相連。其引腳分別對應如下:
      開發板與開發工具相連
      杜邦線序號 MCU開發板串口引腳 開發工具串口引腳
      PC4 RXD
      PC5 TXD
      GND GND

      示例中MCU開發板引腳的示意圖詳情,請參見STM32 Nucleo-64 boards第35頁的Figure24。

    4. 使用Micro USB接口為兩塊板上電,長按通信板的開機

      上電后,PWR亮紅燈,NET黃燈閃爍,LTE亮藍燈。

      上電
  2. 工程移植。
    1. 打開CubeMX,創建并生成基礎工程代碼配置。

      關于使用CubeMX開發工具的使用方法,請參見CubeMX官網。

      需配置的串口和系統的設置如下:

      說明 下表中,UART1的波特率和FREERTOS內存大小的值為推薦值,您可以根據業務實際情況進行配置。
      串口或系統 說明
      UART1
      • 輸出:異步
      • 波特率:230400
      • DMA:啟用
      • 接收中斷:啟用
      UART3
      • 輸出:異步
      • 波特率:115200
      FREERTOS 內存大?。?1920
    2. 使用MDK-Arm,打開工程文件,并將獲取的C Link SDK導入工程。
      C Link SDK文件中,除了./LinkSDK/demo文件夾中的文件,其他文件夾中的.c.h文件均需導入工程。使用MDK-Arm導入源代碼到工程的步驟,請參見添加源文件到工程
    3. 在工程中,編寫代碼,配置系統底層依賴。
      系統底層相關的依賴都在代碼aiot_sysdep_portfile_t g_aiot_sysdep_portfile中,完成系統底層依賴接口的適配,更多信息,請參見移植說明。

      您可以在示例工程,查看系統底層依賴配置的示例文件./Linkkit/portfiles/aiot_port/freertos_tcp_modem_port.c

    4. 在項目工程中,編寫代碼,配置驅動蜂窩模組。
      • 適配AT命令:打開./Linkkit/portfiles/aiot_port/aiot_at_api.c文件,修改適配AT命令列表。
      • 適配串口:
        • 調用aiot_at_setopt,為AT模塊設置串口數據發送接口。
        • 每當串口接收到數據時,調用aiot_at_uart_recv處理AT指令解析。
        在,通過接收數據,再通過指定要發送信息的接口。

      您可以在示例工程,查看驅動蜂窩模組配置的示例文件./Linkkit/portfiles/aiot_port/linkkit_wrapper.c。

    5. 打開./linkkit_mcu_cellular_project/LinkKit/portfiles/aiot_port/mqtt_at_basic_demo.c,配置設備認證信息。
      需要配置的參數如下:
      參數 示例 說明
      url iot-as-mqtt.cn-shanghai.aliyuncs.com 設備的接入域名。本示例使用華東2(上海)地域的舊版公共實例。
      • 若使用公共實例,您可將cn-shanghai更改為您服務所在的地域ID。請在物聯網平臺控制臺左上角,查看您服務所在的地域。地域ID的取值,請參見地域和可用區
      • 若使用企業版實例或新版公共實例,您可在實例詳情頁面,單擊查看開發配置,查看MQTT設備接入的信息。
      product_key a18wP****** 設備認證信息。開發準備時,您獲取的設備證書。

      您也可以在物聯網平臺設備的詳情頁查看設備的認證信息。

      device_name stm32l4_mbedtls_cat1
      device_secret uwMTmVAMnGGHaAkqmeDY6cHxxB******
  3. 調式運行。
    1. 單擊編譯按鈕,編譯工程文件。
    2. 單擊下載按鈕,將編譯后的Demo可執行文件下載至MCU開發板。
    3. 單擊運行,在MCU上,運行Demo可執行文件。

運行結果

  • 您可以在設備端,查看設備日志。
    • 以下日志說明設備已連接物聯網平臺。
      linkkit_init[2.222][LK-0313] MQTT user calls aiot_mqtt_connect api, connect
      [2.266][LK-0317] stm32l4_mbedtls_cat1&a18wP******
      [2.277][LK-0318] B4C45425D73E24B2935D73C1E98B6079A630FBE03F61E2A2031CEE7867******
      unknown option, 2
      unknown option, 5
      [2.377][LK-1000] establish mbedtls connection with server(host='a18wP******.iot-as-mqtt.cn-shanghai.aliyuncs.com', port=[443])
      [7.311][LK-1000] success to establish mbedtls connection,(cost 18686 bytes in total, max used 21294 bytes)
      [7.500][LK-0313] MQTT connect success in 5286 ms
    • 以下日志為設備的時間同步功能。更多信息, 請參見NTP服務。
      AIOT_MQTTEVT_CONNECT
      [7.544][LK-0309] pub: /ext/ntp/a18wP******/stm32l4_mbedtls_cat1/request
      [LK-030A] > 7B 22 64 65 76 69 63 65  53 65 6E 64 54 69 6D 65 | {"deviceSendTime
      [LK-030A] > 22 3A 22 37 35 33 39 22  7D                      | ":"7539"}
      [7.688][LK-0309] pub: /ext/ntp/a18wP******/stm32l4_mbedtls_cat1/response
      local time: 1620915828805, 2021/05/13-22:23:48:805
      heartbeat response
    • 以下為設備的物模型數據。更多信息,請參見什么是物模型。
      [1620915829.788][LK-0309] pub: /sys/a18wP******/stm32l4_mbedtls_cat1/thing/config/log/get
      [LK-030A] > 7B 22 69 64 22 3A 22 31  22 2C 22 76 65 72 73 69 | {"id":"1","versi
      [LK-030A] > 6F 6E 22 3A 22 31 2E 30  22 2C 22 70 61 72 61 6D | on":"1.0","param
      [LK-030A] > 73 22 3A 7B 22 67 65 74  54 79 70 65 22 3A 22 63 | s":{"getType":"c
      [LK-030A] > 6F 6E 74 65 6E 74 22 2C  22 63 6F 6E 66 69 67 53 | ontent","configS
      [LK-030A] > 63 6F 70 65 22 3A 22 64  65 76 69 63 65 22 7D 7D | cope":"device"}}
      [1620915830.011][LK-0309] pub: /sys/a18wP******/stm32l4_mbedtls_cat1/thing/config/log/get_reply
      [1620915830.033][LK-1507] LOGPOST user log config arrived
      log switch state is: 1
      [1620915835.066][LK-0309] pub: /sys/a18wP******/stm32l4_mbedtls_cat1/thing/log/post
      [LK-030A] > 7B 22 69 64 22 3A 22 32  22 2C 22 76 65 72 73 69 | {"id":"2","versi
      [LK-030A] > 6F 6E 22 3A 22 31 2E 30  22 2C 22 70 61 72 61 6D | on":"1.0","param
      [LK-030A] > 73 22 3A 5B 7B 22 75 74  63 54 69 6D 65 22 3A 22 | s":[{"utcTime":"
      [LK-030A] > 32 30 32 31 2F 35 2F 31  33 20 32 32 3A 32 33 3A | 2021/5/13 22:23:
      [LK-030A] > 35 35 22 2C 22 6C 6F 67  4C 65 76 65 6C 22 3A 22 | 55","logLevel":"
      [LK-030A] > 44 45 42 55 47 22 2C 22  6D 6F 64 75 6C 65 22 3A | DEBUG","module":
      [LK-030A] > 22 41 50 50 22 2C 22 63  6F 64 65 22 3A 22 32 30 | "APP","code":"20
      [LK-030A] > 30 22 2C 22 74 72 61 63  65 43 6F 6E 74 65 78 74 | 0","traceContext
      [LK-030A] > 22 3A 22 30 22 2C 22 6C  6F 67 43 6F 6E 74 65 6E | ":"0","logConten
      [LK-030A] > 74 22 3A 22 6C 6F 67 20  69 6E 20 77 68 69 6C 65 | t":"log in while
      [LK-030A] > 28 31 29 22 7D 5D 7D                             | (1)"}]}
      [1620915836.855][LK-0309] pub: /sys/a18wP******/stm32l4_mbedtls_cat1/thing/event/property/post
      [LK-030A] > 7B 22 69 64 22 3A 22 33  22 2C 22 76 65 72 73 69 | {"id":"3","versi
      [LK-030A] > 6F 6E 22 3A 22 31 2E 30  22 2C 22 70 61 72 61 6D | on":"1.0","param
      [LK-030A] > 73 22 3A 7B 22 4C 69 67  68 74 53 77 69 74 63 68 | s":{"LightSwitch
      [LK-030A] > 22 3A 20 30 7D 2C 22 73  79 73 22 3A 7B 22 61 63 | ": 0},"sys":{"ac
      [LK-030A] > 6B 22 3A 31 7D 7D                                | k":1}}
      [1620915837.099][LK-0309] pub: /sys/a18wP******/stm32l4_mbedtls_cat1/thing/event/Error/post
      [1620915837.122][LK-0309] pub: /sys/a18wP******/stm32l4_mbedtls_cat1/thing/event/property/post_reply
      [1620915837.177][LK-0A08] DM recv generic reply
      demo_dm_recv_handler, type = 0
      msg_id = 3, code = 200, data = {}, message = success
      [1620915837.311][LK-0309] pub: /sys/a18wP******/stm32l4_mbedtls_cat1/thing/event/Error/post_reply
      [1620915837.344][LK-0A08] DM recv generic reply
      demo_dm_recv_handler, type = 0
      msg_id = 4, code = 200, data = {}, message = success
  • 您可以在物聯網平臺控制臺查看設備的狀態和運行日志。

    • 左側導航欄,選擇設備管理 > 設備,找到設備,查看設備狀態。設備狀態顯示為在線,則表示設備與物聯網平臺成功連接。設備狀態
    • 在左側導航欄,選擇監控運維 > 日志服務,選擇產品后,查看設備的日志信息。設備日志