164 lines
6.0 KiB
C++
164 lines
6.0 KiB
C++
//**** 声明 ********************************************************************
|
||
/*******************************************************************************
|
||
* 下面来自互联开源程序,由深圳市大夏龙雀科技有限公司收集
|
||
* 方便用户参考学习,本公司不提供任何技术支持
|
||
* 程序仅供测试参考,不能应用在实际工程中,不一定能通过编译
|
||
* 公司网站 http://www.szdx-smart.com/
|
||
* 淘宝网址 https://shop184598174.taobao.com/?spm=a1z10.5-c-s.w12096189-21564973333.3.547b1176WCCDxR&scene=taobao_shop
|
||
*******************************************************************************/
|
||
/********************************************************************
|
||
* 文件名 : WF24-TCP协议应用
|
||
* 描述 : 该文件实现WF24和单片机数据透传。
|
||
***********************************************************************/
|
||
/*
|
||
Name: TCP
|
||
Created: 2024/8/21
|
||
Author: WAM
|
||
*/
|
||
#include <Arduino.h>
|
||
#include <SPI.h>
|
||
#include <SoftwareSerial.h>
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
|
||
|
||
|
||
#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_TCP();
|
||
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');
|
||
Serial.print(arr);
|
||
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
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");
|
||
}
|