2015年10月18日日曜日

gatttool で Bluetooth デバイスの情報を取得する方法

概要

RaspberryPi 上に BlueZ をインストールして gatttool でデバイスの情報を取得する方法を紹介します
また今回使用した BLE デバイスは BL600 です

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspbian 8.0 (Jessie)
  • Kernel Version 4.1.10
  • BlueZ 5.23-2+b1

BLEデバイスをスキャンし接続する

  • sudo hcitool -i hci0 lescan

でまずは Mac アドレスを調べます
対象の Mac アドレス (今回は xx:xx:xx:xx:xx:xx) が判明したら gatttool で接続します
これで gatttool のインタラクティブモードになります

  • gatttool -t random -b xx:xx:xx:xx:xx:xx -I

あとは connect コマンドを実行しましょう

[xx:xx:xx:xx:xx:xx][LE]> connect
Attempting to connect to xx:xx:xx:xx:xx:xx
Connection successful
[xx:xx:xx:xx:xx:xx][LE]>

connect に成功するとプロンプトの色が青色に変化すると思います

値を取得する

まず primary というコマンドを実行しましょう

[xx:xx:xx:xx:xx:xx][LE]> primary
attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x0008, end grp handle: 0x0008 uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x0009, end grp handle: 0x000e uuid: 0000180d-0000-1000-8000-00805f9b34fb
attr handle: 0x000f, end grp handle: 0x0012 uuid: 0000180f-0000-1000-8000-00805f9b34fb
attr handle: 0x0013, end grp handle: 0xffff uuid: 0000180a-0000-1000-8000-00805f9b34fb

すると謎の文字列がずらーっと出てくると思います
これがこのデバイスから取得できるサービスの一覧です
サービスとは BLE が定めたもので各種値は必ずどこかのサービスに属しています

着目するのはこの中の uuid という項目でこの uuid を元にどんなデータが取得できるサービスなのか判断します

例えば一番上の uuid 00001800-0000-1000-8000-00805f9b34fb の初めの8桁の下4桁 1800 に着目します
この 1800 を先ほどの URL の中で探すと Generic Access という項目に該当することがわかります
そして Generic Access の中に Device Name という項目がありここの問い合わせることでデバイス名を取得することができます
では具体的に値を取得してみましょう

デバイス名を取得する

1800 のサービスの中でどの項目がデバイス名なのか調べる必要があります
どんな項目があるかは char-desc というコマンドを使用します

[xx:xx:xx:xx:xx:xx][LE]> char-desc 0x0001 0x0007
handle: 0x0001, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x0002, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0006, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0007, uuid: 00002a04-0000-1000-8000-00805f9b34fb

するとまたずらーっと謎の文字列が登場します
この中のどれかがデバイス名になります
ここでまた登場するのが uuid です
先ほど紹介した Generic Access の詳細を説明するページに移動します
この中の「Device Name」をクリックすると「 Assigned Number: 0x2A00」というのが記載されていると思います
ble_device_name_number.png

この「2A00」を先ほどの char-desc の uuid 下4桁と照らし合わせると以下が該当することがわかります

handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb

ここにアクセスするとデバイス名を取得できそうです
で、アクセスする方法は以下になります

[xx:xx:xx:xx:xx:xx][LE]> char-read-hnd 0x0003
Characteristic value/descriptor: 46 5f 49 49 49

取得できたと思ったら謎の文字列がまた返ってきました
先ほどの Device Name の説明のページを見ると「Format」という欄がありそこに「utf8s」と記載されているのがわかると思います
つまりこの16進数の数字の羅列を utf8s に変換する必要があるのです(面倒くさい!)
そして utf8s への変換方法は以下の通り

  • echo ” 46 5f 49 49 49” | tr \ = | nkf -WwmQ

ちなみにこの文字列は「F_III」に変換されます
ちょっとわかりづらいですが、echo している文字列の先頭にはスペースが入っています
tr コマンドの変換元の文字列はスペースをエスケープしているため「\」が変換元の文字列になります

こんな感じでデバイス名は取得することができます

バッテリ残量を取得する

バッテリ残量も同様の方法で取得することができます
uuid は「0x180F Battery Service」になります

