前人未踏の領域へ ガジェット編

購入したガジェットの記録などなどのメモ置き場です。

Raspberry Pi 無線LAN接続

Raspberry Piに無線LAN経由で接続を行う。

用意するもの

個人的に実績のあるBUFFALOのWLI-UC-GNMEを推奨しておきたい。 これなら最新のはもちろん、古いRaspberry Piでも認識してくれる。 調子にのって高性能な最新のを選ぶと認識されずに苦労するので注意。

ちなみに今回用意したRaspberry Pi 2ならつないだ時点で無線LANを 認識して使えるようになってたのでGUIからいける気がするが、一応書いておく。

www.amazon.co.jp

無線LANを認識していることをを確認

接続したらコマンドを叩いてwlanを認識してくれているかを確認しよう。

pi@raspberrypi ~ $ ifconfig
wlan0     Link encap:イーサネット  ハードウェアアドレス cc:e1:d5:3f:bc:4a 
          inet6アドレス: fe80::3396:f140:f9b2:8ed9/64 範囲:リンク
          UP BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000 
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)

認識はされているものの、inetアドレスが割り当てられていないのでこれを行うことにしよう。 続いてlsusbコマンドでみてみる。

pi@raspberrypi ~ $ lsusb
Bus 001 Device 006: ID 04fe:0007 PFU, Ltd 
Bus 001 Device 005: ID 04fe:0008 PFU, Ltd 
Bus 001 Device 004: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

ちゃんと認識されているようだ。

Bus 001 Device 004: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]

親機との接続

次に親機との接続設定を行う。wpa_passphraseコマンドを以下のように叩く。ちなみにWLI-UC-GNMは2.4GHzにしか対応していないので 5GHzと間違えないように。

pi@raspberrypi ~ $ wpa_passphrase ${SSID} ${パスフレーズ}
network={
    ssid="${SSID}"
    #psk="${生パスフレーズ}"
    psk="${暗号化パスフレーズ}"
}

するとnetwork設定が出力されるので、そいつをwpa_supplicant.confに追記する

pi@raspberrypi ~ $ sudo vim /etc/wpa_supplicant/wpa_supplicant.conf

パスフレーズは間違いがないか確認が取れたら消してしまおう。 また、利用する無線LANの設定に応じていくつか設定を追加する

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="${SSID}"
    psk="${暗号化パスフレーズ}"
        key_mgmt=WPA-PSK
        proto=WPA2
        pairwise=CCMP
        group=CCMP
        priority=2
}

続いてinterfacesを編集。

pi@raspberrypi ~ $ sudo vim /etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

iface eth0 inet manual

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

allow-hotplug wlan1
iface wlan1 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

再起動

再起動後にifconfigしてwlan0にipアドレスが割り当てられていれば成功。

参考

www.amazon.co.jp

Raspberry PiにVNCでリモートアクセス

古い記事 の引越し、コピペ。

GUIでリモートログインしたい場合はVNCを利用できる。http://elinux.org/RPi_VNC_Server を参考にTightVNCを入れてみた。

セットアップ

#インストール
$ sudo apt-get install tightvncserver
#起動
$ tightvncserver

portは5900か5901で立ち上がるかと。

Macから接続する

macはデフォルトでVNCクライアントを持つらしい。Finder → 移動 → サーバーへ接続 で以下を入力。

vnc://raspberrypi.local:5901

成功するとこんな感じでアクセスできる。 f:id:takeR:20151102022957p:plain

参考

www.amazon.co.jp

Raspberry Piに SSHでリモートアクセス

古い記事の引越し。コピペ。

デフォルト設定であればすでにSSHが有効になっていて、外部からのフルアクセスが可能なはずなので、それを前提に接続のみ。IPアドレスDHCPで割り当てられたものを確認。

$ ssh pi@IPアドレス

** ホスト名でアクセスする Avahiを使用することで、ネットワーク名から名前解決をしてRaspberryPiにアクセスが可能になる。 最新のRaspberry Piなら最初から入っているかも。

$ sudo apt-get install avahi-daemon

インストールが完了したらraspberrypi.localでアクセスできるようになる。

