项目搭建
服务器搭建
emq
https://www.emqx.io/docs/zh/v4.4/getting-started/install.html
搭建视频
https://www.bilibili.com/video/BV1PE411L7JW
文档安装:
https://docs.emqx.cn/broker/v4.3/getting-started/install.html#shell-脚本一键安装-linux
ssl加密
https://www.bilibili.com/video/BV1pf4y1271u
mqtt.fx 调试工具
https://wws.lanzous.com/iT59Kkjqnle
密码:bvfa
打开是这样的(具体使用方法可百度)
详情了解可移步这篇博客
https://blog.youkuaiyun.com/weixin_44772058/article/details/112796025?spm=1001.2014.3001.5501
MQTT的连接服务器代码
代码参考
硬件端
stm32
联网
- 通过esp8266AT指令连接WIFI(esp8266转串口)前提是已经配置好了串口外设
注: 代码仅供参考
wifi.h
#ifndef _ESP_H
#define _ESP_H
#include "stm32f1xx_hal.h"
#include "string.h"
#include "stdlib.h"
#include "usart.h"
#define SSID "P2P"
#define PASS "wifi密码"
#define IOT_DOMAIN_NAME "MQTT ip地址"
#define IOT_PORTNUM "1883"
uint8_t esp8266_send_cmd(char *cmd, char *ack, uint16_t wait_time);
uint8_t *esp8266_check_cmd(char *str);
uint8_t esp8266_Connect_IOTServer(void);
uint8_t esp8266_Connect_AP(void);
uint8_t esp8266_Connect_Server(char *host, char *port);
uint8_t esp8266_quit_trans(void);
uint8_t esp8266_consta_check(void);
#endif
wifi.c
#include "esp8266.h"
uint8_t esp8266_Connect_IOTServer(void) {
user_main_info("准备配置模块");
HAL_Delay(100);
esp8266_send_cmd("AT", "OK", 50);
user_main_info("准备退出透传模式\n");
if (esp8266_quit_trans()) {
user_main_info("退出透传模式失败,准备重启");
return 6;
} else
user_main_info("退出透传模式成功");
user_main_info("准备关闭回显");
if (esp8266_send_cmd("ATE0", "OK", 50)) {
user_main_info("关闭回显失败准备重启");
return 1;
} else
user_main_info("关闭回显成功");
user_main_info("查询模块是否在线");
if (esp8266_send_cmd("AT", "OK", 50)) {
user_main_info("模块不在线准备重启");
return 1;
} else
user_main_info("设置查询在线成功");
user_main_info("准备设置STA模式");
if (esp8266_send_cmd("AT+CWMODE=1", "OK", 50)) {
user_main_info("设置STA模式失败准备重启");
return 1;
} else
user_main_info("设置STA模式成功");
user_main_info("准备重启");
if (esp8266_send_cmd("AT+RST", "OK", 50)) {
user_main_info("重启失败,准备重启n");
return 2;
} else
user_main_info("重启成功,等待三秒");
HAL_Delay(1000);
HAL_Delay(1000);
HAL_Delay(1000);
HAL_Delay(1000);
user_main_info("准备取消自动连接");
if (esp8266_send_cmd("AT+CWAUTOCONN=0", "OK", 50)) {
user_main_info("取消自动连接失败,准备重启");
return 3;
} else
user_main_info("取消自动连接成功");
user_main_info("准备链接路由器");
if (esp8266_Connect_AP()) {
user_main_info("连接路由器失败,等待重启");
return 4;
} else
user_main_info("连接路由器成功");
HAL_Delay(1000);
HAL_Delay(1000);
HAL_Delay(1000);
user_main_info("准备开启DHCP");
if (esp8266_send_cmd("AT+CWDHCP=1,1", "OK", 100)) {
user_main_info("开启DHCP失败,准备重启");
return 7;
} else
user_main_info("设置DHCP成功");
user_main_info("设置为关闭多路连接");
if (esp8266_send_cmd("AT+CIPMUX=0", "OK", 100)) {
user_main_info("关闭多路连接失败,准备重启");
return 7;
} else
user_main_info("设置关闭多路连接成功");
user_main_info("准备链接服务器");
if (esp8266_Connect_Server(IOT_DOMAIN_NAME, IOT_PORTNUM)) {
user_main_info("连接阿里云服务器失败,等待重启");
return 8;
} else
user_main_info("连接阿里云服务器成功");
user_main_info("准备退出透传模式\n");
if (esp8266_quit_trans()) {
user_main_info("退出透传模式失败,准备重启");
return 6;
} else
user_main_info("退出透传模式成功");
user_main_info("设置为透传模式");
if (esp8266_send_cmd("AT+CIPMODE=1", "OK", 50)) {
user_main_info("设置透传失败,准备重启");
return 6;
} else
user_main_info("设置透传成功");
user_main_info("设置开启透传模式");
if (esp8266_send_cmd("AT+CIPSEND", "OK", 1000)) {
user_main_info("开启透传失败,准备重启");
return 9;
} else
user_main_info("开启透传成功");
USART3_RX_STA = 0;
memset(USART3_RX_BUF, 0, USART3_MAX_RECV_LEN);
return 0;
}
uint8_t esp8266_send_cmd(char *cmd, char *ack, uint16_t wait_time) {
uint8_t res = 0;
USART3_RX_STA = 0;
memset(USART3_RX_BUF, 0, USART3_MAX_RECV_LEN);
u3_printf("%s\r\n", cmd);
if (wait_time) //需要等待应答
{
while (--wait_time) //等待倒计时
{
HAL_Delay(10);
if (USART3_RX_STA & 0X8000)//接收到期待的应答结果
{
if (esp8266_check_cmd(ack)) {
u1_printf("ack:%s", (uint8_t *) ack);
break;//得到有效数据
}
USART3_RX_STA = 0;
}
}
if (wait_time == 0) {
res = 1; }
}
return res;
}
uint8_t *esp8266_check_cmd(char *str) {
char *strx = 0;
if (USART3_RX_STA & 0X8000) {
//接收到一次数据了
USART3_RX_BUF[USART3_RX_STA & 0X7FFF] = 0;//添加结束符
user_main_printf("%s", (char *) USART3_RX_BUF);
strx = strstr((const char *) USART3_RX_BUF, (const char *) str);
}
return (uint8_t *) strx;
}
uint8_t esp8266_quit_trans(void)