PythonでBLEを使ってスマホを検知する

電子工作

 iPhoneならiBeacon、androidならEddyStoneという名前になっているBLEを使ってスマホの検知を行う。スマートホームなどのIoTを作成する場合、重要となるセンサーが人間の感知である。赤外線を使用したセンサーは動作を検知するものなので座っていたり寝ていたりすると反応しないため人間のセンサーには向かない。そこでスマホが部屋にあるかを判断して、人がいるかを判断することにした。

 まず、初めに使ったものはWi-Fiである。Wi-FiのpingコマンドでスマホがWi-Fiに接続されているかを監視する。Pingの監視はサーバーなどの管理に使用されているようでググるといろいろ出てきた。検出してみたがスリープにして5分でpingが通らなくなることが分かった。自分は、androidを使用しているのだがどうも電力設定が邪魔しているようだ。そこで、BLEに目を付けた。

BLE  【 Bluetooth Low Energy 】とは
Bluetooth 4.0の規格の一部である。物理設計からモデル使用に及ぶあらゆる面で電力消費を最小に保つよう設計されている。

 自分はNuAns NEO [Reloaded] というandroidを使っているのだがたまたまBLEに対応していた。最近のスマホはほとんど対応していると思う。Raspberry Piも3から対応している。なぜBLEかというと消費電力が少ないためである。Pingコマンドの方法では部屋にいるときに電池の消費が激しくなるという問題があった。だが、BLEは24時間送信していてもほとんど電池を食わない。また、通信距離を電波の強弱で制御することができるため部屋ごとに判断するといった使い方もできる。

Raspberry Piでスマホを検知する

スマホにBLEのツールをインストールする。AndroidならBeacon Simulator、iPhoneはもっていないのでBLEなどと検索して探してみてください。ここではandroid用の間隔や強さを設定できるものが使いやすい。AndroidのBeacon Simulatorで説明していきます。

アプリを起動し左下の+で新規追加を行う。

UUIDはランダムな値がはじめ入力されている。
Major:0
Minor:0
Broadcast settings
Power:Medium(電池の消費を抑えたい場合Lowに)
Frequency: Balanced(電池の消費を抑えたい場合Lowに)

チェックを押し、初期画面でtestを有効にする。

これよりPCでの作業になる。
ここから実行ファイルをダウンロードし、解凍したものをRaspberry Piにコピーする。コピー先は、/home/piとする。端末、ターミナルを開き以下のコマンドを実行する。
コマンド
sudo python iBeacon-Scanner–master/testblescan.py

すると以下の様な文字列が表示される。Ctrl+cで終了する。00:bb:c1:37:70:34,00000277c0a80b040000000000000000,0,0,-56,-83

左からMACアドレスUUIDMajorMinorTxPowerRSSIとなる。設定していた値と同じものが表示されればBLEを認識できている。

次にUUIDで識別し、スマホが認識した場合は1を、認識できなかった場合は0を返すようにプログラムを編集する。
コマンド
cd iBeacon-Scanner—master
nano blescan.py

青色部分を以下に置き換える。

            Adstring = returnstringpacket(pkt[report_pkt_offset -22: report_pkt_offset - 6])
                    if (Adstring=='アプリで設定したUUID'):
                        return 1
    return 0

同様にしてtestblescan.pyも書き換える。
コマンド
nano testblescan.py

青色部分を以下に置き換える。

returned = blescan.parse_events(sock, 30print returned

30は検索回数である。増やすと精度が上がるが時間がかかる。
以下のコマンドを実行し確認する。
コマンド
sudo python iBeacon-Scanner–master/testblescan.py

BLEを送信しているとき1が表示されBLEを切断しているときに0が表示されれば完成となる。

 

タイトルとURLをコピーしました