$ ssh pi@raspberrypi.local

Estimote Nearables Developer KitでiBeaconについて学ぶ(Android編)

去年注文したEstimote stickersの開発向けキットが注文から丸一年ほどしてようやく届いたので早速試してみる。

estimote.com

なお、私は現在Android開発者なので、Androidで動作確認を行う。iOSでも試すかは未定。でもAndroidでは機能不足な雰囲気。

ドキュメント

まずは技術ドキュメントのありかを探すところから。Estimoteの開発はiOSが中心に行われている。Androidには含まれない機能も多いので、iOS経験者なら迷わずiOSを選択すべし。 AndroidについてはGitHubSDKのみではないだろうか。

概要

ざっくりと公式サイトの拙訳をしてみる。

iBeaconとは何か

Beaconは小さなコンピューターである。その32-bit ARM® Cortex M0 CPUには加速度、温度センサー、そしてBluetooth 4.0 Smart 、別名BLEと呼ばれる2.4Ghzの無線を備える。

以前のBluetoothテクノロジーと比較した際のもっとも大きなアドバンテージはエネルギー利用効率の高さである。それと我々のエンジニアが電源管理に関する多くの仕事を入れたおかげでEstimote Beaconsはたった1つのCR2477バッテリー上でデフォルト設定で3年間持続する。

信号範囲と近接計測

Beaconは灯台と考えることができる。しかし光の代わりに信号派を、船の代わりにスマートフォンにその存在を知らせる。Estimote Beaconsは70メートルの範囲を持つ。しかしその信号は回析(障害物の向こう側に届く)されることができ、水(人体も含む)によって妨害または吸収される。現実世界では40m-50mと考えるのがよい。

携帯や他のスマート端末はその信号の強さから距離を計測することができる。 Beaconに近ければそれだけ強い信号を受ける。Beaconはその信号を連続的にブロードキャストしているのではなく、断続的に点滅していることに注意が必要である。

Estimote Stickersとは何か

Estimote Stickersはより小さなBeaconで、厚さが3mmしかない。それらはまた1つのバッテリーで動作するARM CPUに加速度、温度計、そしてBlutooth信号を組み込んでいる。

オリジナルのBeaconが発生地点と静的なロケーションのために設計されたのに対し、Stickersは独立したオブジェクトをスマートにするのに最適である。

Nearablesは毎日のアイテム(あるいは犬なども!)をスマートオブジェクトに変化させるEstimote Stickersとクラウドのおかげで、何でもその位置とモーション、そして環境をブロードキャストできる。

stickersはどのように動作するのか

Estimote Stickersは7メートルの範囲と、1つのCR2020バッテリーあたり1年の寿命を持つ。 ランダムなiBeacon IDの平行して、stickersは定義されたNearable IDとNearable Typeを持つ。 Nearable IDは8byteの数値で、Nearable Typeはプログラムされた10分の1のコンテキストstikcerである。

  • bag バッグ
  • bed ベッド
  • bike バイク
  • car 車
  • chair 椅子
  • dog 犬
  • door ドア
  • fridge 冷蔵庫
  • shoe 靴
  • ブランク(自分ようのコンテキストを製作できる)

Stickersは2つのプロトコルを使ってデータをブロードキャストする。 iBeaconとNearableである。 これはそのパケット内により多くのデータを含むことができるようになり、全てのiBeaconの機能の 利益を得る。

nearableプロトコルには以下の情報が含まれる

  • nearable ID 8bytes
  • nearable Type ID (fridge,dog, shoe ...)
  • 方向
  • 空間内の方向
  • 動作モーションのX,Y,Z値
  • 温度
  • ブロードキャスト値(近接計算に使われる)
  • バッテリーレベル
  • ファームウェアのバージョン

nearableの開発

nearableと対話するアプリはiBeaconと同じロジックに従う。ただしiBeacon IDの代わりに Nearable IDとNearable Typeを使う。もしiBeaconの経験があるなら、stickersを使うことは たやすい。

加えて、何かをトリガーとしたいなら、全ての状況に応じたデータが得られる。方向、nearable type, モーション、周囲の温度、1日の時間などだ。

