//**** 声明 ******************************************************************** /******************************************************************************* * 下面来自互联开源程序,由深圳市大夏龙雀科技有限公司收集 * 方便用户参考学习,本公司不提供任何技术支持 * 程序仅供测试参考,不能应用在实际工程中,不一定能通过编译 * 公司网站 http://www.szdx-smart.com/ * 淘宝网址 https://shop184598174.taobao.com/?spm=a1z10.5-c-s.w12096189-21564973333.3.547b1176WCCDxR&scene=taobao_shop *******************************************************************************/ /******************************************************************** * 文件名 : WF24-MQTT协议应用 * 描述 : 该文件实现WF24和单片机数据透传。 ***********************************************************************/ /* Name: MQTT Created: 2024/8/21 Author: WAM */ #include #include #include #include #include #define STA_MODE "AT+CWMODE=0\r\n"//设置为STA模式 连接热点 #define CONNECT_TO_WIFI "AT+CWJAP=DX-SMART,SMART@601\r\n"//DX-SMART为WIFI名称 SMART@601\r\n"//DX-SMART为WIFI名称 SMART@601为WIFI密码 #define ONECON_MODE "AT+CIPMODE=1\r\n"//设置为单连接模式 连接热点 #define CONNECT_TO_TCP "AT+CIPSTART=TCP,192.168.0.146,2347\r\n"//连接服务器 192.168.0.150为IP地址 2347为端口号 应和热点保持一致 #define CONNECT_TO_UDP "AT+CIPSTART=UDP,192.168.0.146,2345,1112,0\r\n"//连接服务器 192.168.0.150为IP地址 2345为端口号 1112 是模块设置的端口号 0 UDP固定目标模式 #define SET_MQTT "AT+MQTTLONGCLIENTID=WF-TEST2\r\n"//配置 MQTT 客户端所需的客户端 ID、用户名和密码 若 MQTT 服务器无用户名和密码验证,则模块可跳过用户名和密码的输入 #define CONNECT_TO_MQTT "AT+MQTTCONN=broker.emqx.io,1883,0\r\n"//连接MQTT 服务器 端口号 是否自动重连 #define SUB_TOPIC "AT+MQTTSUB=test-app,0\r\n"//订阅主题 test-app主题名 QOS服务质量 #define PUB_TOPIC "AT+MQTTPUBRAW=test-wf,10,0,0\r\n"//发布主题 test-wf主题名 10 消息长度 0 为QOS 0 retain 服务器是否为该主题存储一条最新的保留消息 #define EXIT_MQTT "AT+MQTTCLEAN\r\n" //断开MQTT连接 #define PUB_RAM "AT+MQTTPUBRAW=test-wf,32,0,0\r\n" //断开MQTT连接 SoftwareSerial WIFI(10, 11); // RX, TX 软件串口的波特率在Arduino会有一定限制 最好不要超过9600 int ledPin=3;//定义数字10接口 void setup() //初始化部分 { Serial.begin(115200);//WF24使用硬件串口 WIFI.begin(9600);//作为调试 WIFI.listen(); Connect_MQTT(); pinMode(ledPin,OUTPUT);//定义小灯接口为输出接口 digitalWrite(ledPin,HIGH); } String arr; void loop() //主循环 { // 从WF24读取数据并发送到PC串口 while(WIFI.available()>0) { char c = WIFI.read(); Serial.write(c); } //WF24接收到消息进行打印 while (Serial.available() > 0) { arr = Serial.readStringUntil('\0'); if(AT_CMD(PUB_RAM,"OK\r\n")) { Serial.print(arr); delay(200); while (Serial.available()) Serial.read(); } } } bool AT_CMD(char * data,char * keyword) { while (Serial.available()) Serial.read(); int i=0; char inchar; char UNO_RECV[256] = {0}; unsigned long start = millis(); Serial.println(data); //发送AT指令 while(!Serial.available());//等待模块应答 delay(1500); while (Serial.available()) { UNO_RECV[i++] = Serial.read(); } WIFI.print(UNO_RECV); if(strstr(UNO_RECV,keyword)!=NULL) { if(strstr(data,"CWJAP")!=NULL) delay(3000);//等待WIFI连接成功 if(strstr(data,"CIPSTART")!=NULL) delay(1000);//等待连接TCP成功 if(strstr(data,"MQTTCONN")!=NULL) delay(1000);//等待连接服务器成功 if(strstr(data,"MQTTPUBRAW")!=NULL) { } while (Serial.available()) Serial.read(); WIFI.println("true\r\n"); return true; } else { WIFI.println("false\r\n"); while (Serial.available()) Serial.read(); return false; } } void exit_Connect() { for(int i = 0;i<3;i++) { Serial.write('+'); } delay(200); for(int n = 0;n<3;n++) { Serial.write('+'); } } void Connect_TCP() { exit_Connect();//确保模块为指令模式 while(!AT_CMD("AT+RESTORE\r\n","OK\r\n"));//回复出厂设置 while(!AT_CMD("AT+RST\r\n","OK\r\n"));//上电重启 while(!AT_CMD("AT\r\n","OK\r\n"));//是否正常使用 while(!AT_CMD(STA_MODE,"OK\r\n"));//设置为STA模式 while(!AT_CMD(CONNECT_TO_WIFI,"OK\r\n"));//连接热点 while(!AT_CMD(ONECON_MODE,"OK\r\n"));//设置为单模式 while(!AT_CMD(CONNECT_TO_TCP,"CIPSTART:1"));//连接TCP服务端 while(!AT_CMD("AT+CIPSEND\r\n","OK\r\n"));//进入透传模式 Serial.println("connect success"); } void Connect_UDP() { exit_Connect();//确保模块为指令模式 while(!AT_CMD("AT+RESTORE\r\n","OK\r\n"));//回复出厂设置 while(!AT_CMD("AT+RST\r\n","OK\r\n"));//上电重启 while(!AT_CMD("AT\r\n","OK\r\n"));;//是否正常使用 while(!AT_CMD(STA_MODE,"OK\r\n"));;//设置为STA模式 while(!AT_CMD(CONNECT_TO_WIFI,"OK\r\n"));;//连接热点 while(!AT_CMD(ONECON_MODE,"OK\r\n"));;//设置为单模式 while(!AT_CMD(CONNECT_TO_UDP,"CIPSTART:1")); ;//连接TCP服务端 while(!AT_CMD("AT+CIPSEND\r\n","OK\r\n"));//进入透传模式 Serial.println("connect UDP success"); } void Connect_MQTT() { while(!AT_CMD(EXIT_MQTT,"OK\r\n"));//断开连接 while(!AT_CMD("AT+RESTORE\r\n","OK\r\n"));//回复出厂设置 while(!AT_CMD("AT+RST\r\n","OK\r\n"));//上电重启 while(!AT_CMD("AT\r\n","OK\r\n"));//是否正常使用 while(!AT_CMD(STA_MODE,"OK\r\n"));//设置为STA模式 while(!AT_CMD(CONNECT_TO_WIFI,"OK\r\n"));//连接热点 while(!AT_CMD(SET_MQTT,"OK\r\n"));//设置MQTT客户端参数 while(!AT_CMD(CONNECT_TO_MQTT,"MQTTCONNECTED:"));//连接MQTT服务器 while(!AT_CMD(SUB_TOPIC,"OK\r\n"));//订阅MQTT服务主题 //while(!AT_CMD(PUB_RAM,"OK\r\n"));//发布主题消息 //Serial.print("connect MQTT success"); }