Akerunコントローラーからwebhookする

目次

初めに

みなさんこんにちは、naritakuです。本日はAkerun Adveent Calender 2023 16日目の記事です。前回のAkerunコントローラーのスマートプラグ化 に引き続き、Akerunコントローラーの改造第二弾です。

Akerunコントローラーは既設の電気制御のドアやゲートに簡易工事だけで設置し、直接制御できるスマートロックです。

akerun.com

Akerunコントローラーはドアの錠ともネットワークとも有線で接続されています。 そのため、ゲートウェイ端末とのBLE通信必要とするAkerun Proに比べ、よりリアルタイムに遠隔から施錠、解錠できる利点があります。

Akerunコントローラーの場合

sequenceDiagram

actor User
participant ctl as Akerunコントローラー


User->>ctl:遠隔解錠のリクエスト
activate ctl
      ctl->>ctl: 繋がれた錠を解錠
deactivate ctl

Akerun Proの場合

sequenceDiagram

actor User
participant remote as Akerun Remote
participant akerun as Akerun Pro


User->>remote:遠隔解錠のリクエスト


  activate remote
      remote->>akerun: BLE通信による解錠リクエスト
  deactivate remote
  activate akerun
      akerun->>akerun: サムターンを回して解錠
 deactivate akerun

素早く応答できるなら、「扉が開いたことに連動してリアルタイムにXXXがしたい!」といったご要望にも応えたいですよね。 ということで、Akerunコントローラーの開閉をリアルタイムに通知すべく、webhookを仕掛けて遊んでみます。

やってみる

今回やりたいこと

Akerunコントローラーは既存の機能として開閉後に履歴のアップロードをしています。開閉を検知したらwebhookとして事前に登録したURLにデータを渡したいです。

sequenceDiagram

actor User
participant ctl as Akerunコントローラー
participant Server as 外部のテスト用のサーバー

User->>ctl: 解錠リクエスト
activate ctl
    ctl->>ctl: 認証
    opt 認証成功
        ctl->>ctl: 解錠
        ctl->>Server: webhook!
    end
deactivate ctl

webhookとは?

HTTPリクエストを使って他のサービスにイベントの発生を伝える仕組みです。

  • 単純なHTTPリクエストなので、扱える環境が幅広い。
  • ポーリングに比べ、効率的に通信できる

などの利点があります。

詳細は

が勉強になりました。

webhookのあるあるを知りたい

webhookの雰囲気を掴むため、webhookの機能を提供しているサービスのドキュメントを眺めてみます。outgoing webhookと呼ばれている、ユーザーの指定したサーバーへ各webサービスから通知する方向のサービスをいくつか記載します。 LINEやGitHub、PayPayなど、生活に密着した様々なサービスが提供されていますね。

サービス できること ドキュメント なりすましの対策としておすすめしていること
LINE botアカウントへの友だち追加や
メッセージ送信などのイベント通知
メッセージ(Webhook)を受信する リクエストボディーのHMAC-SHA256によるハッシュ値と
リクエストヘッダーのx-line-signatureとして通知される署名を使ったHMACの検証
GitHub 事前にサブスクライブしたGitHubで発生するイベント通知 Webhook のイベントとペイロード Webhook の使用に関するベスト プラクティス
Meta MessengerやInstagram,WhatsAppなど
各種サービスのイベント通知
スタートガイド - Meta Webhooks SHA256のハッシュ値での認証
PayPay 支払い関連のイベント通知 PAYPAY API docs IPアドレスのホワイトリスト登録
Paidy 決済フローに進展があったことの通知 Webhookとは |通知のあった決済IDを使い、APIサーバーへ詳細な決済情報を再度問い合わせ検証

webhook自体は簡単に通知を送信できてしまうため、なりすましの対策は各サービスともに考えられています。 また、webhookを受信できなかった場合のリカバリーとして webhookの再配信をする仕組み等もあるようです。

webhookを使ったサービスでも、求められる要件で必要とされる機能は変わりそうですね。 実際にAkerun入退室管理システムとしてwebhookの通知をする場合は、Akerun APIの履歴取得API を補完するような機能にできると良さそうです。

錠の開閉をwebhookで通知してみる

先ほどのoutgoing webhookに対して、incomming webhookと呼ばれている、ユーザーから各サービスのエンドポイントへ通知するwebhookのサービスを提供しているサービスもいくつか探して連結させてみます。

ワークフロー系のツールやチャットツールが多いですね

サービス できること ドキュメント
GoogleChat チャットへの通知 Google Chat アプリを Webhook として作成する
Slack Slack ワークフローの発火 Webhook で開始するワークフローを作成する
n8n ワークフロー自動化ツールのトリガー ウェブフック|n8n ドキュメント

試しにslack workflowに錠の開閉を通知してみます。 Akerun APIと共通になるいくつかのパラメータを変数として通知できるようにしてみます。

{
    action: 'unlock' または 'lock',
    akerun_id: 対象のAkerunコントローラーのID,
    accessed_at: 入退室の時間(ISO 8601形式),
}

slack側で設定していきます

workflow builderを使って、workflowを設定します

トリガーにwebhookを設定します。変数は20個まで登録できます。

条件分岐など、細かい設定はできませんが、変数をメッセージに埋め込めば、毎回異なるメッセージを通知できます。

まずはcurlでデータを渡して動作確認です

curl -X POST -H "Content-Type: application/json" -d '{
    "action": "lock",
    "akerun_id": "R12XXXXXXXX",
    "accessed_at": "'$(date -u +'%Y-%m-%dT%H:%M:%SZ')'"
}' 'https://hooks.slack.com/triggers/XXXXXXXXX/YYYYYYYYYYYYY/ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ';

curlでwebhook

動きましたね!

実際の施解錠のロジックに埋め込み、CTLの中から直接postできるようにします。

解錠すると通知されました🎉

しっかり通知できました!

所感

slack workflowと繋いでみて

サービスと連動させるために設定もシンプルで、想像よりも速く簡単にできました。

実際に動かしてみて、ICカードリーダーへのレスポンスとほぼ同じタイミングで通知できるのは心地よかったです。

製品の機能にするなら

webhookによって様々な機能と連携できる反面、多くのユースケースを満たせるような設計が肝になりそうです。

  • シンプルに開閉だけが取れれば良い(今回作ったもの)
  • 履歴取得で取れる相当の詳細な開閉ログを毎回通知してほしい
  • 開閉の履歴は必要ないが、未登録のカードでの開閉失敗だけを知りたい

パッと思いつくだけでも色々ありますが、これらに合わせて、なりすましの対策や通知できなかった時のバックアッププラン、なども考える必要があります。色々詰め込むとどんどん複雑に見えてきますね。設計が大変そう。

最後に

webhookを使ったakerunコントローラーとslackworkflowの連携を試しました。

拡張性が高く、弊社が既に提供しているAkerun APIとも親和性が高く感じました。

ブログを書きながら色々試している過程が楽しかったです。

リアルタイムに連動するものが増えるとワクワクしますし、フォトシンスの目指すキーレス社会の実現にも一歩近づくのではないでしょうか?


株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 photosynth.co.jp

Akerunにご興味のある方はこちらから akerun.com