ラベル Bluetooth の投稿を表示しています。 すべての投稿を表示
ラベル Bluetooth の投稿を表示しています。 すべての投稿を表示

2015-04-17

[.tested] TI CC2541 Sensor TagのデータをIBM Bluemixで処理するためのセンサーゲートウェイ マルチデバイス対応 [BX1]

今回は、以前ご紹介したTI CC2541 Sensor TagのデータをIBM Bluemixで処理するためのセンサーゲートウェイのマルチデバイス対応の実装方法についてご紹介します。


OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
OpenBlocks IoT BX1 Debian wheezy 7.8 / kernel 3.10.17-poky-edison

1. 事前準備


ネットワークへの接続、bluetoothの設定、開発環境および関連ツールのインストール、node.jsのインストールにつきましては前々回の記事を参照してください。

2. センサーゲートウェイソフトウェアの構築


ソフトウェアを構築するディレクトリを作成します。

# mkdir multi_device
# cd multi_device

今回必要なモジュールを導入します。
libbluetooth-devパッケージも必要なため、導入していない場合は合わせてインストールしてください。

# aptitude update
# aptitude install libbluetooth-dev
# npm install async
# npm install getmac
# npm install mqtt
# npm install sensortag

次に、ゲートウェイプログラムを作成します。
今回は温度データを取得し、Bluemixへ送信するサンプルです。

# vi multi_st2b.js

multi_st2b.js


var SensorTag = require('sensortag');
var async = require('async');
var mqtt = require('mqtt');
var getmac = require('getmac');

// constants
var u_port = "1883";
var pub_topic = "iot-2/evt/sample/fmt/json";
var qs_org = "quickstart";
var qs_host = "quickstart.messaging.internetofthings.ibmcloud.com";
var qs_type = "iotsample-ti-bbst";

// globals
var org = qs_org;
var type = qs_type;
var host = qs_host;
var deviceId;
var clientId;

getmac.getMac(function(err, macAddress) {
  if (err) throw err;
    console.log(macAddress);
    deviceId = macAddress.replace(/:/g, '').toLowerCase();
    clientId = "d:" + org + ":" + type + ":" + deviceId;
    console.log('MQTT clientId = ' + clientId);
    client = mqtt.createClient(u_port, host, {
    clientId : clientId,
    keepalive : 30
  });
  console.log('MAC address = ' + deviceId);
  console.log('Go to the following link to see your device data;');
  console.log('http://quickstart.internetofthings.ibmcloud.com/#/device/' + deviceId + '/sensor/');
});

function onDiscover(sensorTag) {
  console.log('discovered: ' + sensorTag.uuid + ', type = ' + sensorTag.type);

  sensorTag.on('disconnect', function() {
    console.log('disconnected! ' + sensorTag.uuid);
  });

  async.series([
      function(callback) {
        console.log('connectAndSetUp');
        sensorTag.connectAndSetUp(callback);
      },
      function(callback) {
        console.log('readDeviceName: ' + sensorTag.uuid);
        sensorTag.readDeviceName(function(error, deviceName) {
          console.log('\tdevice name = ' + deviceName);
          callback();
        });
      },
      function(callback) {
        console.log('enableIrTemperature');
        sensorTag.enableIrTemperature(callback);
      },
      function(callback) {
        setTimeout(callback, 2000);
      },
      function(callback) {
        sensorTag.on('irTemperatureChange', function(objectTemperature, ambientTemperature) {

          var tagData = {};
          tagData.d = {};

          tagData.d.deviceid = deviceId;
          tagData.d.uuid = sensorTag.uuid;
          tagData.d.rssi = sensorTag.rssi;
          tagData.d.proximity = sensorTag.proximity;
          tagData.d.objectTemperature = objectTemperature.toFixed(1);
          tagData.d.ambientTemperature = ambientTemperature.toFixed(1);

          tagData.toJson = function() {
            return JSON.stringify(this);
          };

          console.log(pub_topic, tagData.toJson());
          console.log(tagData.toJson());
          client.publish(pub_topic, tagData.toJson() );

          console.log(sensorTag.uuid);
            console.log('\tobject temperature = %d °C', objectTemperature.toFixed(1));
            console.log('\tambient temperature = %d °C', ambientTemperature.toFixed(1))
        });

        console.log('setIrTemperaturePeriod');
        sensorTag.setIrTemperaturePeriod(1000, function(error) {
          console.log('notifyIrTemperature');
          sensorTag.notifyIrTemperature(function(error) {
          });
        });
      },
      function(callback) {
        console.log('disableIrTemperature');
        sensorTag.disableIrTemperature(callback);
      },
    ]
  );
}

SensorTag.discoverAll(onDiscover);

3. センサーゲートウェイソフトウェアの起動


TI CC2541 SensorTagを複数用意し、上記で作成したJavascriptプログラムを起動します。

root@bx1:~/multi_device# node multi_st2b.js
34:95:db:28:41:0e
MQTT clientId = d:quickstart:iotsample-ti-bbst:3495db28410e
createClient is deprecated, use connect instead
MAC address = 3495db28410e
Go to the following link to see your device data;
http://quickstart.internetofthings.ibmcloud.com/#/device/3495db28410e/sensor/

ここでは2台で試してみました。それぞれのセンサータグのサイドボタンを押すと、以下のようなメッセージが表示され、BluemixへMQTTによるデータ送信を開始します。

discovered: 5c313ec119a5, type = cc2540
connectAndSetUp
discovered: 5c313ebff12e, type = cc2540
connectAndSetUp

4. Bluemix側の設定


