数码之家

 找回密码
 立即注册
搜索
查看: 7687|回复: 28

[Arduino] iPhone蓝牙广播随机地址的识别

[复制链接]
发表于 2019-11-29 10:33:08 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
默认的IOS开启了连续服务功能,会用蓝牙4.0的低功耗不断的发送“广告”包。 本来想利用这个来制作一个接近开关,比如带着手机到门口,能自动解锁门。自动解锁电动车之类的。

但是这个广告包用的是一个随机蓝牙地址。而且其附带的厂商数据,是苹果自定义的,至今网上未有人能解析出来。

后来研究蓝牙规范,发现这个随机地址是可解析的,前提是你要有相应的Key。 这个key就是 IRK。

于是我复制粘贴,终于组装出了一个函数,来判断空中的“广告”包的蓝牙地址是否属于自己的手机。
项目开源,上传到了GitHub。

https://github.com/fryefryefrye/Decoding-Random-Bluetooth-Address

里面包含两个小项目:

No.1   获得你的iPhone 的 IRK
用Arduino环境,把get_irk项目烧进一块ESP32板子,这块板子就会打开一个蓝牙服务。 然后在iPhone上安装LightBlue软件,找到“ESP_BLE_SECURITY”服务,点击连接,就会有提示是否配对。确定后手机端连接成功,ESP32端就会打印出IRK。

No.2   低成本监听蓝牙广播包
用Arduino环境,把nrf_ble_add项目烧进一块nano板子,连接上一块nRF24L01,即可监听广播包,提取其中的随机MAC地址,然后与之前获得的IRK进行比较,就能判断是不是自己的手机。

打赏

参与人数 3家元 +45 收起 理由
rimet + 5 優秀文章
老攻 + 30 優秀文章
qrut + 10 優秀文章

查看全部打赏

发表于 2019-11-29 12:14:18 | 显示全部楼层
挺牛呀
不过现在手机常开蓝牙 的人不太多吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-29 13:44:33 | 显示全部楼层
wxws 发表于 2019-11-29 12:14
挺牛呀
不过现在手机常开蓝牙 的人不太多吧

蓝牙4.0的低功耗模式,就算用个CR2032电池,都能连续广播半年以上。

我也搞不懂把蓝牙关掉能省多少电。

难道大多数人真的一个蓝牙设备都没有?
回复 支持 反对

使用道具 举报

发表于 2019-11-29 17:20:44 | 显示全部楼层
不错的创意,能研究到这个地步的都是高手,不过有的手机默认关闭蓝牙广播,只能搜索其它蓝牙设备,不能被其他蓝牙设备发现,点击选项后可以倒计时比如半分钟对外广播,结束自动关闭,这类手机会有局限性~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-29 18:49:19 | 显示全部楼层
本帖最后由 fryefryefrye 于 2019-11-29 18:51 编辑
qrut 发表于 2019-11-29 17:20
不错的创意,能研究到这个地步的都是高手,不过有的手机默认关闭蓝牙广播,只能搜索其它蓝牙设备,不能被其 ...

iPhone只要开着蓝牙,登录ApppleID的话,默认就会不断的蓝牙广播,让你登录了同一个AppleID附近的苹果全家桶的其他设备检测到,然后会有很有方便的功能,比如共享剪贴板之类的。

安卓的话就简单了,装个软件,自己发广播就行了。只要不被后台杀掉,就会24小时发。

以上说的都是蓝牙4.0 低功耗模式,非常省电的。

你说的在设置里面关闭广播,不能被发现,是蓝牙的经典模式,4.0之前的,蓝牙耳机,蓝牙串口之类的用的。也没有随机MAC地址功能。只要打开发现模式,就是用的自己真正的MAC地址通信。
回复 支持 反对

使用道具 举报

发表于 2019-11-29 19:13:25 | 显示全部楼层
fryefryefrye 发表于 2019-11-29 18:49
iPhone只要开着蓝牙,登录ApppleID的话,默认就会不断的蓝牙广播,让你登录了同一个AppleID附近的苹果全家 ...

是的,确切的说是4.2之前的,5.0及以上版本蓝牙功耗很低,默认一直广播~
回复 支持 反对

