關(guān)注+星標(biāo)公眾號,不錯過精彩內(nèi)容
作者 | MakingClub
微信公眾號 | electronic造物實驗室
阿里云物聯(lián)網(wǎng)平臺
新建設(shè)備
- 注冊阿里云賬號并搜索物聯(lián)網(wǎng)服務(wù)。選擇并進(jìn)入物聯(lián)網(wǎng)平臺產(chǎn)品頁。
- 點擊管理控制臺,進(jìn)入物聯(lián)網(wǎng)平臺管理界面。
- 選擇公共實例(如果尚未開通,需要先進(jìn)行開通,具體步驟不再贅述),然后點擊進(jìn)入。
- 創(chuàng)建一個新的產(chǎn)品。填寫產(chǎn)品名稱、所屬品類等必要信息,并完成產(chǎn)品創(chuàng)建步驟。
- 在創(chuàng)建完成的產(chǎn)品頁面上,添加設(shè)備。輸入設(shè)備名稱并確認(rèn)。
- 輸入設(shè)備名稱,輸入完成后點擊確認(rèn);
至此,阿里云物聯(lián)網(wǎng)平臺創(chuàng)建設(shè)備完成,接下來獲取MQTT連接參數(shù)。
獲取AT參數(shù)
創(chuàng)建設(shè)備成功后進(jìn)入設(shè)備詳情頁,查看MQTT連接參數(shù),并進(jìn)行保存。
通過上述步驟,你可以獲取到阿里云物聯(lián)網(wǎng)平臺上設(shè)備的MQTT連接參數(shù),并進(jìn)行保存。這些參數(shù)將用于在ESP-01S / ESP8266上配置AT指令,實現(xiàn)設(shè)備與物聯(lián)網(wǎng)平臺之間的通信。
AT指令介紹
AT命令,用來控制TE(TerminalEquipment)和MT(Mobile Terminal)之間交互的規(guī)則。AT指令可以參考樂鑫官方提供的AT 命令集。
連接阿里云AT指令介紹
- AT+RST 復(fù)位ESP-01S / ESP8266模塊;
- AT+CWMODE=3 設(shè)置ESP模塊為Station+SoftAP模式;
- AT+CWJAP=“SSID”,“PWD” 設(shè)置ESP模塊連接無線網(wǎng)絡(luò) *注意雙引號為英文;
- AT+MQTTUSERCFG=0,1,“NULL”,“username”,“password”,0,0,“” 設(shè)置 MQTT 用戶屬性;
- AT+MQTTCLIENTID=0,“clientId” 設(shè)置MQTT 的clientId參數(shù);
- AT+MQTTCONN=0,“host”,1883,1 連接 MQTT Broker;
-
AT+MQTTCLEAN 斷開MQTT連接。
以上為連接阿里云MQTT服務(wù)器需要的配置命令,接下來在阿里云新建設(shè)備,獲取AT指令需要填充的參數(shù)。
MQTT固件
ESP-01S 1M Flash固件下載1MB AT MQTT
ESP8266 4M Flash固件下載4MB AT MQTT
固件下載
硬件連接
USB轉(zhuǎn)TTL推薦使用帶有獨立LDO的模塊,因為ESP8266EX通訊時電流較大,如無獨立LDO可能導(dǎo)致ESP8266EX掉電重啟。
可以使用下圖模塊,帶獨立LDO,可以提供一定帶負(fù)載能力;
下圖模塊不推薦使用,無獨立LDO,3V3為CH340提供,帶負(fù)載能力弱。
ESP-01燒錄固件
VCC -----> TTL 3.3V
GND -----> TTL GND
TXD -----> TTL RXD
RXD-----> TTL TXD
EN-------> TTL 3.3V
RST ----> TTL RST
GPIO0 ---> GND
GPIO2 ---> 3.3V (不接也可以)
基本接法如下圖所示:
ESP-01S燒錄固件
VCC -----> TTL 3.3V
GND -----> TTL GND
TXD -----> TTL RXD
RXD-----> TTL TXD
RST ----> TTL RST
GPIO0 ---> GND
固件燒錄
下載AT指令固件到本地后,需要使用樂鑫提供的flash_download_tool
工具。下載后直接解壓即用,運行燒錄工具。樂鑫官網(wǎng) - 支持 - 相關(guān)下載 - 工具-Flash 下載工具
選擇型號,選擇ESP8266
打開燒錄軟件, 從"…“選擇要燒錄的bin文件: ESP8266-AT_MQTT-1M.bin;填寫燒錄地址"0x0000”;SPI MODE選擇 “DOUT”;FLASH SIZE選擇 “8Mbit”;"DoNotChgBin"不變;“COM” 選擇你USBtoTTL的COM口;波特率默認(rèn)即可。上述配置完成后, 點擊START開始燒錄, 若一直停在等待上電同步可以就將RST連接GND再斷開, 就可以開始下載了。
串口助手調(diào)試
在進(jìn)行串口助手調(diào)試之前,需要進(jìn)行正確的硬件連接。
硬件連接
對于ESP-01,需要使用兩個上拉電阻將EN和RST引腳上拉到3.3V,如下圖所示:
對于ESP-01S,只需要連接3.3V、RXD、TXD和GND即可。
測試指令
在串口軟件中打開COM口,選擇波特率115200,加回車換行;發(fā)送AT指令,并等待接收到回復(fù)的"OK"。
接下來將MQTT信息填充進(jìn)AT命令中進(jìn)行連接測試。
- AT+RST 復(fù)位ESP-01S / ESP8266模塊;
- AT+CWMODE=3 設(shè)置ESP模塊為Station+SoftAP模式;
- AT+CWJAP=“SSID”,“PWD” 設(shè)置ESP模塊連接無線網(wǎng)絡(luò) *注意雙引號為英文;
- AT+MQTTUSERCFG=0,1,“NULL”,“username”,“passwd”,0,0,“” 設(shè)置 MQTT 用戶屬性;
- AT+MQTTCLIENTID=0,“clientId” 設(shè)置MQTT 的clientId參數(shù);
- AT+MQTTCONN=0,“host”,1883,1 連接 MQTT Broker;
-
AT+MQTTCLEAN 斷開MQTT連接。
AT+MQTTUSERCFG中的username和passwd與下圖對應(yīng)填寫,AT+MQTTCLIENTID中的clientId也與下圖對應(yīng),AT+MQTTCONN的host與下圖mqttHostUrl對應(yīng)。
需要注意AT+MQTTCLIENTID指令中的clientId中的逗號前需要加’ \ '符號進(jìn)行轉(zhuǎn)義,假設(shè)clientId為“a1Tt5hwk2af.Device1|securemode=2,signmethod=hmacsha256,timestamp=1685260171273|”,那么發(fā)送的AT指令應(yīng)為AT+MQTTCLIENTID=0,“723712|securemode=2,signmethod=hmacsha256,timestamp=1685260171273|”
發(fā)送完以上指令后,在阿里云物聯(lián)網(wǎng)平臺中刷新設(shè)備網(wǎng)頁,你將會看到設(shè)備已成功上線的信息。
[18:24:44.609]發(fā)→◇AT
□
[18:24:44.613]收←◆AT
OK
[18:30:14.787]發(fā)→◇ATE0
□
[18:30:14.791]收←◆ATE0
OK
[18:30:31.339]發(fā)→◇AT+CWMODE=3
□
[18:30:31.344]收←◆
OK
[18:31:21.198]發(fā)→◇AT+CWJAP="Xiaxxxx81","dsssxx1"
□
[18:31:22.397]收←◆WIFI CONNECTED
[18:31:23.908]收←◆WIFI GOT IP
OK
[19:24:10.517]發(fā)→◇AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"
□
[19:24:10.530]收←◆
OK
[19:24:53.745]發(fā)→◇AT+MQTTUSERCFG=0,1,"NULL","Devixx1&a1Ttxxxaf","05314xxxxxxxxxxxxxxxxxxxxxxc5de74",0,0,""
□
[19:24:53.755]收←◆
OK
[19:25:09.562]發(fā)→◇AT+MQTTCLIENTID=0,"a1xxxxf.Device1|securemode=2\,signmethod=hmacsha256\,timestamp=1685260171273|"
□
[19:25:09.571]收←◆
OK
[19:25:21.162]發(fā)→◇AT+MQTTCONN=0,"a1xxxxxaf.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1
□
[19:25:21.347]收←◆+MQTTCONNECTED:0,1,"a1Tt5wtm2af.iot-as-mqtt.cn-shanghai.aliyuncs.com","1883","",1
OK
可以看到設(shè)備已成功上線。
AT_Command移植
AT_Command由魔羅大佬開發(fā),是一款管理AT命令通信交互組件, 適用于Modem、WIFI模塊、藍(lán)牙等使用AT命令或者ASCII命令行通信的場景。本次AT連接使用AT_Command移植到STM32F103C8T6進(jìn)行運行。AT_Command Gitee鏈接
本次的項目環(huán)境為HAL庫+CubeMx進(jìn)行配置開發(fā)。
-
首先需要定義適配器,完成驅(qū)動接口及緩沖區(qū)設(shè)置
在wifi_uart.c文件中,進(jìn)行了串口發(fā)送和接收回調(diào)的實現(xiàn)。/* * @brief 向串口發(fā)送緩沖區(qū)內(nèi)寫入數(shù)據(jù)并啟動發(fā)送 * @param[in] buf - 數(shù)據(jù)緩存 * @param[in] len - 數(shù)據(jù)長度 * @return 實際寫入長度(如果此時緩沖區(qū)滿,則返回len) */ unsigned int wifi_uart_write(const void *buf, unsigned int len) { unsigned int ret; ret = ring_buf_put(&rbsend, (unsigned char *)buf, len); HAL_UART_Transmit(&wifi_uart,(unsigned char *)buf,len,0xffff); // wifi串口數(shù)據(jù)發(fā)送 return ret; } /* * @brief WIFI串口接收 * @param[in] none * @return none */ void WIFI_UART_RxCpltCallback(unsigned char *data, uint8_t len) { ring_buf_put(&rbrecv, data, len); /*將數(shù)據(jù)放入接收緩沖區(qū)*/ }
串口數(shù)據(jù)接收使用串口2(TX為PA2, RX為PA3)的是DMA+空閑中斷的方式進(jìn)行接收,在
stm32f1xx_it.c
文件中:/** * @brief This function handles USART2 global interrupt. */ void USART2_IRQHandler(void) { /* USER CODE BEGIN USART2_IRQn 0 */ /* USER CODE END USART2_IRQn 0 */ HAL_UART_IRQHandler(&huart2); /* USER CODE BEGIN USART2_IRQn 1 */ if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE) != RESET) // 空閑中斷 { __HAL_UART_CLEAR_IDLEFLAG(&huart2); // 清除空閑中斷標(biāo)志位 HAL_UART_DMAStop(&huart2); // 停止DMA接收 if( wifiConnectFlag == 0) // 未完成配置 WIFI_UART_RxCpltCallback(uart2_rx_buf, strlen(uart2_rx_buf)); // 數(shù)據(jù)處理函數(shù) else // 配置完成 等待設(shè)備連接 wifi_connnect_calback(uart2_rx_buf, strlen(uart2_rx_buf)); memset(uart2_rx_buf, 0, strlen(uart2_rx_buf)); // 清除數(shù)據(jù) HAL_UART_Receive_DMA(&huart2, uart2_rx_buf, buf_size); // 重新打開DMA接收 } /* USER CODE END USART2_IRQn 1 */ }
-
使用AT適配器創(chuàng)建AT通信對象,在
wifi.c
文件中:static at_obj_t at;static at_obj_t at; /* * @brief wifi初始化 配置8266 */ void wifi_init(void) { static char wifi_msg[128] = {0}; // WIFI 串口初始化 wifi_uart_init(115200); at_obj_init(&at, &at_adapter); // 關(guān)閉回顯 at_send_singlline(&at, NULL, "ATE0"); // OK // AT測試 at_send_singlline(&at, NULL, "AT"); // OK ERROR * // 配置工作模式 AP模式 at_send_singlline(&at, NULL, "AT+CWMODE=3"); // 創(chuàng)建路由器 sprintf(wifi_msg, "AT+CWJAP=\"%s\",\"%s\"", SSID, PWD); at_send_singlline(&at, NULL, wifi_msg); // 設(shè)定域名 at_send_singlline(&at, NULL, "AT+CIPSNTPCFG=1,8,\"ntp1.aliyun.com\""); // 設(shè)定MQTT賬號 at_send_singlline(&at, NULL, "AT+MQTTUSERCFG=0,1,\"NULL\",\"username\",\"passwd",0,0,\"\""); // 設(shè)定Clinent ID at_send_singlline(&at, NULL, "AT+MQTTCLIENTID=0,\"clientid注意逗號需反義\""); // 鏈接MQTT at_send_singlline(&at, connnect_calback, "AT+MQTTCONN=0,\"host\",1883,1"); };
-
加入輪詢?nèi)蝿?wù),
wifi.c
中實現(xiàn)了wifi_task
函數(shù),并在初始化中進(jìn)行循環(huán)調(diào)用,如下:wifi_init(); do { wifi_task(); HAL_Delay(10); }while(wifiConnectFlag == 0);
wifiConnectFlag
標(biāo)志位會在at_send_singlline(&at, connnect_calback, "AT+MQTTCONN=0,\"host\",1883,1");
中的connnect_calback
回調(diào)函數(shù)中進(jìn)行判斷。
如上進(jìn)行配置后可基本完成AT_Command的配置,可以進(jìn)行串口測試。 -
數(shù)據(jù)上報,數(shù)據(jù)上報通常使用標(biāo)準(zhǔn)格式如下:
首先需要在產(chǎn)品中找到屬性上報的Topic類,注意要將${deviceName}
替換為設(shè)備名。
STM32中可使用如下的代碼進(jìn)行motorstatus
屬性上報char sendmsg[256]; sprintf(sendmsg,"AT+MQTTPUB=0,\"/sys/a1Tt5wtm2af/${deviceName}/thing/event/property/post\",\"{\\\"id\\\":1685082419785\\\,\\\"params\\\":{\\\"motorstatus\\\":%d}\\\,\\\"version\\\":\\\"1.0\\\"\\\,\\\"method\\\":\\\"thing.event.property.post\\\"}\",1,0\r\n", motorstatus); HAL_UART_Transmit(&huart2, (unsigned char *)sendmsg, strlen(sendmsg), 0xffff); // wifi串口數(shù)據(jù)發(fā)送 HAL_Delay(1000);
-
云端屬性獲取,當(dāng)云上產(chǎn)生設(shè)備屬性操作時會通過MQTT發(fā)送到對應(yīng)的設(shè)備中,此時需要進(jìn)行相應(yīng)的解析操作,首先通過判斷
wifiConnectFlag
標(biāo)志位判斷是否鏈接阿里云成功,若成功后之后的云端下發(fā)的屬性命令將在wifi.c
中的wifi_connnect_calback(uart2_rx_buf, strlen(uart2_rx_buf));
函數(shù)進(jìn)行解析:
本部分代碼的邏輯為判斷字符串?dāng)?shù)組中是否有特定的三位字符與motorstatus
屬性吻合,從而解析出對應(yīng)的屬性值。/* * @brief wifi 連接成功后數(shù)據(jù)解析 */ // +MQTTSUBRECV:0,"/sys/a1U3gCVc2Lh/Device1/thing/service/property/set",104,{"method":"thing.service.property.set","id":"1199288712", // "params":{"windowControl":3},"version":"1.0.0"} void wifi_connnect_calback(unsigned char *data, uint8_t len) { int i = 0; unsigned char *p ; p = data; // 指針p指向接受數(shù)組的第一個元素 for(i=50;i<strlen(data);i++) { if(*(p+i)=='t' && *(p+i+1)=='u' && *(p+i+2) == 's') // 尋找"motorstatus" { motorstatus = *(p+i+5)-0x30; } } }
總結(jié)
首先,在wifi_uart.c
文件中實現(xiàn)了串口發(fā)送和接收回調(diào)函數(shù)。wifi_uart_write
函數(shù)用于向串口發(fā)送緩沖區(qū)寫入數(shù)據(jù)并啟動發(fā)送,同時使用HAL_UART_Transmit
函數(shù)進(jìn)行串口數(shù)據(jù)發(fā)送。WIFI_UART_RxCpltCallback
函數(shù)用于處理串口接收到的數(shù)據(jù),將數(shù)據(jù)放入接收緩沖區(qū)。
在stm32f1xx_it.c
文件中,使用DMA和空閑中斷的方式進(jìn)行串口2的接收。當(dāng)空閑中斷觸發(fā)時,會調(diào)用WIFI_UART_RxCpltCallback
函數(shù)處理接收到的數(shù)據(jù)。
在wifi.c
文件中,創(chuàng)建AT適配器對象,并在wifi_init
函數(shù)中進(jìn)行AT指令的配置和發(fā)送。通過調(diào)用at_send_singlline
函數(shù)發(fā)送AT命令。在wifi_task
函數(shù)中循環(huán)調(diào)用,通過判斷wifiConnectFlag
標(biāo)志位判斷是否連接成功。
對于數(shù)據(jù)上報,你可以根據(jù)標(biāo)準(zhǔn)格式構(gòu)造要發(fā)送的數(shù)據(jù),使用sprintf函數(shù)將數(shù)據(jù)格式化為AT命令的形式,然后通過HAL_UART_Transmit
函數(shù)發(fā)送到串口。例如,使用sprintf
函數(shù)將motorstatus
屬性格式化為要發(fā)送的字符串,然后通過HAL_UART_Transmit
函數(shù)發(fā)送到串口。
對于云端屬性獲取,當(dāng)云端發(fā)送設(shè)備屬性操作時,通過判斷wifiConnectFlag
標(biāo)志位和解析接收到的數(shù)據(jù)進(jìn)行相應(yīng)的操作。在wifi_connnect_calback
函數(shù)中,你可以解析接收到的數(shù)據(jù),判斷是否含有特定的屬性命令,并提取屬性值。
需要注意的是,以上只是一個簡單的示例,具體的實現(xiàn)可能需要根據(jù)你的項目需求進(jìn)行適當(dāng)?shù)男薷暮驼{(diào)整。同時,確保在使用AT命令進(jìn)行通信時,正確配置串口和波特率,并根據(jù)具體的硬件連接情況進(jìn)行適配。
問題排查
除了上述提到的移植和配置外,以下是一些可能需要的步驟和流程:
-
確定硬件連接:根據(jù)AT_Command庫的要求,確認(rèn)將STM32F103C8T6與Modem、WIFI模塊、藍(lán)牙等設(shè)備正確連接。確保使用的串口、引腳和電源連接正確。
-
配置CubeMX:使用CubeMX配置STM32F103C8T6的引腳和時鐘設(shè)置,確保與硬件連接一致。在CubeMX中選擇正確的串口配置,包括波特率、數(shù)據(jù)位、停止位等參數(shù)。
添加庫文件和代碼:將AT_Command庫的源代碼和相應(yīng)的頭文件添加到你的項目中。確保在編譯過程中包含這些文件,并鏈接到正確的位置。
-
初始化串口和DMA:在代碼中初始化串口和DMA相關(guān)的設(shè)置,確保正確配置串口的接收和發(fā)送功能。確保正確啟動DMA進(jìn)行接收,并在空閑中斷中處理接收到的數(shù)據(jù)。
-
實現(xiàn)適配器函數(shù):根據(jù)AT_Command庫的要求,實現(xiàn)適配器函數(shù),包括串口發(fā)送和接收的函數(shù)。這些函數(shù)將作為AT_Command庫的回調(diào)函數(shù),在相應(yīng)的事件發(fā)生時被調(diào)用。
-
初始化AT_Command對象:在代碼中創(chuàng)建AT_Command對象,并使用之前實現(xiàn)的適配器函數(shù)進(jìn)行初始化。這將使AT_Command庫能夠使用正確的串口進(jìn)行通信,并通過回調(diào)函數(shù)處理接收到的數(shù)據(jù)。
-
配置AT指令和發(fā)送數(shù)據(jù):根據(jù)你的項目需求,使用AT_Command庫提供的函數(shù)配置AT指令,例如發(fā)送AT測試命令、配置工作模式、創(chuàng)建路由器等。使用AT_Command庫提供的函數(shù)發(fā)送數(shù)據(jù)到串口,實現(xiàn)數(shù)據(jù)上報等功能。
-
解析接收數(shù)據(jù):根據(jù)AT_Command庫的回調(diào)函數(shù),解析接收到的數(shù)據(jù)。根據(jù)具體的協(xié)議和數(shù)據(jù)格式,提取需要的信息并進(jìn)行相應(yīng)的處理。例如,在
wifi_connnect_calback
函數(shù)中解析云端下發(fā)的屬性命令,并根據(jù)屬性命令進(jìn)行相應(yīng)的操作。 -
循環(huán)調(diào)用AT_Command庫:在主循環(huán)中循環(huán)調(diào)用
AT_Command
庫的相關(guān)函數(shù),確保AT指令的正常運行。可以通過wifi_task
函數(shù)進(jìn)行循環(huán)調(diào)用,并在循環(huán)中添加適當(dāng)?shù)难訒r。 -
調(diào)試和測試:進(jìn)行逐步調(diào)試和測試,確保
AT_Command
庫在STM32F103C8T6上正常工作。驗證AT指令的發(fā)送和接收功能,檢查數(shù)據(jù)上報和云端屬性獲取的正確性。
以上是一個大致的流程,具體的實現(xiàn)可能需要根據(jù)你的項目需求和AT_Command庫的要求進(jìn)行調(diào)整。確保按照庫的文檔和示例進(jìn)行
源碼獲取
關(guān)注公眾號electronic造物實驗室
并發(fā)送AT指令
即可獲取測試源碼。文章來源:http://www.zghlxwxcb.cn/news/detail-464665.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-464665.html
到了這里,關(guān)于【ESP-01S / ESP8266 AT指令連接阿里云物聯(lián)網(wǎng)平臺】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!