Raspberry Pi 3でBluetooth LEを導入する

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

今回は以上になります。

参考文献

The following two tabs change content below.
株式会社クリエイターズ・ラボ 代表取締役。株式会社078 取締役。 中学生の時に父の自作PCを譲り受け、はじめてのウェブ制作を経験する。見よう見まねで自分のウェブサイトにチャット機能や掲示板を自作で実装したのがはじめてのプログラミング経験。 大学在学中にLinuxとC言語を学ぶ。大学卒業後はエンジニアとして自動車メーカーで油圧制御プログラムの開発や、シミュレーションソフト開発に従事。その後、半導体商社にて組込みソフトエンジニアとして、産業機器や家電、IoT等の組込みソフトウェア開発に従事。 2015年9月に株式会社クリエイターズ・ラボを設立。

コメントを残す

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

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

%d人のブロガーが「いいね」をつけました。