于是在社团大佬的指点下采用UDP通讯,应该会收发自如,顺滑如狗。
然后我就一直在踩坑,深坑!!
现在给大家看一下正点原子给出的AT指令使用示例里面的UDP通讯。
图中红框圈出来的地方就是第一个问题。
这边ESP8266的WIFI模式不能设置成AP+STA。
做AP的一方只能设置成 AT+CWMODE=2(建议使用AT+CWMODE_DEF=2)
做STA的一方只能设置成 AT+CWMODE=1(建议使用AT+CWMODE_DEF=1)
两个模块都不能设置成STA+AP模式,因为会存在IP找不到的情况,具体的原理,我在StackOverflow上看到了国外大佬的回答,豁然开朗,下面贴上连接: https://stackoverflow.com/questions/39064193/esp8266-send-udp-string-to-ap?r=SearchResults
如果说看不懂英文的话,可以再开个网页配一个在线翻译,哈哈哈哈,我也是这么干的,一直看英文太累了。
接收的一方的ESP8266模块,也就是需要外挂MCU的模块,必须使用 AT+CIPSTART 去监听对方的UDP连接。
坑就坑在里面的参数设置,下面给出一个正确示例:
AT+CIPSTART="UDP","192.168.4.4",2500,2500,0
第一个2500是ESP8266-NodeMCU那边的端口号,第二个2500是模块自己端口号,写成一样的方便,不会乱。
注意一点,接收方的IP地址必须自己指定,不能直接使用AP建立之后的192.168.4.1,不然就会出现上面所说的另一方找不到模块的 IP地址。
接收方ESP8266模块还需增加一个命令:AT+CIPAP_DEF="192.168.4.3"
这样就把ESP8266模块的IP改成了 192.168.4.3 ,另一方来连接这个就是连192.168.4.3 端口是2500。这样就能成功建立连接。并且还能接收到数据,无卡顿,非常流畅。
#include
#include
const char* ssid = "MyAP1"; //你的AP的名字
const char* password = "123456789"; //AP的密码
const char* IP = "192.168.4.3"; //创建AP的模块的IP地址
const int PORT = 2500; //模块的端口号
WiFiUDP Udp;
unsigned int localUdpPort = 2500; //本地的端口号,就是ESP8266-NodeMCU的端口号
char incomingPacket[255]; // buffer for incoming packets
char replyPacket[] = "Hi there! Got the message :-)\r\n"; // a reply string to send back
void setup() {
Serial.begin(115200);
Serial.println();
//开始连接
Serial.printf("Connecting to %s ", ssid);
WiFi.mode(WIFI_STA);
WiFi.begin("MyAP1", "123456789");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println(" connected");
//开启本地端口
Udp.begin(localUdpPort);
Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
}
void loop() {
//开始发送数据
int packetSize = Udp.parsePacket();
//开始打包
int mycode = Udp.beginPacket("192.168.4.3",2500);
//写入数据
int wirtecode = Udp.write(replyPacket);
//发送
int endcode = Udp.endPacket();
//打印返回值看看是否发送出去了
Serial.printf("udp package code = %d, weite code = %d, endcode = %d\n",mycode,wirtecode,endcode);
Serial.printf("UDP send once \n");
delay(500);
}
1、AT+CWMODE=2
2、AT+CWSAP_DEF="MyAP1","123456789",11,4
3、AT+CIPAP_DEF="192.168.4.3"
4、AT+CIPMUX=0
5、AT+CIPMODE=1
至此,已经可以成功连接了
如果需要接收对方发来的数据,再添加一行命令:
6、AT+CIPSTART="UDP","192.168.4.4",2500,2500,0
这样就能接收到数据了。