Bluemix側は、前々回前回と同じテンプレートが利用できます。



今回は温度データのみですが、データを追加したい場合はインストールしたsensortagモジュール(node_modules/sensortag)にあるtest.jsなどを参照して、必要なデータを追加してください。

5. 最後に


今回は、TI CC2541 Sensor Tagを複数接続する例を紹介しました。
さらに詳しい情報が知りたい方は
https://github.com/sandeepmistry/node-sensortag
を参照してください。

2015-03-13

[.tested] 受信したiBeaconの情報をIBM Bluemixで処理するためのゲートウェイ [BX1]


スマホをビーコンの受信機とした位置情報の取得は、現在各地で実証実験が行われているところですが、小型で安価なビーコンタグの普及の加速により、その逆の形として、ビーコンを取り付けたモノや人の位置情報をビーコンの受信機により検知し、クラウド処理する事案が増えています。

今回は、ibeaconの信号を受信し、uuid、受信したゲートウェイのデバイスID、電波強度であるrssiをIBMのBluemixで処理するためのゲートウェイソフトウェアの例を紹介します。



OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
OpenBlocks IoT BX1 Debian wheezy 7.8 / kernel 3.10.17-poky-edison

1. 事前準備


・ネットワークへの接続

BX1 を外部ネットワークに接続可能な状態にします。本体にSIMを入れることにより3G通信も可能ですが、開発環境の構築や、パッケージの入手などはWifi 環境に接続するか、USB分岐ケーブルにUSB-Etherアダプタなどを利用して有線LAN接続することをおすすめします。

以下、WebUIの無い、先行開発キットでの手順となります。

・bluetoothの設定

Bluetoothは、初期状態ではblockしてありますので、rfkillコマンドによりunblockしてください。
具体的には、以下の手順で手動で行うか、

# bluetooth_rfkill_event &
# rfkill unblock bluetooth

以下の3行をrc.localに追加します。

bluetooth_rfkill_event &
sleep 1
rfkill unblock bluetooth

・node.jsのインストール

node.jsのインストール方法は、前回の記事を参照してください。

---
WebUIのインストールされた製品を使用される場合は、node.jsパッケージはインストール済、かつbluetooth設定はWebUIより行いますので、以下の手順でnpmだけを追加インストールしてください。


# export TMPDIR=/var/tmp
# curl -L https://npmjs.org/install.sh | sh


2. ibeaconゲートウェイソフトウェアの構築


ソフトウェアを構築するディレクトリを作成します。

# mkdir ibeacon
# cd ibeacon

node.jsを使用してibeaconの送受信を行うbleaconモジュールを導入します。
bleaconの導入には、 libbluetooth-devパッケージも必要なため、導入していない場合は合わせてインストールしてください。

# aptitude update
# aptitude install libbluetooth-dev
# npm install bleacon

bluemixへデータを送信するためのMQTTクライアントライブラリおよび、getmacライブラリをインストールします。

# npm install mqtt
# npm install getmac

次に、ゲートウェイプログラムを作成します。

# vi ib2b.js

ib2b.js

var bleacon = require("bleacon");
var mqtt = require('mqtt');
var getmac = require('getmac');

// constants
var u_port = "1883";
var s_port = "8883";
var pub_topic = "iot-2/evt/sample/fmt/json";
var sub_topic = "iot-2/cmd/blink/fmt/json";
var qs_org = "quickstart";
var reg_domain = ".messaging.internetofthings.ibmcloud.com";
var qs_host = "quickstart.messaging.internetofthings.ibmcloud.com";
var qs_type = "iotsample-ti-bbst";
var configFile = "./device.cfg";
var ledPath ="/sys/class/leds/beaglebone:green:usr";
var caCerts = ["./IoTFoundation.pem", "IoTFoundation-CA.pem"];


// globals
var org = qs_org;
var type = qs_type;
var host = qs_host;
var deviceId;
var clientId;
var password;
var username;

getmac.getMac(function(err, macAddress) {
    if (err) throw err;
     console.log(macAddress);
     deviceId = macAddress.replace(/:/g, '').toLowerCase();
     clientId = "d:" + org + ":" + type + ":" + deviceId;
     console.log('MQTT clientId = ' + clientId);
     client = mqtt.createClient(u_port, host, {
     clientId : clientId,
     keepalive : 30
     });
     console.log('MAC address = ' + deviceId);
     console.log('Go to the following link to see your device data;');
     console.log('http://quickstart.internetofthings.ibmcloud.com/#/device/' + deviceId + '/sensor/');
     bleacon.startScanning();
});

bleacon.on('discover', function(bleacon) {
        var tagData = {};
        tagData.d = {};
        //       console.log(bleacon);

        tagData.d.deviceid = deviceId;
        tagData.d.uuid = bleacon.uuid;
        tagData.d.rssi = bleacon.rssi;
        tagData.d.proximity = bleacon.proximity;

        tagData.toJson = function() {
           return JSON.stringify(this);
        };

        console.log(pub_topic, tagData.toJson());
        console.log(tagData.toJson());
        client.publish(pub_topic, tagData.toJson() );

});

3. ゲートウェイソフトウェアの起動


ibeaconの送信機を用意して、上記で作成したJavascriptプログラムを起動します。

root@bx1:~/ibeacon# node ib2b
34:95:db:28:41:d2
MQTT clientId3 = d:quickstart:iotsample-ti-bbst:3495db2841d2
createClient is deprecated, use connect instead
MAC address = 3495db2841d2
Go to the following link to see your device data;
http://quickstart.internetofthings.ibmcloud.com/#/device/3495db2841d2/sensor/
iot-2/evt/sample/fmt/json {"d":{"deviceid":"3495db2841d2","uuid":"1ae18c1c6c7b4aedb1664462634da855","rssi":-56,"proximity":"immediate"}}

