国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

esp8266模塊--MQTT協(xié)議連接服務(wù)器實(shí)現(xiàn)數(shù)據(jù)接收和發(fā)送+源碼

這篇具有很好參考價(jià)值的文章主要介紹了esp8266模塊--MQTT協(xié)議連接服務(wù)器實(shí)現(xiàn)數(shù)據(jù)接收和發(fā)送+源碼。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

首先推薦中國移動的代碼,我覺得中國移動的代碼更為合理:(但是有一些其他的模塊在里面)

OneNET開發(fā)板代碼、資料--2020-09-27--標(biāo)準(zhǔn)板、Mini板bug修復(fù) - 開發(fā)板專區(qū) - OneNET設(shè)備云論壇 (10086.cn)

以及這位b站up做的視頻:(wifi模塊在p9節(jié))

【挽救小白第一季】STM32+8266+小程序智能家居畢設(shè)實(shí)戰(zhàn)_嗶哩嗶哩_bilibili

推薦跟著這位up一起c+v。但是沒有講解原理,只追求做出來的可以看看。

---------------------------------------------------------------------------------------------------------------------------------

esp8266是一款wifi無線通訊模塊,該模塊能夠通過wifi來與其他設(shè)備通信。我們要做的就是通過串口來發(fā)送指令、接收指令,其他的都是由模塊自身來處理的。

我所用的是這塊新大陸的wifi模塊,就是由普通的esp8266集成的,用法沒什么區(qū)別。串口與stm32單片機(jī)的串口對接就行,rx-tx交叉接線。由板子3.3v供電。

esp8266+mqtt,筆記,嵌入式硬件,stm32

這里選擇j6端。

esp8266+mqtt,筆記,嵌入式硬件,stm32

啟動和下載選著啟動,這個(gè)下載是在固件庫燒錄的時(shí)候用的。

esp8266+mqtt,筆記,嵌入式硬件,stm32

?當(dāng)然如果你選擇其他的wifi模塊也是一樣的,連接串口電源一樣能用,沒有什么區(qū)別。

其實(shí)這個(gè)東西很簡單,就是一個(gè)串口接收發(fā)的事。

-------------------------------------------------------------------------------------------------------------------------

那么這個(gè)東西該如何使用呢?

我們通過AT指令來操作這個(gè)模塊。通過串口發(fā)送字符串來發(fā)送AT操作指令,這個(gè)模塊會解析指令來實(shí)現(xiàn)操作,并且反饋一些信息。(MQTT協(xié)議)

下面這個(gè)連接是AT指令集:(左邊欄目選擇wifi指令集,基礎(chǔ)指令啥得也都能用)

推薦自己去看看,這些指令我是講不完的,學(xué)會讀文檔是一個(gè)很重要的技能!

Wi-Fi AT 命令集 - ESP32 - — ESP-AT 用戶指南 latest 文檔 (espressif.cohttps://docs.espressif.com/projects/esp-at/zh_CN/latest/esp32/AT_Command_Set/Wi-Fi_AT_Commands.html

我也來講解一下一些指令,方便各位理解:

1.AT+CWMODE

AT+CWMODE=<mode>[,<auto_connect>]

  • <mode>:模式

    • 0: 無 Wi-Fi 模式,并且關(guān)閉 Wi-Fi RF

    • 1: Station 模式? ?\\該模式是連接wifi的模式,作為客機(jī)

    • 2: SoftAP 模式? ?\\該模式是將esp8266成為熱點(diǎn)的模式,選擇2

    • 3: SoftAP+Station 模式? \\這個(gè)我也沒有用過估計(jì)是兩個(gè)都有

我們一般選擇1模式連接別的熱點(diǎn)或wifi進(jìn)行通信。當(dāng)你要設(shè)置這個(gè)模式的時(shí)候就得一字符串的形式發(fā)給模塊,如下

? ? ? ? ? ? ?"AT+CIPMODE=1\r\n"? ? ?!??!注意必須要有\(zhòng)r\n,這是規(guī)定,否則指令識別不了

wifi模塊自己會讀取設(shè)別設(shè)置模式,收到并且發(fā)送的指令正確后會返回“OK”,否則會返回“ERROR”。

?2.AT+CWJAP

AT+CWJAP=[<ssid>],[<pwd>][,<bssid>][,<pci_en>][,<reconn_interval>][,<listen_interval>][,<scan_mode>][,<jap_timeout>][,<pmf>]

這個(gè)指令是用來連接wifi的,看起來一堆,其實(shí)主要的只是前面的ssid和pwd,就是你wifi的名字和密碼,如下

"AT+CWJAP=\"wifiname\",\"password\"\r\n"? ?

?!?。∽⒁獗仨氁衆(zhòng)r\n,這是規(guī)定,否則指令識別不了

wifiname中輸入你的wifi名字,password中輸入密碼,在輸入上一條指令“AT+CIPMODE=1”后你就能連上你的熱點(diǎn)或者wifi了。當(dāng)然這個(gè)函數(shù)后面還有許多參數(shù),我也沒用過,感興趣的可以去學(xué)學(xué)。AT指令有很多,建議自己去看一看。

然后下面這些指令就是要有MQTT協(xié)議的wifi模塊才能用了!如果報(bào)錯(cuò)就需要你自己去燒錄一下固件庫了。當(dāng)然你不下也可以連接部分服務(wù)器,只不過有MQTT協(xié)議的你可能就連接不了了。普通的服務(wù)器至于要用TCP/IP指令,還有更多指令要自己去看文檔!

// 單連接 (AT+CIPMUX=0):
AT+CIPSTART=<"type">,<"remote host">,<remote port>[,<keep_alive>][,<"local IP">]

// 多連接 (AT+CIPMUX=1):
AT+CIPSTART=<link ID>,<"type">,<"remote host">,<remote port>[,<keep_alive>][,<"local IP">]

4.AT+MQTTUSERCFG

AT+MQTTUSERCFG=<LinkID>,<scheme>,<"client_id">,<"username">,<"password">,<cert_key_ID>,<CA_ID>,<"path">

  • <LinkID>:當(dāng)前僅支持 link ID 0。

  • <scheme>

    • 1: MQTT over TCP;

    • 2: MQTT over TLS(不校驗(yàn)證書);

    • 3: MQTT over TLS(校驗(yàn) server 證書);

    • 4: MQTT over TLS(提供 client 證書);

    • 5: MQTT over TLS(校驗(yàn) server 證書并且提供 client 證書);

    • 6: MQTT over WebSocket(基于 TCP);

    • 7: MQTT over WebSocket Secure(基于 TLS,不校驗(yàn)證書);

    • 8: MQTT over WebSocket Secure(基于 TLS,校驗(yàn) server 證書);

    • 9: MQTT over WebSocket Secure(基于 TLS,提供 client 證書);

    • 10: MQTT over WebSocket Secure(基于 TLS,校驗(yàn) server 證書并且提供 client 證書)。

  • <client_id>:MQTT 客戶端 ID,最大長度:256 字節(jié)。

  • <username>:用戶名,用于登陸 MQTT broker,最大長度:64 字節(jié)。

  • <password>:密碼,用于登陸 MQTT broker,最大長度:64 字節(jié)。

  • <cert_key_ID>:證書 ID,目前 ESP-AT 僅支持一套 cert 證書,參數(shù)為 0。

  • <CA_ID>:CA ID,目前 ESP-AT 僅支持一套 CA 證書,參數(shù)為 0。

  • <path>:資源路徑,最大長度:32 字節(jié)

link id填0;scheme填1;client_id隨便填,但不能不填;username和password隨便填。我用的是公共服務(wù)器,沒有用戶名和密碼的要求,如果是專業(yè)的服務(wù)器就有可能要填正確的用戶名和密碼。后面三個(gè)參數(shù)就填0,0和空就行了。如下

="AT+MQTTUSERCFG=0,1,\"sbmc\",\"user\",\"pw\",0,0,\"\"\r\n"

?。?!注意必須要有\(zhòng)r\n,這是規(guī)定,否則指令識別不了

3.AT+MQTTCONN

AT+MQTTCONN=<LinkID>,<"host">,<port>,<reconnect>

  • <LinkID>:當(dāng)前僅支持 link ID 0。

  • <host>:MQTT broker 域名,最大長度:128 字節(jié)。

  • <port>:MQTT broker 端口,最大端口:65535。

  • <reconnect>

    • 0: MQTT 不自動重連。如果 MQTT 建立連接后又?jǐn)嚅_,則無法再次使用本命令重新建立連接,您需要先發(fā)送?AT+MQTTCLEAN=0?命令清理信息,重新配置參數(shù),再建立新的連接。

    • 1: MQTT 自動重連,會消耗較多的內(nèi)存資源。

linkid填0;host填你連接服務(wù)器的ip地址;port填連接的端口號。reconnect選擇不自動重連。我選擇的是使用emqx創(chuàng)建的服務(wù)器,不會創(chuàng)建服務(wù)器的話我后面可能會寫一篇博客來幫助大家創(chuàng)建服務(wù)器。

4.AT+MQTTSUB

AT+MQTTSUB=<LinkID>,<"topic">,<qos>

  • <LinkID>:當(dāng)前僅支持 link ID 0。

  • <topic>:訂閱的 topic。

  • <qos>:訂閱的 QoS。

linkid為0;topic為訂閱的話題,這個(gè)你可以把他看成是一個(gè)頻道,兩臺設(shè)備只有在同一頻道內(nèi)才能接收到互相發(fā)的消息。qos這個(gè)東西就是確認(rèn)是否收到消息,1級為我發(fā)消息后我要確認(rèn)你收到了,要等到你發(fā)送反饋信息。而0就是我發(fā)給你了就是發(fā)給你了,不管你收沒收到,發(fā)了只后我就不管了。我們填0就行了。

"AT+MQTTSUB=0,\"123\",1\r\n"

?。?!注意必須要有\(zhòng)r\n,這是規(guī)定,否則指令識別不了

5.AT+MQTTPUB

AT+MQTTPUB=<LinkID>,<"topic">,<"data">,<qos>,<retain>

  • <LinkID>:當(dāng)前僅支持 link ID 0。

  • <topic>:MQTT topic,最大長度:128 字節(jié)。

  • <data>:MQTT 字符串消息。

  • <qos>:發(fā)布消息的 QoS,參數(shù)可選 0、1、或 2,默認(rèn)值:0。

  • <retain>:發(fā)布 retain。

topic為訂閱的話題;data為要發(fā)送的數(shù)據(jù);qos和上面一樣。retain填0都行,我并不期待他的反饋。

"AT+MQTTPUB=0,\"123\",\"ON_OK\",1,0\r\n"

?。?!注意必須要有\(zhòng)r\n,這是規(guī)定,否則指令識別不了

最后就是串口初始化了,我就不講了。源碼搞上!

OLED并沒有用上,如果有刪掉就行了

main.c

#include "stm32f10x.h"                  // Device header
#include "usart.h"
#include "usart3.h"
#include "esp8622.h"
#include "Delay.h"
#include "OLED.h"

u8 *instruction = "";

int main(void){
	OLED_Init();
  usart_init();
	usart3_init();
	sendcmd("ATE0","",1); //關(guān)閉回顯
	connect_Wifi();
	Delay_ms(3000);
	connect_Cloud();
	while(1){
		if(ack_dat("led_on")){
		  sendcmd("AT+MQTTPUB=0,\"123\",\"ON_OK\",1,0\r\n","",1);//
		}
		if(ack_dat("led_down")){
		  sendcmd("AT+MQTTPUB=0,\"123\",\"DOWN_OK\",1,0\r\n","",1);
		}
	  Delay_ms(200);

	}
}

usart.c

#include "usart.h"


#if EN_USART1_RX   //如果使能了接收
u8 USART_RX_BUF[USART_REC_LEN];     //接收緩沖,最大USART_REC_LEN個(gè)字節(jié).
u16 USART_RX_STA=0;       //接收狀態(tài)標(biāo)記	 

void usart_init(void){
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//tx
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
	
	NVIC_Init(&NVIC_InitStructure);
	
	USART_InitStructure.USART_BaudRate=115200;
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
	USART_InitStructure.USART_StopBits=USART_StopBits_1;
	USART_InitStructure.USART_Parity=USART_Parity_No;
	
	USART_Init(USART1,&USART_InitStructure);
	USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);
	USART_Cmd(USART1,ENABLE);
}


void usart_send(uint8_t Byte){
	USART_SendData(USART1, Byte);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == 0);
}



void USART1_IRQHandler(void){
	u8 res;
	if(USART_GetFlagStatus(USART1, USART_IT_RXNE)!=0){
		res = USART_ReceiveData(USART1);
		
		if((USART_RX_STA&0x8000) == 0){
			if(USART_RX_STA&0x4000){
				if(res!=0x0a)USART_RX_STA=0;
				else USART_RX_STA|=0x8000;
			}
			else{
				if(res==0x0d)USART_RX_STA|=0x4000;
				else{
					USART_RX_BUF[USART_RX_STA&0x3fff]=res;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
				}
			}
		}
	}
}
#endif

//重定義fputc函數(shù) 
int fputc(int ch, FILE *f)
{      
  usart_send(ch);
	return ch;
}

usart.h

#ifndef __UASRT_H__
#define __UASRT_H__

#include <stdio.h>
#include "stm32f10x.h"

#define USART_REC_LEN  			200  	//定義最大接收字節(jié)數(shù) 200
#define EN_USART1_RX 			1	

extern u8  USART_RX_BUF[USART_REC_LEN]; //接收緩沖,最大USART_REC_LEN個(gè)字節(jié).末字節(jié)為換行符 
extern u16 USART_RX_STA;  

void usart_init(void);
void usart_send(uint8_t Byte);
	
#endif

usart3.c

#include "usart3.h"
#include "stdarg.h"	
#include "string.h"	
#include "OLED.h"

u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; 			//接收緩沖,最大USART3_MAX_RECV_LEN個(gè)字節(jié).
u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; 			//發(fā)送緩沖,最大USART3_MAX_SEND_LEN字節(jié)
vu16 USART3_RX_STA=0;  

void usart3_init(void){
	NVIC_InitTypeDef NVIC_InitStructure;
	USART_InitTypeDef usartst;
	GPIO_InitTypeDef GPIO_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//使能USART3,GPIOA時(shí)鐘
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//注意usart3再apb1
	
	//USART3_TX  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//復(fù)用推挽輸出
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10
   
  //USART1_RX	 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PA11
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11  
	
	
	USART_DeInit(USART3);  //復(fù)位串口3
	usartst.USART_BaudRate = 115200;
	usartst.USART_WordLength = USART_WordLength_8b;
	usartst.USART_StopBits = USART_StopBits_1;
	usartst.USART_Parity = USART_Parity_No;
	usartst.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	usartst.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
	USART_Init(USART3,&usartst);
	USART_Cmd(USART3,ENABLE);
	
	
	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//開啟串口接受中斷
	
	NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
	
	NVIC_Init(&NVIC_InitStructure);
	
}


void u3_printf(char* fmt,...)  
{  
	u16 i,j; 
	va_list ap; 
	va_start(ap,fmt);
	vsprintf((char*)USART3_TX_BUF,fmt,ap);
	va_end(ap);
	i=strlen((const char*)USART3_TX_BUF);		//此次發(fā)送數(shù)據(jù)的長度
	for(j=0;j<i;j++)							//循環(huán)發(fā)送數(shù)據(jù)
	{
	  while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循環(huán)發(fā)送,直到發(fā)送完畢   
		USART_SendData(USART3,USART3_TX_BUF[j]); 
	} 
}

void USART3_IRQHandler(void){
	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收到數(shù)據(jù)
	{
		USART_ClearITPendingBit(USART3, USART_IT_RXNE);
		USART3_RX_BUF[USART3_RX_STA] = USART_ReceiveData(USART3);	//讀取接收到的數(shù)據(jù)
		USART3_RX_STA=USART3_RX_STA+1;
		if(USART3_RX_STA>USART3_MAX_RECV_LEN)//緩存區(qū)溢出
		  USART3_RX_STA = 0x0000;		 		 
	}
}

usart3.h

#ifndef __USART3_H__
#define __USART3_H__

#include "stm32f10x.h"
#include <stdio.h>

