NEMで特定のモザイク所有者のみが開けるドアを作ってみた

NEM×IoTの試作の試作。

特定のモザイクを持っている人だけが開けることができるドアを作ってみました。

作ったもの

こんな感じです。

着金トリガーで扉開かせてる感じです。

「この扉、そんなことしなくても開けれるだろ」とかそういうツッコミはご遠慮ください。

仕組み

全体構成

動作の流れ

  1. ラズパイでWebSocketを使って特定のアドレスA のトランザクション監視しておく。

  2. ラズパイでアドレスA への支払いQRコードを表示 (0xem)
    この時、ランダムで生成した文字列をメッセージに含めておく

  3. スマホでQRコードを読み取って送金

  4. ラズパイで、QRコード表示したメッセージを含むトランザクションをキャッチ。解析する。

    • 送信者アドレスの所有モザイクを取得し、必要なモザイクを所有していたら SwitchBot にコマンド送信して鍵を開ける
    • 必要なモザイクを所有していなかったら何もしない

0xemですが送金トランザクションを発生させることで、アドレスの所有権を確認しています。(人のアドレスを使って扉を開けることが無いように)

ランダムで作成したメッセージを含めているのは、扉の前で表示しているQRコードを読み取った( = 扉の前に人がいる) ことを確認するため。ワンタイムパスワード的なもの。

各部の詳細

ソースコードは GitHub に公開してますのでご参照ください(ラズパイの部分のコードです)。

ラズパイ(Raspberry Pi 3 Model B)

今回使ったラズパイは、Raspberry Pi 3 Model B というやつです。

Wi-Fi、Bluetooth とかのデバイスが使えるラズパイです。

OS は Android Things 入れてます。

IoT デバイス向けの Android ですね。

Android が動く = 開発に Kotlin が使える、というわけで NEM のブロックチェーンへのアクセスはもちろん nem-kotlin。

Android Things は良いです。画面描画系は普通の Android 端末の描画と同様に行えるし、Bluetooth へのアクセスも普通の Android と同じ方法で行えるので開発しやすかったです。

Kotlin 使えるしね。

SwitchBot

Bluetooth でコマンド受け取って、壁付けのスイッチなどを押すためのデバイスです。

おもろい。

おもろいんですが、API 仕様が公開されていなくて(公開予定はあるらしい)、どうやって制御するんだというデバイスです。

制御の方法に関しては、こちらのブログ と、ブログ内からリンクされている中の人から紹介してもらったコードを参考にしました。

調べてわかったこととしては、

  • BLE (Bluetooth Low Energy) + GATT を使っている
  • UUID が “cba20d00-224d-11e6-9fb8-0002a5d5c51b” の Service 内、UUID が “cba20002-224d-11e6-9fb8-0002a5d5c51b” の Characteristic にバイト配列で [0x57, 0x01, 0x00] を送ると腕(?) が出てくる

ということだったので、その通りに Android 上でもやってみて、どうにか動かすことができました。

早く API 仕様公開してほしい。

スマホ

スマホ自体は普通の Android のスマホで、使っているアプリも NEM Wallet の Android 版です。

ちなみに上の動画で、鍵が開くタイミングでスマホに表示された通知は先日公開した Skype の Bot のやつです。

これでドアを開くためアドレスへの入金を監視しています。

アプリのデバッグに役立つツールになった。

所感

NEM のトランザクションで IoT デバイスを制御するなんてことをやってみたわけですが、気になることとしてはやはりトランザクションが承認されるまでの時間ですかね。

扉開くのに 1 分とかかかるのはさすがに辛い。Catapult でどんなもんになるか。

他、

  • QRコードで表示されたランダム文字列を遠くにいる別の人にLINEで連絡 -> 連絡を受けた人が入金 とした場合でも、入金した人がモザイク持ってれば扉が開く。
  • ブロックチェーンに解錠の履歴が残る
  • 上記のBotみたいな、トランザクションを監視するシステムを使えば、誰かが鍵を開けたことを監視することができる

消えない履歴が残るのでセキュリティ的には良いかも。

さいごに

今回一番苦労したヤツ

SwitchBot は、壁付けのスイッチを押すためのデバイスですからね。

こんなアナログな扉の鍵をこれで押させようとするのが間違いです。

真似しないように。辛いので。


最後まで読んでいただきありがとうございます。 このブログを「いいな」と感じていただけましたら、Twiter にてフォローいただけるとうれしいです。ブログ更新情報などもお届けします。



この記事をシェアする




りゅーた
フリーランスのエンジニアしてます。Android、iOS アプリの開発、対向サーバの開発、C/C++のライブラリ開発が現在のメイン。趣味はテニス・ゲーム・自転車。3児の父

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA