目錄
鏈接快速定位
前沿
1 準(zhǔn)備工作
2 硬件環(huán)境介紹
3 軟件環(huán)境介紹
3.1 串口初始化及配置
3.2 編寫(xiě)AT MQTT指令代碼
3.2.1 ESP8266_Cmd函數(shù)介紹
3.2.2 wifi連接函數(shù)介紹
3.2.3 云端連接語(yǔ)句介紹
3.2.4 環(huán)回消息測(cè)試語(yǔ)句介紹
3.2.5 屬性上報(bào)語(yǔ)句介紹
3.2.6 設(shè)置屬性語(yǔ)句介紹
4 實(shí)驗(yàn)現(xiàn)象
4.1 代碼運(yùn)行現(xiàn)象
4.2 屬性上報(bào)現(xiàn)象??
?4.3 設(shè)置屬性現(xiàn)象
鏈接快速定位
ESP8266 -- 燒錄AT固件(一)
ESP8266 -- 搭建阿里云物聯(lián)網(wǎng)與MQTT.fx通信的平臺(tái)(二)
ESP8266 -- 串口助手 AT MQTT 指令與阿里云物聯(lián)網(wǎng)平臺(tái)建立通信(三)
演示代碼在文章頂部可以下載,也可以通過(guò)評(píng)論留下郵箱進(jìn)行發(fā)送
前沿
? ? ? ? 前面講解了固件的燒錄,搭建阿里云物聯(lián)網(wǎng)平臺(tái)和esp8266利用串口助手與阿里云物聯(lián)網(wǎng)平臺(tái)建立通信,本小節(jié)主要講解利用STM32與esp8266模塊進(jìn)行通信。
1 準(zhǔn)備工作
? ? ? ? 在進(jìn)行本小節(jié)內(nèi)容的時(shí)候,需要做如下的準(zhǔn)備工作:
- 燒錄AT MQTT固件,見(jiàn)鏈接:ESP8266 -- 燒錄AT固件(一)
- 阿里物聯(lián)網(wǎng)平臺(tái)的搭建,見(jiàn)鏈接:ESP8266 -- 搭建阿里云物聯(lián)網(wǎng)與MQTT.fx通信的平臺(tái)(二)
? ? ? ? 如果對(duì)AT指令不是很熟悉,建議參考:ESP8266 -- 串口助手 AT MQTT 指令與阿里云物聯(lián)網(wǎng)平臺(tái)建立通信(三),簡(jiǎn)單的掌握一下AT指令。
2 硬件環(huán)境介紹
? ? ? ?硬件選擇安信可的ESP01S模塊與STM32單片機(jī)相連接,具體連接方式這里不展開(kāi)講解,網(wǎng)上也有很多資料,原理就是串口間的通信。
3 軟件環(huán)境介紹
? ? ? ? 軟件環(huán)境使用keil5,編譯下載stm32f103標(biāo)準(zhǔn)庫(kù)程序進(jìn)行演示。演示代碼在文章頂部可以下載,也可以通過(guò)評(píng)論留下郵箱進(jìn)行發(fā)送。下面重點(diǎn)講解軟件代碼。
3.1 串口初始化及配置
? ? ? ? ?主要實(shí)現(xiàn)了串口的初始化配置,并且使能了接收完成中斷。
static void ESP8266_USART_Config ( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* config USART clock */
macESP8266_USART_APBxClock_FUN ( macESP8266_USART_CLK, ENABLE );
macESP8266_USART_GPIO_APBxClock_FUN ( macESP8266_USART_GPIO_CLK, ENABLE );
/* USART GPIO config */
/* Configure USART Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = macESP8266_USART_TX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(macESP8266_USART_TX_PORT, &GPIO_InitStructure);
/* Configure USART Rx as input floating */
GPIO_InitStructure.GPIO_Pin = macESP8266_USART_RX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(macESP8266_USART_RX_PORT, &GPIO_InitStructure);
/* USART mode config */
USART_InitStructure.USART_BaudRate = macESP8266_USART_BAUD_RATE;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(macESP8266_USARTx, &USART_InitStructure);
/* 中斷配置 */
USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); //使能串口接收中斷
ESP8266_USART_NVIC_Configuration ();
USART_Cmd(macESP8266_USARTx, ENABLE);
}
void macESP8266_USART_INT_FUN ( void )
{
uint8_t ucCh;
if ( USART_GetITStatus ( macESP8266_USARTx, USART_IT_RXNE ) != RESET )
{
ucCh = USART_ReceiveData( macESP8266_USARTx );
if ( strEsp8266_Fram_Record .InfBit .FramLength < ( RX_BUF_MAX_LEN - 1 ) ) //預(yù)留1個(gè)字節(jié)寫(xiě)結(jié)束符
{
strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ++ ] = ucCh;
}
}
}
3.2 編寫(xiě)AT MQTT指令代碼
? ? ? ? 以下就是AT MQTT實(shí)現(xiàn)的主要函數(shù),此函數(shù)主要實(shí)現(xiàn)了以下功能:
- wifi連接
- 云端連接
- 環(huán)回消息的測(cè)試
- 屬性上報(bào)
- 設(shè)置屬性
void ESP8266_Test(void)
{
char cCmd [254]; //最多一次發(fā)送256字節(jié),除去兩個(gè)字節(jié)的換行符
printf ( "正在配置 ESP8266 ......\r\n" );
macESP8266_CH_ENABLE();
ESP8266_AT_Test ();
ESP8266_Net_Mode_Choose (STA);
while ( ! ESP8266_JoinAP (ESP8266_APSSId, ESP8266_APPWD) );
printf("wifi已連接\r\n");
/* 單連接模式 */
ESP8266_Enable_MultipleId ( DISABLE );
/* 配置云端參數(shù) */
sprintf (cCmd, "AT+MQTTUSERCFG=0,1,\"%s\",\"%s\",\"%s\",0,0,\"\"", BROKER_CLIENT_ID, BROKER_USERNAME,BROKER_USERNAME_PWD);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );
/* 連接云端 */
sprintf (cCmd, "AT+MQTTCONN=0,\"%s\",%s,0", BROKER_HOST_IP, BROKER_HOST_PORT);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );
/* 訂閱環(huán)回消息 */
sprintf (cCmd, "AT+MQTTSUB=0,\"%s\",0", LOOP_PUB_SUB_TOPIC);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );
/* 發(fā)送環(huán)回消息 */
sprintf (cCmd, "AT+MQTTPUB=0,\"%s\",\"%s\",0,0", LOOP_PUB_SUB_TOPIC, testdata);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );
/* 屬性上報(bào)--訂閱消息 */
sprintf (cCmd, "AT+MQTTSUB=0,\"%s\",0", POST_REPLY_TOPIC);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );
/* 屬性上報(bào)--發(fā)布消息 */
sprintf (cCmd, "AT+MQTTPUB=0,\"%s\",\"%s\",0,0", POST_TOPIC, postdata);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );
while (1)
{
/* 設(shè)置屬性--訂閱消息 */
sprintf (cCmd, "AT+MQTTSUB=0,\"%s\",0", SET_PROPERTY_TOPIC);
ESP8266_Cmd ( cCmd, "OK", NULL, 2000 );
}
}
3.2.1 ESP8266_Cmd函數(shù)介紹
? ? ? ? 此函數(shù)主要實(shí)現(xiàn)了向esp8266模塊發(fā)送AT指令,并且在串口助手打印收到的AT回復(fù),形參reply1和reply2為返回字符串的子集,如果返回字符串存在reply1和reply2這兩個(gè)參數(shù),那么返回成功。
bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime )
{
strEsp8266_Fram_Record .InfBit .FramLength = 0; //從新開(kāi)始接收新的數(shù)據(jù)包
macESP8266_Usart ( "%s\r\n", cmd );
if ( ( reply1 == 0 ) && ( reply2 == 0 ) ) //不需要接收數(shù)據(jù)
return true;
Delay_ms ( waittime ); //延時(shí)
strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';
macPC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );
if ( ( reply1 != 0 ) && ( reply2 != 0 ) )
return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) ||
( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );
else if ( reply1 != 0 )
return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) );
else
return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );
}
3.2.2 wifi連接函數(shù)介紹
? ? ? ? 連接wifi主要通過(guò)< AT+CWJAP="wifi帳號(hào)","wifi密碼"? >指令進(jìn)行wifi的連接,這里做了簡(jiǎn)單的處理,既是已經(jīng)連上wifi下次不必重復(fù)連接。
bool ESP8266_JoinAP ( char * pSSID, char * pPassWord )
{
char cCmd [120];
sprintf ( cCmd, "AT+CWJAP?");
/* 如果已經(jīng)連接wifi,那么不需要重復(fù)鏈接 */
if (ESP8266_Cmd ( cCmd, "+CWJAP:", NULL, 5000 ) == true)
{
return true;
}
printf("正在連接wifi\r\n");
sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord );
return ESP8266_Cmd ( cCmd, "OK", NULL, 5000 );
}
3.2.3 云端連接語(yǔ)句介紹
? ? ? ? 云端的連接主要分為兩部分:?詳情請(qǐng)參見(jiàn)ESP8266 -- 串口助手 AT MQTT 指令與阿里云物聯(lián)網(wǎng)平臺(tái)建立通信(三)
一是配置云端參數(shù):配置云端參數(shù)主要是<?AT+MQTTUSERCFG=0,1,"client_id","username","password",0,0,"" >指令實(shí)現(xiàn)。
二是連接云端:通過(guò)< AT+MQTTCONN=0,"host",port,0 > 指令實(shí)現(xiàn)。
#define BROKER_HOST_IP "iot-06z12ga2pdtk6xu.mqtt.iothub.aliyuncs.com" //要連接的服務(wù)器的 IP
#define BROKER_HOST_PORT "1883" //要連接的服務(wù)器的端口
/* 對(duì)于BROKER_CLIENT_ID定義字符串的解釋:
原本字符串:"izi37b1wleB.TestDevice|securemode=2,signmethod=hmacsha256,timestamp=1701570366200|"
esp8266支持的字符串:"izi37b1wleB.TestDevice|securemode=2\,signmethod=hmacsha256\,timestamp=1701570366200|" 需在','前加'\'
C語(yǔ)言基于esp8266支持的字符串:"izi37b1wleB.TestDevice|securemode=2\\,signmethod=hmacsha256\\,timestamp=1701570366200|" 需在'\'前再加一個(gè)'\'
最終通過(guò)串口發(fā)出去的字符串:"izi37b1wleB.TestDevice|securemode=2\,signmethod=hmacsha256\,timestamp=1701570366200|"
*/
#define BROKER_CLIENT_ID "izi37b1wleB.TestDevice|securemode=2\\,signmethod=hmacsha256\\,timestamp=1701570366200|"
#define BROKER_USERNAME "TestDevice&izi37b1wleB"
#define BROKER_USERNAME_PWD "77517177642f88688ac2d6286f30699cff7d699daad8394d837608dc5db5935b"
/* 配置云端參數(shù) */
sprintf (cCmd, "AT+MQTTUSERCFG=0,1,\"%s\",\"%s\",\"%s\",0,0,\"\"", BROKER_CLIENT_ID, BROKER_USERNAME,BROKER_USERNAME_PWD);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );
/* 連接云端 */
sprintf (cCmd, "AT+MQTTCONN=0,\"%s\",%s,0", BROKER_HOST_IP, BROKER_HOST_PORT);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );
3.2.4 環(huán)回消息測(cè)試語(yǔ)句介紹
? ? ? ? 環(huán)回消息主要是依賴自定義的發(fā)布和接收Topic,首先使用< AT+MQTTSUB=0,"topic",0 >命令訂閱消息,再通過(guò)< AT+MQTTPUB=0,"topic","data",0,0 >指令回讀發(fā)送的消息。
const char testdata[] = "This is a MQTT loop test";
#define LOOP_PUB_SUB_TOPIC "/izi37b1wleB/TestDevice/user/LoopTopic" //環(huán)回測(cè)試主題
/* 訂閱環(huán)回消息 */
sprintf (cCmd, "AT+MQTTSUB=0,\"%s\",0", LOOP_PUB_SUB_TOPIC);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );
/* 發(fā)送環(huán)回消息 */
sprintf (cCmd, "AT+MQTTPUB=0,\"%s\",\"%s\",0,0", LOOP_PUB_SUB_TOPIC, testdata);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );
3.2.5 屬性上報(bào)語(yǔ)句介紹
? ? ? ? 屬性上報(bào)和環(huán)回消息類似,只是訂閱的主題不一樣,環(huán)回測(cè)試主題是自定義的收發(fā)Topic,屬性上報(bào)則是物模型的屬性上報(bào)Topic。
/* 對(duì)于postdata定義字符串的解釋:
原本字符串: "{
(JSON格式) "id":1701504913858,
"params":
{
"TestTSL":888
},
"version":"1.0",
"method":"thing.event.property.post"
}"
esp8266支持的字符串: "{
(也就是在'"'前面增加'\' \"id\":1701504913858\,
在','前面增加'\') \"params\":
{
\"TestTSL\":888
}\,
\"version\":\"1.0\"\,
\"method\":\"thing.event.property.post\"
}"
C語(yǔ)言基于esp8266支持的字符串: "{
(如果是','需在'\'前再加1個(gè)'\', \\\"id\\\":1701504913858\\,
如果是'"'需在'\'前再加2個(gè)'\' \\\"params\\\":
{
\\\"TestTSL\\\":888
}\\,
\\\"version\\\":\\\"1.0\\\"\\,
\\\"method\\\":\\\"thing.event.property.post\\\"
}"
最終通過(guò)串口發(fā)出去的字符串: "{
\"id\":1701504913858\,
\"params\":
{
\"TestTSL\":888
}\,
\"version\":\"1.0\"\,
\"method\":\"thing.event.property.post\"
}"
*/
const char postdata[] = "{\\\"id\\\":1701504913858\\,\\\"params\\\":{\\\"TestTSL\\\":888}\\,\\\"version\\\":\\\"1.0\\\"\\,\\\"method\\\":\\\"thing.event.property.post\\\"}";
#define POST_TOPIC "/sys/izi37b1wleB/TestDevice/thing/event/property/post" //發(fā)布
#define POST_REPLY_TOPIC "/sys/izi37b1wleB/TestDevice/thing/event/property/post_reply" //訂閱
/* 屬性上報(bào)--訂閱消息 */
sprintf (cCmd, "AT+MQTTSUB=0,\"%s\",0", POST_REPLY_TOPIC);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );
/* 屬性上報(bào)--發(fā)布消息 */
sprintf (cCmd, "AT+MQTTPUB=0,\"%s\",\"%s\",0,0", POST_TOPIC, postdata);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );
3.2.6 設(shè)置屬性語(yǔ)句介紹
? ? ? ? 設(shè)置屬性就是實(shí)時(shí)訂閱云端的消息,這里2s訂閱一次消息。
#define SET_PROPERTY_TOPIC "/sys/izi37b1wleB/TestDevice/thing/service/property/set" //訂閱
while (1)
{
/* 設(shè)置屬性--訂閱消息 */
sprintf (cCmd, "AT+MQTTSUB=0,\"%s\",0", SET_PROPERTY_TOPIC);
ESP8266_Cmd ( cCmd, "OK", NULL, 2000 );
}
4 實(shí)驗(yàn)現(xiàn)象
4.1 代碼運(yùn)行現(xiàn)象
4.2 屬性上報(bào)現(xiàn)象??
????????這里屬性上報(bào)的TestTSL=888,我們打開(kāi)云端,查看到TestTSL的值確實(shí)是888。
?4.3 設(shè)置屬性現(xiàn)象
? ? ? ? 通過(guò)阿里云物聯(lián)網(wǎng)平臺(tái),設(shè)置TestTSL=123,查看到串口助手顯示的值也為123。
? ? ? ? 注意:此代碼不能直接和云端進(jìn)行通信,需要自己搭建云平臺(tái),并修改相對(duì)應(yīng)的云端IP、client_id及密碼,云端的搭建可以參考:ESP8266 -- 搭建阿里云物聯(lián)網(wǎng)與MQTT.fx通信的平臺(tái)(二)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-767119.html
接下來(lái)講解利用物聯(lián)網(wǎng)平臺(tái)讀取和控制STM32板載資源,敬請(qǐng)期待。。。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-767119.html
到了這里,關(guān)于ESP8266 -- STM32與阿里云物聯(lián)網(wǎng)平臺(tái)建立通信(四)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!