#define USART3_MAX_RECV_LEN		1024			    //最大接收緩存字節(jié)數(shù)
#define USART3_MAX_SEND_LEN		600					//最大發(fā)送緩存字節(jié)數(shù);
extern u8  USART3_RX_BUF[USART3_MAX_RECV_LEN]; 		//接收緩沖,最大USART3_MAX_RECV_LEN字節(jié)
extern u8  USART3_TX_BUF[USART3_MAX_SEND_LEN]; 		//發(fā)送緩沖,最大USART3_MAX_SEND_LEN字節(jié)
extern vu16 USART3_RX_STA;   						//接收數(shù)據(jù)狀態(tài)

void usart3_init(void);

#endif

esp8266.c

#include "esp8622.h"


//當(dāng)你已經(jīng)連上服務(wù)器地址后,再次下載需要重新啟動esp8266模塊,否則連接到服務(wù)器的指令會報(bào)錯(cuò)

//推薦視頻,用的是中國移動的代碼
//https://www.bilibili.com/video/BV1ae411W7yD/?spm_id_from=333.999.0.0
//MQTT指令集
//https://docs.espressif.com/projects/esp-at/zh_CN/latest/esp32/AT_Command_Set/MQTT_AT_Commands.html#cmd-mqttsub
//esp固件庫燒錄
//https://www.bilibili.com/read/cv18483671
//https://www.bilibili.com/video/BV1Mx4y1P72o/?spm_id_from=333.337.search-card.all.click


/*      發(fā)送指令
AT+MQTTPUB:發(fā)布 MQTT 消息(字符串)?
設(shè)置命令?
功能:

通過 topic 發(fā)布 MQTT 字符串 消息。如果您發(fā)布消息的數(shù)據(jù)量相對較多,已經(jīng)超過了單條 AT 指令的長度閾值 256 字節(jié),請使用 AT+MQTTPUBRAW 命令。

命令:

AT+MQTTPUB=<LinkID>,<"topic">,<"data">,<qos>,<retain>
響應(yīng):

OK
參數(shù)?
<LinkID>:當(dāng)前僅支持 link ID 0。

<topic>:MQTT topic,最大長度:128 字節(jié)。

<data>:MQTT 字符串消息。

<qos>:發(fā)布消息的 QoS,參數(shù)可選 0、1、或 2,默認(rèn)值:0。

<retain>:發(fā)布 retain。

說明?
每條 AT 命令的總長度不能超過 256 字節(jié)。

本命令不能發(fā)送數(shù)據(jù) \0,若需要發(fā)送該數(shù)據(jù),請使用 AT+MQTTPUBRAW 命令。

示例?
AT+CWMODE=1
AT+CWJAP="ssid","password"
AT+MQTTUSERCFG=0,1,"ESP32","espressif","1234567890",0,0,""
AT+MQTTCONN=0,"192.168.10.234",1883,0
AT+MQTTPUB=0,"topic","\"{\"timestamp\":\"20201121085253\"}\"",0,0  // 發(fā)送此命令時(shí),請注意特殊字符是否需要轉(zhuǎn)義。
*/



//從串口3響應(yīng)接收,如果接收到了則會返回接收到的數(shù)據(jù)。
u8 AT_Respose(u8 *string)
{
	printf("\r\n接收到模塊響應(yīng)數(shù)據(jù)為:\n%s",USART3_RX_BUF);
	if(strstr((const char*)USART3_RX_BUF,(const char*)string) != 0)
	{
		printf("\r\n接收到期待的響應(yīng) %s",string);
		USART3_RX_STA = 0;
		memset(USART3_RX_BUF,0x00,USART3_MAX_RECV_LEN);
		return 1;
	}	
	else
	{
		printf("\r\n未接收到期待的響應(yīng) %s",string);
		USART3_RX_STA = 0;
		memset(USART3_RX_BUF,0x00,USART3_MAX_RECV_LEN);
		return 0;
	}
}

