「汎用ボタン(仮称)」構想

f:id:mitszo:20181113151155j:plain こんにちは。144Labの今津です。

うんこボタンは売れてませんが、名前のインパクトのおかげか展示会などでは「知ってるよ!」と言っていただける機会も増えました。その中で「こういう用途に使えるかな」といったお話を伺うことも増えてきたので、うんこボタンとは別のシステムを開発するときに備えて、うんこボタンのシステムのキモになる部分を切り出したいと考えています。 今日は、それを(うまい名前が思いつかないので)仮に「汎用ボタン」として、どういうものを考えているのかを書いてみます。

うんこボタンのシステムのキモ

うんこボタンは個人的な記録を助けるための道具としての、無線LANを介した通信を行う押しボタンスイッチです。「個人的な」用途の道具ですので、その装置を「個人(ウェブアプリのアカウント)」とひもづけることが、使い始めるためには必要です。

単純な方法は、デバイスに固有のIDが書いて(QRコードだったり)あって、それをアプリの画面上で入力する、というものでしょう。 でも、うんこボタンでは採用しませんでした。理由はいくつかあります。使う人の視点では入力間違いもありうるでしょうし面倒くささは否めません。提供する側としてはいちいちハードウェアのIDが書かれたシールなどを間違いなくその個体に貼り付ける工程が必要です。

というところから、ウェブアプリからうんこボタンデバイスのウェブアプリに誘導しつつ、ひもづけのための情報を「ウェブアプリサーバー→うんこボタンデバイスAPIサーバー」と運ぶことで、アカウントとデバイスをひもづける方法を選択しています。 ここがうんこボタンのシステムのキモのひとつです。

汎用ボタンって?

汎用ボタンは「汎用的に使えるボタン型デバイス」のことではなく、うんこボタンのような何かしらのデバイスを外部システム(既存のウェブアプリだったり)の入力(「ボタンが押されましたよ」)として導入しやすいように、

の組み合わせとして、うんこボタンのシステムのキモを提供する仕組みです。

登場するモノ

  • 外部システム
    • お客さまのシステム
  • ボタンデバイス
  • 汎用ボタンAPIサービス
    • 当社のAPIサービス

ユースケース

  • ボタンデバイスを有効化する
    • 外部システム側とボタンデバイスの連動設定を行うこと
    • ボタンデバイス無線LAN等のネットワーク設定を同時に行う場合もある
  • ボタンデバイス有効化通知
    • ボタンデバイスの有効化が完了したことを外部システムに知らせる
  • ボタンデバイスのイベントを通知する
    • ボタンデバイスの押しボタンスイッチが押されたことなどのイベント発生を外部アプリに通知すること

「押しボタンスイッチが押されたことなどのイベント」としたのは、デバイスによっては押しボタンではなくセンサー測定値の送信などの場合も考えられるから。

外部システム

設定として持ってるもの

  • 当社の汎用ボタンAPIサービスのURL
  • 当社が発行したテナントID
  • 当社の汎用ボタンAPIサービスにアクセスするAPIキー
  • ボタンデバイス上のHTTPサーバーのURL

API

  • ボタンデバイス有効化完了時に、汎用ボタンAPIサービスが呼び出すAPI
  • ボタンデバイスのボタンスイッチが押されたことなどを通知するために、汎用ボタンAPIサービスが呼び出すAPI

データとして持っているもの

  • トーク
    • 外部システムが発行する、外部システムがデバイスの識別に使用したい識別子
    • ボタンデバイスの有効化時にボタンデバイスを経由して汎用ボタンAPIに渡される
    • ボタンデバイスの有効化以降、汎用ボタンAPIサービスが外部システムAPIアクセス時に付与する識別子
  • トークンの作成日時
    • トークンの処理状態問い合わせ時に汎用ボタンAPI側の更新日時と比較する
  • ボタンデバイス識別子
    • バイス有効化完了通知時に汎用ボタンAPIサービスが提供する識別子
    • バイスの無効化要求などで使用する

ボタンデバイス

設定として持っているもの

  • バイスID(機種ID, 個体ID)
  • 汎用ボタンAPIのURL
  • 汎用ボタンAPIアクセスキー
    • ボタンデバイス製造時に埋め込み

HTTPサーバー

  • 無線LAN設定を行うURL
  • Query文字列に以下の情報を必要とする
    • トーク
    • テナントID
    • 処理完了後遷移先URL
      • 検討中
      • 空だったら画面閉じるとか
      • 登録完了後のコールバックとは別。あくまで画面用

データとして持っているもの

なし。 最初はボタンデバイストークン保存したら、と思ったけど当社APIサーバーを介する形であればボタンデバイスに保存しなくても、APIサーバー側で保存すれば良さそう。

汎用ボタンAPIサービス

設定として持っているもの

  • テナント情報
    • テナントID
    • ボタンデバイス有効化時のコールバックURL
    • ボタンデバイスのボタンスイッチ押下イベント通知URL
    • APIアクセスキー

API

クライアントを認証する仕組みがある。 ヘッダーに格納されたAPIアクセスキーを使用する。 ボタンデバイスの個体にひもづいておりアクセスの度に検証する。

  • ボタンデバイス有効化
    • ボタンデバイスがPOSTしてくる
    • バイスIDでDBからボタンデバイス情報を取得
      • テナントIDチェック(不一致ならエラー)
    • バイスIDに対してトークンを関連付けて保存(1:1にする)
      • 更新日時を更新
    • ボタンデバイスに結果に応じたレスポンスを返す
      • 正常:200
      • エラー: 4xx
    • テナントIDでテナント情報からボタンデバイス有効化時のコールバックURLなどの設定を得てPOST
  • ボタンデバイス有効化状況問い合わせ
    • 外部アプリが完了判定のためにポーリングしてくる
      • しなくても完了時にAPI叩きに行くのでわかると思うけど、うんこボタンでは待ち処理が欲しかった
      • トーク
    • ボタンデバイストークンの関連付け情報を返す
      • トークン登録有無
      • トークンの更新時刻
        • 外部アプリ側で保持しているトークン作成時刻より古い場合は、以前に有効化したことあるデータ
  • タンデバイス押下イベントハンドラ
    • 有効化済みボタンデバイスが、押しボタンスイッチを押された時にPOSTしてくる
      • バイスID
        • 通常押しボタンスイッチの識別に使われる
    • テナント情報からボタンデバイスのボタンスイッチ押下イベント通知URLやAPIアクセスキーを取得してPOST

データとして持っているもの

バイスを有効化する時

f:id:mitszo:20181113151144p:plain 汎用ボタンAPIサービス側でデバイスIDとトークンのひもづけをしておく。

バイスでイベントが発生した(押ボタンを押したとか)時

f:id:mitszo:20181113151137p:plain 送られてくるデバイスIDに対応するトークンを付与して外部サービスのAPIを実行することで、外部サービス側はどのアカウントにひもづいたデバイスのデータなのかがわかる。

これができると何がうれしいのか

「うんこボタンみたいな感じのシステム開発」を「うんこボタンのカスタマイズ」じゃなくて、「汎用ボタンをベースにした新規(差分)開発」にすることができると、僕らがうれしい。カスタマイズで対応し続けるのが必ずしもうれしくないのは十分経験済みだし。

「うんこボタンみたいな感じの仕掛け」を自分たちのシステムやアプリに組み込みたいと考えているお客様がうれしい、とうれしいですね。

今後の予定

この仕組みを作ること自体は決めているので、この開発自体を勧めつつ、次の半年くらいをめどに計画しているうんこボタンサービスのリニューアルをこの仕組みをベースにしたものにしようと目論見中。