デバッグ用にBluemixへ送信するデータの内容をコンソール出力していますので、不要な場合は削除してください。

3. Bluemix側の設定


Bluemix側は、前回と同じテンプレートが利用できます。



JSON形式で出力されるデータは、
deviceid: ゲートウェイのアドレス
uuid: 検出したibeaconのuuid
rssi: 電波強度
proximity: 相対距離の情報
となります。

bleaconライブラリで得られるパラメータを追加したい場合は、以下のJavascriptプログラムの出力を参考にしてください。

discover.js

var Bleacon = require("bleacon");
Bleacon.startScanning();
Bleacon.on("discover", function(bleacon) {
  console.dir(bleacon);
});

root@bx1:~/ibeacon# node discover.js
{ uuid: '1ae18c1c6c7b4aedb1664462634da855',
  major: 0,
  minor: 0,
  measuredPower: -82,
  rssi: -49,
  accuracy: 0.22312232579283153,
  proximity: 'immediate' }

4. 最後に


iBeaconのハードウェアレポートに関しては、若干古い情報にはなりますが、以下のページが参考になると思います。

The Hitchhikers Guide to iBeacon Hardware: A Comprehensive Report by Aislelabs



2015-03-11

[.tested] TI CC2541 Sensor TagのデータをIBM Bluemixで処理するためのセンサーゲートウェイ [BX1]

この1月24日,25日に、天王洲のSamurai Startup Islandにおいて、

「IoTハック新年会2015」

を行いました。
このイベントは、IBMとSamurai Incubateが共催で『日常生活で使うモノ』をテーマ行うアイディアソン、ハッカソンで、クラウド環境としては、IBM BlueMix、デバイスとしては、TI CC2541センサータグ、ゲートウェイとして、OpenBlocks BX1を用意しています。

今回は、上記ハッカソンで使用した、OpenBlocks BX1側のTI CC2541 SensorTagデバイスゲートウェイ実装方法について紹介します。



OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
OpenBlocks IoT BX1 Debian wheezy 7.8 / kernel 3.10.17-poky-edison

1. 事前準備


・ネットワークへの接続

BX1を外部ネットワークに接続可能な状態にします。本体にSIMを入れることにより3G通信も可能ですが、開発環境の構築や、パッケージの入手などはWifi環境に接続するか、USB分岐ケーブルにUSB-Etherアダプタなどを利用して有線LAN接続することをおすすめします。

以下、WebUIのない、先行開発キットでの事例となります。

・bluetoothの設定

Bluetoothは、初期状態ではblockしてありますので、rfkillコマンドによりunblockしてください。
具体的には、以下の手順で手動で行うか、

# bluetooth_rfkill_event &
# rfkill unblock bluetooth

以下の3行をrc.localに追加します。

bluetooth_rfkill_event &
sleep 1
rfkill unblock bluetooth

・開発環境および関連ツールのインストール

node.jsをビルドするためには、開発環境が必要です。(IO開発ボード付きセットの場合は開発環境をプリインストールしています)
また、今回必要になるパッケージ類を以下の手順でインストールします。

# aptitude update
# tasksel install standard
# aptitude install build-essential
# aptitude install git

・node.jsのインストール

node.jsはdebianのパッケージを使用せず、最新版を以下のサイトから入手し、ビルドしています。

Node.js

# wget http://nodejs.org/dist/v0.12.0/node-v0.12.0.tar.gz
# tar xvzf  http://nodejs.org/dist/v0.12.0/node-v0.12.0.tar.gz
# cd node-v0.12.0
# ./configure
# make -j3
# make install

2. センサーゲートウェイソフトウェアの構築


IBM Internet of Thingsの以下のレシピページより、BeagleBone用のゲートウェイプログラムを入手します。

Texas Instruments BeagleBone with SensorTag - Internet of Things:

# git clone http://github.com/ibm-messaging/iot-beaglebone

以下のディレクトリに移動し、setup.shを編集し、checkInstall bluezの行をコメントアウトします。
(bluezはすでにインストールされているものを使用します。debian wheezyのaptで導入されるものは、BLEに対応していないバージョンのため使用しません)

     :
# checkInstall bluez
checkInstall libbluetooth-dev
  :

編集後、setup.shにより、動作環境の構築を行います。

#./setup.sh

次に、ゲートウェイプログラム本体の若干の修正を行います。
これは、beaglebone向けに書かれていて、データを受け取りLEDを点滅させる記述があるのですが、 このLEDの点灯処理部分だけをコメントアウトしてしまいます。
ここは、OpenBlocksのLEDの仕様で書き換えれば同様にBluemix側からLEDの点灯処理ができるのですが、今回は行っていません。

# vi iot_sensortag.js

50行以下を以下の様に編集します。

// LED functions
// run asynchronously, callbacks just trap unexpected errors
function ledWrite(extra, content, callback) {
//  fs.writeFile(ledPath+extra, content, function(err) {
//      if (err) throw err;
//  });
//  if (callback) callback();
}

2. センサーゲートウェイソフトウェアの起動


TI CC2541 SensorTagを用意し、編集したJavascriptプログラムを起動します。

root@bx1:~/iot-beaglebone/samples/nodejs# node iot_sensortag.js
Press the side button on the SensorTag to connect

メッセージに従い、センサータグのサイドボタンを押すと、接続を行い、BluemixへMQTTによるデータ送信を開始します。

