基于STM32与ESP8266的AT命令实现利用MQTT协议与服务器实现订阅与上报数据
一.给ESP8266烧录带有MQTT协议的AT固件:1. 乐鑫官方固件下载:
ESP-AT|乐鑫科技 (espressif.com.cn)https://i-blog.csdnimg.cn/blog_migrate/19566fdf079fc55a650ba3e2791d037d.pnghttps://www.espressif.com.cn/zh-hans/support/download/at?keys&field_type_tid%5B%5D=14 2.安信可官方固件下载:
安可信https://i-blog.csdnimg.cn/blog_migrate/19566fdf079fc55a650ba3e2791d037d.pnghttps://docs.ai-thinker.com/esp8266/sdk3.固件烧录工具:
开辟工具清单 | 安信可科技 (ai-thinker.com)https://i-blog.csdnimg.cn/blog_migrate/19566fdf079fc55a650ba3e2791d037d.pnghttps://docs.ai-thinker.com/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B72
二.测试ESP8266的AT指令是否可以利用:
1.利用串口调试助手与ESP8266的RX,TX相连,在串口调试助手发以下命令举行测试:
AT:测试AT是否启动启动
AT+GMR:检察版本信息
AT+CMD?:查询当前固件支持的所有命令及命令类型
2.将串口的USART设置为如下(如果串口波特率为115200可以不用设置):
AT+UART_DEF=115200,8,1,0,3:设置串口的波特率、数据位、停止位、校验位、流控
三.初始化一个STM32的USART串口并将其RX,TX分别与ESP8266的TX,RX相连后
1.ESP8266初始化
void ESP8266_Init(void)
{
ESP8266_Clear();
printf( "0. AT\r\n");
while(ESP8266_SendCmd("AT\r\n", "OK"))
HAL_Delay(500);
printf( "1. RST\r\n");
ESP8266_SendCmd("AT+RST\r\n", "");
HAL_Delay(500);
ESP8266_SendCmd("AT+CIPCLOSE\r\n", "");
HAL_Delay(500);
printf( "2. CWMODE\r\n");
while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
HAL_Delay(500);
printf( "3. AT+CWDHCP\r\n");
while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
HAL_Delay(500);
printf("4. CWJAP\r\n");
while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
HAL_Delay(500);
printf( "5. CIPSTART\r\n");
// while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))
// HAL_Delay(500);
printf( "6. ESP8266 Init OK\r\n");
} 2.界说WIFI名称和密码:
#define ESP8266_WIFI_INFO "AT+CWJAP=\"名称\",\"密码\"\r\n" 3.连接WIFI:
uint8_t atk_mw8266d_join_ap(char *ssid, char *pwd)
{
uint8_t ret;
char cmd;
sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"", ssid, pwd);
ret = atk_mw8266d_send_at_cmd(cmd, "WIFI GOT IP", 10000);
if (ret == ATK_MW8266D_EOK)
{
return ATK_MW8266D_EOK;
}
else
{
return ATK_MW8266D_ERROR;
}
} 4.MQTT服务配置和连接:
const char* ClintID="";//连接ID
const char* username="";//连接的用户名
const char* passwd="";//连接的密码
const char* Url="";//连接的地址
const char* pubtopic="";//订阅的位置
const char* subtopic="";//发布的位置
uint8_t atk_mw8266d_mqtt_user(void)//mqtt_user配置
{ char cmd;
uint8_t ret;
sprintf(cmd, "AT+MQTTUSERCFG=0,1,\"%s\",\"%s\",\"%s\",0,0,\"\"\r\n",ClintID,username,passwd);
ret = atk_mw8266d_send_at_cmd(cmd,"OK", 500);
if (ret == ATK_MW8266D_EOK)
{
delay_ms(1000);
return ATK_MW8266D_EOK;
}
else
{
return ATK_MW8266D_ERROR;
}
}
uint8_t atk_mw8266d_mqtt_CONN(void)//mqtt连接
{ char cmd;
uint8_t ret;
sprintf(cmd, "AT+MQTTCONN=0,\"%s\",端口号,1\r\n",Url);
ret = atk_mw8266d_send_at_cmd(cmd,"OK", 500);
if (ret == ATK_MW8266D_EOK)
{
delay_ms(1000);
return ATK_MW8266D_EOK;
}
else
{
return ATK_MW8266D_ERROR;
}
} 5.订阅消息:
uint8_t atk_mw8266d_mqtt_SUB(void)//mqtt订阅
{ char cmd;
uint8_t ret;
sprintf(cmd, "AT+MQTTSUB=0,\"%s\",1\r\n",subtopic);
ret = atk_mw8266d_send_at_cmd(cmd,"OK", 500);
if (ret == ATK_MW8266D_EOK)
{
delay_ms(1000);
return ATK_MW8266D_EOK;
}
else
{
return ATK_MW8266D_ERROR;
}
} 6.发布消息(发布的消息布局利用的是JSON):
const char* func1="recycle";
uint8_t re_atk_mw8266d_mqtt_pub(void)//mqtt发布
{ char cmd;
uint8_t ret;
func2=temp;//
sprintf(cmd, "AT+MQTTPUB=0,\"%s\",\"{\\\"%s\\\":%d\\}\",0,0\r\n",pubtopic,func1,100-(func2/20));
ret = atk_mw8266d_send_at_cmd(cmd,"OK", 500);
if (ret == ATK_MW8266D_EOK)
{
delay_ms(1000);
return ATK_MW8266D_EOK;
}
else
{
return ATK_MW8266D_ERROR;
}
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]