HackintoshでOpenHaystackを使ってみる ESP32でAirtag互換

OpenHaystackはApple Find Myネットワークを使ってAirtagのようにBluetoothで任意の機器を追跡できるようにするプロジェクトです。

https://github.com/seemoo-lab/openhaystack

理論上はBluetoothを搭載したデバイスなら何でも追跡できますが、追跡用のカスタムファームウェアが公開されてるESP32やnRF51(BBC micro:bit)、もしくはラズパイみたいなLinuxが簡単です。
今回はESP32-WROOM-32Dを使いました。

また、OpenHaystackはMacからでないと追跡ができないという厄介な点があります。

実機は持ってないので仮想環境上のHackintoshでやりましたが、OpenHaystack上のマップがブラックアウトして何も見えなくなるバグが発生して使えませんでした。
同じように純正のMapsアプリもブラックアウトしていたので、おそらくGPU周りの仮想化の問題でしょう。

そこで、OpenHaystackの代わりにコマンドラインからその位置情報を引っ張り出せるFindMy(名前そのまま?!)を使ってマップを使わずに位置を取得します。こちらは成功しました。

https://github.com/biemster/FindMy

ちなみに、OpenHaystackのREADMEにはOpenHaystack Mobileなるものが存在すると書かれていますが今は使えないようです。

また、今のところ本物のFind myアプリに登録することもできないみたいです。
https://github.com/seemoo-lab/openhaystack/issues/39

環境

追跡する対象: ESP32-WROOM-32D
Ubuntu 22.04 5.15.0-53-generic
また Docker-OSX を利用した macOS Monterey 12.6.2
FindMy monterey branch 9369284856bbe64a918d7d8abfdbd3214433b513

下準備

まず最初にicloudにログインする必要があるみたいです。
また、Xcodeかコマンドラインツールを入れておいてください。

使用したmacOSはMontereyなので、FindmyのMontereyブランチを使いました。

必要なライブラリ

キーを作成します。なぜかpython3だとエラーが出た

出来上がった.keysファイルを覗いてみます

この中のAdvertisement keyを使います。

ESP32-WROOM-32Dのファームウェア焼き

ここをファームウェアと手順が置いてあるので参考にします。

https://github.com/seemoo-lab/openhaystack/tree/main/Firmware/ESP32

Ubuntuで行いました。
まず、公式ドキュメントを参考にESP-IDFをインストールしてください。

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/

ファームウェアを持ってきます。

ビルドして、ESP32デバイスを指定して焼きます。ttyUSB0みたいな名前です。

追跡してみる

macに戻って、少し待ってからFindmyのrequest_reports.pyを叩きます。こっちはpython3じゃないと動きませんでした。
Keychain passwordはmacのパスワードです。

緯度と経度が取得できました。google mapのリンクも出てるのでそのままアクセスすればマップでどの位置にあるかわかります。

結構精度高くてびっくりしました。住宅街で周りにそんなapple製品ないと思うのですが誤差10mくらいでした。
本物のAirtagと遜色ないのではないでしょうか。

モバイルバッテリーに繋げて、ロードバイクのサドルバッグに突っ込んでおくことにします。
普通のモバイルバッテリーだとESP32みたいな低電力しか消費しないものを繋げるとオートパワーオフしてしまうのですが、このXTAR PB2Sは低電流出力モードがあるのでおすすめです。正確にはこれは18650/20700/21700のセルが2本入る充電器(モバイルバッテリー機能付き)ですが。

余談ですが、盗まれた自転車などを勝手に自分で取り返したら犯罪らしいですね。警察がまともに取り合ってくれるか怪しいので私なら絶対取り返しますけど。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です