複数のBluetoothビーコンを使用して、周囲のBluetoothデバイスの位置をリアルタイムで可視化するシステムです。
- Raspberry Pi上で動作するPythonプログラム
- Bluetoothデバイスの検出とRSSI値の取得
- 10秒間スキャンを実行してRSSIの平均値を計算
- 2秒ごとに新しいスキャンを実行
- サーバーへのデータ送信
- Node.js & TypeScriptで実装
- 三点測量法によるデバイスの位置推定
- WebSocketを使用したリアルタイム通信
- SQLiteデータベースによるデータ保存
- Vanilla JavaScriptで実装
- グリッド上にデバイスの位置を表示
- デバイスの種類ごとに色分け表示
- ズーム・パン機能
- Raspberry Pi 5(ビーコン用)× 複数台
- Bluetooth機能が有効なLinuxサーバー(または開発用PC)
-
依存パッケージのインストール:
pip install bleak pyyaml aiohttp -
設定ファイルのカスタマイズ:
# config.yaml(各ビーコンごとに設定) beacon_id: "beacon-01" # ビーコンの固有ID zone: "building-A" # 設置ゾーン x: 10 # X座標(メートル) y: 20 # Y座標(メートル)
-
ビーコンプログラムの実行:
python beacon.py --config config.yaml --server http://server-ip:3000/api/beacons/data
-
依存パッケージのインストール:
npm install -
TypeScriptのコンパイル:
npm run build -
サーバーの起動:
npm start開発モードで起動する場合:
npm run dev
- ビーコンを配置する場所を決め、各ビーコンの座標を設定ファイルに記録します(1メートル単位)
- 各ビーコンでスクリプトを実行し、サーバーのIPアドレスを指定します
- サーバーを起動します
- ウェブブラウザで
http://server-ip:3000にアクセスすると、デバイスの位置がリアルタイムで表示されます
このシステムでは、複数のビーコンから収集したRSSI(受信信号強度)データを使用して三点測量法によりデバイスの位置を推定します。
-
RSSI値を距離に変換:
距離 = 10 ^ ((送信出力 - RSSI) / (10 * 環境係数))ここで、送信出力は一般的に-59dBm(1m距離での理論値)、環境係数は2.0〜4.0の間(オープンスペースで2.0、壁などの障害物がある場合は高い値)を使用します。
-
最小二乗法による位置推定: 複数のビーコンからの距離情報を基に、最小二乗法を用いてデバイスの最も確からしい位置を計算します。
-
デバイスが3箇所未満のビーコンで検出された場合は、最も強いRSSI値を持つビーコンの位置を採用します。
BluetoothのRSSI値は、以下の要因により不安定になりがちです:
- 人や物による信号の遮断
- マルチパス効果(反射波による干渉)
- デバイス自体の特性
これに対応するため、本システムでは以下の工夫を実装しています:
- 10秒間の連続スキャンによるRSSI値の平均化
- 高频度のスキャン更新(2秒おき)
- 位置推定結果の丸め処理
- 複数ビーコンからのデータ統合
bluetooth_tracker/
├── beacon.py # ビーコン側のスクリプト
├── config.yaml # ビーコン設定ファイル
├── package.json # サーバー側の依存関係
├── tsconfig.json # TypeScript設定
├── shell.nix # Nix環境設定
├── src/ # サーバーソースコード
│ ├── server.ts # サーバーメイン
│ ├── controllers/ # コントローラー
│ ├── models/ # データモデル
│ └── utils/ # ユーティリティ
├── public/ # Webクライアント
│ ├── index.html # メインUI
│ └── ...
└── data/ # データベースファイル
- ビーコンは少なくとも3台以上設置することで、精度の高い位置推定が可能になります
- 理想的には、三角形を形成するようにビーコンを配置してください
- 障害物が少ない環境で使用すると精度が向上します
- RSSIは環境によって大きく変動するため、実際の位置と誤差が生じる場合があります
-
Bluetoothスキャンが失敗する場合:
sudo systemctl restart bluetooth -
権限エラーが発生する場合:
sudo setcap 'cap_net_raw,cap_net_admin+eip' `which python3`
-
データベースのアクセス権限エラー:
chown <ユーザー名> data/bluetooth_tracker.db chmod 644 data/bluetooth_tracker.db -
ポート3000が使用中の場合:
export PORT=3001 # 別のポートを指定してから起動 npm start
- ビーコン間の自動同期機能
- 機械学習による位置推定精度の向上
- デバイスの移動履歴の追跡と表示
- カスタムフロアマップのサポート
- デバイス種別の自動判別機能の強化
MITライセンス