//發(fā)送數(shù)據(jù),通過串口3發(fā)送AT指令,esp8266會自行根據(jù)指令來傳輸數(shù)據(jù)
u8 sendcmd(u8 *cmd,u8 *ack,u8 times)//cmd:傳輸?shù)闹噶?ack:期待收到的響應(yīng) times:失敗后再次發(fā)送的次數(shù)
{
	u8 i;
	for(i=0;i<times;i++)
	{
		u3_printf("%s\r\n",cmd);//串口三輸出
		printf("\r\n已發(fā)送指令:%s",cmd);//串口一輸出,提示程序的進(jìn)程
		Delay_ms(1000);//等待響應(yīng)  
		if(AT_Respose(ack))
			return 1;
		printf("\r\n發(fā)送指令響應(yīng)錯(cuò)誤,1.5s后重新發(fā)送指令:%s",cmd);
		Delay_ms(1500);
	}
	return 0;
	
}

u8 sendcmd1(u8 *cmd,u8 *ack,u8 times)//發(fā)送數(shù)據(jù)特殊版,一般不用
{
	u8 i;
	for(i=0;i<times;i++)
	{
		u3_printf("%s\r\n",cmd);
		printf("\r\n已發(fā)送指令:%s",cmd);
		Delay_ms(7000);
		if(AT_Respose(ack))
			return 1;
		printf("\r\n發(fā)送指令響應(yīng)錯(cuò)誤,1.5s后重新發(fā)送指令:%s",cmd);
		Delay_ms(1500);
	}
	return 0;
	
}

//連接wifi  AT+XXX 的格式是固定的
u8 connect_Wifi(void)
{
	
	u8 *instruction="AT";
	if(sendcmd(instruction,"OK",3))//檢測wifi模塊是否正常
	{
		Delay_ms(1000);
		instruction="AT+CIPMODE=1";
		if(sendcmd(instruction,"OK",3))//設(shè)置為sta模式
		{
			Delay_ms(1000);
			instruction="AT+CWJAP=\"Lakzhu\",\"1588662051\"";
			if(sendcmd1(instruction,"OK",5))//連接wifi熱點(diǎn)
			{
				return 1;
			}
		}
	}
	return 0;
}

//連接云平臺服務(wù)器
u8 connect_Cloud(void)
{
	u8 *instruction = "";
	instruction="AT+MQTTUSERCFG=0,1,\"sbmc\",\"user\",\"pw\",0,0,\"\""; //發(fā)送連接后的自己的id,用戶名,密碼 id不能為空
	if(sendcmd(instruction,"OK",3)){
     instruction="AT+MQTTCONN=0,\"192.168.109.71\",1883,0"; //連接服務(wù)器的地址、通道
			if(sendcmd(instruction,"OK",3)){
				instruction="AT+MQTTSUB=0,\"123\",1\r\n"; //訂閱話題
				if(sendcmd(instruction,"OK",3)){
					return 1;
				}
			}
	}
	return 0;
}

int ack_dat(u8* string){
	if(strstr((const char*)USART3_RX_BUF,(const char*)string) != 0)
	{
		printf("\r\n接收到期待的響應(yīng) %s",string);
		USART3_RX_STA = 0;
		memset(USART3_RX_BUF,0x00,USART3_MAX_RECV_LEN);
		return 1;
	}
	return 0;
}



esp8266.h

#ifndef __ESP8622_H__
#define __ESP8622_H__

#include "Delay.h"
#include "usart.h"
#include "usart3.h"
#include "stm32f10x.h"
#include "string.h"
//WiFi連接
//云平臺連接
//數(shù)據(jù)上傳
//命令上傳


u8 sendcmd(u8 *cmd,u8 *ack,u8 times);
u8 connect_Wifi(void);
u8 connect_Cloud(void);
int ack_dat(u8* string);
#endif

Delay.c

