
yj_nearbyglasses v1.0.10
尝试检测附近的智能眼镜并警告您
yj_nearbyglasses
尝试检测附近的智能眼镜并向你发出警告。
⚠ 警告!⚠
nearby-glasses-alert.pages.dev 与我的项目没有任何关系。Play Store 和 App Store 中的许多应用看起来甚至名称都与 Nearby Glasses 非常相似。它们似乎是在盗用这个名字,试图从中快速牟利。它们不遵守 AGPL 许可证,也不提供任何保障。我不认可这种行为。
⚠ 警告!⚠
因为认为他人佩戴隐蔽监控设备而对其进行骚扰可能构成刑事犯罪。这可能比使用此类设备本身更为严重。请就此事咨询当地法律。
⚠ 绝对不要骚扰任何人 ⚠
Nearby Glasses
这款名为 Nearby Glasses 的应用只有一个目的:寻找附近的智能眼镜并向你发出警告。
目录
这款应用会在智能眼镜出现在附近时通知你。它利用这些设备发出的蓝牙数据中的公司标识符进行识别。因此,很可能会出现误报(例如来自 VR 头显)。所以,当你靠近附近戴眼镜的人时,请务必谨慎。尽管应用发出了警告,对方可能只是戴着普通眼镜。
本应用作者 Yves Jeanrenaud 对本应用及其功能不承担任何责任。使用风险自负。从技术设计上讲,检测蓝牙 LE 设备有时可能无法如预期般工作。我并非科班出身的开发者。这一切都是我在业余时间用自学知识写成的。
误报很可能发生。 这意味着,Nearby Glasses 应用可能会在附近实际上只有同一厂商的 VR 头显或该公司其他产品时,通知你附近有智能眼镜。它也可能漏掉附近的智能眼镜。再次强调:我不是专业开发者。
不过,这款应用是免费且开源的,你可以审查代码、修改并重新使用它(遵循许可证)。
Nearby Glasses 应用不会存储任何关于你的详细信息,也不会收集任何关于你或你手机的信息。没有遥测、没有广告,也没有其他烦扰。如果你通过 Play Store 安装该应用,Google 可能会了解一些关于你的信息并收集一些统计数据。但应用本身不会。
如果你选择存储(导出)日志文件,这完全取决于你自己,数据去向也由你负责。日志仅在本地记录,不会自动与任何人共享。它们确实包含少量敏感数据;实际上,只有遇到的 BLE 设备的制造商 ID 代码。
请极其谨慎地使用! 如前所述:无法保证检测到的智能眼镜真的在附近。它可能是另一台在技术上(在 BLE 广播层面)与智能眼镜相似的设备。
请不要鲁莽行事。在根据任何消息采取行动之前请三思(不仅仅是来自本应用的消息)。
为什么?
- 因为我认为智能眼镜是一种不可容忍的侵犯、无视同意的、可怕的科技产品,且已被用于制作各种大量同样真正令人作呕的“内容”。1,2
- 一些智能眼镜配有小型 LED 指示灯,表示正在录制。但这很容易被禁用,而制造商声称会防止这种情况,却完全不承担责任(几十年来科技行业一直如此)。3
- 智能眼镜此前已被用于即时人脸识别 4,据报道开箱即用也将具备此功能 5。这使许多人处于危险之中。
- 这些数据被用于训练 AI,这意味着人们会筛查录像,很可能看到最私密的细节 6
- 我希望这款应用对某些人有用。
如何实现?
- 这是一种相当简单的启发式方法。由于 BLE 使用随机化 MAC,OSSID 不稳定,服务通告的 UUID 也不稳定,你不能仅仅扫描蓝牙信标。而且,更糟糕的是,一些厂商(例如 Meta)使用专有蓝牙服务,UUID 并不持久,
目前我们只能依赖通信的设备名称。 - 目前最可行的方法来自 Bluetooth SIG 分配编号仓库。据此,制造商公司名称会以数字代码的形式出现在 BLE 信标的广播包头(ADV)中。
- BLE 广播帧的样子如下:``` Frame 1: Advertising (ADV_IND) Time: 0.591232 s Address: C4:7C:8D:1E:2B:3F (Random Static) RSSI: -58 dBm
Flags: 02 01 06 Flags: LE General Discoverable Mode, BR/EDR Not Supported
Manufacturer Specific Data: Length: 0x1A Type: Manufacturer Specific Data (0xFF) Company ID: 0x058E (Meta Platforms Technologies, LLC) Data: 4D 45 54 41 5F 52 42 5F 47 4C 41 53 53
Service UUIDs: Complete List of 16-bit Service UUIDs 0xFEAA
- 根据 [Bluetooth SIG 分配编号仓库](https://github.com/yjeanrenaud/yj_nearbyglasses/blob/main/www.bluetooth.com/specifications/assigned-numbers),我们可以使用以下公司 ID:
- `0x01AB` 对应 `Meta Platforms, Inc. (formerly Facebook)`
- `0x058E` 对应 `Meta Platforms Technologies, LLC`
- `0x0D53` 对应 `Luxottica Group S.p.A`(Meta Ray-Bans 的制造商)
- `0x03C2` 对应 `Snapchat, Inc.`(SNAP Spectacles 的制造商)
- `0x05D6` 对应 `Zhuhai Jieli Technology Co`(Rogbird VisionPro 和 Rollme VistaView 的制造商)
这些 ID 是**不可变且强制性的**。当然,Meta 和其他制造商也有其他带蓝牙功能的产品,因此也使用它们的 ID,例如 VR 头显。因此,使用这些公司 ID 代码进行应用扫描过程容易产生误报。但如果你看不到周围有人戴着 Occulus Rift,也没有建筑物可供他们藏身,那么很可能就是智能眼镜。
- 在配对过程中,智能眼镜通常会发出其产品名称,因此我们也可以扫描该名称。但在实际场景中很少能看到这种情况。打算在酒吧、酒馆、街头和其他地方使用智能眼镜的人通常会事先做好准备。
- 当应用识别到信号强度足够的蓝牙低功耗(BLE)设备时(参见下方的 RSI),它会推送一条警报消息。这应有助于你采取相应行动。
- 此外,我们还会扫描广播的设备名称,例如 `rayban`、`ray-ban` 或 `HeyCyan`。`HeyCyan` 是[一个著名的各种品牌智能眼镜 SDK](https://github.com/ebowwa/HeyCyanSmartGlassesSDK)。在这些 *HeyCyan* 设备中,你可能还会发现由 ALDI 和 Hofer(在奥地利)销售的 Nilox Smart AI Glasses。为加强这一点,我们还会查找 `primary_UUID`,这是一个固定在这些眼镜软件端的服务标识符(`7905FFF0-B5CE-4E99-A40F-4B1E122D00D0`)。虽然这在未来可能会改变,但可能性不大,因为那会使旧设备无法使用,因此我们届时可能只需在扫描例程中添加更多 UUID。
## 功能
- 应用 *Nearby Glasses* 在附近有智能眼镜时(即上述公司 ID 之一的 BLE 设备)会显示通知
- **附近**是指 RSSI(信号强度)小于或等于给定值:默认 -75 dBm。此默认值对应中等距离和还算可以的信号。
### 什么是 RSSI?
- 让我稍微解释一下 RSSI 值:<br/>
RSSI 是 Received Signal Strength Indication(接收信号强度指示)的缩写。该值表示无线通信应用的接收场强。[Wikipedia 有一篇相当不错的文章](https://en.wikipedia.org/wiki/Received_signal_strength_indicator)介绍它。
简而言之,RSSI 主要取决于:<br/>
- 设备发射功率
- 天线设计
- 墙壁和障碍物
- 人体吸收信号
- 反射和干扰
- 设备方向<br/>
但在典型的 BLE(蓝牙低功耗)场景中,RSSI 粗略距离(开阔空间)为:<br/>
- -60 dBm ~ 1 – 3 m<br/>
- -70 dBm ~ 3 – 10 m<br/>
- -80 dBm ~ 10 – 20 m<br/>
- -90 dBm ~ 20 – 40 m<br/>
- -100 dBm ~ 30 – 100+ m 或接近信号丢失<br/>
在室内,距离通常要短得多。<br/>
RSSI 大致按以下公式下降<br/>
`RSSI ≈ -10 * n * log10(distance) + constant`<br/>
- 因此,默认 RSSI 阈值 -75 dBm 对应开阔空间约 10 到 15 米,室内或拥挤空间约 3 到 10 米。这样你很有机会发现那个戴智能眼镜的人。
- *Nearby Glasses* 显示可选的调试日志,可导出(为 txt 文件),并具有复制粘贴功能。这些面向高级用户(极客)和进一步调试。
- 在 *Settings* 下,你可以指定日志长度、调试(显示所有扫描项或仅 ADV 帧)。
- 你也可以输入一些**公司 ID** 作为十六进制值字符串,例如 `0x01AB,0x058E,0x0D53`。这会覆盖内置检测,因此你的通知会针对新值显示。
- 为更好地保持运行,它使用 Android 的 *Foreground Service*。如果你不需要,可以在 *Settings* 下禁用。
- *Settings* 下的 *Notification Cooldown* 指定两次警告之间必须经过多少时间。默认是 10000 ms,即 10 秒。这也适用于金丝雀,例如 10 秒意味着它会保持警觉 10 秒,然后再次平静下来。
- 现在它更加本地化了:<img src="https://raw.githubusercontent.com/yjeanrenaud/yj_nearbyglasses/HEAD/img/canary_hide.svg" align="right" alt="Drawing of a canary that hides underneath a wing" height="100" width="100">
- 英语
- 德语
- 瑞士德语
- 法语
- 西班牙语
- 中文
- 意大利语
- 葡萄牙语(巴西)
- 俄语
- 土耳其语
- 更多语言最终会到来([通过贡献你的语言来支持这个项目!](https://github.com/yjeanrenaud/yj_nearbyglasses/issues/3))
- 现在应用图标的背景不再是透明的
- 现在我们也会扫描 UUID
- *Nearby Glasses* 现在支持深色模式(通过系统设置)
- 边到边布局问题应从 [v1.0.4](https://github.com/yjeanrenaud/yj_nearbyglasses/releases) 起修复。
- 新许可为 AGPL 3.0
- 我决定放弃 CLA。在与比我更了解协作项目的人进行了一些讨论后,我意识到这是不必要的一步。
- 现在它有了略微不同的图标,以更严格地遵守 AGPL 3.0。
## iOS 和 Android
- 终于,在三周后,iOS 移植版可用了。它应该能在大多数 iPhone 和 iPad 上运行;甚至更旧的设备(可回溯到 iOS 16)。[源代码和项目文件也已提供](https://github.com/yjeanrenaud/yj_nearbyglasses/blob/main/iOS)。代码丑陋且非正统。许多方法都是快速而粗糙的(例如,我复用了 Android 本地化的 json 文件),但到目前为止它还能工作。*Nearby Glasses* 可通过 [Apple App Store](https://apps.apple.com/us/app/nearby-glasses-original/id6761056896) 获取。(它被称为 original 是为了与那些模仿者区分开来)。一个 .ipa 可在 [releases](https://github.com/yjeanrenaud/yj_nearbyglasses/releases) 下用于侧载。
iOS 应用无法在后台工作,因为由于 iOS 限制,我找不到使用类似 `ForegroundServices` 的方式来永久扫描 BTLE ADV。因此,在 iOS 下的 *Nearby Glasses* 中只有 *Canary Mode* 可用。如果你比我更了解 Swift 和 iOS(这很可能),请贡献!
- 因为这个仓库同时包含 Android 和 iOS 应用代码,我重新组织了文件夹。因此,有 [/iOS](https://github.com/yjeanrenaud/yj_nearbyglasses/blob/main/iOS) 和 [/Android](https://github.com/yjeanrenaud/yj_nearbyglasses/blob/main/Android)。
## 使用
- 请参阅 [Releases](https://github.com/yjeanrenaud/yj_nearbyglasses/releases) 下载 APK,或使用 Google Play Store。F-Droid 和/或 Accrescent 可能会跟进。
<img width="135" height="300" align ="right" alt="Screenshot Nearby Glasses: Settings" src="https://assets.kitploit.com/production/public/readmes/12083/71a0271ff9172cad52e8d83ed9a29ba43b509c7b250be2a0254a5a4371ee3401.png" />
<a href="https://play.google.com/store/apps/details?id=ch.pocketpc.nearbyglasses" target="_blank"><img width="239" height="71" alt="Get It On Google Play" src="https://assets.kitploit.com/production/public/readmes/12083/a7dbeba4623dd255798dd1159e543cdbeeb9e43faa6db7f859b0f9ed3699932c.png" /></a> <a href="https://apps.apple.com/us/app/nearby-glasses-original/id6761056896"><img width="213" height="71" alt="Download on the App Store" src="https://assets.kitploit.com/production/public/readmes/12083/a6fa504b048d52b4e9f5108021dce33af0d96b8b78c34095072971f4a34471fa.png" /></a>
1. 安装应用(目前可从 [Releases](https://github.com/yjeanrenaud/yj_nearbyglasses/releases) 或 [Google Play](https://play.google.com/store/apps/details?id=ch.pocketpc.nearbyglasses) 获取)或从 [Apple App Store](https://apps.apple.com/us/app/nearby-glasses-original/id6761056896) 获取,然后打开它
2. 点击 *Start Scanning* 按钮
3. 授予权限以激活蓝牙(如果尚未启用)并访问附近设备。某些 Android 版本还需要你授予访问位置的权限(大多在版本 13 之前)。*Nearby Glasses* 不会对你的位置信息做任何处理。如果你不相信我,请查看[代码](https://github.com/yjeanrenaud/yj_nearbyglasses/tree/main/app)
4. 如果你没有看到扫描开始,你可能需要在 *Settings* 菜单中为你的特定手机启用 *Foreground Service*(见下文)
5. 一切就绪!当检测到附近有智能眼镜时,会出现通知。它会一直显示,直到你点击 *Stop Scanning* 或彻底终止应用
7. 在菜单中(右上角,齿轮图标),你可以进行一些 *Settings*:
1. *Enable Foreground Service*:通过此设置,你可以防止 Android 暂停应用,从而防止它无法提醒你。我建议保持启用
2. *RSSI threshold*:这个负数指定设备可能有多远才会成为 *Nearby Glasses* 警报的原因。技术上,它指的是信号接收的强度。越接近零意味着信号越好,因此你的手机和智能眼镜之间的距离越短。参见[上方 RSSI 的解释和指导](#how)。我建议保持在 -75
3. *Enable Notifications*:你不会想禁用这个
4. Canary Mode。这是新的默认模式。使用此模式,你不会收到系统通知来提醒你附近有智能眼镜,而是会看到一只金丝雀,表示周围没有智能眼镜。由于技术限制,iOS 应用只有金丝雀模式。<img src="https://raw.githubusercontent.com/yjeanrenaud/yj_nearbyglasses/HEAD/img/canary.svg" alt="Drawing of a canary" width="100" height="100" alignt="left">
5. *Notification/Canary Cooldown*:在这里,你指定希望收到多少关于附近发现智能眼镜的通知,或金丝雀应隐藏多久。我选择 10 秒(10000 ms)作为默认值。这样,你不会错过通知,同时也不会被它过多打扰或过快耗尽电池
6. *Enable Log Display*:禁用此功能可能会为你节省一些电量。在金丝雀模式下此项被禁用。
7. *Debug*:需要它才能在日志显示框中看到不仅仅是匹配的 BLE 帧。它有助于查看事情是否正常工作。在金丝雀模式下此项被禁用。
8. *Max log lines*:日志可以有多长。200 似乎是电池寿命和日志可用性之间的良好平衡(对于像我这样的极客)。在金丝雀模式下此项被禁用。
9. *BLE ADV only*:这会从日志中排除其他蓝牙 LE 帧,以提高可读性。在金丝雀模式下此项被禁用。
10. *Override Company IDs*:如果你愿意,你可以让 *Nearby Glasses* 提醒你上述指定之外的其他设备。至少对我来说,对调试有用。如果你不需要或不知道如何使用,请留空
11. 每个设置都会被保存并立即生效。要返回,请使用返回按钮或手势
8. 导出功能使你能够分享应用日志的文本文件。对于像我这样的极客
9. 你也可以通过点击日志显示框来复制粘贴日志
## 待办事项
- **它现在在实际环境中工作了!** 我设法让一些人在周围有已验证智能眼镜的情况下测试它。特别感谢 Lena!
- 请参阅 [Releases](https://github.com/yjeanrenaud/yj_nearbyglasses/releases) 下载 APK。
- 我也将 [*Nearby Glasses* 推送到了 Google Play](https://play.google.com/store/apps/details?id=ch.pocketpc.nearbyglasses)。但是,我将始终在 [GitHub 上发布 releases](https://github.com/yjeanrenaud/yj_nearbyglasses/releases) 并在[其他地方](https://yves.app/nearbyglasses/latest.apk)发布,以方便那些避开 Google Play 的人。
---
- 添加一个选项,将误报设置为忽略列表。也许在通知中?
- 我完全不是 BT 或 Android 专家。据我所知,人们还可以通过嗅探 BLE 流量来更深入地研究智能眼镜的通信。通过这样做,我们可能不需要依赖设备按照 BT 规范运行,还可以对加密流量传输使用启发式方法,而不会产生太多误报。但我已经十多年没有研究 BT 流量数据包了。我很高兴我还记得 ADV 帧……所以如果有人能在这方面提供帮助,将不胜感激!
---
- 添加**更多智能眼镜制造商 ID**。目前是 Meta、Oakley 和 Snap。一份带摄像头的智能眼镜列表也会有所帮助。我为此开了一个 [ISSUE](https://github.com/yjeanrenaud/yj_nearbyglasses/issues/56),因此人们在遇到其他带录像功能的智能眼镜时可以通过发送他们的日志(在我看来这些日志完全安全)来**提供帮助**
- 截至 2026 年 3 月 24 日,iOS 版本也可用了。
- **Google Pixel 设备**的**布局问题**似乎已在版本 1.0.3 中修复。如果你仍然无法访问菜单,因为它不知何故与状态栏混在一起。我会尽快研究这个问题。与此同时,尝试将屏幕切换到横屏模式并*顺时针(向右)*旋转。
## 技术解决主义?
我知道,这可能是一个奇怪的场合来谈这个,但请听我说完。我意识到这是一个针对社会问题的技术解决方案,而这个问题本身又被技术放大。
我不想推广技术解决主义,也不想让人们感到虚假的安全。这仍然是一种不完美的方法,而且可能永远都会如此。仅仅因为这个应用现在存在,并不意味着一切都好。我们需要更好的解决方案来遏制监控技术和隐私侵犯。
## 从源代码构建
由于 *Nearby Glasses* 是开源的,你也可以从源代码自行构建应用。这确保 APK 中没有包含其他库,你能得到你想要的东西。
请注意此应用基于:
- Gradle Wrapper: 9.3.1
- Android Gradle Plugin: 8.13.2
- Kotlin: 1.9.22
- compileSdk: 36
- targetSdk: 36
- minSdk: 26
- 无产品风味
- 仓库:仅 google() 和 mavenCentral()
- 无 Google Services 或 Firebase 插件
### 要求
- **JDK 17**(必需 — 项目目标为 Java 17)
- 已安装 **Android SDK Platform 35**
- compileSdk = 35
- targetSdk = 35
- Git
### 逐步构建 APK```bash
#Verify Java version:
$java -version
#It must report Java 17.
#Get the source code
$git clone https://github.com/yjeanrenaud/yj_nearbyglasses
$cd yj_nearbyglasses
#Build Debug
$./gradlew clean assembleDebug
#Build Release (with your own signature cert)
$./gradlew clean assembleRelease
#Build unsigned Release for IzzyOnDroid / F-Droid
$./gradlew clean izziFdroid
#Run and Test
$./gradlew test lint
致谢
- @[email protected] 帮助我处理警告
- @[email protected] 提出了金丝雀模式的想法
- @pojntfx 指出了我在许可方面的误解
- Sarah-Jane B. 提供的 UX 设计建议
- Lena Radau 提供的西班牙语翻译
- Marcel L. 提供的反馈和 iOS 应用测试
- Lena Hansen 进行的实地测试
- 以及所有已经为应用提供反馈的人!
许可与致谢
应用图标:该图标基于 Glasses SVG Vector by sensa, licensed under CC0 1.0 Universal。
许可:本应用 Nearby Glasses 基于 AGPL-3.0 许可 授权。
金丝雀:金丝雀图案由我绘制,基于 CC BY-SA 4.0 授权。我以原始 svg 文件形式提供(使用 InkScape 制作),并转换为 xml,显然是为了应用的资源