root@bx1:~/iot-beaglebone/samples/nodejs# node iot_sensortag.js
Press the side button on the SensorTag to connect
SensorTag connected
Discovering services and characteristics
Device name = TI BLE Sensor Tag
System id = 34:b1:f7:0:0:d5:d5:2a
Serial number = N.A.
Firmware revision = 1.01 (Feb  7 2013)
Hardware revision = N.A.
Software revision = N.A.
Manufacturer name = Texas Instruments
Enable IR temperature
Enable accelerometer
Enable humidity sensor
Enable magnetometer
Enable barometer
Enable gyroscope
MQTT clientId = d:quickstart:iotsample-ti-bbst:98f170697445
MQTT Connected
Sending data
MAC address = 98f170697445
Go to the following link to see your device data;
http://quickstart.internetofthings.ibmcloud.com/#/device/98f170697445/sensor/

3. Bluemix側の設定


Bluemixは、試用期間が30日あり、登録して30日間は無料ですべての機能を試すことが出来ます。
(無料期間終了後は、クレジットカードの登録が必要ですが、375GB時間までは無料で使用できるようになっています)

カタログのボイラープレートより、左上のNode-Redを使用したInternet of Things Foundationアプリケーションを選択します。


インスタンスを起動します


最初に簡単なサンプルプレートがありますので、この左側のIBM IoT App Inに、上記で立ち上げたゲートウェイソフトウェア起動時に表示されるMAC Addressを入力します。


Deployし、すぐ右にあるDevice Dataのdebugタブを引き出すと、右のDebugウィンドウに、センサータグからデータがJSON形式で送信されていることが確認出来ます。


 様々な機能が用意されていますので、あとはPaaS側で処理を作成していくことになります。
この環境はそのまま実稼働環境へと移行させることも出来ます。


4. 最後に


今回は、TI CC2541 Sensor Tagを利用した例を紹介しました。
ibeacon仕様のビーコンタグのデータをBluemixへ送信するテストプログラムも作成していますので、次回ご紹介します。

2013-12-12

[.tested] TI CC2541 SensorTag Development Kit[debian Wheezy][AX3][A7]




先日、以下の記事で紹介した、TI CC2541 SensorTag Kitと、OpenBlocks Aシリーズとの接続評価を行いました。

TI CC2541 SensorTag Development Kit


OBDN技術ブログによる動作検証は、該当するデバイスの動作を保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
Debian 7.1 Wheezy
OpenBlocks AX3/4 kernel: 3.2.40
OpenBlocks A6/A7 kernel: 3.2.40

1. 事前準備


本装置は、Bluetooth LEにより通信を行うため、OpenBlocks本体に、USB Bluetoothアダプタを接続して使用します。
Bluetoothアダプタに関しては、以下の記事において、一部製品の接続検証を行っております。

 周辺機器接続テスト

上記の記事に、Bluetooth接続に関する説明を記述しておりますが、今回は、Bluetooth LEによる接続であるため、手順に関しては本記事にて説明します。

Bluez 5.12の導入

Debian Wheezyにて提供されるbluezパッケージでは、gatttoolによるデータのwriteが出来ず、Web検索したところ、以下のページを参考に、5.12をインストールしました。
また、下記ページでは今回使用したデバイスそのもののテストも行っています。

Michael Saunby: Raspberry Pi and TI CC2541 SensorTag:

導入に際しては、事前に開発環境のインストールを行ってください。
( すでに行っている場合は必要ありません)

# aptitude install build-essential

Bluez 5.12のビルドに必要なライブラリをインストールします。

# aptitude install libglib2.0-dev libdbus-1-dev libusb-dev libudev-dev libical-dev systemd libreadline-dev

Bluez 5.12を入手し、解凍します。

# wget https://www.kernel.org/pub/linux/bluetooth/bluez-5.12.tar.xz
# tar -Jxvf bluez-5.12.tar.xz

INSTALLドキュメントに従い、インストールします。

# cd bluez-5.12/
# ./configure
# make
# make install

2. 接続方法


CC2541のデータハンドリングは、以下のTI Wikiに記述されています。

SensorTag User Guide - Texas Instruments Wiki:


今回は、wheezyのbluetoothサポートパッケージを導入していませんので、手動でデバイスの立ち上げからテストまでを行っています。

# hciconfig hci0 up

デバイスサイドにあるスイッチを押して、BLEデバイスのスキャンを行います。


# hcitool lescan
LE Scan ...
34:B1:F7:D5:59:2A (unknown)
34:B1:F7:D5:59:2A SensorTag
 :
 :

gatttoolにより、インタラクティブにセンサーデータを取得してみます。

# gatttool -i hci0 -b 34:B1:F7:D5:59:2A -I
[34:B1:F7:D5:59:2A][LE]> connect
Attempting to connect to 34:B1:F7:D5:59:2A
Connection successful
[34:B1:F7:D5:59:2A][LE]> primary
attr handle: 0x0001, end grp handle: 0x000b uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x000c, end grp handle: 0x000f uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x0010, end grp handle: 0x0022 uuid: 0000180a-0000-1000-8000-00805f9b34fb
attr handle: 0x0023, end grp handle: 0x002a uuid: f000aa00-0451-4000-b000-000000000000
attr handle: 0x002b, end grp handle: 0x0035 uuid: f000aa10-0451-4000-b000-000000000000
attr handle: 0x0036, end grp handle: 0x003d uuid: f000aa20-0451-4000-b000-000000000000
attr handle: 0x003e, end grp handle: 0x0048 uuid: f000aa30-0451-4000-b000-000000000000
attr handle: 0x0049, end grp handle: 0x0054 uuid: f000aa40-0451-4000-b000-000000000000
attr handle: 0x0055, end grp handle: 0x005c uuid: f000aa50-0451-4000-b000-000000000000
attr handle: 0x005d, end grp handle: 0x0061 uuid: 0000ffe0-0000-1000-8000-00805f9b34fb
attr handle: 0x0062, end grp handle: 0x0068 uuid: f000aa60-0451-4000-b000-000000000000
attr handle: 0x0069, end grp handle: 0xffff uuid: f000ffc0-0451-4000-b000-000000000000
[34:B1:F7:D5:59:2A][LE]> char-read-hnd 38
Characteristic value/descriptor: 00 00 00 00
[34:B1:F7:D5:59:2A][LE]> char-write-req 3c 01
Characteristic value was written successfully
[34:B1:F7:D5:59:2A][LE]> char-read-hnd 38
Characteristic value/descriptor: 4c 6d 46 60
[34:B1:F7:D5:59:2A][LE]>


上記の手順により、センサーデータから数値を取得することが出来ます。


ただし、このデバイスは常時監視する用途には向きません。
USBに直結するタイプのインターフェースも配布されていますので、別途入手して評価する予定です。

2013-12-09

TI CC2541 SensorTag Development Kit

TEXAS INSTRUMENTS社より、センサータグ開発キットCC2541が配布されているので、TIショップより入手しました。

 CC2541 SensorTag 開発キット - CC2541DK-SENSOR - TI ツール・フォルダ:

この開発キットは、以下のセンサー入力をBluetoothにより出力します。
  • IR 温度センサ
  • 湿度センサ
  • 圧力センサ
  • 加速度計
  • ジャイロスコープ
  • 磁力計


購入は、TIショップからの直接購入をお勧めします。($25で送料込み)
展示会などでの即売もあるようです。

Bluetooth LEデバイスとして、bluezでscan出来るところまでは確認しました。
OpenBlocksとの接続や監視ツールとの連携に関してはこれから行いたいと思います。

(TIのサイトより、各種OS向けの開発キットやテストツールが配布されていますが、ソースコードの入手にはagreementが必要になっていますので、muninプラグインなど作成した際の公開に関しては少し時間がかるかと思います)

2013-05-01

【.tested】Logitec Bluetooth USBアダプタ LBT-UAN04C2 [Debian Wheezy/Squeeze][AX3][A6]

Logitec LBT-UAN04C2は、Bluetooth(R) 4.0に対応した、Class2のUSBホストアダプタです。



今回、OpenBlocks AX3およびA6から本USB Bluetoothアダプタを介して、RATOC REX-BT60および、Bluetoothスピーカー Buffalo BSS09Bを接続し、検証を行いました。
従来のDebian 6.0(Squeeze)環境に加え、先日リリースされたDebian 7.1環境における検証も行います。

( 2013/8/7 追記 )
Debian 7.1正式版が公開されましたので、再度検証しました。
本デバイスを使用される方は、 上記リンクより、リリース版のファームウェアをご利用下さい。 

OBDN技術ブログによる動作検証は、該当するデバイスの動作を保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
Debian 6.0 Squeeze
OpenBlocks AX3/4 kernel: 3.0.6
OpenBlocks A6 kernel: 2.6.31.8
Debian 7.0 Wheezy
OpenBlocks AX3/4 kernel: 3.2.40
OpenBlocks A6 kernel: 3.2.40

<使用機器>

OpenBlocks AX3
OpenBlocks A6
Logitec LBT-UAN04C2 Bluetooth USBホストアダプタ
RATOC Systems Inc. REX-BT60 Bluetooth-RS232C変換アダプタ
Buffalo BSSP09B Bluetooth ワイヤレススピーカ

1. Bluetoothデバイスの導入


標準でサポートされるbtusbモジュールにより認識します。

 <dmesgの例 A6/Wheezy kernel 3.2.36環境>

Bluetooth: Core ver 2.16
NET: Registered protocol family 31
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: L2CAP socket layer initialized
Bluetooth: SCO socket layer initialized
Bluetooth: Generic Bluetooth USB driver ver 0.6
usbcore: registered new interface driver btusb


Bluetooth: BNEP (Ethernet Emulation) ver 1.3
Bluetooth: BNEP filters: protocol multicast
Bluetooth: RFCOMM TTY layer initialized
Bluetooth: RFCOMM socket layer initialized
Bluetooth: RFCOMM ver 1.11

 <dmesgの例 A6/squeeze kernel 2.6.31環境>

A6/Kernel 2.6.31

Bluetooth: Core ver 2.15
NET: Registered protocol family 31
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: Generic Bluetooth USB driver ver 0.5
usbcore: registered new interface driver btusb


Bluetooth: L2CAP ver 2.13
Bluetooth: L2CAP socket layer initialized
Bluetooth: RFCOMM TTY layer initialized
Bluetooth: RFCOMM socket layer initialized
Bluetooth: RFCOMM ver 1.11
Bluetooth: BNEP (Ethernet Emulation) ver 1.3
Bluetooth: BNEP filters: protocol multicast
Bridge firewalling registered
Bluetooth: SCO (Voice Link) ver 0.6
Bluetooth: SCO socket layer initialized

2. Bluezの導入


Bluezのインストール

Bluetooth機器の操作は、bluezパッケージを利用します。

# aptitude -R install bluez python-dbus python-gobject

python-*は、ペアリングなどを行うスクリプトを動かすために必要です。

インターフェイスの確認・設定

Bluetooth機器はhciXというデバイス名(インターフェイス名)で扱います。

# hciconfig -a
hci0:   Type: BR/EDR  Bus: USB
        BD Address: 00:09:DD:40:C6:12  ACL MTU: 310:10  SCO MTU: 64:8
        UP RUNNING PSCAN
        RX bytes:23538 acl:47 sco:0 events:2966 errors:0
        TX bytes:1423677 acl:5253 sco:0 commands:101 errors:0
        Features: 0xff 0xff 0x8f 0xfe 0xdb 0xff 0x5b 0x87
        Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
        Link policy: RSWITCH HOLD SNIFF PARK
        Link mode: SLAVE ACCEPT
        Name: 'obsa6-0'
        Class: 0x4a0100
        Service Classes: Networking, Capturing, Telephony
        Device Class: Computer, Uncategorized
        HCI Version: 4.0 (0x6)  Revision: 0x1d86
        LMP Version: 4.0 (0x6)  Subversion: 0x1d86
        Manufacturer: Cambridge Silicon Radio (10)

3. REX-BT60との接続


REX-BT60はBluetoothを介して離れた場所にあるシリアル通信機器を、制御・管理できるシリアルインターフェイスです。また、コネクターに は、EIA/TIA-574 仕様のD-Sub 9Pin を採用しており、RS-232C機器とBluetooth接続で通信が可能です。
ペアリング方法、および通信テストに関しては、同社のclass1 Bluetoothホストアダプタ、LBT-UAN04C1を使用した場合と同じです。

 [.tested] RATOC SYSTEM REX-BT60 [Debian Wheezy/Squeeze][AX3][A6]

を参照して下さい。

4. Buffelo BSSP09B ワイヤレススピーカーとの接続


Buffelo BSSP09Bは、Bluetooth ver2.1に対応した、ワイヤレススピーカ/ハンズフリーヘッドセット、マイクユニットで、A2DPやHFP、HSPのプロファイルをサポートしています。
今回、bluez-audioによるサウンド出力を行ってみます。



デバイスのスキャン

 hcitoolを使用します。

# hcitool scan
Scanning ...
        XX:XX:XX:XX:XX:XX       BSSP09B

REX-BT60は、RN42-XXXXと表示されます。

ペアリング

simple-agentは、Debian wheezeのパッケージからは、
bluez-simple-agent
bluez-test-device
に置き換わり、/usr/bin以下にインストールされています。

ただし、Debian/Wheezyパッケージにより提供されるbluez-simple-agentコマンドは、そのままでは本ユニットとの接続が出来ません。
コマンドを直接viで編集して、修正を行います。
(7.1リリース版においても、下記の修正が必要となりました)

# vi /usr/bin/bluez-simple-agent

#capability = "KeyboardDisplay"  この行を編集する。
capability = "DisplayYesNo"


それぞれのペアリング方法は以下の通りです。
BSSP09B側をペアリング待機状態にしておけば、特に入力は必要ありません。

 (Debian 6.0 Squeeze)

# /usr/share/doc/bluez/examples/simple-agent hci0 <BTADDR>
Release
New device (/org/bluez/3445/hci0/dev_XX_XX_XX_XX_XX_XX)

 (Debian 7.0 Wheezy)

# bluez-simple-agent hci0 <BTADDR>
Release
New device (/org/bluez/3445/hci0/dev_XX_XX_XX_XX_XX_XX)


ペアリングの確認は以下のコマンドで行います。

 (Debian 6.0 Squeeze)

# /usr/share/doc/bluez/examples/test-device list
dbus.Array([dbus.ObjectPath('/org/bluez/1453/hci0/dev_XX_XX_XX_XX_XX_XX')], signature=dbus.Signature('o'))

 (Debian 7.0 Wheezy)

# bluez-test-device list
XX:XX:XX:XX:XX:XX BSSP09B

ペアリングの解除方法は以下の通りです。

 (Debian 6.0 Squeeze)

# /usr/share/doc/bluez/examples/test-device remove <BTADDR>

 (Debian 7.0 Wheezy)

# bluez-test-device remove <BTADDR>


4. bluez-audioによるオーディオ再生方法


Bluez-audioにより、Bluetoothデバイスを使用した音楽再生を行います。

bluez-audioおよび、mp3出力に対応したプレーヤである、mpg123を導入します。

# aptitude -R install bluez-audio mpg123

.asoundrcを編集します。

# cat << EOF > ~/.asoundrc
pcm.bt {
  type bluetooth
  device "30:XX:XX:XX:XX:XX"
}
EOF

Wheezyのパッケージの場合、/etc/bluetooth/audio.confに以下の部分を追加します。

[General]
Enable=Socket

音楽再生のテストを行います。

# mpg123 -a bt http://classical-music.sakura.ne.jp/Room/Chopin-Poronase-Heroic.mp3

ただし、AX3に適用される、プレリリース版Debian Wheezyパッケージ(armhf)のmpg123ではうまく再生できないため、mplayerを使用して動作確認を行いました。

# aptitude install mplayer
# mplayer -ao alsa:device=bt http://classical-music.sakura.ne.jp/Room/Chopin-Poronase-Heroic.mp3

5. さいごに


LBT-UAN04C2は、Class1製品である、LBT-UAN04C1と同様に、OpenBlocks AX3/A6のDebian/squeezeパッケージおよび、Deabian/Wheezyパッケージで利用出来ることを確認しました。

