キャスレーコンサルティング 技術ブログ

Linkingを使用してIoT技術に触れてみた

Posted on 01月 11, 2017

キャスレーコンサルティングSI(システム・インテグレーション)部の鈴木です。
今回は鈴木チーム全員でLinking APIを使用してIoT技術を体験した模様をお伝えします。

メンバーは以下の3名です。
鈴木(要件定義担当、アプリ開発リーダー、ブログ執筆担当)
田中(孝)さん(アプリ開発メンバー、社内勉強会講師担当)
谷本さん(アプリ開発メンバー)

Linking対応アプリを作るきっかけ

世間では以前からIoT(Internet of Things)という単語が飛び交っていましたが、
ここ最近、自動運転技術のレベルが進展したりスマートデバイスが登場して
より一層IoTが注目を集めるようになってきました。

しかし、チームのメンバーはみんな業務アプリケーション開発技術者であり、IoTに興味はあっても、
なかなかIoTの技術に触れる機会がありませんでした。

そんなとき、NTT DoCoMoがProject Linkingというプロジェクトを展開していることを知りました。
(https://linkingiot.com/)

Linkingプロジェクトでは、デバイスとアプリの連携をサポートするAPIを提供しています。
・デバイス開発者はLinking APIに準拠したデバイスを製作します。
・アプリ開発者はLinking APIに従ってアプリとデバイスのI/Fを記述します。

Linking
※図はProject Linkingのサイトより

Linkingによって、デバイス開発者は自分が作成したデバイスを専用アプリ「のみ」ではなく、
いろんなアプリからデバイスを使ってもらうことができ、アプリ開発者は専用デバイス「のみで」使える技術ではなく、
異なるデバイスを扱うときもLinking API対応のデバイスであれば、習得した技術を生かすことができます。

「専用」「のみ」といったキーワードが少なく、「いろんな」「どんな」といったキーワードが増えるほど
その技術は技術者にとってもユーザにとっても身近になります。
つまり、LinkingはIoTを身近な技術にすることに挑戦するプロジェクトだということです。
※鈴木個人の見解です

今までIoTに疎遠だった自分たちにぴったり!
さっそくアプリ開発を体験してみることになりました。

Linkingで何つくる?

どんなデバイスを使ってどんなアプリを開発するか。
IoTの肝といえる部分。

物がただ単にインターネットに繋がっているだけではそれほど意味がなく、
物から得られる情報をどう扱うかでIoTの価値が決まります。

デバイスで出来ること:温度取得、湿度取得、位置情報取得、LED点灯・点滅
※デバイスによってどれが出来るか異なる
デバイスとスマホ間の通信:LinkingはBluetooth Low Energy(BLE)でスマホとデバイスの通信を行う

議論を重ねた結果、
温度センサー、湿度センサー、LEDを搭載し、クリップ留めができる「Tukeru」というデバイスを使用して、
ペットのケージ(飼育スペース)内の温度、湿度を監視するアプリ「ペット快適生活」を開発することになりました。

ケージに「Tukeru」を取り付けて、温度、湿度を監視し、大切なペットを熱射病や低体温から守ります。
飼い主とペット、共に嬉しいアプリだと思います。

快適な環境ではなくなった場合、アプリにメッセージを表示するとともに、デバイスのLEDを点灯させ、
ユーザにお知らせします。

◆「ペット快適生活」の搭載機能
画面設計
1.不適切環境と判断した際のアラートを表示する領域
2.飼育に適切とされる温度、湿度を設定する領域
3.現時点の温度、湿度表示

デバイスとのI/F
4.デバイスから温度、湿度情報を取得する機能
5.不適切環境と判断した際に、デバイスのLEDを点灯させる機能

業務処理
A.一定間隔でデバイスから情報を取得
B.デバイスから取得した温度、湿度が快適な温度、湿度範囲内にあるか判定
C.範囲外の場合に画面にアラートメッセージを表示し、デバイスのLEDを点灯する

ここからはアプリ開発の肝である、デバイスとのI/F機能(上記4.と5.)の実装について、
他ではあまり触れられていない部分について紹介します。
なお、正式なAPI仕様についてはProject Linkingの開発者用ページをご覧ください。

LinkingAPIを使った実装

今回はすべてMainActivity.java内に記述しました。

デバイスからセンサーデータを取得する

onCreate()にデバイスのセンサーデータを取得するControlSenSorDataオブジェクトを生成します。

mySensorDataInterface = new MySensorDataInterface();
mSensorData = new ControlSensorData(this, mySensorDataInterface);

onClick()の見守り開始ボタン押下時の処理として、まずは接続デバイス情報を取得します。

// 接続デバイス情報の取得
GetDeviceInformation getDeviceInformation = new GetDeviceInformation(this);
List<DeviceInfo> deviceInfos = getDeviceInformation.getInformation();

if (deviceInfos.isEmpty()) {
    Log.e(TAG, "デバイス情報が取得できませんでした");
    return;
}

// 複数のデバイス情報を取得可能(今回はデバイスは一つなので引数は0固定)
DeviceInfo info = deviceInfos.get(0);

デバイス情報を取得できたら、以下のようにセンサーデータに情報を設定し、センサーデータ取得を開始します。
通知間隔と通知継続時間は単位が違うので注意が必要です。

// センサーデータ通知間隔(ミリ秒)
mSensorData.setInterval(10*1000);
// センサーデータ通知継続時間(秒)
mSensorData.setDuration(600);
// センサータイプ情報
mSensorData.setType(4);
// デバイスのBDアドレス("00:11:22:AA:BB:CC"形式)
mSensorData.setBDaddress(info.getBdaddress());
// デバイスへセンサーデータの取得開始依頼
mSensorData.start();

センサータイプの設定値は以下の通りです。
setType表

センサーデータを取得

センサーからデータを取得した時の処理はMySensorDataInterface.onSendorData()に記述します。
originalDataには拡張センサーのデータが格納されています。
データは指数表現で記述されており、比較や画面表示をする際には10進数に変換する必要があります。
今回はお試しということで、変換処理はLinkingAPIダウンロードファイルに同梱されているサンプルプログラムから
流用しました。

@Override
public void onSensorData(String bd, int type,float x,float y,float z, byte[] originalData, long time) {
    float fVal;
    BigDecimal bigD;

    Log.d(TAG, bd + ":センサーデータを受信しました。");

    if(type == 4) {
        // 指数表現→10進数への変換
        // (LinkingAPIダウンロードファイルに同梱されているサンプルプログラムよりPairingUtilを流用)
        fVal = PairingUtil.convertOriginalData(4, originalData);
        // 小数第二位を四捨五入
        bigD = new BigDecimal(String.valueOf(fVal));
        fCurTemp = bigD.setScale(1, BigDecimal.ROUND_HALF_UP).floatValue();
        // 画面項目curTempに表示
        curTemp.setText(String.valueOf(fCurTemp));
    }
    Log.d(TAG, "現在の温度:" + fCurTemp);

実際に取得した値はこのように表示されます。
after_getTemp_a

デバイスのLEDを点灯させる機能

取得した温度、湿度がアプリで設定した快適温度と快適湿度の範囲内にあるか判定します。
範囲内にあれば「快適」なので何もせずに監視を継続しますが、範囲外である場合はアプリにメッセージを表示し、
デバイスのLEDを点灯させます。
ではLEDの点灯を行う処理を見ていきます。

onCreate()内に拡張センサーの通知用クラスSendOtherのオブジェクトを生成します。

// 拡張センサー情報の通知用
sendOther = new SendOther(this);

デバイスに拡張センサー情報を通知するときは以下のように記述します。

// デバイスあてにLED点灯指示を送る
sendOther.setIllumination(
    new byte[]{
        LINKING_IF_PATTERN_ID,
        blink_pattern,
        LINKING_IF_COLOR_ID,
        color
    });
sendOther.send();

引数blink_patternにはLED点灯パターンを設定します。
LED点灯パターン表

引数colorにはLED点灯色を設定します。
LED色表

Tukeruのデバイス仕様書は現時点で公表されていないので、実際にデバイスを作動させて上の表を作りました。
※参考にした結果につきましては一切責任を負いません

通知を受けるとデバイスのLEDが点灯します。
DSC_1268
ちなみにこのときの画面です。
after_alert_a

おわりに

そこまで遠くない将来、AIの発達などでプログラマーが不要になるという意見があります。
この意見は、アプリのアイデア出しをするためにIoT、AIやビッグデータなど最新技術を調べていて見つけたのですが、
読んでいるうちに遥か昔の記憶がフラッシュバックしてきました。

それは、社内SEをしていた頃、業務効率化のためのシステムを提案すると、現場から
「システム部はリストラを助長するだけだ!」
「我々の仕事を奪うのか!」
と直球の意見を受けた経験です。

「自分のやっていることは間違ってないはずのに。。」
と寂しい思いをしましたが、今度は自分の仕事が奪われる立場になりました。

しかし、あまり危機感を抱いていません。
コーディングは機械に任せて、社会的問題に役立つシステムや顕在化していないニーズを呼び起こすシステムを考える、
より上流の仕事に専念できる!
そう考えるとむしろ歓迎すべきことだと思います。
新しいITサービスを提供するためのクリエイター的発想を今のうちからどんどん磨いていきましょう!

また、IoTは私たちが望んでいる未来を実現する有力な手段であることが実感できました。
Project Linking自体も本格的なIoTプロジェクトとなるべく、デバイスとアプリがインターネット接続できるように
進化するかもしれません。

今後もIT業界の最新動向についてアンテナを高くする必要があると認識した、
非常に意義のあるLinkingアプリ体験でした。
(了)


採用情報

  • Profile
    キャスレーコンサルティングの技術ブログです。
    当社エンジニアが技術面でのTips、技術系イベント等についてご紹介いたします。
  • CSV社長ブログ
  • チーム・キャスレーブログ