
近くのスマートグラスを検出しようと試み、警告します。
近くのスマートグラスを検出して警告を試みます。
Nearby Glasses というこのアプリの唯一の目的は、近くのスマートグラスを探して警告することです。
このアプリは、スマートグラスが近くにあるときに通知します。これらのデバイスが発信するBluetoothデータ内の企業識別子を使用します。そのため、誤検知(例:VRヘッドセットなど)が発生する可能性が高いです。したがって、近くにいるメガネをかけている人に近づく際は、十分に注意してください。このアプリの警告にもかかわらず、それは単なる普通のメガネかもしれません。
このアプリの作者 Yves Jeanrenaud は、このアプリおよびその機能について一切の責任を負いません。自己責任で使用してください。技術的な設計上、Bluetooth LEデバイスの検出は、時には期待どおりに機能しないことがあります。私は正規の開発者ではありません。これはすべて私の自由時間に、独学で身につけた知識で書かれたものです。
誤検知が発生する可能性が高いです。 つまり、Nearby Glasses アプリは、実際には同じメーカーのVRヘッドセットや、その企業系列の別の製品が近くにある場合でも、スマートグラスが近くにあると通知する可能性があります。また、近くのスマートグラスを見逃す可能性もあります。繰り返しますが、私はプロの開発者ではありません。
ただし、このアプリは無料かつオープンソースであり、コードをレビューし、変更し、再利用することができます(ライセンスに基づく)。
Nearby Glasses アプリは、あなたに関する詳細情報を保存したり、あなたやあなたの電話に関する情報を収集したりすることはありません。テレメトリも広告も、その他の迷惑要素もありません。Play Store経由でアプリをインストールした場合、Googleがあなたについて何かを知り、統計を収集する可能性があります。しかし、アプリ自体はそうしません。
ログファイルを保存(エクスポート)することを選択した場合、それは完全にあなた次第であり、そのデータの行き先についての責任もあなたにあります。ログはローカルのみに記録され、自動的に誰かと共有されることはありません。ログには機密データはほとんど含まれていません。実際には、遭遇したBLEデバイスのメーカーIDコードのみが含まれます。
細心の注意を払って使用してください! 前述のとおり、検出されたスマートグラスが本当に近くにあるという保証はありません。技術的に(BLEアドバタイズレベルで)スマートグラスに似た別のデバイスである可能性もあります。
軽率な行動はしないでください。(このアプリに限らず)あらゆるメッセージに基づいて行動する前に、よく考えてください。
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.(旧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や他のメーカーにはBluetoothを搭載した他の製品(VRヘッドセットなど)もあるため、そのIDも存在します。したがって、アプリのスキャン処理でこれらの会社IDコードを使用すると、誤検知が発生しやすくなります。しかし、周囲にOcculus Riftを着用している人が見えず、隠れられる建物もない場合は、スマートグラスである可能性が高いです。
- ペアリング中、スマートグラスは通常製品名を発信するため、それもスキャンできます。しかし、実際の現場でそれを見ることは稀です。バーやパブ、路上などでスマートグラスを使用する意図のある人は、通常事前に準備しています。
- アプリが十分な信号強度(下記のRSSIを参照)を持つBluetooth Low Energy(BLE)デバイスを認識すると、アラートメッセージをプッシュします。これにより、適切に対応できます。
- さらに、`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(Bluetooth Low Energy)シナリオでは、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ファイルとして)オプションのデバッグログを表示し、コピー&ペースト機能も備えています。これらは上級ユーザー(オタク)向けであり、さらなるデバッグ用です。
- *設定*で、ログの長さ、デバッグ(すべてのスキャン項目を表示するか、ADVフレームのみ表示するか)を指定できます。
- また、16進値の文字列として**会社ID**を入力することもできます。例:`0x01AB,0x058E,0x0D53`。これにより組み込みの検出が上書きされ、新しい値に対して通知が表示されます。
- 永続性を高めるため、Androidの*フォアグラウンドサービス*を使用します。不要な場合は*設定*で無効にできます。
- *設定*の*通知クールダウン*は、2つの警告の間に経過しなければならない時間を指定します。デフォルトは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
- ついに、3週間後、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は[リリース](https://github.com/yjeanrenaud/yj_nearbyglasses/releases)で入手できます。
iOSアプリはバックグラウンドでは動作しません。iOSの制限により、BTLE ADVを永続的にスキャンするために`ForegroundServices`に類似したものを使用する方法が見つからなかったためです。したがって、iOSの*Nearby Glasses*では*カナリアモード*のみが利用可能です。私よりSwiftとiOSに詳しい方(おそらくそうでしょう)は、ぜひ貢献してください!
- このリポジトリにはAndroidとiOSの両方のアプリコードが含まれているため、フォルダを再編成しました。したがって、[/iOS](https://github.com/yjeanrenaud/yj_nearbyglasses/blob/main/iOS)と[/Android](https://github.com/yjeanrenaud/yj_nearbyglasses/blob/main/Android)があります。
## 使用方法
- APKをダウンロードするには[リリース](https://github.com/yjeanrenaud/yj_nearbyglasses/releases)を参照するか、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. アプリをインストールし(当面は[リリース](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. Bluetoothを有効にする(まだ有効でない場合)ための権限と、近くのデバイスにアクセスするための権限を付与します。一部の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のみ*:読みやすくするために、他のBluetooth LEフレームをログから除外します。カナリアモードでは無効です。
10. *会社IDの上書き*:必要に応じて、上記以外のデバイスについても*Nearby Glasses*にアラートを出させることができます。少なくとも私にとってはデバッグに役立ちます。不要な場合や使い方がわからない場合は空のままにしてください
11. すべての設定は保存され、即座に有効になります。戻るには、戻るボタンまたはジェスチャーを使用します
8. エクスポート機能により、アプリのログのテキストファイルを共有できます。私のようなオタク向けです
9. ログ表示フレームをタップして、ログをコピー&ペーストすることもできます
## ToDos
- **実際の環境で動作しています!** 検証済みのスマートグラスを周囲に持つ何人かの人々にテストしてもらうことができました。Lenaに特に感謝します!
- APKをダウンロードするには[リリース](https://github.com/yjeanrenaud/yj_nearbyglasses/releases)を参照してください。
- [*Nearby Glasses*をGoogle Playに公開](https://play.google.com/store/apps/details?id=ch.pocketpc.nearbyglasses)しました。ただし、Google Playを避ける方のために、[ここGitHubのリリース](https://github.com/yjeanrenaud/yj_nearbyglasses/releases)と[他の場所](https://yves.app/nearbyglasses/latest.apk)でも常に公開します。
---
- 誤検知を無視リストに設定するオプションを追加します。通知内でできるかもしれません。
- 私はBTやAndroidの専門家ではありません。学んだことから言えば、BLEトラフィックをスニッフィングすることでスマートグラスの通信をさらに深く調査することもできるでしょう。そうすれば、デバイスがBT仕様に従って動作することに依存する必要がなく、誤検知をあまり発生させずに暗号化されたトラフィック送信にヒューリスティックを使用できる可能性があります。しかし、私は10年以上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
アプリアイコン: アイコンは Freepik - Flaticon が作成した眼鏡アイコン に基づいています
ライセンス: このアプリ Nearby Glasses は AGPL-3.0ライセンス の下でライセンスされています。
カナリア: カナリアの図は私が作成し、CC BY-SA 4.0 の下でライセンスされています。これらは生のsvgファイル(InkScapeで作成)として提供し、アプリのリソース用にxmlに変換しました。