Raspberry Pi 3から、Bluetoothモジュールが標準装備されたモデルが発売されています。
今回はその機能を使い、BLEをプログラムで制御する手始めをご説明いたします。
今回のゴール
- BlueZをインストール
- C言語でサンプルプログラムを組んで、動作確認を行う
実際にやってみよう
では、さっそく実践して参りましょう。
BlueZをインストール
まずはapt-getコマンドで必要なパッケージをインストールします。
$ sudo apt-get install libdbus-1-dev libdbus-glib-1-dev libglib2.0-dev libical-dev libreadline-dev libudev-dev libusb-dev make
apt-getでBlueZをインストールすると、古いバージョンがインストールされてしまうので、wgetでRaspberry Piにインストールしてやります。
まずはダウンロードします。
$ mkdir -p package/bluetooth
$ cd package/bluetooth
$ wget https://www.kernel.org/pub/linux/bluetooth/bluez-5.32.tar.xz
次に、ダウンロードしたファイルを解凍しましょう。
$ tar xvf bluez-5.32.tar.xz
ここで、解凍したデータを使ってビルド、インストールしていきます。
$ cd bluez-5.32
$ ./configure --disable-systemd --enable-library
$ make
このmakeにしばらく時間がかかるので、コーヒーでも飲みながら待ちましょう。
$ sudo make install
makeやmake installでインストールできないものがあるので、ここから手動でインストールしていきます。
まずはGATT Toolから。
$ sudo cp attrib/gatttool /usr/local/bin/
次に、libbluetooth-devのライブラリです。
$ sudo cp -ipr lib/ /usr/include/bluetooth.5.32
$ cd /usr/include
すでにbluetoothフォルダがある場合はバックアップをとっておきましょう。
$ sudo mv bluetooth bluetooth.4.99
次に、シンボリックリンクを作成してこの作業は完了です。
$ sudo ln -s bluetooth.5.32/ bluetooth
補足
私の場合、これだけでは後に上手く動かなくて、libbluetooth-devを別途インストールする必要がありました。
$ sudo apt-get install libbluetooth-dev
ここまででBlueZのインストールは完了です。
サンプルプログラムを動かしてみる
Raspberry PiでBluetoothを使うときに重宝するBlueZなのですが、公式ドキュメントもあまりに情報が貧弱で困る方も多いかと思いますが、サンプルコードを掲載してくださっている方がいらっしゃいましたので、こちらを実装してみましょう。
http://people.csail.mit.edu/albert/bluez-intro/c404.html
まずはファイルを作ります。
$ mkdir ~/application/ble
$ cd ~/application/ble/
$ nano simplescan.c
以下のコードを打ち込んで下さい。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <bluetooth/bluetooth.h> #include <bluetooth/hci.h> #include <bluetooth/hci_lib.h> int main(int argc, char **argv) { inquiry_info *ii = NULL; int max_rsp, num_rsp; int dev_id, sock, len, flags; int i; char addr[19] = { 0 }; char name[248] = { 0 }; dev_id = hci_get_route(NULL); sock = hci_open_dev( dev_id ); if (dev_id < 0 || sock < 0) { perror("opening socket"); exit(1); } len = 8; max_rsp = 255; flags = IREQ_CACHE_FLUSH; ii = (inquiry_info*)malloc(max_rsp * sizeof(inquiry_info)); num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags); if( num_rsp < 0 ) perror("hci_inquiry"); for (i = 0; i < num_rsp; i++) { ba2str(&(ii+i)->bdaddr, addr); memset(name, 0, sizeof(name)); if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name), name, 0) < 0) strcpy(name, "[unknown]"); printf("%s %s\n", addr, name); } free( ii ); close( sock ); return 0; }
その後、コンパイルします。
$ gcc -o simplescan simplescan.c -lbluetooth
その後、実行します。
$ ./simplescan
今回は以上になります。
参考文献
- Bluetooth C programming
- RaspberryPi に BlueZ をインストールして BLE を検知してみた
- Chapter 4. Bluetooth programming in C with BlueZ
Yoshio Yanagi
最新記事 by Yoshio Yanagi (全て見る)
- VCCW + Ubuntu16にPHP5.6をインストールして使う - 2018年3月20日
- 既存のHeroku appからpipelineを作成し、CLIからStagingとProductionをいじれるようにする - 2017年5月24日
- お手伝いいただけるソフトウェアエンジニア募集中! - 2017年5月22日
この記事へのコメントはありません。