[xx:xx:xx:xx:xx:xx][LE]> connect
Attempting to connect to xx:xx:xx:xx:xx:xx
Connection successful
[xx:xx:xx:xx:xx:xx][LE]> primary
attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x0008, end grp handle: 0x0008 uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x0009, end grp handle: 0x000e uuid: 0000180d-0000-1000-8000-00805f9b34fb
attr handle: 0x000f, end grp handle: 0x0012 uuid: 0000180f-0000-1000-8000-00805f9b34fb
attr handle: 0x0013, end grp handle: 0xffff uuid: 0000180a-0000-1000-8000-00805f9b34fb
[xx:xx:xx:xx:xx:xx][LE]> char-desc 0x000f 0x0012
handle: 0x000f, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x0010, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0011, uuid: 00002a19-0000-1000-8000-00805f9b34fb
handle: 0x0012, uuid: 00002902-0000-1000-8000-00805f9b34fb
[xx:xx:xx:xx:xx:xx][LE]> char-read-hnd 0x0011
Characteristic value/descriptor: 52

Format を見ると uint8 なので符号なし整数です
値はもちろん16進数なのでこれを10進数に変換すると

52(16) = 82(10)

になります
単位はパーセンテージなので電池残量は残り 82 %だとわかります

最後に

紹介は以上です
取得の仕組みがわかるとスイスイ値を取得できますが、わかるまでが大変でした
基本的に英語の文献ばかりなので英語が読めないと辛いです

Tips

  • UUID を直接指定して値を取得する方法
    例えばデバイス名を取得する場合

char-read-uuid 2a00

でも取得することができます

  • インタラクティブモードじゃない方法で取得する方法

gatttool -t random -b xx:xx:xx:xx:xx:xx –char-read –uuid=0x2a00

この場合 connect -> disconnect も勝手に行ってくれます

  • 存在しない UUID もあります
    UUID は決められてはいますがデバイスによってはカスタマイズされており、存在していないものもあります
    なのでサービスの一覧と primary コマンド等で UUID を照らし合わせつつ値の取得を行ってください

2015年10月17日土曜日

RaspberryPi の OS を MicroSD に書き込む方法

概要

RaspberryPi はOSも含め外部記憶にデータを持ちます
今回は公式で公開されている Raspbian というOSを MicroSD に書き込む方法を紹介します

環境

Raspbianのダウンロード

RaspbianとはRaspberryPi用に作成されたOSでDebianをベースにしています
これをSDカードにインストールしてSDカードからRaspberryPiを起動します

https://www.raspberrypi.org/downloads/
にアクセスしましょう
Raspbianのダウンロードボタンがあるのでクリックしてダウンロードします
download_raspbian.png

今回は Wheezy というバージョンの Raspbian をダウンロードしました
TorrentとZipがありますが、今回はZip形式をダウンロードしました
Zipのサイズで990MBでした

SDカードへimgを書き込む

ダウンロードしたzipファイルを解凍すると「2015-05-05-raspbian-wheezy.img」というファイルがあります
※ファイルの解凍は「The Unarchiver」というアプリを使うと楽です、unzip コマンドだとエラーになりました

これをRaspberryPiが読み込んだ時に起動できるようにSDカードに書き込みます
今回環境がMacOSなのでddコマンドを使ってイメージを書き込みます
他の方法として専用のツールを使って書き込むこともできます

dd コマンドを使って書き込む

SDカードをPCに接続してください
Mac Book Air の場合 SD カードを接続できる I/F がデフォルトでついていると思います
MicroSD の場合は SD カードのアダプタを付けて接続してください

解凍したimgファイルがあるディレクトリに移動して以下のコマンドを実行します (以下では ~/Downloads に解凍しています)
MOUNTED_SDCARD_NAME は各自の環境でことなるので df コマンド等で確かめてから実行してください

cd ~/Downloads
sudo diskutil umount /Volumes/[MOUNTED_SDCARD_NAME]
sudo dd bs=1m if="./2015-05-05-raspbian-wheezy.img" of="/dev/rdisk2"

以下のように表示されればイメージの書き込みは完了です

3125+0 records in
3125+0 records out
3276800000 bytes transferred in 228.385373 secs (14347679 bytes/sec)

dd: /dev/rdisk2: Input/output error
みたいなエラーが表示された場合は書き込みに失敗しています
2GBのSDカードでは容量不足になり上記エラーになるようです
最低でも4GBのSDカードを用意してください

書き込みが完了したらSDカードを取り出してください
ちゃんとFinderから「取り出す」とかで外してください