使用道具 举报

发表于 2019-12-2 16:23:23 | 显示全部楼层
fryefryefrye 发表于 2019-11-29 18:49
iPhone只要开着蓝牙,登录ApppleID的话,默认就会不断的蓝牙广播,让你登录了同一个AppleID附近的苹果全家 ...

会玩ble协议的都是高手。
回复 支持 反对

使用道具 举报

发表于 2019-12-3 14:16:56 | 显示全部楼层
我用带CC2540的蓝牙手环刷了固件变成了CC2540的dongle,有没有啥用呢。。:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-3 20:48:29 | 显示全部楼层
jpdd521 发表于 2019-12-3 14:16
我用带CC2540的蓝牙手环刷了固件变成了CC2540的dongle,有没有啥用呢。。

看我的开源项目的第二个子项目,就是用一片2元钱的nRF24L01,就能接收蓝牙广播。

你自己刷的dongle不用搞那么复杂的解码MAC,直接比较一下就行了。
回复 支持 反对

使用道具 举报

发表于 2020-4-24 02:25:09 | 显示全部楼层
我是将例程ble-notify改了下 手机读取rssi强度 返回给esp32开或关的指令 刚开始学BLE 多交流:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-24 16:48:43 | 显示全部楼层
anshilike 发表于 2020-4-24 02:25
我是将例程ble-notify改了下 手机读取rssi强度 返回给esp32开或关的指令 刚开始学BLE 多交流 ...

ESP32 成本高一点,但是可以获得RSSI,然后估计距离。

用nRF24L01成本低,但是没RSSI,只能获得 “有” 或者 “没有” 两个状态。
回复 支持 反对

使用道具 举报

发表于 2020-9-8 14:45:07 来自手机浏览器 | 显示全部楼层
息屏就搜索不到了、是版本问题,还是手机本身的问题
回复 支持 反对

使用道具 举报

发表于 2020-10-8 00:34:26 | 显示全部楼层
我和楼主一样,有各种好玩的想法,但就没有楼主的技术。:mad:
回复 支持 反对

使用道具 举报

发表于 2021-7-1 12:45:58 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-1 18:18:13 | 显示全部楼层

bug已经修复,但是github连不上去,先把固件放这儿。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2021-7-3 00:24:34 | 显示全部楼层
“安卓的话就简单了,装个软件,自己发广播就行了”

能具体说是哪个软件么?谢谢!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-3 08:23:02 | 显示全部楼层
lyy-cy 发表于 2021-7-3 00:24
“安卓的话就简单了,装个软件,自己发广播就行了”

能具体说是哪个软件么?谢谢!!! ...

比如: nRF Connect
回复 支持 反对

使用道具 举报

发表于 2021-7-3 12:15:08 | 显示全部楼层

感谢楼主回复。:handshake:
回复 支持 反对

使用道具 举报

发表于 2021-7-6 12:26:51 | 显示全部楼层
fryefryefrye 发表于 2021-7-1 18:18
bug已经修复,但是github连不上去,先把固件放这儿。

用esphome_flash刷的时候提示
Using 'COM14' as serial port.
Connecting......
Detecting chip type... ESP32
Connecting......

Chip Info:
- Chip Family: ESP32
- Chip Model: ESP32D0WDQ6 (revision 1)
- Number of Cores: 2
- Max CPU Frequency: 240MHz
- Has Bluetooth: YES
- Has Embedded Flash: NO
- Has Factory-Calibrated ADC: YES
- MAC Address: 3C:61:05:14:DD:20
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
- Flash Size: 4MB
Unexpected error: Error while retrieving firmware file 'https://raw.githubusercontent.com/espressif/arduino-esp32/1.0.4/tools/sdk/bin/bootloader_dio_80m.bin': ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None))
回复 支持 反对

使用道具 举报

发表于 2021-7-15 11:32:30 | 显示全部楼层
fryefryefrye 发表于 2021-7-1 18:18
bug已经修复,但是github连不上去,先把固件放这儿。

网站上更新了吗?:shy:
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-3 01:38 , Processed in 0.156000 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表