推薦閱讀: 自建MQTT遷移阿裡雲物聯網平台指南
本實踐案例介紹使用物聯網平台提供的C語言裝置端SDK,将搭載實時作業系統(RTOS)的微控制單元(MCU)的裝置接入阿裡雲物聯網平台。
原有的工業自動化裝置、資料采集裝置、實時控制裝置、家電等使用的是搭載實時作業系統(RTOS)的微控制單元(MCU)。在對此類裝置進行物聯網改造時,可以使用阿裡雲物聯網平台提供的C語言裝置端SDK,将此類裝置接入物聯網平台。
接入方案
将MCU與通信模組相連,MCU與通信模組間通過AT指令進行連接配接和通信。在通信模組上,使用C語言裝置端SDK實作與物聯網平台的連接配接和通信。

準備軟硬體
本示例中,使用了如下MCU、通信模組開發闆和軟體開發環境。
MCU為ST公司生産的STM32F103,其開發闆為NUCLEO-F103RB。
通信模組為SIMCom公司(芯訊通無線科技有限公司)生産的SIM800C,其開發闆為SIM800C mini V2.0。
開發環境為
IAR Embedded Workbench for ARM。
實作過程
建立産品和裝置
首先,在物聯網平台控制台建立産品和裝置,擷取裝置證書資訊(ProductKey、DeviceName和DeviceSecret)。裝置證書資訊需配置到裝置端SDK中。當裝置請求連接配接物聯網平台時,物聯網平台會根據裝置證書資訊進行裝置身份驗證。
操作步驟
- 登入物聯網平台控制台。
-
建立産品。
在左側導航欄,選擇裝置管理 > 産品。
在産品管理頁,單擊建立産品,填入産品資訊,然後單擊儲存。
-
在産品下,建立裝置。
在左側導航欄,選擇裝置管理 > 裝置。
在裝置管理頁,單擊添加裝置,在新建立的産品下添加裝置。
執行結果
裝置建立成功後,會彈出裝置證書資訊。您也可以在裝置管理頁,單擊裝置對應的檢視,進入裝置詳情頁檢視裝置證書資訊。
搭建裝置端開發環境
将MCU與通信模組開發闆相連,搭建軟體開發環境,建立工程項目,導入SDK,完成SDK配置。
背景資訊
本示例中使用了兩個開發闆示意圖如下。
開發闆NUCLEO-F103RB
引腳示意圖如下。
SIM800C mini v2.0
引腳示意圖和說明如下。
引腳說明
PWR-開關機引腳。預設為自動開機。
STA-狀态監測引腳。
GND-電源接地引腳。
RXD-接收序列槽引腳。
TXD-發送序列槽引腳。
EN-電源使能引腳。
VIN-5~18V電源輸入。
連接配接硬體
将兩個開發闆的接收和發送序列槽連接配接,作為AT指令通道。如下圖所示
搭建開發環境
本示例開發工具為STM32CubeMX。使用詳情,請參見
STM32Cube Ecosystem- 打開STM32CubeMX,并選擇建立項目。
STM32F103:RTOS裝置通過TCP模組上雲 - 在Board Seletor中,搜尋NUCLEO-F103RB,并單擊STM32F103RBTx。
STM32F103:RTOS裝置通過TCP模組上雲 - 單擊右上角Start Project。
- 在左側Connectivity菜單中,勾選序列槽USART1作為MCU與模組通信的端口,并進行以下配置。
- 設定Mode為Asynchronous。
-
在Configuration欄,完成以下設定。
在GPIO Settings下,确認Pin為PA9和PA10。
在NVIC Settings下,将USART1 global interrupt設定為Enable。
- 在Middleware下,選擇FREERTOS,并配置為使用計數信号量和堆大小,用于給每個線程配置設定棧。
STM32F103:RTOS裝置通過TCP模組上雲 - 在Project Manager頁簽下,完成Project設定。
STM32F103:RTOS裝置通過TCP模組上雲 - 單擊右上角GENERATE CODE,生成代碼工程。
開發裝置端
使用的
C語言Link Kit SDK将通信模組接入物聯網平台。
其他硬體平台也可以在上述SDK擷取文檔中擷取相關SDK自主調試。
裝置端SDK配置
- 單擊這裡 下載下傳C語言Link Kit SDK 3.0.1版。
-
從下載下傳包中提取SDK代碼。本文以Linux系統操作為例。
運作make menuconfig。
選中ATM Configurations,單擊Select。
選中AT HAL Configurations,單擊Select。
配置如下項目。
FEATURE_PLATFORM_HAS_STDINT=y
FEATURE_PLATFORM_HAS_OS=y
FEATURE_INFRA_STRING=y
FEATURE_INFRA_NET=y
FEATURE_INFRA_LIST=y
FEATURE_INFRA_LOG=y
FEATURE_INFRA_LOG_ALL_MUTED=y
FEATURE_INFRA_LOG_MUTE_FLW=y
FEATURE_INFRA_LOG_MUTE_DBG=y
FEATURE_INFRA_LOG_MUTE_INF=y
FEATURE_INFRA_LOG_MUTE_WRN=y
FEATURE_INFRA_LOG_MUTE_ERR=y
FEATURE_INFRA_LOG_MUTE_CRT=y
FEATURE_INFRA_TIMER=y
FEATURE_INFRA_SHA256=y
FEATURE_INFRA_REPORT=y
FEATURE_INFRA_COMPAT=y
FEATURE_DEV_SIGN=y
FEATURE_MQTT_COMM_ENABLED=y
FEATURE_MQTT_DEFAULT_IMPL=y
FEATURE_MQTT_DIRECT=y
FEATURE_DEVICE_MODEL_CLASSIC=y
FEATURE_ATM_ENABLED=y
FEATURE_AT_TCP_ENABLED=y
FEATURE_AT_PARSER_ENABLED=y
FEATURE_AT_TCP_HAL_SIM800=y
配置完成後,運作./extract.sh提取代碼。
提取的代碼位于output/eng目錄。
其中,各子目錄分别包含的代碼如下。
atm -- AT指令收發子產品
dev_sign -- 裝置身份認證子產品
infra -- 内部實作子產品
mqtt -- MQTT協定子產品
wrappers -- HAL對接子產品
在wrappers目錄下,建立檔案wrappers.c,該檔案中的代碼需實作以下HAL函數。
int32_t HAL_AT_Uart_Deinit(uart_dev_t *uart)
int32_t HAL_AT_Uart_Init(uart_dev_t *uart)
int32_t HAL_AT_Uart_Recv(uart_dev_t *uart, void *data, uint32_t expect_size, uint32_t *recv_size, uint32_t timeout)
int32_t HAL_AT_Uart_Send(uart_dev_t *uart, const void *data, uint32_t size, uint32_t timeout)
int HAL_GetDeviceName(char device_name[IOTX_DEVICE_NAME_LEN])
int HAL_GetDeviceSecret(char device_secret[IOTX_DEVICE_SECRET_LEN])
int HAL_GetFirmwareVersion(char *version)
int HAL_GetProductKey(char product_key[IOTX_PRODUCT_KEY_LEN])
void *HAL_Malloc(uint32_t size)
void HAL_Free(void *ptr)
void *HAL_MutexCreate(void)
void HAL_MutexDestroy(void *mutex)
void HAL_MutexLock(void *mutex)
void HAL_MutexUnlock(void *mutex)
void *HAL_SemaphoreCreate(void)
void HAL_SemaphoreDestroy(void *sem)
void HAL_SemaphorePost(void *sem)
int HAL_SemaphoreWait(void *sem, uint32_t timeout_ms)
int HAL_ThreadCreate(void **thread_handle,
void *(*work_routine)(void *),
void *arg,
hal_os_thread_param_t *hal_os_thread_param,
int *stack_used)
void HAL_SleepMs(uint32_t ms)
void HAL_Printf(const char *fmt, ...)
int HAL_Snprintf(char *str, const int len, const char *fmt, ...)
uint64_t HAL_UptimeMs(void)
下載下傳wrappers.c檔案的代碼Demo。
在代碼Demo中,替換裝置證書資訊為您的裝置證書資訊。
說明 如果您不是使用NUCLEO-F103RB通信模組開發闆,需在配置時,設定FEATURE_AT_TCP_HAL_SIM800=n。且wrappers.c檔案中代碼需實作以下HAL函數。
int HAL_AT_CONN_Close(int fd, int32_t remote_port)
int HAL_AT_CONN_Deinit(void)
int HAL_AT_CONN_DomainToIp(char *domain, char ip[16])
int HAL_AT_CONN_Init(void)
int HAL_AT_CONN_Send(int fd, uint8_t *data, uint32_t len, char remote_ip[16], int32_t remote_port, int32_t timeout)
int HAL_AT_CONN_Start(at_conn_t *conn)
int32_t HAL_AT_Uart_Deinit(uart_dev_t *uart)
int32_t HAL_AT_Uart_Init(uart_dev_t *uart)
int32_t HAL_AT_Uart_Recv(uart_dev_t *uart, void *data, uint32_t expect_size, uint32_t *recv_size, uint32_t timeout)
int32_t HAL_AT_Uart_Send(uart_dev_t *uart, const void *data, uint32_t size, uint32_t timeout)
int HAL_GetDeviceName(char device_name[IOTX_DEVICE_NAME_LEN])
int HAL_GetDeviceSecret(char device_secret[IOTX_DEVICE_SECRET_LEN])
int HAL_GetFirmwareVersion(char *version)
int HAL_GetProductKey(char product_key[IOTX_PRODUCT_KEY_LEN])
void *HAL_Malloc(uint32_t size)
void HAL_Free(void *ptr)
void *HAL_MutexCreate(void)
void HAL_MutexDestroy(void *mutex)
void HAL_MutexLock(void *mutex)
void HAL_MutexUnlock(void *mutex)
void *HAL_SemaphoreCreate(void)
void HAL_SemaphoreDestroy(void *sem)
void HAL_SemaphorePost(void *sem)
int HAL_SemaphoreWait(void *sem, uint32_t timeout_ms)
int HAL_ThreadCreate(void **thread_handle,
void *(*work_routine)(void *),
void *arg,
hal_os_thread_param_t *hal_os_thread_param,
int *stack_used)
void HAL_SleepMs(uint32_t ms)
void HAL_Printf(const char *fmt, ...)
int HAL_Snprintf(char *str, const int len, const char *fmt, ...)
uint64_t HAL_UptimeMs(void)
-
将SDK整合到IAR工程中。
如下圖所示。
-
運作SDK,進行測試。
運作成功後,裝置端本地日志如下圖。
在物聯網平台控制台,監控運維 > 日志服務中,也可檢視裝置上報資料到雲端的日志。
STM32F103:RTOS裝置通過TCP模組上雲
阿裡雲物聯網平台公共執行個體,18元/年起:
點此購買物聯網平台專屬執行個體,1萬台裝置接入低至9.5元/天,更劃算:
檢視文檔按用量付費6折起: