Akerun Pro APIでできること10選 / Akerun Advent Calendar 14日目

f:id:photosynth-inc:20161215205132j:plain

この記事はAkerun Advent Calendar 14日目の記事です。

今日もkazuphが担当しますよん。

Akerun API

photosynth-inc.github.io

AkerunにはWeb APIあります。今のところ会社で使っているAkerunの一覧と開閉などの履歴の取得のAPIのみですが、それだけでもかなり使い勝手いいと思いますので、今回は僕が思いつく限りのアイディアを紹介したいと思います。

ちなみにAkerun Proは中小企業向けなので、会社でのアイディアがメインになります。

履歴参照APIを使った場合のアイディア

① 誰がどこにいるかを確認する

f:id:photosynth-inc:20161215205633p:plain

Slack Botに質問すると誰がどこにいるのか教えてくれる。執務室以外にも会議室につけておくと「今ミーティング中だよ〜」とかわかって便利です。残念ながらトイレには付けられないので他を当たってください。

②簡易的な勤怠システムを作成する

f:id:photosynth-inc:20161215205927p:plain

自分が会社にどれくらいいたのかわかるとあとから振り返りのとき便利ですよね。 テキストでもいいですが、Spreadsheetにまとめたり、専用のWebアプリケーションをつくってもいいかもしれません。

③会議室の空き状況把握

f:id:photosynth-inc:20161215210135p:plain

立ち話が発展して「よしじゃあ今からミーティングしよう!」となったときに、さっと確認できて便利です。また本当はミーティングが始まってなくて、開きっぱなしになっていれば、Googleカレンダーと連携して、予定をキャンセルしてくれたりすると、会議室の利用率向上にも貢献してくれそうですね。

④退出したら無条件にパソコンの画面をロックする

f:id:photosynth-inc:20161215214433p:plain

うっかりパソコンのロックを忘れてしまった。5分後に自動ロックされるようにしているけど、それでもうっかり忘れちゃうのは怖い。そんなときには、退出ログを確認したときには、自動で画面をロックするようにしていると便利かもしれません。少なくともMacではApple Scriptを実行すればロックは一瞬なので、そういうプロセスを置いておけばよさそうですね。

⑤今オフィスにいる人に合わせて音楽を鳴らす

f:id:photosynth-inc:20161215212034p:plain

仕事中に音楽を流せる職場なら、今いる人に合わせて予め登録してあるプレイリストをミックスして再生とかするとおもしろいかもしれません。 エンジニアしかいないならアニソン、事務のお姉さんが来たら流行りのJ-POP、社長が出社したら無条件に北島三郎など、チューニングはあなた次第。 Youtubeでいいなら、APIがあるので、やりやすそうですね!

⑥定時後に退社したら奥さんのLINEに通知する

f:id:photosynth-inc:20161215211949p:plain

いわゆる「これから帰る🐸」ですね。 いつも同じことを繰り返すのは面倒なので、自動化しちゃいましょう。

⑦帰りの遅い人には注意する

f:id:photosynth-inc:20161215212155p:plain

残業続きは身体に毒です。APIで取得した履歴から帰る時間を算出して、遅かったら労ったり、仕事を調整して上げましょう。 Akerunの入退出ログはドアの開閉に紐づくので少なくともほふくでは突破できません。ドアが開けっ放しにされても警告音を鳴らせますし、ズルはしずらいかなーって思います。

⑧仕事の進捗とオフィスにいる時間の相関を取ってみる

f:id:photosynth-inc:20161215212742p:plain

Akerunでは入退室のログが全部取れるので、どれくらいオフィスにいたのかを正確に把握することができます。

長くいれば生産性が上がるというわけではないと思うので、ちゃんと統計を取ってみると案外すぐ帰る人の方が最終的な生産性がいいかもしれません。 働くお母さんの方が生産性が高いみたいなデータが取れるかもしれませんね。

⑨社内の電話システムと連動してオフィスにいる人の前の電話に転送するようにする

f:id:photosynth-inc:20161215213424p:plain

オフィスが広くなってくると、いろんな場所で電話が鳴って、電話を取りたくても走ってその島にいかないといけないということがありますよね(他の島の電話が取れるやつもありますが)。

そういうときは、いる人の席にある電話だけなるようにすると捗るかもしれません。最近は電話の転送設定がウェブだけでできるので、APIがなくても最悪自動でブラウザ操作すればいけるかもしれません。

⑩退出したときに、雨が降ってそうならアプリに通知する

f:id:photosynth-inc:20161215213534p:plain

退出したタイミングで雨情報をその人に通知するような仕組みがあると便利かもしれません。 下まで降りて雨だと気づいてまた上の階のオフィスまで傘を取りにいくのは大変なので。

まとめ

いらすとやさん便利。

じゃなかった。ということで、ざっと思いつたアイディアを書き出してみました。 まだまだ便利でおもしろいアイディアは沢山あると思うので、Akerunを導入した際は是非APIも使ってみてください!

株式会社フォトシンスでは、APIやWebツールをもっと良くしてくれる、Railsエンジニアを募集しています! www.wantedly.com

