...
嵌入式 esp8266udp

小程序使用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

在线免费的AI照片无损放大和模糊修复工具分享 免费在线pdf文档文件翻译工具分享一下
biu biu biu
在Windows2012下安装SQL Server 2005无法启动服务的解决办法 JavaScript实时监听歌曲播放进度显示对应歌词 Linux crontab 计划任务,定时执行任务方法 OpenVpn 搭建虚拟局域网服务 Windows篇 Linux mysql 定时自动备份实现