小程序使用udp广播获取esp8266的局域网ip地址
闲来无事玩玩嵌入式,最近遇到一个问题
就是esp8266连接路由器后怎样才能知道它的ip地址
总不能每次都去路由器后台查看或者设置固定ip吧!!!
这都不现实,于是查阅大量资料找到一个好办法。
使用udp广播
大致原理是这样的:
1、esp8266开一个udp服务器,设置固定端口(唯一的不好就是要一个固定端口)如:1234
2、使用小程序发送udp广播到 ip:255.255.255.255 端口:1234 上。
3、esp8266收到广播消息,将自己的ip地址发送给客服端,然后可以转tcp连接,至此完成ip传递。
代码
ESP8266
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
WiFiUDP udp;
// 发送udp消息到远程客户端
void udp_send(String msg, IPAddress remoteIP, int remotePort)
{
// 配置远端ip地址和端口
udp.beginPacket(remoteIP, remotePort);
udp.write(msg.c_str());
udp.endPacket();
}
// 接受udp消息
void udp_handle(String msg, IPAddress remoteIP, int remotePort)
{
String type = subfstr(msg, "\n");
if (type == "scanip")
{
// 将ip发送到客户端
udp_send("scanip:ok\n"+WiFi.localIP().toString(), remoteIP, remotePort);
}
}
void setup(){
udp.begin(1234);
}
void loop()
{
// 接收数据包
if (udp.parsePacket()) // 解析包不为空
{
String temp = "";
while (udp.available())
{
temp += (char)udp.read();
delay(3);
}
// 处理接收的数据
udp_handle(temp, udp.remoteIP(), udp.remotePort());
}
}
小程序
const udp = wx.createUDPSocket()
udp.bind()
udp.onMessage((e) => {
// 检查到来的消息是否是ip
const data = new TextDecoder('utf-8').decode(e.message)
// 分割消息 第一行是命令 第二行是传递的数据
const arr = data.replaceAll('\r','').split('\n')
if(arr[0] == 'scanip:ok'){
// 这里有两种方式可以取到ip
// 1 通过返回消息 arr[1]
// 2 通过e.remoteInfo.address取到ip e.remoteInfo.port取到端口
// 如果使用2方法 在esp哪里就不需要返回ip了
const address = e.remoteInfo.address;
const port = e.remoteInfo.port;
}
})
// 关键:发送广播数据
udp.send({
address: '255.255.255.255',
port: 1234,
message: 'scanip',
// 此处一定要有,设置这条消息是广播消息
setBroadcast: true
})
至此就可以实现广播方式获取esp8266的ip地址,唯一的就是端口号需要设置为固定的,但这个不碍事。
当初也想过让esp8266持续发送广播到指定端口上,手机只做接受,但是小程序好像收不到广播消息,如果需要esp持续发送的小伙伴也是可以尝试用这种方法去拿ip,自己把代码反着写一下就可以了。
顺便普及一下udp广播的消息:
https://blog.csdn.net/m0_74937538/article/details/134449864
https://blog.csdn.net/weixin_48102054/article/details/127736689