最後に

書き込み自体はダウンロードしてコマンド実行だけと非常に簡単でした
あとは RaspberryPi 本体の裏側に MicroSD ( or SDカード ) を挿入する I/F があるので接続し RaspberryPi に電源を入れましょう
うまく OS が焼けていれば起動し、設定画面に遷移すると思います (参考 : http://kakakikikeke.blogspot.jp/2015/10/raspberrypi-started.html)

2015年10月16日金曜日

RaspberryPi の bluetoothctl で無線キーボードに接続

概要

RaspberryPi のバージョン8 (Jessie) から bluez-utils というパッケージがなくなったようで bluez-simple-agent, bluez-test-device, bluez-test-input 等のコマンドが使えません
その代わりに bluetoothctl というコマンドで制御することができるのでその方法を紹介します

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspbian 8.0 (Jessie)
  • Kernel Version 4.1.10
  • BlueZ 5.23-2+b1
  • Bluetoothキーボード : iBUFFALO Bluetooth3.0対応 コンパクトキーボード 薄型モデル BSKBB24BK
  • Bluetoothレシーバ : ELECOM Bluetooth PC用USBアダプタ 超小型 Ver4.0 Class2 forWin8 ブラック LBT-UAN05C2

接続方法

まず bluetoothctl をエージェントモードで起動します
すると [bluetooth]# というプロンプト表示になるのでここで対話的にコマンドを入力していきます
※念のためレシーバ、キーボードの Mac アドレスは伏せています
※yy: … はレシーバの Mac アドレス、xx: … はキーボードの Mac アドレスです

pi@raspberrypi ~ $ sudo bluetoothctl -a
[NEW] Controller yy:yy:yy:yy:yy:yy BlueZ 5.23 [default]
Agent registered
[bluetooth]#

まず、キーボードをペアリングできる状態にしてキーボードをスキャンします

[bluetooth]# scan on
Discovery started
[NEW] Device xx:xx:xx:xx:xx:xx BSKBB24

検知できると NEW と出て対象の Mac アドレスが出力されます
この Mac アドレスに対して connect します

[bluetooth]# connect xx:xx:xx:xx:xx:xx
Attempting to connect to xx:xx:xx:xx:xx:xx
[CHG] Device xx:xx:xx:xx:xx:xx Connected: yes
Connection successful

successful と出れば接続完了です
この段階で bluetooth キーボードが使えるようになっていると思います

あとは再起動時にも自動で接続するよう trust しておきます

[bluetooth]# trust xx:xx:xx:xx:xx:xx
[CHG] Device xx:xx:xx:xx:xx:xx Trusted: yes
Changing xx:xx:xx:xx:xx:xx trust succeeded

これで再起動しても自動で無線キーボードが接続されるようになりました

Tips

一定時間キーボードからの入力がないと自動でスリープ状態に入ってしまうようです
とりあえずキーボードを適当に叩いてキーボード側のスリープを解除し信号を送ってみて、それでもダメなら再度 bluetoothctl を実行すれば OK だと思います
ただ、その場合は無線キーボードが使えないので有線 or SSH でのログインができる状態である必要があります

参考サイト

2015年10月15日木曜日

RaspberryPi で Error: connect: Connection refused (111)

概要

RaspberryPi で BLE と connect するために gatttool やら hcitool を使っていたのですがタイトルのエラーが解消できずに悩んでいました
ようやく解決できたので紹介します

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspbian 7.8 (Wheezy) -> 8.0 (Jessie)
  • Kernel Version 4.17 -> 4.1.10
  • BlueZ 5.35 -> 5.23-2+b1
  • Bluetoothレシーバ : ELECOM Bluetooth PC用USBアダプタ 超小型 Ver4.0 Class2 forWin8 ブラック LBT-UAN05C2

解決方法

結論から述べると自分のケースでは

OS と kernel をアップグレードし BlueZ を再インストール

することで解決しました

OS アップグレード方法

一旦 Wheezy のパッケージを最新にします

  • sudo apt-get update
  • sudo apt-get upgrade
  • sudo apt-get dist-upgrade

apt の対象リポジトリを Jessie に変更します

  • sudo cp /etc/apt/sources.list{,.wheezy}
  • sudo vim /etc/apt/sources.list

deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi

再度アップデートコマンドを実行します

  • sudo apt-get update
  • sudo apt-get upgrade
  • sudo apt-get dist-upgrade

すべて完了したら再起動します
OS のバージョンと kernel のバージョンを確かめましょう

  • sudo reboot
  • cat /etc/issue
  • uname -a

BlueZ の再インストール

過去にソースをコンパイルしてインストールしていたものを Jessie にすることで apt でインストールできる BlueZ に入れ替えます

ソースからインストールした hcitool 等は直接 rm で削除しました

  • sudo rm /usr/local/bin/*

あとは apt-get で BlueZ をインストールすれば OK です

  • sudo apt-get install bluetooth bluez blueman

Jessie になると bluez-utils というパッケージがなくなって bluez に統一されているようです
自分は念のためインストール後に再起動も実施しました
また、apt-get でインストールできるものに hcidump がないので、これだけはソースコンパイルしてできた hcidump を適当に配置しました

  • sudo cp ./bluez-5.35/tools/hcidump /usr/bin

P.S 20151029
hcidump は bluez-hcidump というパッケージに含まれているので sudo apt-get install bluez-hcidump でもインストール可能です

BLE デバイスの検知

OS をアップグレードした状態で hcitool と gatttool を使ってBLE デバイス(今回は SensorTag ) を検知してみました
USBドングルを接続はあらかじめ接続しておいてください

Macアドレスのスキャンおよび接続テスト

別ターミナルで詳細を確認するために hcidump を起動しておいてください

  • sudo hcidump -X

まずは BLE デバイスをスキャンします
もちろん BLE デバイスは Advertise できるように電源を入れてください

  • sudo hcitool -i hci0 lescan

検出された Mac アドレスに接続テストします

  • sudo hcitool -i hci0 lecc xx:xx:xx:xx:xx:xx

接続が持続されているか確認します

  • sudo hcitool con

これで接続したはずの BLE デバイスが表示されないとうまく接続できていないことになります
おそらく大丈夫だと思いますがダメな場合は lecc のコマンドに --random のオプションを付けて実行してみてください

安定した接続が確認できたら lecc 時に発行されるハンドル番号をもとに一旦切断します

  • sudo hcitool ledc NN

切断しない状態で gatttool 等を実行すると

Error: connect error: Device or resource busy (16)

というエラーが発生してしまいます

gatttool で接続する

では次に gatttool でも接続してみましょう
先ほど lescan で検知した同一の Mac アドレスに接続してください

  • gatttool -b xx:xx:xx:xx:xx:xx -I

lecc 時に --random をつけていた場合には gatttool 実行時にも random で接続してください

  • gatttool -t random -b xx:xx:xx:xx:xx:xx -I

これでインタラクティブモードに入ります
問題の元凶である Connection refused (111) はここで connect 時に発生していました

[xx:xx:xx:xx:xx:xx][LE]> connect
Attempting to connect to xx:xx:xx:xx:xx:xx
Connection successful

こんな感じになれば OK です
あとは SensorTag を Read/Write してみましょう
終わったら disconnect してください

[xx:xx:xx:xx:xx:xx][LE]> char-read-hnd 0x25
Characteristic value/descriptor: 0a 26 00 00 00 00 00 00 00 00 b0 00 40 51 04 03 aa 00 f0
[xx:xx:xx:xx:xx:xx][LE]> char-write-cmd 0x29 01
[xx:xx:xx:xx:xx:xx][LE]> disconnect

その他試したこと

いろいろと Try&Error したので覚えている限りで事象を記載します
もちろんここに記載していることは全部ダメでした

  • hcitool, gatttool のコマンドオプションをいろいろ変更してテスト
    特にタイプの public や random を変更してやってみました
    関係ないわけではないですが、根本対応が問題で効果はありませんでした

  • 異なる USB ドングルを使ってみる
    RaspberryPi に接続されているドングルが原因なのではと思い ELECOM 製以外の USB ドングルを接続してみましたがダメでした
    また、USB ドングルの再接続も何度か試しました

  • HCIの再起動
    sudo hciconfig hci0 down
    sudo hciconfig hci0 up
    で再起動してみましたがダメでした

  • BlueZ のバージョンアップ
    実は初めは 4.99 で試していました
    それでダメだったのでソースインストールに切り替えたのですがそれでもダメでした

  • 既存の BlueZ の削除
    apt-get でインストールした 4.99 を apt-get –purge remove してからソースインストールしたのですが、ダメでした

  • 別のBLEデバイスを用意してテスト
    BLE デバイス側が悪いのではと原因を切り分けるために別の BLE デバイスを用意してテストしました
    用意したデバイスは BL600 と 自作のペリフェラルiPhoneアプリを作成しました

  • Kernel のバージョンだけあげて BlueZ を再コンパイル&インストール
    rpi-update を使ってカーネルのバージョンをアップデートしました
    結果的にカーネルだけではダメでした

  • OS のバージョンをあげて BlueZ を再コンパイル&インストール
    OS のバージョンをあげた場合はソースインストールせず、apt で配布されている BlueZ を使用するのが正解でした

Tips

  • bluez-simple-agent や bluez-test-device, bluez-test-input 等のコマンドがなくなっています
    bluez-utils のパッケージが Jessie では削除されているため上記のコマンドが使えなくなります
    調べた限りだと bluetoothctl というコマンドで代用するみたいですが、詳細な方法(コマンド)までは調べていません

  • Could not create connection: Connection timed out
    hcitool lecc コマンドで上記のエラーが発生することがあります
    このエラーがでると同じ Mac アドレスに次回以降接続しようとしても Could not create connection: Input/output error となり接続できません
    その場合は hcitool を使って対象の hci を再起動してください

    sudo hciconfig hci0 down
    sudo hciconfig hci0 up

  • Bluetooth: SMP security requested but not available
    lecc 実行時に dmesg のログに発生する
    初めはこれが問題だと思いいろいろとググるが結果的に問題なく lecc できていたときにも発生していた
    とりあえず原因不明のまま無視することにした

  • 接続できない場合の hcidump の特徴

> HCI Event: Command Status (0x0f) plen 4
    LE Create Connection (0x08|0x000d) status 0x00 ncmd 1
> HCI Event: Command Status (0x0f) plen 4
    LE Read Remote Used Features (0x08|0x0016) status 0x00 ncmd 1
> HCI Event: Command Status (0x0f) plen 4
    Disconnect (0x01|0x0006) status 0x00 ncmd 1
> HCI Event: Disconn Complete (0x05) plen 4
    status 0x00 handle 72 reason 0x16
    Reason: Connection Terminated by Local Host

うまく接続できない場合には hcidump にずっと上記のようなログが出力されていました
うまく接続できたと思っても Connection Terminated by Local Host が強制的に発生し BLE デバイスとの接続を勝手に切断sれていました
対処後はこのログも出なくなりました

最後に

対象のエラー文でググるとカーネルがバグっている系と BlueZ のバージョンをあげてくださいという記事が多く見受けられたような気がします
カーネルは確かに怪しかったので rpi-update でアップデートしたのですが、まさか OS まであげないとダメとは思いませんでした
そしてソースインストールした BlueZ も悪いとは思いませんでした
1週間はがんばったと思います
この記事が誰かの助けになれば幸いです

2015年10月14日水曜日

CentOS で Consul 入門

概要

CentOS 上で Consul を触ってみたのでメモ

Consul はいわゆる、サービスディスカバリのためのツールです
あるクラスタにサーバが1台追加されたら、それを検知して何かアクションを実行したりすることができます
今回は2台のサーバを用意して試してみました

環境

  • CentOS 6.6 64bit
  • Consul 0.5.2

インストール

バイナリを1つ配置して終了です

サーバモードで起動

1台はサーバモードで起動します
サーバ側の IP は 192.168.0.10 (server001) とします

  • consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul &

クライアントモードで起動

クライアント側はサーバモードで起動したノードに対して join します
クライアント側の IP は 192.168.0.11 (client001) とします

  • consul agent -data-dir=/tmp/consul -server -join 192.168.0.10 &

クラスタ内のメンバーを確認する

  • consul members
Node           Address            Status  Type    Build  Protocol  DC
server001      192.168.0.10:8301  alive   server  0.5.2  2         dc1
client002      192.168.0.11:8301  alive   client  0.5.2  2         dc1

サーバ、クライアントどちらで実行しても OK です
こんな感じで表示されるはずです
どちらのノードも alive になっていることがわかると思います

終了する(リーブする)

特定のクライアントを終了したい(クラスタから離脱させたい)場合は kill をするのではなく leave コマンドを使います

  • consul leave

これでプロセス自体もいなくなります
consul members で見てみると alive だったのが left になっているのが確認できると思います

consul watch で特定のコマンドを実行してみる

例えば server001 で以下を実行してみましょう

  • consul watch -type=service -service=consul “echo change services >> /var/tmp/consul.log”

クラスタ内に属するどれかのサーバで consul プロセスに何か変化があった場合に最後に指定したコマンドが実行されます
この状態で client001 で consul leave を実行するとコマンドが実行されファイルに文字列が出力されると思います

type はいろいろと指定できます
今回指定した service はサービスプロセスの変化を watch するタイプです
他にも key (key - value ストアの変化を watch する) , event (任意のイベントの発行を watch する) などがあります
詳細はここの Watch Types という項目に記載されています

最後に

簡単ですが、インストールから起動、consul watch までを試してみました
印象は非常にシンプルで便利なツールだと思いました
シンプルが故に応用もかなり効くと思います
今回は紹介しませんでしたが、クラスタ内で KVS を共有できたり、クラスタ内で DNS を立てたりすることもできるようです

たぶん機能の肝になるのは consul watch かなと思います

参考サイト

2015年10月13日火曜日

RaspberryPi 超入門 〜OS起動まで〜

概要

RaspberryPi の OS の準備ができたので実際に起動まで行ってみました
起動用の OS 準備編はこちら

環境

RaspberryPi の購入に関して

実は購入は2013年にしており最新版のRaspberryPiを使っているわけではありません
また、購入自体は本家 RaspberryPi のサイトから購入しました
raspberry_order.png

配線

配線は基本4箇所でOK

  • RaspberryPi <- SDカード
    裏側にSDカードの挿入 I/F があります

  • RaspberryPi <- キーボード
    USBポートに接続します

  • RaspberryPi <- HDMIケーブル -> モニタ
    HDMIポートに接続します

  • RaspberryPi <- 電源ケーブル -> コンセント
    MicroUSBポートに接続します
    電源ケーブルは今回 RaspberryPi と同様に公式サイトで購入したものを使っています

RaspberryPi 的にはこんな感じで接続されていればOKです
raspberry-pi.jpg

電源ON

RaspberryPi に特に電源スイッチはありません
上記配線を完了した上でコンセントに電源プラグを接続してください
電源が共有されると自動で RaspberryPi が起動します
起動する PWR という LED が点灯します
起動中は ACT という LED が点滅し起動処理を実施します

raspi-config

いわゆる BIOS の設定画面です
ここではローケールの設定やタイムゾーン、キーボードのレイアウトなどを設定します
自分は以下の部分だけ設定しました

  • Expand Filesystem (1)
    ストレージとして使用するSDカードの領域を拡張してくれます
    基本は実行したほうがいいと思います
    クリックするだけでOKです

  • Internationlisation Options (4)

    • I1 Change Locale -> リスト表示 -> ja_JP.UTF-8 UTF-8 -> ja_JP.UTF-8
    • I2 Change Timezone -> Asia -> Tokyo
    • I3 Change Keyboard Layout -> リスト表示 -> Generic 105-key (Intl) PC -> Other -> Japanese -> Japanese (OADG 109A) -> The default for the keyboard layout -> No compose key -> Yes
  • Advanced Options

    • A4 SSH -> Enable

あたりを設定しました
Locale を ja_JP に設定すると日本語が化ける問題が発生するので日本語フォントをインストールする必要があります
( 日本語表示が全部豆腐 (■) になってしまいます )
英語キーボードでかつ RaspberryPi で日本語表示されなくてもいい場合は、Internationlisation Options は Timezone だけ設定すればいいと思います

その他の項目の詳細は公式の raspi-config の説明を御覧ください
日本語でも調べればいろいろでますが、Raspbian のバージョンによって設定項目が変わると思いますのでバージョンにご注意ください

ログイン

起動が完了するとログインプロンプトが表示されます

raspberrypi login :

raspi-config で特にユーザのパスワード等は設定していないのでデフォルトの ID/PW でログインできると思います

pi / raspberry

成功するとコマンドプロンプトの表示になりコマンドを入力することができるようになります

pi@raspberrypi ~$ ls

基本的な Linux のコマンド ( ls や cd ) は普通に使えます

最後に

とりあえず起動して OS へログインすることに成功しました
RaspberryPi 自体 Linux みたいなものなので慣れている方はある程度簡単に使えると思います

RaspberryPi 自体は小さくていいのですが、とは言えやはり始めるにはいろいろと周辺機器が必要になってしまうのは仕方ないといったところでしょうか

いざやる気になって RaspberryPi を購入したものの、キーボードやらモニタやら各種ケーブルやらがない、、、という状況になってしまう人は多いのではと思いました

2015年10月12日月曜日

RaspberryPi で WiMAX2 に接続する方法

概要

USB の Wi-Fi ドングルを使って RaspberryPi を無線 LAN に接続してみました

環境

無線LANの設定

RaspberryPi を起動する前に USBドングルは接続しちゃってください
空いている RaspberryPi 上の USB ポートを使ってしまえばOKです

接続した状態で RaspberryPi が起動したら Wi-Fi の設定をしていきます

USBドングルの接続確認

  • lsusb

を実行して USB ドングルを RaspberryPi が認識しているか確認してください
今回の場合だと BUFFALO INC. という文字列を含む行が出力されていれば OK です

Wi-Fi 接続用ファイルの作成

ルータに接続する設定ファイルを作成します
事前に SSID と接続用のパスワードを用意しておいてください

  • sudo cp /etc/wpa_supplicant/wpa_supplicant.conf{,.back}
  • sudo chmod 666 /etc/wpa_supplicant/wpa_supplicant.conf
    バックアップを作成して書き込み権限を付与してあげます

  • sudo wpa_passphrase [ssid] [password] >> /etc/wpa_supplicant/wpa_supplicant.conf

  • sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

wps_passphrase コマンドで接続用の設定を出力してファイルにリダイレクトします
[ssid] と [password] は自分の環境の ID/PW に変更してくだdさい
wps_passphrase コマンドの内容だけでは足りないのでファイルを開いて直接編集します

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        proto=WPA2
        key_mgmt=WPA-PSK
        pairwise=CCMP
        group=CCMP
        ssid="ssid"
        psk=xxxxxxxxxxxxxx
}

network の部分が追記部分でここに他に必要なパラメータを追記します
自分の場合は

  • proto=WPA2
  • key_mgmt=WPA-PSK
  • pairwise=CCMP
  • group=CCMP

の 4 つのパラメータを追記すれば OK でした
追記したら保存します

  • sudo chmod 600 /etc/wpa_supplicant/wpa_supplicant.conf

権限も戻しておきましょう

DHCP で IP を取得するように設定

ルータからは DHCP で IP を取得するようにします
こちらも念のためバックアップを取得してから実施します

  • sudo cp /etc/network/interfaces{,.back}
  • sudo vi /etc/network/interfaces

iface wlan0 inet dhcp

wlan0 の manual の部分を dhcp に書き換えればOKです

ネットワーク起動

  • sudo /etc/init.d/networking restart

でルータから IP を取得できれば OK です
取得できない場合は設定ファイルに不備がないか確認してください
Wi-Fi の設定によっては設定ファイルの書き方が異なります
例えば暗号化モードに(ないとは思いますが) WEP を採用している場合は書き方が代わります

確認

pi@raspberrypi ~ $ ifconfig wlan0
wlan0 Link encap:イーサネット ハードウェアアドレス aa:bb:cc:dd:ee:ff
inetアドレス:192.168.179.13 ブロードキャスト:192.168.179.255 マスク:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:623 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:408 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1000
RXバイト:88191 (86.1 KiB) TXバイト:56337 (55.0 KiB)

あとは apt コマンド等でパッケージのインストールができることも確認するといいと思います

sudo apt-get install emacs

Tips

今回使った子機はかなり熱を持つため RaspberryPi ではちょっとオススメしません
長時間起動していると USB ポートの部分がかなり熱くなってしまいます

P.S 20151130
ステルスモードのアクセスポイントを使っている場合は以下を試してみてください
http://blog.rutoru.com/2014/04/05/raspberry-pi-wifi/

自分の場合は PSK を手動でコピーするのが面倒だったので以下のような流れで作業しました

  • chmod 666 /etc/network/interfaces
  • sudo wpa_passphrase [ssid] [password] | grep psk= | grep -v “#psk” >> /etc/network/interfaces
  • 以下を手動で修正する
    • #wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    • wpa-driver wext
    • wpa-scan-ssid 1
    • wpa-ssid “ssid”
    • wpa-psk “xxxxxxxxxx”
  • sudo /etc/init.d/networking restart

で参考サイト通り無事取得できました