<拙訳終わり>

どこから始めたらいいの?

とりあえず開発キットは届いたが何をどうすればよいのか。これも公式ブログに記事がある。

How to get started with Estimote Beacons? – Estimote Community Portal

だいたい以下のような感じのことが書いてある

  1. 箱から出せ
  2. アプリをダウンロードせよ
  3. スマホBluetoothと位置情報を有効にせよ
  4. デモをやってみろ
  5. Estimoteのアカウント作れ
  6. 自分のアプリを作れ!!

大したこと言ってない気がするが、とりあえずアプリをダウンロードして使ってみよう。

アプリのダウンロード

公式のデモアプリがあるのでインストールしてみる。先に述べておくと、このアプリよりもGitHubSDKに付属するデモアプリの方が参考になるだろう。

アカウントを作ろう

注文した人は既にアカウントを持っているはず。 Estimote Cloudにログインすると購入済みのBeaconなどの情報が得られる。

Estimote Cloud

Android SDKを試す

GitHubSDKがある。jar及びaarでの提供となっており、オープンソースではないっぽい。

Android 4.3以上

Bluetooth Low Energyが4.3からなので、SDKも4.3以降が対象となっている。すなわちminSdkVersionは18となる

defaultConfig {
    minSdkVersion 18
  }

SDKでできること

  • 範囲内にあるBeaconのスキャン(またはフィルタ)、レンジング
  • Beaconの領域検知(Beaconのエリアに入った・出た)
  • nearables (Stickerなど) の発見
  • EddyStoneのスキャン Beacons   |   Google Developers
  • Beaconの特性の読み書き

renging(レンジング)とは何か

デバイスとビーコンとの相対的な距離を測ること

参考: iBeacon(3) - リージョン監視とレンジング

アプリを登録する

estimote cloudにアプリを登録することでAPP_IDとAPP_TOKENがもらえる。なお、アプリ登録時に選択肢にSwiftObjective-Cしか選べない箇所があるが、IDとTOKENのゲットには関係がないので適当でOK。登録が終わるとテンプレート実装がダウンロードされるが、これもiOS向けなのでAndroidには無関係である。

実装

ざっくりいうと

  • onCreate でManagerつくってリスナーを設定
  • onStart で接続してスキャン開始
  • onStop でスキャン停止
  • onDestroy で切断

Application

EstomoteSDKの初期化をApplicationクラスの継承クラスで行う。 Estimote Cloudに登録していない場合はこの記述は不要かもしれない(未確認)。

public class EstimoteApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

    // Initializes Estimote SDK with your App ID and App Token from Estimote Cloud.
    // You can find your App ID and App Token in the
    // Apps section of the Estimote Cloud (http://cloud.estimote.com).
    EstimoteSDK.initialize(this, EstimoteConstants.APP_ID, EstimoteConstants.APP_TOKEN);

    // Configure verbose debug logging.
    EstimoteSDK.enableDebugLogging(true);
    }
}

Activityの実装サンプル

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private BeaconManager beaconManager;
    private String scanId;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        beaconManager = new BeaconManager(getApplicationContext());

        Log.d(TAG, "onCreate isBluetoothEnabled:" + beaconManager.isBluetoothEnabled());
        Log.d(TAG, "onCreate checkPermissionsAndService:" + beaconManager.checkPermissionsAndService());
        Log.d(TAG, "onCreate hasBluetooth:" + beaconManager.hasBluetooth());

        beaconManager.setNearableListener(new BeaconManager.NearableListener() {
            @Override
            public void onNearablesDiscovered(List<Nearable> nearables) {
                Log.d(TAG, "Discovered nearables: " + nearables);
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
            @Override
            public void onServiceReady() {
                scanId = beaconManager.startNearableDiscovery();
                Log.d(TAG, "onServiceReady scanId:" + scanId);
            }
        });
    }

    @Override
    protected void onStop() {
        super.onStop();
        beaconManager.stopNearableDiscovery(scanId);
        Log.d(TAG, "onStop scanId:" + scanId);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        beaconManager.disconnect();
    }
}

データが取得できればこっちのもの。あとは良しなに実装すればよい。