一、引言:?NB-IoT技術與應用場景
NB-IoT( Narrow?Band?Internet of Things?)作為低功耗廣域網( LPWAN?)的核心技術,以其廣覆???蓋、低功耗、大連接、低成本的特性,廣泛應用于智能表計、環境監測、智能農業、資產追蹤等場景。??本文基于STM32F103C8T6單片機與移遠BC26?NB-IoT模塊,通過HAL庫實現設備與阿里云IoT平臺的?通信,從硬件連接、軟件配置到代碼實現,全程圖文并茂,助力開發者快速上手NB-IoT開發。
二、硬件準備:?模塊選型與電路連接
2.1?核心硬件清單
設備名稱 | 型號/規格 | 作用 |
? 單片機 | STM32F103C8T6(最小系統?板) | 主控單元,控制傳感器與通信?模塊 |
NB-IoT模塊 | 移遠BC26(含天線、SIM卡) | 實現NB網絡接入與數據傳輸 |
電源模塊 | 5V/2A直流電源 | 為BC26和STM32供電 |
傳感器(可選) | DHT11溫濕度傳感器 | 采集環境數據(示例用) |
? 輔助工具 | USB轉TTL模塊、杜邦線、面包?板 | ? 調試與接線 |
2.2?硬件連接詳解
BC26模塊與STM32通過UART串口通信,同時需注意電源隔離與信號完整性。
2.2.1?引腳連接表
STM32F103C8T6引腳 | BC26模塊引腳 | 功能說明 |
PA9(USART1_TX) | RXD | STM32發送數據到BC26 |
PA10(USART1_RX) | TXD | STM32接收BC26返回數據 |
5V | VIN | 模塊電源(BC26需5V供電) |
STM32F103C8T6引腳 | BC26模塊引腳 | 功能說明 |
? GND | ? GND | 共地(必須連接,避免信號干?擾) |
PB0(可選) | PWR | 模塊上電控制(低電平啟動) |
三、軟件環境搭建:?開發工具與庫配置
3.1?開發工具準備
? STM32CubeMX:用于生成初始化代碼(版本6.6.1+)
? Keil MDK5:編譯與下載代碼(需安裝STM32F1xx系列支持包)
? 串口調試助手:如SSCOM、XCOM(用于監控模塊AT指令交互)
? 阿里云IoT平臺:創建產品與設備,獲取通信憑證
3.2?HAL庫與工程配置
3.2.1?STM32CubeMX配置步驟
1. 新建工程:選擇STM32F103C8T6,配置RCC為外部高速時鐘(HSE)。
2. UART配置:
? 打開USART1,模式選擇“異步通信(Asynchronous)”,波特率115200,數據位8,停止位1,無校?驗。
??使能USART1中斷(NVIC Settings?→ USART1 global interrupt?→ Enabled)。
3. GPIO配置:若使用PB0控制BC26上電,配置為推挽輸出(GPIO_Output)。
4. 生成代碼:選擇“MDK-ARM”,勾選“Generate peripheral initialization as .c/.hfiles”,點擊生成工程。
四、?NB-IoT模塊核心原理:AT指令與網絡附著
4.1?BC26?AT指令集概述
BC26通過AT指令控制,核心指令如下表:
指令 | 功能說明 | 示例響應 |
---|---|---|
AT | 測試模塊是否正常 | OK |
AT+CIMI | 查詢SIM卡IMSI號(確認卡是否識別) | 460041234567890 |
AT+CSQ | 查詢信號質量(0-31,越大越好) | +CSQ: 28,0 |
AT+CGATT? | 查詢網絡附著狀態(1=附著,0=未附著) | +CGATT: 1 |
AT+QMTCFG="aliauth",0,"PK","DN","DS" | 配置阿里云MQTT認證信息(PK/DN/DS為設備三元組) | OK |
AT+QMTOPEN=0,"iot-as-mqtt.cn-shanghai.aliyuncs.com",1883 | 連接阿里云MQTT服務器 | +QMTOPEN: 0,0 |
4.2?NB-IoT網絡附著流程
1. 模塊上電初始化:BC26上電后需1-2秒穩定,發送??AT?指令確認響應。
2. SIM卡檢測:發送 ?AT+CIMI,返回IMSI號表示SIM卡正常。
3. 信號質量檢查: ?AT+CSQ返回值需≥10(否則需調整天線位置)。
4. 網絡附著: ?AT+CGATT=1?附著網絡, ?AT+CGATT??返回1表示成功。
5. PDP上下文激活: ?AT+CGACT=1,1激活數據業務,獲取IP地址( ??AT+CGPADDR=1?)。
五、驅動代碼實現:?從UART通信到阿里云對接
5.1?UART底層驅動(基于HAL庫)
5.1.1?UART初始化代碼(stm32f1xx_hal_msp.c )
void HAL_UART_MspInit(UART_HandleTypeDef* huart) {GPIO_InitTypeDef GPIO_InitStruct = {0};if (huart->Instance == USART1) {__HAL_RCC_USART1_CLK_ENABLE(); // 使能USART1時鐘__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA時鐘// PA9(TX)配置為復用推挽輸出GPIO_InitStruct.Pin = GPIO_PIN_9;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// PA10(RX)配置為浮空輸入GPIO_InitStruct.Pin = GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// 配置USART1中斷優先級HAL_NVIC_SetPriority(USART1_IRQn, 3, 3);HAL_NVIC_EnableIRQ(USART1_IRQn);}
}
5.1.2?UART中斷接收與AT指令解析( usart.c )
uint8_t uart_rx_buf[256]; // 接收緩沖區
uint16_t uart_rx_len = 0; // 接收長度// USART1中斷服務函數
void USART1_IRQHandler(void) {uint8_t ch;if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE)) {HAL_UART_Receive(&huart1, &ch, 1, 0x01); // 讀取接收數據uart_rx_buf[uart_rx_len++] = ch; // 存入緩沖區if (ch == '\n' || uart_rx_len >= 255) { // 換行符或緩沖區滿時結束uart_rx_buf[uart_rx_len] = '\0'; // 添加字符串結束符uart_rx_len = 0; // 重置接收長度// 解析AT指令響應(此處可添加狀態機處理邏輯)}}HAL_UART_IRQHandler(&huart1);
}// 發送AT指令函數
HAL_StatusTypeDef AT_SendCmd(char *cmd, uint32_t timeout) {HAL_UART_Transmit(&huart1, (uint8_t*)cmd, strlen(cmd), timeout); // 發送指令HAL_Delay(100); // 等待模塊響應return HAL_OK;
}
5.2?BC26模塊初始化與阿里云連接
5.2.1?BC26初始化流程( bc26.c )
// 模塊初始化狀態枚舉
typedef enum {BC26_STATE_INIT, // 初始狀態BC26_STATE_CHECK_SIM, // 檢查SIM卡BC26_STATE_ATTACH_NET, // 網絡附著BC26_STATE_MQTT_CONN, // MQTT連接BC26_STATE_READY // 就緒狀態
} BC26_StateTypeDef;BC26_StateTypeDef bc26_state = BC26_STATE_INIT;// BC26初始化函數
void BC26_Init(void) {switch (bc26_state) {case BC26_STATE_INIT:AT_SendCmd("AT\r\n", 1000); // 測試模塊if (strstr((char*)uart_rx_buf, "OK")) {bc26_state = BC26_STATE_CHECK_SIM;memset(uart_rx_buf, 0, sizeof(uart_rx_buf));}break;case BC26_STATE_CHECK_SIM:AT_SendCmd("AT+CIMI\r\n", 1000); // 查詢IMSIif (strstr((char*)uart_rx_buf, "460")) { // 中國運營商IMSI以460開頭bc26_state = BC26_STATE_ATTACH_NET;memset(uart_rx_buf, 0, sizeof(uart_rx_buf));}break;// 后續狀態(網絡附著、MQTT連接)代碼省略,完整代碼見工程文件}
}
5.2.2 阿里云MQTT連接關鍵代碼
// 配置阿里云三元組(需替換為實際值)
#define PRODUCT_KEY "a1b2c3d4e5f6g7h8i9j0k"
#define DEVICE_NAME "NB_IoT_Device"
#define DEVICE_SECRET "abcdef1234567890abcdef1234567890"// 連接阿里云MQTT服務器
void BC26_MQTT_Connect(void) {char cmd[256];// 配置阿里云認證sprintf(cmd, "AT+QMTCFG=\"aliauth\",0,\"%s\",\"%s\",\"%s\"\r\n", PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET);AT_SendCmd(cmd, 1000);// 連接阿里云MQTT服務器(地址:iot-as-mqtt.cn-shanghai.aliyuncs.com,端口1883)AT_SendCmd("AT+QMTOPEN=0,\"iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883\r\n", 2000);if (strstr((char*)uart_rx_buf, "+QMTOPEN: 0,0")) { // 連接成功// 訂閱主題(示例:/sys/a1b2c3d4e5f6g7h8i9j0k/NB_IoT_Device/user/get)sprintf(cmd, "AT+QMTSUB=0,1,\"/sys/%s/%s/user/get\",0\r\n", PRODUCT_KEY, DEVICE_NAME);AT_SendCmd(cmd, 1000);}
}
5.3 數據上報與接收示例
5.3.1 溫濕度數據上報(main.c)
// 假設通過DHT11獲取溫濕度(代碼省略,可參考SHT20驅動) float temp = 25.5, humi = 60.0; char data_buf[128]; // 上報數據到阿里云 void Aliyun_ReportData(float temp, float humi) { char cmd[512]; // 構建JSON格式數據(阿里云物模型格式) sprintf(data_buf, "{\"id\":\"123\",\"version\":\"1.0\",\"params\":{\"CurrentTemperature\":{\"value\":%.1f},\"CurrentHumidity\":{\"value\":%.1f}},\"method\":\"thing.event.property.post\"}", temp, humi); // 發布主題(示例:/sys/a1b2c3d4e5f6g7h8i9j0k/NB_IoT_Device/thing/event/property/post) sprintf(cmd, "AT+QMTPUB=0,0,0,0,\"/sys/%s/%s/thing/event/property/post\",\"%s\"\r\n", PRODUCT_KEY, DEVICE_NAME, data_buf); AT_SendCmd(cmd, 2000); } // 主循環 int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); while (1) { BC26_Init(); // 模塊初始化 if (bc26_state == BC26_STATE_READY) { Aliyun_ReportData(temp, humi); // 上報數據 HAL_Delay(10000); // 每10秒上報一次 } HAL_Delay(100); } }
六、調試與測試:從指令交互到平臺驗證
6.1 AT指令調試(串口助手)
通過USB轉TTL連接BC26的TX/RX引腳,使用串口助手發送AT指令,驗證模塊功能:
AT // 測試模塊 OK AT+CIMI // 查詢IMSI 460041234567890 OK AT+CSQ // 信號質量 +CSQ: 28,0 OK AT+CGATT? // 網絡附著 +CGATT: 1 OK
6.2 阿里云平臺數據查看
- 登錄阿里云IoT平臺:進入“設備管理 → 設備”,查看設備狀態為“在線”。
- 物模型數據:在設備詳情頁“物模型數據”中,可實時查看上報的溫濕度數據。
- 日志服務:通過“監控運維 → 日志服務”查看設備上下線記錄和數據傳輸日志。
七、進階應用:低功耗優化與多場景擴展
7.1 BC26低功耗模式(PSM)配置
BC26支持PSM(Power Saving Mode),可通過AT指令配置:
// 使能PSM模式(TAU=3600秒,Active Time=60秒) AT+CSCON=0 // 進入Idle狀態 AT+CPWROFF // 模塊斷電(實際進入PSM)
7.2 STM32低功耗配合(Stop模式)
STM32進入Stop模式,通過LPTIM定時器喚醒:
void EnterStopMode(void) { HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 進入Stop模式 // 喚醒后需重新配置系統時鐘 SystemClock_Config(); }
八、總結與擴展
本文詳細介紹了STM32F103C8T6與BC26模塊的硬件連接、軟件配置、AT指令交互及阿里云對接流程,提供了完整的代碼框架和調試方法。讀者可進一步擴展:
- 多傳感器數據采集:添加光照、氣壓等傳感器,豐富上報數據。
- OTA遠程升級:通過BC26實現設備固件遠程更新。
- 多平臺對接:適配中國移動OneNET、華為OceanConnect等平臺。
技術交流:歡迎在評論區留言提問,或關注博主獲取更多物聯網開發教程!
創作聲明:本文為原創內容,轉載請注明出處。文中代碼經過實際測試,可直接移植使用。如有錯誤,歡迎指正!
?