Raspberry Piを使って、Beaconのスキャン(入力)、アドバタイジング(出力)を実現できるのは既知だが、
1台で両方同時にできるかはググってもよくわからなかったので、実際にやってみた。
この検証で使用するもの
- Raspberry Pi Zero 1台
- SDカード(8GB以上推奨。4GBでもいけるかもしれないが未検証。)
- iPhone(アプリ「Beacon入門」を使用)
- 開発PC(私はMacOSを使用)
Raspberry Piセットアップ
RaspbianをSDカードに焼く手順や、PCからリモートログインする方法は、既にいろいろな方が記事をアップしてくれているので割愛する。
なおOSイメージは起動速度の早い「RASPBIAN STRETCH LITE」を推奨する。
Raspbianが起動したら、apt-getを最新にする。
$ sudo apt-get update
$ sudo apt-get upgrade # 念の為
Nodejsをインストールする
$ sudo apt-get install -y nodejs npm
$ sudo npm cache clean
$ sudo npm install npm n -g
$ sudo n 9.10.1
Nodejsのインストール成功を確認する
$ node -v
v9.10.1
$ npm -v
5.6.0
Bleaconをインストールする
sudo apt-get install libbluetooth-dev
npm install bleacon
ソースコード
ソースを以下のように実装する。
本プログラムはスキャンとアドバタイジングの両方を実行するものである。
Bleacon = require('bleacon');
const uuid = 'aaaaaaaabbbbccccddddeeeeeeeeeeee';
const major = 12;
const minor = 34;
const measuredPower = -59;
Bleacon.startScanning(uuid);
Bleacon.on('discover', function(bleacon) {
console.log(bleacon);
});
Bleacon.startAdvertising(uuid, major, minor, measuredPower);
実行する
$ sudo node beacon.js
検証
iOSアプリ「Beacon入門」を使用した。(とても便利なアプリで感謝しています)
アドバタイジング確認
まず、Raspberry PiからiBeaconの電波がアドバタイジングされていることをiPhoneで確認する。
アプリ「Beacon入門」を起動し、設定(UUID等の初期設定)で以下のように設定する
- UUID
- AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE
- Major
- 未設定
- Minor
- 未設定
ビーコン距離計測(距離を測定し一覧表示)を選択し、実行する。
一覧にmajor=12 minor=34のビーコンが表示されればOK。
スキャン確認
今度はiPhoneからiBeaconのパケットをアドバタイジングして、Raspberry Piで電波を拾う。
アプリ「Beacon入門」を起動し、ビーコン発信を選択し、実行を押す。
iPhoneからiBeaconのパケットが出力されるので、Raspberry Piのターミナルに以下のようにrssiなどの情報が表示される。
{ uuid: 'aaaaaaaabbbbccccddddeeeeeeeeeeee',
major: 100,
minor: 1,
measuredPower: -57,
rssi: -34,
accuracy: 0.22223443385817412,
proximity: 'immediate' }
結果
以上から、Raspberry Pi ZeroでBeaconのスキャンとアドバタイジングは同時にできることがわかった。
また、両者を別々のプロセスで実行するとアドバタイジングだけが停止してしまうことがあったが、原因はいまのところ不明である。
参考URL
まことに勝手ながら以下のページを参考にさせていただきました。