Android如何编程获取附近设备MAC地址及与Arduino无连接通信方法
Android 附近设备MAC地址获取及与ESP8266无连接通信方案
一、编程获取附近设备MAC地址的实现说明
Android系统对MAC地址的获取权限有严格的版本限制,普通第三方应用的实现能力如下:
- Android 10及以上系统:系统默认对周边未连接设备的MAC地址做匿名化处理,普通应用即使申请了定位、WiFi/蓝牙相关权限,也无法获取到周边设备的真实MAC地址,仅系统级签名应用才能拿到原始数据。
- Android 6.0 - Android 9系统:可以通过WiFi扫描获取周边WiFi设备的MAC地址,需要先申请
ACCESS_FINE_LOCATION、ACCESS_WIFI_STATE、CHANGE_WIFI_STATE权限,参考代码如下:
// 初始化WiFi服务 WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); // 发起WiFi扫描 wifiManager.startScan(); // 获取扫描结果 List<ScanResult> scanList = wifiManager.getScanResults(); for (ScanResult item : scanList) { // BSSID字段即为对应WiFi设备的MAC地址 String mac = item.BSSID; String deviceName = item.SSID; }
如果需要获取非WiFi设备的MAC地址,除了已配对的蓝牙设备外,普通应用没有合法的实现路径。
二、不依赖WiFi/蓝牙常规连接的通信方案
你需要的无连接通信,指不需要完成配对、建立长连接的交互场景,可行的实现方案如下:
- WiFi Beacon帧通信:仅使用WiFi硬件,不需要建立WiFi连接,ESP8266可以配置为AP模式,自定义Beacon帧的厂商自定义字段,把需要传输的内容写入该字段循环广播;Android端通过WiFi扫描即可解析到对应内容,不需要建立任何连接,传输距离和普通WiFi覆盖范围一致。如果需要从Android端往ESP8266发数据,也可以在Android端构造自定义探测请求帧,ESP8266监听空中的探测请求即可解析数据,不过该操作在Android普通应用层无法直接实现,需要Root或通过NDK调用底层驱动,兼容性较低。
- 声波通信:不需要额外的专用通信硬件,Android端用扬声器、ESP8266外接麦克风模块即可实现,将数据编码为超声波频段(人耳无法听到)的声波信号传输,传输距离在0.5-5米左右,适合低速率的小数据传输。
- NFC通信:通信距离在10cm以内,不需要配对连接,Android端自带NFC读写模块,ESP8266外接PN532等NFC模块即可实现双向数据交互,适合近距离触发类的场景使用。
- 可见光通信:ESP8266外接LED灯珠,将数据编码为高频闪烁的光信号(闪烁频率超过人眼识别阈值,不会感觉到灯光闪动),Android端通过摄像头或者光线传感器即可接收数据,也可以反向用Android屏幕发光传输数据给ESP8266的光敏模块,无电磁干扰,适合对电磁信号有限制的特定场景。
如果可以接受两台设备在同一局域网下,UDP广播 也是高性价比的方案,不需要提前配对建立长连接,直接往广播地址发数据包即可,实现难度远低于自定义WiFi帧方案。
内容的提问来源于stack exchange,提问作者Giuseppe Mondelli
相关产品推荐
相关产品推荐