IoT企業社内便利ツール② ラベルプリンターをIoT化する / Akerun Advent Calendar 13日目

この記事はAkerun Advent Calendar 13日目の記事です。

今回はフォトシンスCTOの@kazuphが担当しますよ( ・`д・´)b

今日は以前のbuildersconでも少し取り上げたラベルシールプリンターをIoT化した話です!

目的

社内での出荷作業の一部で二次元QRコードのシールを同梱したり、製品に貼ったりすることがあるので、そのQRコードを生成してます。 業者に依頼することもできるのですが、センシティブな情報も含むことがあるので、全部自社内でやっています。

ラベルプリンターを用意する

www.brother.co.jp

ブラザー工業 PCラベルプリンター P-touch P750W PT-P750W

ブラザー工業 PCラベルプリンター P-touch P750W PT-P750W

要件的にこれで良かったので、これにしました。もっと高価でシールの解像度が高いものもあります。

SDKを確認する

幾つか操作方法があります。

今回は「アプリケーション開発ツール b-PAC(Brother P-touch Applicable Component)」というものを使用しました。

www.brother.co.jp

b-PAC (Brother P-touch Applicable Component)は、弊社P-touch(ピータッチ)シリーズのハードウェアに出力するコンポーネントです。 専用エディターを使用することなく、Microsoft® Visual Basic® 、Microsoft® Excel® 、VB Script等で作成されたお客様のシステムから簡単に出力できます。(プログラマーはラベルテンプレートファイルを作成するために専用エディターの操作を覚える必要がありますが、開発されたプログラムを使用し、実務にてラベル出力を行う方は、専用エディターの操作を覚える必要はありません。)

う、MS、、、VB、、、となったのですが、

もっと調べるとちゃんとJSでも使えました。

www.brother.co.jp

f:id:photosynth-inc:20161213131537p:plain

Jscript (for Internet Explorer®)

Jscript、、、なにそれ?)

心の声はさておき、どうやらInternet Explorerでなら、JSでSDKが動く!ということがわかりました。

印刷用サンプルスクリプト

SDK(bpac.Document)とテンプレ(qr.lbx)を指定して印刷を実行してます。

function printLabel() {
    var bpac = new ActiveXObject("bpac.Document");
    var lbxPath = "C:\\templates\\qr.lbx";
    var code = $("#code").data("code");
    if (bpac.Open(lbxPath) != false) {
        bpac.GetObject("code").Text = code;
        bpac.StartPrint("", 0);
        bpac.PrintOut(1, 0);
        bpac.Close();
        bpac.EndPrint();
    } else {
        console.log("fail...");
    }
}

うん、普通にJSですね。

SDKをインストールする

このままだと動かないので、SDKをインストールして、テンプレも指定のパスに設置します。

https://online.brother.co.jp/dev/Top.aspx

SDKをインストールするためにここで新規登録を行います。

ログインできたら「Windows用開発ツール」ページにて必要物をダウンロードします。

・b-PAC SDK (64bit版) ・b-PAC クライアント用コンポーネント (64bit版)

bitは適切な方を選んでください。ダウンロードしたらインストールします。

あ、当然ですが、Windowsでしか実行できません。僕はPallarelsにて実施しました。

印刷用テンプレを準備する

ソフトウェアダウンロード | PT-P750W | 日本 | ブラザー

ここからエディタツールをダウンロードしてください。 もちろんドライバーがまだならそれも。

このツールで自由にレイアウトしたシールを作成できます。

実行

実行環境: Windows 10 IE 11

f:id:photosynth-inc:20161214103347g:plain

とりあえずこれでブラウザからの印刷ができるようになりました。

※ブラウザから自動で実行する場合は、IEの設定からセキュリティを落とす必要があるかもしれません。

IoTにする部分

ブラウザで実行できたということは、あとはトリガーを入れるだけです。 この辺は別途サーバーとWebSockedで繋いだり、単にAjaxするなど、色々な方法があるので、各々適切な方法を選んでください(あとは丸投げ)。

まとめ

ということで、こんな感じでラベルプリントもよりWebっぽくIoT化できる方法を紹介しました。

Akerunをつくっている株式会社フォトシンスでは、APIやWebツールを一緒に盛り上げてくれるRailsエンジニアを募集しています! www.wantedly.com

Akerun Developersサイトもやってます。Akerun APIについては、こちらをご覧ください。 photosynth-inc.github.io

さくらIoT PlatformモジュールとNordic nRF52 BLEモジュールを繋ぐ / Akerun Advent Calendar 12日目

f:id:photosynth-inc:20161206012751j:plain

こんにちは。 す〜 ( @ksksue ) です。 前回の記事「さくらIoT Platformをさわって遊んでみる」の続きで Akerun Advent Calendar 12 日目の記事です。

ざっくりこんな感じで書き進めています。

  1. さくらIoTさわってみる
  2. nRF52とつなげてみる ← イマココ
  3. Akerun Pro 遠隔で開けてみる(次回)

今回はNordic nRF52 と繋いでゴニョゴニョしようと思います。

早速ですが、さくらIoTモジュールとI2Cで繋ぐためのnRF52ライブラリを作ったので github で公開しておきます。 ※ 公開しているコードは個人の趣味の制作物です

GitHub - ksksue/sakura_iot_beta_nrf52_i2c: さくらのIoT Platform βとnRF52をI2Cで繋げるためのコード

使い方は後で書くとして、まずはnRF52についてちょっと紹介しておきます。

Nordic nRF52 BLE の紹介

最近やたらと各ベンダがBLEチップを出しまくってますが、その中でもnRF52はかなりいいツールです。

  • オープンソース文化の色が濃い
  • 地雷を踏んでも公式コミュニティサイトDevZone(stack overflow風QAサイト)でなんとかなる
  • 最新技術を取り込むのが早い

nRF52 : オープンソース文化の色が濃い

他ベンダの開発環境は組込み色が濃い中、Nordicはわりとオープンソースの文化を引き継いているため、 サンプルコード、オープンだと助かるツールのコードが github にアップされています。 Nordic Semiconductor · GitHub

f:id:photosynth-inc:20161212163432p:plain

また、マイコンC言語のコードを眺めてみるとトリッキーな書き方は避けリーダブルなコードを目指していることがわかります。 C言語マイコンドライバを書き進めるときの素直なコードを書くときの参考になります。

ほぼオープンソースなので、実際にはAkerun ProではOTAでファームをBLE通信するときの独自暗号化通信対応などができるところで助かりました。

Akerun ProではWebの暗号化通信がそのままデバイスまで降りてきているという、マイコンレベルではかなりリッチな暗号化を施しているのですが OTAも同じ暗号化技術を使って通信内容の暗号化をすることができました。

それでも高速に処理できるほどのCPUパワーがあるのもnRF52の魅力ポイントです。

nRF52 : 地雷を踏んでも公式コミュニティサイトDevZoneでなんとかなる

f:id:photosynth-inc:20161212163551p:plain Stack overflowライクなコミュニティサイトがあります。 Googleからも検索にひっかかるので、エラーコメントを検索するだけで上位にひっかかってきてくれます。

nRF52 : 最新技術を取り込むのが早い

f:id:photosynth-inc:20161212163635p:plain 最新技術を取り込むのが早いという点もイケてるポイントです。 2016/12/7にBluetooth 5 が公式採択されたばかりですが、その日にNordicからBluetooth 5の開発ボードが発売開始となりました。

ちなみにBluetooth 5 はBluetooth 4.2に比べて、通信範囲 4倍、通信速度 2倍、メッシュネットワーク対応という これまでなんだったの感があるくらい飛躍を遂げている仕様なのでPhotosynth社内でも注目しています。

今のところBluetooth 5対応の開発ボードは日本未Shipping状態(2016/12/12現在)なのですが Nordicの開発ボードを手に入れて実際の技術を体験できることを楽しみにしています。 ※ 要電波暗室

【本題】さくらIoT モジュールとNordic nRF52 BLE を繋げる

さてnRF52についての紹介はこのあたりにして、本題です。実際にnRF52とつなげて通信してみます。

nRF52-DK(要電波暗室)などを使って、図のようにつなげます。I2C電圧レベル変換ICを噛ましてるだけです。 f:id:photosynth-inc:20161212163855p:plain

nRF52 BLE ライブラリを使う

さくらIoTモジュール駆動用にnRF52ライブラリとして26個の関数を作りました。 ファイルダウンロード系が今のところサポートされていないようなのでそれ以外の関数です。 ソースコードgithubにアップしてあります。

GitHub - ksksue/sakura_iot_beta_nrf52_i2c: さくらのIoT Platform βとnRF52をI2Cで繋げるためのコード

※ 何度も言いますが個人趣味の範囲でやってることなのであしからず

void drv_sakura_iot_init(void);

//**********************************************************
// general commands
//**********************************************************
uint8_t drv_sakura_iot_get_connection_status(void);
uint8_t drv_sakura_iot_get_signal_quality(void);
uint8_t drv_sakura_iot_get_date_time(sakura_iot_date_time_t *date_time);
uint8_t drv_sakura_iot_echo_back_test(uint8_t length, uint8_t *indata, uint8_t *outdata);

//**********************************************************
// IO commands
//**********************************************************
uint8_t drv_sakura_iot_read_adc(uint8_t ch, uint16_t *volt);

//**********************************************************
// data tx commands
//**********************************************************
uint8_t drv_sakura_iot_tx_enqueue(txrxdata_t *data);
uint8_t drv_sakura_iot_tx_immediately(txrxdata_t *data);
uint8_t drv_sakura_iot_tx_available_queue_length(void);
uint8_t drv_sakura_iot_tx_queued_length(void);
uint8_t drv_sakura_iot_tx_queue_flush(void);
uint8_t drv_sakura_iot_tx_queue_send(void);
uint8_t drv_sakura_iot_get_tx_queue_status(void);
uint8_t drv_sakura_iot_get_tx_immediately_status(void);

//**********************************************************
// data rx commands
//**********************************************************
uint8_t drv_sakura_iot_rx_dequeue(txrxdata_t *data);
uint8_t drv_sakura_iot_rx_queue_peek(txrxdata_t *data);
uint8_t drv_sakura_iot_get_rx_available_queue_length(void);
uint8_t drv_sakura_iot_get_rx_queued_length(void);
uint8_t drv_sakura_iot_rx_queue_flush(void);

//**********************************************************
// etc command
//**********************************************************
uint8_t drv_sakura_iot_get_product_id(uint8_t *pid);
uint8_t drv_sakura_iot_get_unique_id(uint8_t *uid);
uint8_t drv_sakura_iot_get_firmware_version(uint8_t *version);
uint8_t drv_sakura_iot_unlock(void);
uint8_t drv_sakura_iot_firmware_update(void);
uint8_t drv_sakura_iot_get_firmware_update_status(void);
uint8_t drv_sakura_iot_software_reset(void);

ざっくりと initして叩けばOKです。

drv_sakura_iot_init();

uint8_t st = drv_sakura_iot_get_connection_status();

if(st == DRV_SAKURA_IOT_CONNECTION_STATUS_CONNECTED) {
    DPRINTF("connected!");
}

という感じです。 コネクションを確認できたらさくらIoTモジュールのTx FIFOにキューしてsendすればデータを送れます。

    txrxdata_t txdata;

    txdata.ch = 0;
    txdata.type = 'i';
    txdata.data.ui = 0x12345678;

    drv_sakura_iot_tx_enqueue(&txdata);
    drv_sakura_iot_tx_queue_send();

カンタンですね。

データの受信はWAKE_OUTで割込み信号が取れるようですが、 ここではポーリングで対応。GPIO割込みコードを書けばWAKE_OUT対応はすぐできます。

    uint8_t rx_queue_num;
    txrxdata_t rxdata;

    while(1) {
        rx_queue_num = drv_sakura_iot_get_rx_queued_length();
        if(rx_queue_num != 0) {
            drv_sakura_iot_rx_dequeue(&rxdata);
            DPRINTF("rxdata ch:%d type:%02x data:%d\n", rxdata.ch, rxdata.type, rxdata.data.ui);
        }
        nrf_delay_ms(10);
    }

これでデータの送受信ができるようになります。

ちなみにこのライブラリでは書き方を簡易化するためI2Cは同期通信に書き直しています。(nRF52のI2Cドライバ内では非同期)

さくらIoT Platformのクラウド側の準備

さて、そのデータの送受信先のクラウドの準備をします。

バイスの登録などは公式ドキュメントを参考にしてください。

https://iot.sakura.ad.jp/developer/pdf/iot_platform_manual_beta.pdf

PC → さくらクラウド → さくらIoTデバイス → nRF52

PC→さくらIoTデバイス、のデータ通信をするために incoming webhookを作っておきます。

その状態で、PCからincoming webhookを経由してさくらIoTモジュールへデータを送信するpythonコードを以下に書いておきます。

#!/usr/bin/env python

import hmac
import hashlib
import requests
import json
secret = ""
data = {"module": "xxxxxxxx","type": "channels","payload": {"channels": [{"channel": 0,"type": "i","value": 123456789}]}}
payload = json.dumps(data)
x_sakura_signature = hmac.new(secret.encode("utf-8"), payload.encode("utf-8"), hashlib.sha1).hexdigest()
print(x_sakura_signature)

headers = {'X-Sakura-Signature' : x_sakura_signature}
r = requests.post('https://api.sakura.io/incoming/v1/moemoe', data=payload, headers=headers)
print(r.text)

※ moduleのxxxxxxxx部分にはモジュールのID、incoming/v1/moemoe の部分にはTokenを入れます。secretは未動作確認。

参考: SakuraIoTAlphaDocs/services.md at master · sakura-internet/SakuraIoTAlphaDocs · GitHub

このpythonコードを叩くとPCから

channel : 0
type : 'i'
value : 123456789

の情報をクラウドへ送ることが出来ます。

さくらクラウドはさくらIoTモジュールへこの情報を送信し、nRF52でそのデータを取り込み、 nRF52のデバッグコンソールに以下の文字が流れます。

rxdata ch:0 type:i data:123456789

nRF52 → さくらIoTデバイス → さくらクラウド

バイスからデータがクラウドへ流れているかを確認するのにwebsocketがカンタンなので さくらクラウドサーバ側でwebsocketのプロジェクトを作っておきます。

上記のnRF52のコードを叩くと、さくらクラウドの画面にデータがきていることが確認できます。

    drv_sakura_iot_tx_enqueue(&txdata);
    drv_sakura_iot_tx_queue_send();

f:id:photosynth-inc:20161206014843p:plain

まとめ

さて、駆け足でしたがnRF52とさくらIoTモジュールをつなげてデータ送受信するところまできました。

マイコンモジュールからクラウドへダイレクトにデータ通信できるというのはおもしろいですね。 ボクは組込み屋ですが、クラウド側をもっといじりたいと思いました。

次回はAkerun Proに繋いでパカーっと鍵を開けるところまで行ってみたいと思います。

参考サイト

Nordic Semiconductor http://www.nordicsemi.com/

Bluetooth 5 https://www.bluetooth.com/specifications/bluetooth-core-specification/bluetooth5

さくらのIoT Platform | 開発者向け https://iot.sakura.ad.jp/developer/

告知

Akerunをつくっている株式会社フォトシンスではRailsエンジニアを募集しています! www.wantedly.com

Akerun Developersサイトもやってます。Akerun APIについては、こちらをご覧ください。 photosynth-inc.github.io

IoTデバイスにもスクリプト言語のススメ / Akeurn Advent Calendar 11日目

qiita.com Akerun Advent Calendar 11日目の記事は@KoheiAkitaが担当します。

今回は、スクリプト言語を馬鹿にしていた組み込みエンジニアが、スクリプト言語が組み込み開発にもどれだけ向いているかを力説します。

前回での私の記事の中でご紹介しましたが、私が現在組み込みの開発に用いている言語はNodejsです。私の今までの開発の中で、スクリプトの存在意義はせいぜいちょっとしたバッチ処理やコマンドを用いたコンバータ程度でした。その頃は、スクリプトの種類も少なく、メジャーなものとしてはWindows MS-Dosを始め、Linux shell、PHPPerlPythonJavascriptくらいでした。 Javascriptコンパイル言語、その他は全てインタプリタ言語で使っていた当時のJavascriptもお世辞にも速いとは言えないレベルでした。 私の中では、スクリプト言語は遅い、書きにくい、分かりにくいとあまりいい印象が無い言語の部類でした。

Photosynthに入社し、任されたAkerun Remote開発でNodejsを扱うようになり、しばらく扱ってみて思ったのが、

Nodejsって速い!

NodejsはGoogle Chromeで使われているJavascript v8エンジンを基にした言語であり、JITコンパイラ形式で最終的にはネイティブコードに変換されているので(部分的になる場合もありますが)、動作が速いわけです。

1. スクリプト言語って遅い?

幾つかのWebサイトで各言語の動作速度比較を行っているものがありました。そのうちの一つを紹介します。

blog.famzah.net

ループ、配列操作、単純計算処理等、基本的な処理での比較です。もちろん、各言語ともに目的とする処理、得意とする処理があるため、一概には言えないところもありますが、一般的な処理での言語としての速度はスクリプト言語の中では圧倒的にNodejsが速いようです。 事実、私が実際に業務でhttp通信、ファイルI/O、BLE通信の処理を組み込んだアプリケーションを作成していますが、全くもたつきを感じません。鍵を預かる製品として、コンマ何秒ですら速く動作させたい立場としては、合格点の動作ができる言語と言えるのではないでしょうか。

2. スクリプト言語って大したことできないのでは?

Javascriptの特徴を公式ページから引用すると、

developer.mozilla.org

JavaScript には、Array、Date、そして Math といったオブジェクトからなる基本的なライブラリ、
そして演算子、制御構造、文といったプログラミング言語の要素からなる主要な機能が含まれています。
JavaScript の主要機能は追加のオブジェクトを補うことで、様々な目的に拡張することができます、
例えば:

クライアントサイド JavaScript)
ブラウザとそのドキュメントオブジェクトモデル (DOM) を制御するオブジェクトを提供することにより、
コア言語を拡張します。例えば、クライアントサイドでの拡張により、アプリケーションが HTML
フォーム上に要素を配置したり、マウスクリック、フォームへの入力、ページ移動といったユーザ
イベントに応答できるようにします。

サーバサイド JavaScript)
JavaScript を使ったサーバの稼働に関連するオブジェクトを提供することにより、コア言語を
拡張します。例えば、サーバサイドでの拡張により、アプリケーションがデータベースとデータを
やり取りし、アプリケーション内で呼びだされた情報が連続性を保ったまま受け取られるようにし、
あるいはサーバ上のファイルを操作できるようにします。

Javascriptとしては、Webページのクライアント制御、サーバー側のデータベース制御といった機能が主となりますが一方Nodejsの特徴として、I/O機能、I/O周りのフレームワークの課題解決を実現した言語と言えます。

  • ファイル入出力
  • パイプ / ソケット
  • プロセス制御
  • メモリ管理

といった組み込みに必要な基本的なI/Oはもちろんのこと、ライブラリを用いれば

  • BLE通信( Peripheral / Central )
  • Wi-Fi制御
  • Http通信

など、IoTデバイスのアプリケーションを実装していくのに必要な機能が提供されています。

3. スクリプト言語の採用は新しいデバイスへの移行を加速させる

現在はIoT向けの組み込み機器は怒涛の速さで新しい端末が生まれており、顧客へ最新の端末を届けたいという願う身として、そして提供する立場としては新しい端末への移植を作業を少なく行いたいと考えている人はたくさんいることと思います。「開発したソフトウェアを他のデバイスへ移植する」という事はいつの時代なっても課題となっています。

Nodejsを用いる場合、端末毎のドライバとOSは用意されている事が多い中で新しい端末へ移植するためにするべきことは、

  • nodejsのインストール
  • 必要なライブラリのインストール
  • 自身のアプリケーションのインストール

程度で済みます。自身で行うべき新しい端末へのインテグレーションはほぼゼロにできます (自身のソースに端末依存の処理があれば別ですが)。

実際、今の業務での書いたNodejsの規模は既に数千行に及びますが別の端末で動かそうと、OSこそほぼ同じであれどCPUやペリフェラルのチップの構成は全く異なる端末上で試してみたところほんの数行の修正のみでなんとあっさり動いたことに驚きました。BLE通信処理や、Wi-Fi制御処理なども全く変えていません。 実際は、CPUが違えばJavascriptエンジンのバイナリも異なりますし、nodejsのライブラリで用いているCのネイティブコード部分など対応しているOSである必要がありますが、これだけ簡単に別端末に移植できる環境というのはなかなか無いのではないでしょうか。

まとめ

言語としての速度も十分、移植性も十分、常に新しい端末上で動作させる事ができるであろうスクリプト言語によるIoT機器もしくは組み込み機器向けの開発は、今までC/C++言語信仰者として生きてきたエンジニアの開発の考えを大いに変えてくれました。 今回はいいことばかり書いてしまいましたが、メモリの扱いに弱いというデメリット、その他実装する内容によっては向かないことなども当然ありますが、スクリプト言語での開発も場合によってはおすすめです、として締めくくりたいと思います。

株式会社 Photosythでは、APIやWebツールなどAkerunをどんどん良くしてくれるエンジニアを募集しています。

www.wantedly.com

Amazon Dash Buttonでスマートロックを開けられるようにしたら思ったよりも便利だった / Akeurn Advent Calendar 10日目

この記事はAkerun Advent Calendar10日目の記事です。 数日ぶりにフォトシンスCTOの@kazuphが担当させていただきます。

今回は流行りに乗っかってみましたよ(・∀・)

Akerun Dash Button

f:id:photosynth-inc:20161210074036p:plain

どん!GIMPで作成しました。

Amazon Dash Buttonは、ワンプッシュで紐付けている商品を自動で注文するためのIoTデバイスです。沢山の人たちがHack(良い意味)して遊んでいるので、自分もやってみました。

gigazine.net

押す度にAkerunが追加注文されるものをつくって配った方が良かったのかもしれませんが、今回はAmazon Dash ButtonでAkerunを開けてみました。 Amazon Dash Buttonが直接Akerunにつながって開閉できるようにしているわけではなく、Wi-Fiの認証、鍵の認証をはさみつつネットワーク越しに開閉しています。

仕組みは単純です。

f:id:photosynth-inc:20161210082426p:plain

以下解説です。

Amazon Dash Buttonが押されたことを検知する

サントリー天然水 Dash Button

サントリー天然水 Dash Button

まず最初にAmazon Dash Buttonを最寄りのWi-Fiに接続できるようにしてください。 商品と紐付けると商品が届いてしまうので、一番最後の商品選択だけはやらないでください。

方法は以下の記事が詳しいです。

qiita.com

MACアドレスを拾う方法としては、僕はnode-dash-buttonというライブラリを使いました。

github.com

実行環境はRaspberry Pi 3です。

nodeはxbuildで構築しておりVersionは4.6.2です。

$ git clone https://github.com/tagomoris/xbuild.git
$ xbuild/node-install -f v4.6.2 ~/local/node-v4.6.2 linux-armv7l
$ export PATH=/home/pi/local/node-v4.6.2/bin:$PATH
$ sudo ln -svf /home/pi/local/node-v4.6.2/bin/node /usr/bin/node
※nodeは4系では4.7.0が最新ですが、元々入れていたので今回はこれを使いました

はぁ〜〜〜xbuild便利〜〜〜〜

nodeが入ったら次にnode-dash-buttonをインストールします。

$ sudo apt-get install libpcap-dev
$ cd your_project/
$ npm install -S node-dash-button

libpcapは名前からもわかるようにパケットキャプチャをするためのライブラリです。 node-dash-button内で使用しているようです。

次にAmazon Dash ButtonのMACアドレスを特定します。

$ cd node_modules/node-dash-button
$ sudo node bin/findbutton

この状態でボタンを押すと以下のようにMACアドレスが表示されるはずです。

https://camo.githubusercontent.com/3d35efffb1fd83e942c77ddd8b95c7e186576b7a/687474703a2f2f692e696d6775722e636f6d2f426e676f6b50432e706e67

あとはこのMACアドレスをプログラム中に埋め込むだけです。

var dash_button = require('node-dash-button');
var dash = dash_button("8f:3f:20:33:54:44", null, null, 'all'); //address from step above
dash.on("detected", function (){
    // ここに任意の処理を書く
});

ちなみに実行は自分の場合はsudoをつける必要がありました。

$ sudo node hook.js

簡単ですね!!

Akerunを開ける

方法としては社内限定公開のAPIを叩く方法と荒業としてURL鍵をヘッドレスブラウザから叩く方法があります。 現在公開されているAPIについては、以下のAkerun Developersサイトを御覧ください。

photosynth-inc.github.io

今回は現時点で誰でも使用できるURL鍵を用いた方法を紹介します。

まずヘッドレスブラウザであるphantomjsをインストールします。

github.com

こんな感じでRaspberry Pi用にビルドしたものをダウンロードして使うのが早いです。

wget https://github.com/hamidnazari/raspi-armv7l-phantomjs/raw/master/phantomjs-2.0.0.tar.gz
tar zxfv phantomjs-2.0.0.tar.gz
sudo mv phantomjs /usr/local/bin/

これでphantomjsの準備はできました。

次にURL鍵を用意します。URL鍵とは、Akerun ManagerというAkerunの鍵の管理画面から発行できるURLをブラウザで開くと、そこでAkerunの解錠・施錠ができるというものになります。 使用するためには、Akerun RemoteというAkerunとサーバーをつなぐためのゲートウェイバイスをセットしている必要があります。

Akerun Proを申し込んでもらった場合は、標準でRemoteもついてくるので、是非お試しください。

URL鍵には以下の情報が紐付いています。

  • 開閉したいAkerun(錠)
  • 開閉したいユーザー
  • 開閉したい日時や曜日(例えば平日の業務時間内などに限定できます)
  • URLでブラウザでアクセスしたときに入力するパスワード(推奨)

Amazon Dash Buttonを押せるのは、家やオフィスのWi-Fiにつながる場所だけとなりますが、無条件に開閉してしまうのが怖い場合は、是非時間帯の限定やパスワードを設定してください。

あとはphantomjsで叩くだけです。

var page = require('webpage').create();

page.open('<解錠用URL>', function() {
  page.evaluate(function() {
    document.querySelector("input[name=open]").click();
  });
  window.setTimeout(function() { phantom.exit(); }, 3000);
});

単純にこれを実行するなら、以下の用になります。

$ phantomjs akerun_open.js

このソースコードだとphantomjsという処理系でしか動かないので、nodeで動かす場合には工夫が必要ですが、今回は単純にCLIコマンドとして実行してみました。

function openAkerun() {
  var exec = require('child_process').exec;
  return exec('phantomjs akerun_open.js', function(error, stdout, stderr) {
    console.log('done');
  });
};

var dash_button = require('node-dash-button');
var dash = dash_button("8f:3f:20:33:54:44", null, null, 'all'); //address from step above
dash.on("detected", function (){
    openAkerun();
});

あとはこれを実行しておくことで、解錠できます!

実際にやってみる

f:id:photosynth-inc:20161210093650g:plain

Amazon DashからAkerunの解錠までできました!

実際に会社でしばらく使ったのですが、トイレに行ったあとの帰り道でボタンを押しておくとちょうどいいタイミングで解錠してくれたり、外で押したとしても、社内専用Wi-Fiにつながらない限り実行されないので、すごい安心感がありました。

まとめ

これは便利!

ということで、APIやWebツールなどAkerunをどんどん良くしてくれるエンジニアを募集しています!

www.wantedly.com

<iOS>CoreBlueToothの実際の注意点、アイデア

こんにちは、Photosynth エンジニア@taku33です。
主にスマホ開発をやっております。

今回は、CoreBlueTooth API での、各処理で実装する際の注意点やアイデアを書きます。
ネットから見つけにくいけれど実際の実装では有益な情報を書きます。

タイムアウト

ViewControllerなどから各BLE処理を呼ぶ際は、NSTimerで事前にアプリ側上でのタイムアウト時間を設定しておきます。
これは、何らかの理由(途中で接続が切れた、有効距離外など)でBLE応答が来なかった場合、永遠に応答を待ち続けるのを防止するためです。
CoreBlueToothペリフェラルAPIの場合、タイムアウト時はアドバタイズを止めてwriteリクエストなどが来ないようにしておくといいと思います。

実際のタイムアウト時間ですが、セントラル機器側にもタイムアウト時間が定義されている場合は、それより多めにタイムアウト時間を取った方が良いかもしれません。全体の設計次第で上手く判断してください。

アドバタイズ

小技1

CoreBlueToothペリフェラルAPIにてアドバタイズを開始する際に、
CBAdvertisementDataLocalNameKeyというプロパティで自分が誰かをセントラル機器に伝えることができます。

しかし、もしセントラル機器がペリフェラルiOSに対してreadリクエストが出来ない場合、ペリフェラルiOS側が通信したいセントラル機器を限定するにはどうすればよいでしょうか。

先ほどのCBAdvertisementDataLocalNameKeyというプロパティには、通信したい特定のセントラル機器のMacアドレスなどを代わりに乗せて伝えることもできます。
これによりセントラル機器は自分のMacアドレスと一致した場合だけペリフェラルiOSと通信を続ける、といったワークアラウンドを取ることができます。

小技2

別の小技として、ペリフェラル機器(iOS以外)側でManufacturer Specific Dataにデータを乗せれば、セントラルiOS側はアドバタイズスキャンだけでフラグ情報などを見ることも可能です。
わざわざコネクトしなくても簡単な情報は見れるわけです。実際の実装においては、これで十分足りる場合もあるかと思います。
http://stackoverflow.com/questions/22833198/get-advertisement-data-for-ble-in-ios
また、この際にセントラルiOS側が継続してアドバタイズスキャンをすることも可能です。
http://stackoverflow.com/questions/9911102/core-bluetooth-constant-rssi-updates-of-in-range-devices


コネクト/ディスコネクト

CoreBlueToothセントラルAPIでは、コネクト/ディスコネクトが任意で操作できます。
しかしCoreBlueToothペリフェラルAPIでは、セントラル機器とのコネクト/ディスコネクトなどの状態変化すら通知されないため、アプリ側からみるといきなりデータ通信がはじまるようにみえます。

MTU

大量のデータをwirte/notifyする場合などは、
BluetoothSIGの仕様により一回の通信でやりとりできるデータのサイズ(MTU)は20バイほどが基本単位 になっているため、これを考慮する必要があります。
と言っても、実はiOS8,iOS9あたりはMTUが155バイト(+3バイトはオーバーヘッド)です。
これはつまり、iOSが155バイト位まではバッファにより1回で送ってくれるということなので、155バイト未満のペーロードで済むのならわざわざ20バイトを複数回に分けて送る必要はないです。
http://stackoverflow.com/questions/26623286/amount-of-data-to-be-sent-to-peripheral-using-bluetooth-in-ios-8

腰に優しいIoT製品開発 〜 Akerunつくったエンジニアのそこそこ大規模なIoTプログラミング 〜

こんばんは。Photosynth の 組み込みエンジニアの石井です。

昨日に引き続きAkerun Adventカレンダー 8日目 の記事の担当です!

今回は、Akerun Pro のファームウェア 開発とデバッグ環境について、実際の開発のタイムラインに沿ってご紹介します。

開発開始!基板むき出し期

開発初期は筐体はありません。試作基板で開発します。ネイキッドAkerunです。

f:id:photosynth-inc:20161207194939j:plain

※画像はイメージです

有線接続で、

をしています。

実装→動作確認→修正 をゴリゴリ繰り返します。

作業台の上で開発を進めました。すべて手元で完結します。

こいつ・・・動くぞ!開発黎明期

試作筐体で評価します。メカ・エレキ・ファームウェア・アプリ・クラウドなど通しで結合していきます。

f:id:photosynth-inc:20161208112945j:plain

※画像はイメージです

開発・デモ用の錠つきのドアを用意し、実ユースケースで、

有線接続で、

  • FWの書き込み
  • シリアルログの監視

をして開発・デバッグしています。

これも大きめの作業台や、デモのために移動することもあるのでワゴンに乗せて開発を進めました。 通信的にはクラウドまで達していますが、物理(ファームウェア)的には、すべて手元で完結します。

品質評価期

実際のオフィスのドアに貼り付けて評価します。

はじめのうちは、

  • エラー報告を受ける → PCをターゲットに接続 → 再現させる → 修正

というやり方をしていました。これだとフェイズが進むにつれて

  • 再現しない
  • 報告者の情報のエントロピーが高い
  • ドアの横で作業するので 腰が痛い

などの問題がありました。なんとかならないものか。

社内に落ちてたラズパイ2との出会い

とある日のPhotosynthの日常


I 「ラズパイ3ってなかなかリッチで良さげだね」

H 「いまウチにあるラズパイ2だとドングル必要だもんね〜」

I 「あ、ラズパイ2はあるんだっけ」

ん、ラズパイ2がある?


※一部フィクションです。

ラズパイつないで自動化もしてみた。

こうなりました。

f:id:photosynth-inc:20161208113326j:plain

f:id:photosynth-inc:20161208134953p:plain

ラズパイとターゲット(Akerun Pro)は有線で接続しています。 ラズパイはターゲットのログをストレージに吐き出しています。 出入りの映像は日時付きでWebcamで映像を記録します。(時計を壁に貼り付けるという原始的な方法で)

不具合が発生したとき

クライアントPC (MacBook)からsshで入って、ログを監視することができます。 その時の映像と照合できて調査が加速しますね。 しかも本体に近づかなくて良いので 腰に優しい

ファームウェア更新するとき

修正したソースをビルドし、ファームウェアを作成、ターゲットに書き込みます。

  • GitHubにpushするとJenkinsおじさんに通知
  • Jenkinsおじさんがビルドして結果をSlackで教えてくれます
  • sshでラズパイに入り、Jenkinsおじさんから成果物をダウンロードします
  • ターゲットに書き込みます

実際に手を動かすのは、クライアントからコマンドを数回たたくだけです。 本体に近づかなくて良いので 腰に優しい です。

また、リポジトリに適用する前に試す場合は手元でビルドして scp でファイル転送→書き込み もよくやっていました。

導入してから超絶快適になりました。

※製品版は当然ですが、外部から接続できないようになっている、かつ暗号化されているので安心してご利用になれます。

それでも腰が痛くなりそうな場合はこれを足元に忍ばせておきましょう。

鉄人倶楽部(IRONMAN・CLUB) 健康 足踏み  KW-887

鉄人倶楽部(IRONMAN・CLUB) 健康 足踏み KW-887

以上、ファームウェアの開発とデバッグのお話でした。

Akerun Developersやってます!開発者の方Welcome!

photosynth-inc.github.io