尝试检测附近的智能眼镜并警告你。
这款名为 Nearby Glasses 的应用,只有一个目的:寻找附近的智能眼镜并警告你。
当智能眼镜在附近时,此应用会通知你。它利用这些设备发出的蓝牙数据中的公司标识符。因此,可能会有误报(例如来自 VR 头显)。所以,当你接近佩戴眼镜的人时,请谨慎行事。尽管此应用发出警告,但他们可能只是戴着普通眼镜。
本应用作者 Yves Jeanrenaud 对本应用及其功能不承担任何责任。使用风险自负。由于技术设计,有时蓝牙 LE 设备检测可能无法按预期工作。我不是专业开发者。这些都是我在空闲时间用自学知识编写的。
很可能出现误报。 这意味着,本应用 Nearby Glasses 可能会在你附近有同一制造商的 VR 头显或其他产品时,通知你有智能眼镜。它也可能漏掉附近的智能眼镜。再次强调:我不是专业开发者。
不过,本应用是 免费且开源的,你可以审查代码、修改并重用(在许可证条款下)。
Nearby Glasses 应用不会存储关于你的任何详细信息,也不会收集关于你或你手机的任何信息。没有遥测、没有广告,也没有其他打扰。如果你通过 Play Store 安装应用,Google 可能会知道你的某些信息并收集一些统计数据。但应用本身不会这样做。
如果你选择存储(导出)日志文件,这完全由你决定,数据去向也由你负责。日志仅本地记录,不会自动与任何人共享。它们包含的敏感数据很少;实际上,只有遇到的 BLE 设备的制造商 ID 代码。
极其谨慎地使用! 如前所述:无法保证检测到的智能眼镜真的就在附近。它可能是另一个在蓝牙广播层技术上与智能眼镜相似的设备。
请不要贸然行动。在根据任何消息行动前请三思(不仅限于本应用)。
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
根据 [蓝牙 SIG 已分配编号仓库](https://github.com/yjeanrenaud/yj_nearbyglasses/blob/HEAD/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 的公司)
它们是 **不可变且强制性的**。当然,Meta 和其他制造商还有其他带有蓝牙的产品,因此它们的 ID 也会出现,例如 VR 头戴设备。因此,在应用的扫描过程中使用这些公司 ID 代码容易产生误报。但如果你看不到周围有人戴着 Oculus Rift,也没有建筑物可以藏身,那么很有可能就是智能眼镜。
- 在配对过程中,智能眼镜通常会广播其产品名称,因此我们也可以扫描该名称。但在实际场景中很少能看到这种情况。有意在酒吧、酒馆、街道等场所使用智能眼镜的人通常会提前做好准备。
- 当应用识别到具有足够信号强度(见下文 RSI)的蓝牙低功耗(BLE)设备时,会推送一条警报消息。这将帮助您采取相应行动。
- 此外,我们还会扫描广播的设备名称,例如 `rayban`、`ray-ban` 或 `HeyCyan`。`HeyCyan` 是[一个著名的各种品牌智能眼镜 SDK](https://github.com/ebowwa/HeyCyanSmartGlassesSDK)。在这些 *HeyCyan* 设备中,您可能还会发现由 ALDI 和 Hofer(奥地利)销售的 Nilox Smart AI 眼镜。为了加强检测,我们还会查找 `primary_UUID`,这是一个固定在这些眼镜软件端的服务标识符(`7905FFF0-B5CE-4E99-A40F-4B1E122D00D0`)。虽然这将来可能会改变,但可能性不大,因为那会导致旧设备无法使用,所以我们可能届时只需向扫描例程中添加更多 UUID。
## 功能
- 当智能眼镜在附近时(即上述公司 ID 之一的 BLE 设备),应用 *Nearby Glasses* 会显示通知
- **附近**意味着 RSSI(信号强度)小于或等于给定值:默认 -75 dBm。该默认值对应中等距离和尚可的信号。
### 什么是 RSSI?
- 让我解释一下 RSSI 值:<br/>
RSSI 是接收信号强度指示(Received Signal Strength Indication)的缩写。该值表示无线通信应用的接收场强度。[维基百科有一篇相当好的文章](https://en.wikipedia.org/wiki/Received_signal_strength_indicator)介绍了它。
简而言之,RSSI 主要取决于:<br/>
- 设备发射功率
- 天线设计
- 墙壁和障碍物
- 人体吸收信号
- 反射和干扰
- 设备方向<br/>
但在典型的 BLE(蓝牙低功耗)场景中,RSSI 的粗略距离(开阔空间)为: <br/>
- -60 dBm ~ 1 – 3 米<br/>
- -70 dBm ~ 3 – 10 米<br/>
- -80 dBm ~ 10 – 20 米<br/>
- -90 dBm ~ 20 – 40 米<br/>
- -100 dBm ~ 30 – 100+ 米或接近信号丢失<br/>
在室内,距离通常短得多。<br/>
RSSI 大致按以下公式衰减:<br/>
`RSSI ≈ -10 * n * log10(距离) + 常数`<br/>
- 因此,默认 RSSI 阈值 -75 dBm 对应于开阔空间约 10 到 15 米,室内或拥挤空间约 3 到 10 米。这样您就有很大机会发现佩戴智能眼镜的人。
- *Nearby Glasses* 显示一个可选的调试日志,可导出(为 txt 文件),并具有复制和粘贴功能。这些适用于高级用户(极客)和进一步调试。
- 在*设置*下,您可以指定日志长度、调试模式(显示所有扫描项或仅 ADV 帧)。
- 您还可以输入一些**公司 ID** 作为十六进制值字符串,例如 `0x01AB,0x058E,0x0D53`。这会覆盖内置检测,因此您的通知会针对新值出现。
- 为了更好的持久性,它使用 Android 的*前台服务*。如果您不需要,可以在*设置*下禁用它。
- *设置*下的*通知冷却时间*指定两次警告之间必须经过的时间。默认是 10000 毫秒,即 10 秒。这也适用于金丝雀模式,例如 10 秒意味着它会保持警觉 10 秒,然后再次平静下来。
- 现在本地化程度更高: <img src="https://raw.githubusercontent.com/yjeanrenaud/yj_nearbyglasses/HEAD/img/canary_hide.svg" align="right" alt="一只金丝雀藏在翅膀下的图画" 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。在与比我更了解协作项目的人讨论后,我了解到这是一个不必要的步骤。
## iOS 和 Android
- 终于,三周后,iOS 移植版可用了。它应该适用于大多数 iPhone 和 iPad,甚至较旧的设备(支持至 iOS 16)。同样提供了[源代码和项目文件](https://github.com/yjeanrenaud/yj_nearbyglasses/blob/HEAD/iOS/)。代码丑陋且非正统。许多方法都是快速而粗糙的(例如我复用了 Android 本地化中的 json 文件),但到目前为止还能正常工作。*Nearby Glasses* 可通过 [Apple App Store](https://apps.apple.com/us/app/nearby-glasses-original/id6761056896) 获取。(名称中带有“original”以区别于那些仿冒品)。用于侧载的 .ipa 文件可在[发布页](https://github.com/yjeanrenaud/yj_nearbyglasses/releases)找到。
iOS 应用无法在后台运行,因为我找不到使用类似 `ForegroundServices` 的方法来永久扫描 BTLE ADV,这是 iOS 的限制。因此,在 iOS 版 *Nearby Glasses* 中只有 *Canary Mode* 可用。如果您比我更了解 Swift 和 iOS(很有可能),请贡献代码!
- 由于此仓库同时包含 Android 和 iOS 应用代码,我重新组织了文件夹。因此,有 [/iOS](https://github.com/yjeanrenaud/yj_nearbyglasses/blob/HEAD/iOS/) 和 [/Android](https://github.com/yjeanrenaud/yj_nearbyglasses/blob/HEAD/Android/)。
## 用法
- 参见 [Releases](https://github.com/yjeanrenaud/yj_nearbyglasses/releases) 下载 APK,或使用 Google Play 商店。F-Droid 和/或 Accrescent 可能会跟进。
<img width="135" height="300" align ="right" alt="Nearby Glasses 设置截图" 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="从 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="从 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. 点击*开始扫描*按钮
3. 授予权限以启用蓝牙(如果尚未启用)并访问附近设备。某些 Android 版本还需要你授予访问位置的权限(主要在版本 13 之前)。*Nearby Glasses* 不会对你的位置信息进行任何操作。如果你不信,请查看[代码](https://github.com/yjeanrenaud/yj_nearbyglasses/tree/main/app)
4. 如果你没有看到扫描开始,你可能需要在*设置*菜单中启用*前台服务*(见下文)
5. 一切就绪!当检测到附近有智能眼镜时,会显示通知。它会一直显示,直到你点击*停止扫描*或彻底关闭应用
7. 在菜单中(右上角的齿轮图标),你可以进行一些*设置*:
1. *启用前台服务*:这样你可以防止 Android 暂停应用,从而避免错过警报。我建议保持启用状态
2. *RSSI 阈值*:这个负数指定设备距离多远才会触发 *Nearby Glasses* 的警报。从技术上讲,它表示接收信号的强度。接近零意味着信号更好,即手机与智能眼镜之间的距离更短。参见[上面的 RSSI 解释和指南](#how)。我建议保持为 -75
3. *启用通知*:你可能不想禁用它
4. 金丝雀模式。这是新的默认模式。启用后,你不会收到系统通知提醒附近有智能眼镜,而是会看到一只金丝雀表示没有智能眼镜。由于技术限制,iOS 应用只有金丝雀模式。 <img src="https://raw.githubusercontent.com/yjeanrenaud/yj_nearbyglasses/HEAD/img/canary.svg" alt="一只金丝雀的图画" width="100" height="100" alignt="left">
5. *通知/金丝雀冷却时间*:这里你可以指定收到关于附近发现智能眼镜的通知次数或金丝雀隐藏的时长。我选择 10 秒(10000 毫秒)作为默认值。这样你既不会错过通知,也不会被过多打扰或过快耗尽电池
6. *启用日志显示*:禁用它可能会节省一些电量。金丝雀模式下禁用。
7. *调试*:需要在日志显示框中看到更多内容,而不仅仅是匹配的 BLE 帧。有助于查看是否一切正常。金丝雀模式下禁用。
8. *最大日志行数*:日志最大长度。200 条似乎是电池续航与日志可用性之间的良好平衡(适合像我这样的极客)。金丝雀模式下禁用。
9. *仅 BLE ADV*:将其他蓝牙 LE 帧排除在日志之外,以提高可读性。金丝雀模式下禁用。
10. *覆盖公司 ID*:如果你愿意,可以让 *Nearby Glasses* 提醒你除上述设备之外的其他设备。至少对我来说,这对调试很有用。如果不需要或不了解如何操作,请留空。
11. 每个设置都会保存并立即生效。要返回,请使用返回按钮或手势。
8. 导出功能允许你分享应用日志的文本文件。适合像我这样的极客
9. 你还可以通过点击日志显示框来复制粘贴日志。
## 待办事项
- **现在已在现实环境中运行!** 我设法让一些人在身边有已验证的智能眼镜时进行测试。特别感谢 Lena!
- 参见[发布页](https://github.com/yjeanrenaud/yj_nearbyglasses/releases)下载 APK。
- 我也将 [*Nearby Glasses* 推送到 Google Play](https://play.google.com/store/apps/details?id=ch.pocketpc.nearbyglasses)。不过,我始终会在 [GitHub 发布页](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: 8.13
- Android Gradle Plugin: 8.13.2
- Kotlin: 1.9.22
- compileSdk: 35
- targetSdk: 35
- minSdk: 26
- 无产品风味
- 仓库:仅 google() 和 mavenCentral()
- 无 Google 服务或 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
应用图标:图标基于Freepik - Flaticon创建的眼镜图标
许可:本应用 Nearby Glasses 遵循 AGPL-3.0 许可。
金丝雀:金丝雀图案由我绘制,并采用 CC BY-SA 4.0 许可。我以原始 SVG 文件(在 InkScape 中完成)提供,并转换为 XML 以用于应用资源