BLEで何かつくる

BLEを使って何かつくれないか考えてみる。

ただBLEといっても漠然としすぎてるので、アイデア出しの下地として以下の構成を考えてみた。

  • 各機器の構成
    • スマホとRaspberry PiをBLEで通信させる
    • Raspberry Pi はネットにつながってて、JSONとかでWebサーバと通信させる
    • Raspberry Piはコンセントから電源を供給、Wi-Fiで常時ネットにつながっている
    • Raspberry PiのGPIOにはデバイス(センサーなど)をつなげることができる

f:id:yamataka548:20150212180258p:plain



Raspberry Pi ではなく Arduino とBLE通信させる構成だとこんな感じ。

  • 各機器の構成
    • スマホArduinoをBLEで通信させる
    • Arduino は電池で電源を供給
    • ArduinoのGPIOにはデバイス(センサーなど)をつなげることができる

f:id:yamataka548:20150212193514p:plain



ちなみに、よくあるBeaconの構成はこんな感じで、スマホのアプリになにかアクションを起こさせるトリガとしてBLE(アドバタイズメント・チャネル)を使っている。

Beacon はアドバタイズメント・チャネルでID情報(UUID:会社ID, major:店舗)を一定時間ごとに送信する。スマホはID情報を受信すると、アプリを起動してアクションを起こす。
このアクションは、例えばWebサーバからメッセージを取得すること (いわゆるプッシュ通知) や、アプリ内ダイアログやビルトイン機能を表示することなど。

Beacon 自体は単にID情報をブロードキャストするだけなので、ボタン電池で数年稼動させることができる。

f:id:yamataka548:20150212182658p:plain

BLE: Bluetooth Low Energy

技術的な特徴はこんな感じ。

  • BLE機器を低消費電力でつくれるため、ボタン電池で数年稼動
  • 免許不要の2.4GHz帯を利用して、最大1Mbpsの通信が可能
  • 通信距離は2.5mから50m

通信は2種類ある。

  • 1対1通信
    • Central (スマホなど) と Peripheral (BLE機器)の通信
    • アドバタイズメント・チャネルによる通信
      • Peripheral の発見と接続に使う
    • データ・チャネルによる通信
      • データ通信に使う
    • 暗号化通信可
  • N対1通信
    • Broadcaster (BLE機器) と Observer (スマホなど) の通信
    • アドバタイズメント・チャネルによる通信
      • Broadcaster の発見と接続に使う
    • 暗号化通信はできない

スマホ/タブレットの対応状況は、Android/iOS端末で下記の通り。

  • Android端末
    • OS: Android4.3(APIレベル18)以上
    • デバイス: 端末にBluetooth4.0が搭載されていること。端末メーカーの仕様を確認。
  • iOS端末
    • OS: iOS7以上
    • デバイス: iPhone 4S以降、iPad (第3世代)以降

用途は下記がある。

  • Beacon
    • スマホの位置情報を特定し、ロケーションに合わせて必要な情報を配信する
    • スマホを測位する距離モードは10メートル程度/数メートル程度/数センチ程度と3段階を判別できる

Cloudera Manager / CDH のメモ

Cloudera Manager 5

Cloudera Manager 5 を消して 4 を入れ直すときの罠

Cloudera Manager 5 をアンインストールした後、Cloudera Manager 4を入れる場合は /var/cache/yum/x86_64/6/cloudera-manager 配下を消す必要があるみたいだ。
残っていると、Cloudera Manager 4のインストーラが5のパッケージを参照してエラーになるため。

sudo rm -rf /var/cache/yum/x86_64/6/cloudera-manager 


また、各Agentホスト(Cloudera Manager Serverホストを除く)の /etc/yum.repos.d/cloudera-manager.repo が Cloudera Manager 5向けのものに変わっているので消す。

sudo rm /etc/yum.repos.d/cloudera-manager.repo
sudo rm /etc/yum.repos.d/cloudera-cdh.repo

なんか、ほかにも消さなきゃならんかもしれん。

http://[cloudera manager host]:7180/ へアクセスした後、インストールウィザードの「クラスタインストール」の画面で真っ白になって操作不能になって困っていたが、原因はブラウザのキャッシュだった。
クリアしたら治った。。

罠大杉だろう。

hbaseクライアント起動時に hbase-site.xml を参照できてなさそうなときの対処

hbaseクライアント起動時のクラスパスに hbase-site.xml を配置したディレクトリへの参照がない場合、下記のような例外が起こる。

java.lang.RuntimeException: java.io.IOException: org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation@3801318b closed

hdfs コマンドで FileSystem file:/// is not a distributed file system とか出て困った

HDFS入れたし動作確認してみようと、下記コマンド実施。失敗。

$ sudo -u hdfs hdfs dfsadmin -report
[sudo] password for admin:
report: FileSystem file:/// is not a distributed file system
Usage: java DFSAdmin [-report]

原因は /etc/hadoop/conf が参照している設定が /etc/hadoop/conf.empty を参照してたため。

alternatives コマンドでHDFSの正しいクライアント設定を参照するように変更してやればいい。

HibernateのQueryクラス setDate(), setTime(), setTimestamp() の違い

java.util.Date インスタンスを Query#setDate() で格納して取り出したら時刻が00:00:00になってしまい困っていた。
時刻まで格納するには setTimestamp() を使えばいい。


java - What's the difference between setTime(...) and setTimestamp(...) in Hibernate Query? - Stack Overflow