WheezyパッケージはSqueezeパッケージとコマンドラインツールの場所が変更されていること、ペアリングに際し、一部コマンドファイルの変更が必要なこと、オーディオ再生におけるbluetooth管理プログラムのデフォルト設定が違うことなどがあり、上記の記事にあるように、一連の動作確認には若干の修正が必要となります。

2012-07-19

【.tested】Logitec製 Bluetoothアダプタ (LBT-UAN03C1BK) [AX3]



ma2shitaです。
Logitec製 Bluetoothアダプタ「LBT-UAN03C1BK」の動作検証を、OpenBlocks AX3上で行いました。

ChangeLog:

2012/7/26 ma2shita
  • 全体: apt-get → aptitudeへ変更した
  • 全体: コンソールからの入力をボールドにした
  • bluezのインストール: bluezパッケージ同梱のpythonスクリプトを動かすためのパッケージpython-gobjectが足りなかったので追記した
  • ペアリング: 0000や1234で固定されている場合の挙動について追記
  • 後継品 LBT-UAN04C1での検証を行い、同様の手順での動作を確認しました。
OBDN技術ブログによる動作検証は、該当するハードウェア・ソフトウェアの動作を保証およびサポートを行うものではありません。詳しくは周辺機器動作検証に関してをご覧ください。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

LBT-UAN03C1BKについて

Bluetooth 3.0、出力クラスはClass1と、申し分の無いスペックに加え、超小型&低消費電力であることが特徴のUSB接続Bluetoothアダプタです。
[写真1:パッケージと中身]

検証環境

OpenBlocks AX3/4 (Debian 6.0.5 / kernel 3.0.6)
OpenBlocks A6 → 検証中

使用方法(ペアリングまで)

LBT-UAN03C1BKは、挿すだけで認識されます。
実際に使うためにはいくつかパッケージを導入する必要がありますが、aptでインストールできるので非常に簡単です。
[写真2:OpenBlocks AX3にLBT-UAN03C1BKを挿したところ]
# dmesg
~snip~
usb 1-1: new full speed USB device number 2 using ehci_marvell
usb 1-1: New USB device found, idVendor=21ee, idProduct=1100
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1: Product: Broadcom Bluetooth V3.0 USB Device
usb 1-1: Manufacturer: Broadcom Corp
usb 1-1: SerialNumber: XXXXXXXXXXXX
Bluetooth: Generic Bluetooth USB driver ver 0.6
usbcore: registered new interface driver btusb

bluezのインストール

Bluetooth機器の操作は、bluezパッケージに入っているコマンドを利用することになります。
# aptitude -R install bluez python-dbus python-gobject
python-*は、ペアリングなどを行うスクリプトを動かすために必要です。

インターフェイスの確認・設定

Bluetooth機器はhciXというデバイス名(インターフェイス名)で扱います。
hciXインターフェイスの確認や設定はhciconfigコマンドを使用します。(NICに対するifconfigの関係に似ています)
# hciconfig -a
hci0:   Type: BR/EDR  Bus: USB
    BD Address: 00:XX:XX:XX:XX:XX  ACL MTU: 1021:8  SCO MTU: 64:1
    UP RUNNING PSCAN 
    RX bytes:1117 acl:0 sco:0 events:41 errors:0
    TX bytes:1626 acl:0 sco:0 commands:41 errors:0
    Features: 0xff 0xff 0x8f 0xfe 0x9b 0xff 0x79 0x87
    Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 
    Link policy: RSWITCH HOLD SNIFF PARK 
    Link mode: SLAVE ACCEPT 
    Name: 'obsax3-0'
    Class: 0x4a0100
    Service Classes: Networking, Capturing, Telephony
    Device Class: Computer, Uncategorized
    HCI Version: 3.0 (0x5)  Revision: 0x0
    LMP Version: 3.0 (0x5)  Subversion: 0x4203
    Manufacturer: Broadcom Corporation (15)
# hciconfig hci0 revision
hci0:   Type: BR/EDR  Bus: USB
    BD Address: 00:XX:XX:XX:XX:XX  ACL MTU: 1021:8  SCO MTU: 64:1
    Firmware 0.66 / 3
# hciconfig hci0 features
hci0:   Type: BR/EDR  Bus: USB
    BD Address: 00:XX:XX:XX:XX:XX  ACL MTU: 1021:8  SCO MTU: 64:1
    Features page 0: 0xff 0xff 0x8f 0xfe 0x9b 0xff 0x79 0x87
        <3-slot packets> <5-slot packets> <encryption> <slot offset> 
        <timing accuracy> <role switch> <hold mode> <sniff mode> 
        <park state> <RSSI> <channel quality> <SCO link> <HV2 packets> 
        <HV3 packets> <u-law log> <A-law log> <CVSD> <paging scheme> 
        <power control> <transparent SCO> <broadcast encrypt> 
        <EDR ACL 2 Mbps> <EDR ACL 3 Mbps> <enhanced iscan> 
        <interlaced iscan> <interlaced pscan> <inquiry with RSSI> 
        <extended SCO> <EV4 packets> <EV5 packets> <AFH cap. slave> 
        <AFH class. slave> <3-slot EDR ACL> <5-slot EDR ACL> 
        <sniff subrating> <pause encryption> <AFH cap. master> 
        <AFH class. master> <EDR eSCO 2 Mbps> <EDR eSCO 3 Mbps> 
        <3-slot EDR eSCO> <extended inquiry> <simple pairing> 
        <encapsulated PDU> <err. data report> <non-flush flag> <LSTO> 
        <inquiry TX power> <EPC> <extended features> 
    Features page 1: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00

動作確認