#include "Delay.h"
/**
  * @brief  微秒級延時(shí)
  * @param  xus 延時(shí)時(shí)長,范圍:0~233015
  * @retval 無
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//設(shè)置定時(shí)器重裝值
	SysTick->VAL = 0x00;					//清空當(dāng)前計(jì)數(shù)值
	SysTick->CTRL = 0x00000005;				//設(shè)置時(shí)鐘源為HCLK,啟動定時(shí)器
	while(!(SysTick->CTRL & 0x00010000));	//等待計(jì)數(shù)到0
	SysTick->CTRL = 0x00000004;				//關(guān)閉定時(shí)器
}

/**
  * @brief  毫秒級延時(shí)
  * @param  xms 延時(shí)時(shí)長,范圍:0~4294967295
  * @retval 無
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒級延時(shí)
  * @param  xs 延時(shí)時(shí)長,范圍:0~4294967295
  * @retval 無
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

Delay.h

#ifndef __DELAY_H
#define __DELAY_H

#include "stm32f10x.h"
void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

分享就到這里。感謝觀看。文章來源地址http://www.zghlxwxcb.cn/news/detail-718642.html

到了這里,關(guān)于esp8266模塊--MQTT協(xié)議連接服務(wù)器實(shí)現(xiàn)數(shù)據(jù)接收和發(fā)送+源碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【STM32 x ESP8266】連接阿里云 MQTT 服務(wù)器(報(bào)文連接)

    【STM32 x ESP8266】連接阿里云 MQTT 服務(wù)器(報(bào)文連接)

    具體如何在阿里云創(chuàng)建一個(gè) MQTT 服務(wù)器我就不寫出來了,可以去百度一下(主要是我忘了,不好演示)。 有關(guān) MQTT 報(bào)文的一些標(biāo)識在我前面的 一篇文章 中講過,感興趣的可以去看看( 有關(guān)代碼部分講解的內(nèi)容也在那里 ,這里就不細(xì)講了,主要講如何連接的) 插一嘴,如果

    2024年02月06日
    瀏覽(25)
  • STM32通過esp8266連接WiFi接入MQTT服務(wù)器

    STM32通過esp8266連接WiFi接入MQTT服務(wù)器

    上文我們講到如何搭建本地MQTT服務(wù)器http://t.csdn.cn/aHNcO,現(xiàn)在介紹如何通過stm32連接MQTT 一.首先我們初始化esp8266這里我們使用的是USART4與其通信代碼如下 二.通過數(shù)據(jù)間隔時(shí)間來判斷是否是一串?dāng)?shù)據(jù)如果間隔時(shí)間大于30ms則判定為不是一串?dāng)?shù)據(jù),接收緩沖器清零。 代碼如下!

    2024年02月07日
    瀏覽(36)
  • ESP8266-01 MQTT固件燒錄并連接阿里云服務(wù)器

    ESP8266-01 MQTT固件燒錄并連接阿里云服務(wù)器

    1、燒錄工具:flash_download_tool : ? 鏈接:https://pan.baidu.com/s/1jJJ07G56jNJ3SrOwstPzVA?pwd=8i93? 提取碼:8i93 2、串口調(diào)試助手:串口調(diào)試助手 3、阿里云配置生成工具: 鏈接:https://pan.baidu.com/s/13tjpFwGMeR0juS5OSEBiJQ?pwd=61me? 提取碼:61me 4、USB TO TTL 5、esp8266 01s 6、AT固件:下載 ? 向esp8266燒

    2024年02月06日
    瀏覽(32)
  • esp8266WIFI模塊教程:ATK-ESP8266——TCP網(wǎng)絡(luò)通訊和服務(wù)器連接

    esp8266WIFI模塊教程:ATK-ESP8266——TCP網(wǎng)絡(luò)通訊和服務(wù)器連接

    ??ATK-MW8266D 模塊是正點(diǎn)原子推出的一款高性能 UART-WIFI(串口-無線)模塊,ATK-MW8266D 模塊板載了正點(diǎn)原子公司自主研發(fā)的 ATK-ESP-01 模塊,該模塊通過 FCC、CE 認(rèn)證,可直接用于出口歐美地區(qū)的產(chǎn)品。 ??ATK-MW8266D 模塊采用串口(LVTTL)與 MCU(或其他串口設(shè)備)通訊,且內(nèi)置

    2024年04月15日
    瀏覽(64)
  • ESP8266連接OneNet服務(wù)器

    ESP8266連接OneNet服務(wù)器

    配置ESP8266為客戶端,連接公網(wǎng),連接上OneNet服務(wù)器,通過MQTT協(xié)議與服務(wù)器進(jìn)行交互。 一 準(zhǔn)備工作 OneNet平臺上創(chuàng)建自己的產(chǎn)品設(shè)備信息。 對MQTT協(xié)議進(jìn)行一定了解。 準(zhǔn)備一塊ESP8266,通過串口進(jìn)行ESP8266的配置。 二 配置ESP8266 1.AT 驗(yàn)證硬件是否正常 硬件正常返回:AT OK 2.AT+RS

    2024年02月01日
    瀏覽(21)
  • esp32通過NBIoT模塊連入MQTT服務(wù)器

    title: esp32通過NBIoT模塊連入MQTT服務(wù)器 keywords: nbiot,esp32,c++,python,mqtt tags: [esp32,c++,python,mqtt,nbiot] categories: [嵌入式,前后端] esp32通過NBIoT模塊連入MQTT服務(wù)器 (Message Queuing Telemetry Transport),是一種輕量級、開放的發(fā)布-訂閱式通信協(xié)議。它適用于物聯(lián)網(wǎng)、移動應(yīng)用和其他帶有低帶寬

    2024年04月17日
    瀏覽(23)
  • 從零開始用Nodejs搭建一個(gè)MQTT服務(wù)器,并且用stm32通過esp8266進(jìn)行消息訂閱和發(fā)布

    從零開始用Nodejs搭建一個(gè)MQTT服務(wù)器,并且用stm32通過esp8266進(jìn)行消息訂閱和發(fā)布

    最近在做一個(gè)物聯(lián)網(wǎng)項(xiàng)目,需要用到服務(wù)器進(jìn)行數(shù)據(jù)的存儲和數(shù)據(jù)的請求和發(fā)送,之前我用過onenet平臺上的http服務(wù),雖然能通過get和post請求進(jìn)行數(shù)據(jù)的提交和發(fā)送,但是平臺上的數(shù)據(jù)發(fā)生改變卻不能主動推送給esp8266,與我此次的項(xiàng)目不符合,所以pass。然后我了解了下mqtt協(xié)

    2024年02月04日
    瀏覽(32)
  • esp8266WiFi模塊通過MQTT連接華為云

    esp8266WiFi模塊通過MQTT連接華為云

    最近 突然想做物聯(lián)網(wǎng)的項(xiàng)目,做一個(gè)類似遠(yuǎn)程控制家里的設(shè)備,比如控制燈,電視機(jī),空調(diào)這樣的,同時(shí)能夠?qū)⒓依锏臏貪穸鹊刃畔⒖梢詫?shí)時(shí)上傳到手機(jī)里。 剛開始認(rèn)為這個(gè)不就是一個(gè)很簡單的項(xiàng)目嘛, 幾個(gè)小時(shí) 之內(nèi)就能做出來,可是沒想到諸事不順,遇到各種各樣的bu

    2023年04月20日
    瀏覽(31)
  • 基于ESP32搭建物聯(lián)網(wǎng)服務(wù)器十二(使用MQTT協(xié)議與ESP32互動)

    基于ESP32搭建物聯(lián)網(wǎng)服務(wù)器十二(使用MQTT協(xié)議與ESP32互動)

    在之前的文章中:基于ESP32搭建物聯(lián)網(wǎng)服務(wù)器十一(用WEB頁面控制引腳(GPIO)功能)_esp32webserver 控制io_你的幻境的博客-CSDN博客 已經(jīng)簡單地介紹了MQTT協(xié)議,對比于其它網(wǎng)絡(luò)協(xié)議,MQTT協(xié)議在物聯(lián)網(wǎng)的開發(fā)中,它的特點(diǎn)使它適用于大多數(shù)受限的環(huán)境。例如網(wǎng)絡(luò)代價(jià)昂貴,帶寬低、不可

    2024年02月02日
    瀏覽(54)
  • ESP-01S燒錄及使用,連接本地MQTT服務(wù)器

    ESP-01S燒錄及使用,連接本地MQTT服務(wù)器

    網(wǎng)上的教程大多無法正常燒錄與使用,因此在這里進(jìn)行總結(jié)。 固件燒錄建議使用專用的燒錄器,十分省心。 本文討論的是使用普通的CH340串口模塊進(jìn)行燒寫。 必須使用的工具:杜邦線、CH340串口模塊、另外一塊有3V3電源和GND的開發(fā)板。 CH340 TTL轉(zhuǎn)USB模塊的引腳數(shù)量不夠,因此

    2024年02月16日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包