You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP8266未连WiFi时广播含标识数据包至手机的可行性问询

嘿,这个需求其实挺容易实现的,而且完全不用提前连任何WiFi——ESP8266本身就支持在SoftAP模式下发送UDP广播包,新手也能快速上手。我给你一步步拆解:

核心思路:用ESP8266当临时热点发广播

简单来说,我们让ESP8266自己创建一个WiFi热点(SoftAP模式),不用连接外部WiFi。然后它可以定时向全网段发送UDP广播包,手机APP只要监听对应的UDP端口,就能提取出你要的标识号——甚至不用连接ESP的热点(不过实际测试中,部分手机需要开启WiFi并处于监听状态才能稳定接收,实在不行可以让APP提示用户连ESP的热点,这样100%能收到)。

步骤1:ESP8266端代码(Arduino框架,新手友好)

用Arduino IDE写代码最省心,直接抄下面的示例,改改标识号和热点名称就行:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

// 自定义你的ESP热点名称(可以设空密码,方便手机连)
const char* ap_ssid = "ESP_Device_Broadcast";
const char* ap_password = ""; 

WiFiUdp udp;
const unsigned int udp_port = 12345; // 收发用同一个端口就行
char broadcast_msg[255];
const char* device_id = "MY_ESP_001"; // 你的设备专属标识号

void setup() {
  Serial.begin(115200);
  
  // 切换到SoftAP模式,自己当热点
  WiFi.mode(WIFI_AP);
  WiFi.softAP(ap_ssid, ap_password);
  
  // 获取热点的IP,顺便打印广播地址(方便调试)
  IPAddress ap_ip = WiFi.softAPIP();
  IPAddress broadcast_ip = IPAddress(ap_ip[0], ap_ip[1], ap_ip[2], 255);
  Serial.print("ESP热点IP: ");
  Serial.println(ap_ip);
  Serial.print("广播地址: ");
  Serial.println(broadcast_ip);
  
  udp.begin(udp_port);
  // 把标识号打包成固定格式的字符串,方便APP解析
  sprintf(broadcast_msg, "DEVICE_ID:%s", device_id);
}

void loop() {
  // 每隔2秒发一次广播(可以改时间,比如10秒一次省电量)
  udp.beginPacket(IPAddress(255,255,255,255), udp_port);
  udp.write(broadcast_msg);
  udp.endPacket();
  
  Serial.println("已发送广播: " + String(broadcast_msg));
  delay(2000);
}

代码关键点说明:

  • WiFi.mode(WIFI_AP):强制ESP进入SoftAP模式,不再尝试连接外部WiFi
  • IPAddress(255,255,255,255):全局广播地址,只要在同一个WiFi频段的设备都能收到
  • 固定格式的广播内容(比如DEVICE_ID:XXX):方便APP快速提取标识号,避免和其他广播包混淆
步骤2:手机APP端接收广播(以Android为例)

这里给你核心的接收代码,iOS逻辑类似,都是监听UDP端口解析数据:

第一步:先加权限(AndroidManifest.xml)

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android6.0+需要动态申请 -->

第二步:后台线程监听UDP广播

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpReceiver extends Thread {
    private static final int UDP_PORT = 12345; // 和ESP端保持一致
    private boolean isRunning = true;
    private OnDeviceFoundListener listener;

    // 定义回调接口,方便把标识号传到UI层
    public interface OnDeviceFoundListener {
        void onDeviceIdReceived(String deviceId);
    }

    public UdpReceiver(OnDeviceFoundListener listener) {
        this.listener = listener;
    }

    @Override
    public void run() {
        try {
            DatagramSocket socket = new DatagramSocket(UDP_PORT);
            socket.setBroadcast(true); // 允许接收广播包
            byte[] buffer = new byte[256];

            while (isRunning) {
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                socket.receive(packet);
                String receivedData = new String(packet.getData(), 0, packet.getLength());
                
                // 解析标识号:如果收到的字符串以DEVICE_ID开头,就提取后面的内容
                if (receivedData.startsWith("DEVICE_ID:")) {
                    String deviceId = receivedData.substring("DEVICE_ID:".length());
                    if (listener != null) {
                        listener.onDeviceIdReceived(deviceId);
                    }
                }
            }
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 停止监听的方法,在Activity销毁时调用
    public void stopListening() {
        isRunning = false;
    }
}

第三步:在Activity中启动监听

@Override
protected void onStart() {
    super.onStart();
    // 启动UDP监听线程
    UdpReceiver udpReceiver = new UdpReceiver(deviceId -> {
        // 在UI线程更新界面,显示收到的标识号
        runOnUiThread(() -> {
            tv_device_id.setText("找到设备:" + deviceId);
        });
    });
    udpReceiver.start();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    udpReceiver.stopListening(); // 停止监听,避免内存泄漏
}
新手必看注意事项
  • 广播范围问题:如果手机不连ESP的热点,只能在同一个2.4G频段内收到广播(ESP8266只支持2.4G),如果手机连的是5G WiFi,大概率收不到。所以要稳定接收的话,建议APP提示用户连接ESP的热点。
  • 端口冲突:尽量选一个不常用的UDP端口(比如12345),避免和其他应用冲突。
  • 功耗优化:如果ESP是电池供电,把广播间隔改大一点(比如10秒一次),能显著降低功耗。

内容的提问来源于stack exchange,提问作者xPledo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:49:17