最近发现一个好玩的项目:AppleJuice,它可以让iPhone不停弹窗。但这个项目在Mac上似乎没法运行,不过有人把它移植到了ESP32上——EvilAppleJuice-ESP32

准备动手

Usage:Clone the repo, and easiest would be to use VS Code w/ PlatformIO to upload it to your ESP32.

ESP32是由Espressif开发的一系列低成本、低功耗的片上系统微控制器,集成了Wi-Fi和蓝牙无线功能以及双核处理器。根据项目的推荐,我买了一块合宙ESP32C3,只花了12.9元。

接下来在VS Code里安装PlatformIO,我试过在应用商店里直接安装,总是不成功,可能是网络原因,于是我选择离线安装。

安装完成后PlatformIO还需要下载核心组件,最好挂上代理,不然大概率还会失败:

等待组件下载安装完成后,就可以用PlatformIO打开项目了:

等了两天板子到了,之前还担心没有合适的线连接,结果板子有个type-c口,可以直接用手机充电线连电脑。

尝试用PlatformIO编译上传。编译很顺利,上传的时候遇到了个报错:

A fatal error occurred: Failed to write to target RAM (result was 01070000:

经过一番搜寻,ESP32C3在Mac上需要安装驱动才能进行烧录:我下载了CH341SER_MAC.ZIP - NanjingQinhengMicroelectronics,安装又出现报错:程序尝试载入由“Unidentified - CH34xVCPControlDriver”签名的新系统扩展,该扩展需要由开发者更新。

又经过一番搜寻,发现要更改启动磁盘的安全性设置,具体步骤可以参考:https://support.apple.com/zh-cn/guide/mac-help/mchl768f7291/mac

设置完成后烧录还是报错了(^_^)又又经过一番搜寻,发现要在platformio.ini中添加:

upload_port = /dev/cu.wchusbserial57280383961

之后就成功烧录了!猜测PlatformIO会自动制定错误的上传口,所以需要写明。

开始动手

现在只需要接入电源,ESP32C3就会向周围的设备广播Apple蓝牙配对信息:

经过实测,影响效果与ESP32C3和iPhone之间的距离成反比,如果设备之间还有遮挡物,效果就更弱了。

看了一下项目中的devices.hpp,它对设备的蓝牙配对信息分成两大类:一类是是耳机配对信息,这些信息需要ESP32C3与设备距离更近才容易触发;另一类是家用设备,如Apple TV、HomePod等,在长距离下表现更佳。

再看看main.cpp

int device_choice = random(2);
if (device_choice == 0){
  int index = random(17);
  oAdvertisementData.addData(std::string((char*)DEVICES[index], 31));
} else {
  int index = random(12);
  oAdvertisementData.addData(std::string((char*)SHORT_DEVICES[index], 23));
}

可以看到对于蓝牙配对信息的选择是随机的,对两类设备选择的概率各为百分之五十。这会导致了如果设备之间距离过远或存在遮挡,iPhone就只会断断续续的收到家用设备设置和配对信息,而达不到关闭一个弹窗就产生下一个弹窗的效果。

小彩蛋:如果收到了Apple TV的配对信息,iPhone的控制中心会多出一个Apple TV遥控器图标😄