hciXの操作はhcitoolコマンドを使用します。
周辺のBluetooth機器を探索してみます。
# hcitool scan
Scanning ...
    00:XX:XX:XX:XX:XX   XXXXXXX
    00:XX:XX:XX:XX:XX   XXXXXXXX
    00:XX:XX:XX:XX:XX   XXXXXX の Mac mini
    78:XX:XX:XX:XX:XX   XXXXXXX
    00:XX:XX:XX:XX:XX   XXXXX   
    78:XX:XX:XX:XX:XX   XXXXXXXXXX

ペアリング

ペアリング操作は、bluezパッケージに含まれるsimple-agentコマンドを使用します。(このためにpython-dbusが必要です)
ペアリング対象機器をペアリング待ち受け状態にした上で、simple-agentを実行します。
Enter PIN Code:は任意の四桁以上の数字を入力してください。すると、ペアリング対象機器で同じPINの入力を求められます。
# /usr/share/doc/bluez/examples/simple-agent hci0 BTADDR
RequestPinCode (/org/bluez/2332/hci0/dev_A0_XX_XX_XX_XX_XX)
Enter PIN Code: *
Release
New device (/org/bluez/2332/hci0/dev_A0_XX_XX_XX_XX_XX)
※PIN codeが00001234等で固定されている場合、PIN codeの入力なしにペアリングが完了する場合があります。
ペアリング済機器はtest-deviceコマンドで見ることができます。
ペアリング前
# /usr/share/doc/bluez/examples/test-device list
dbus.Array([], signature=dbus.Signature('o'))
ペアリング後
# /usr/share/doc/bluez/examples/test-device list
dbus.Array([dbus.ObjectPath('/org/bluez/2332/hci0/dev_A0_XX_XX_XX_XX_XX')], signature=dbus.Signature('o'))
ペアリングの削除もtest-deviceコマンドです。
# /usr/share/doc/bluez/examples/test-device remove BTADDR
※ペアリング対象機器側の登録削除もお忘れなく。

/usr/share/doc/bluez/examples/* と D-Busについて

bluezはBluetooth関連の情報をD-Busを使ってやりとりしています。
そのため、dbus-sendコマンドを使用すれば細かな制御が可能ですが、 難しいのでラッパースクリプトとして /usr/share/doc/bluez/examples/*スクリプト群があるようです。

利用方法(DUN): 3G携帯電話をモデムとして使う

AQUOS SHOT SoftBank 002SHをDUNモデムとして使えるようにします。
具体的にはrfcommコマンドで/dev/rfcommXデバイスを作り、それを利用して通信します。
注意:ペアリングは済ませておいてください。
# rfcomm connect hci0 BTADDR
これで、/dev/rfcommXデバイスができているはずです。別セッションから確認します。
# ls -lF /dev/rfcomm*
crw-rw---- 1 root dialout 216, 0 Jul 19 17:51 /dev/rfcomm0
cuコマンド上でヘイズATコマンドを使って電話番号 00-0000-0000 に音声発呼してみます。
# aptitude -R install cu
# chown root:root /dev/rfcomm0
# cu -E ^ -l /dev/rfcomm0
AT
OK
ATD00000000;
OK
ATH
OK
^.
Disconnected.
※ボールドは入力行です。実際は表示されません。

ヘイズATコマンドになじみの無い方へ

ATコマンドと呼ばれることが多いですが、モデムを制御するコマンド形態です。
  • AT → モデムが動作していればOKが返ってくる
  • ATDn → nへダイヤルをする (電話番号の末尾にセミコロンを付けると、音声発信であることの明示)
  • ATH → 回線切断

この後

rfcommコマンドが実行されている限り/dev/rfcommXが存在します。
また、/etc/bluetooth/rfcomm.confに設定を書くことで、bluetoothdの動作に連動させて/dev/rfcommXを作ることができるようです。(未確認)
これを使ってppp等の利用も可能だと思われます。(未検証)

トラブルシュート

  • Can't connect RFCOMM socket: Connection refused
    • → ペアリングされてません、ペアリングしてください。

利用方法(A2DP): Bluetoothヘッドフォンで音楽再生

SONY MDR-NWBT10NをA2DPヘッドフォンとして使えるようにします。
具体的にはALSAを利用して出力先デバイスにMDR-NWBT10Nを指定するようにします。
注意:ペアリングは済ませておいてください。
注意:音量に気をつけてください、耳の痛い、もしくは恥ずかしい思いをします。
# aptitude -R install bluez-audio mpg123-alsa
# cat << EOF > ~/.asoundrc
pcm.bt {
  type bluetooth
  device "30:XX:XX:XX:XX:XX"
}
EOF
※30:XX:XX:XX:XX:XX はMDR-NWBT10Nのアドレスに読み替えてください。
再生してみます。ショパンの「英雄」がMDR-NWBT10Nから流れてくれば、勝利です。
# mpg123-alsa -a bt http://classical-music.sakura.ne.jp/Room/Chopin-Poronase-Heroic.mp3

この後

X11を導入し、mplayerやVLC等で動画再生等も可能ですが、ここでは割愛です。(ごめんなさい part2)

トラブルシュート

  • ALSA lib audio/pcm_bluetooth.c:1607:(audioservice_expect) BT_GET_CAPABILITIES failed : Input/output error(5)
    • → ペアリングがされてない、既に別のデバイスとMDR-NWBT10Nが接続されている状態の時に表示されます。

あとがき


LBT-UAN03C1BKの後継商品「LBT-UAN04C1」についても検証を行い、本記事の手順での動作を確認しました。

参考URL





[PR]