業務で「リモート操作で扉の鍵を施錠/解錠する」必要があり、いろいろ調査した結果 Akerun という入退室管理システムを使ってみました。その様子をメモ目的でブログにしました。
2019030400


扉の鍵をリモート操作で開ける、という需要はあると思っています。特定の条件を満たす人だけが入れる部屋を作りたい(そのためのロジックを加えて実装したい)とか、締め忘れて外出してしまった可能性のある家の扉の鍵をいま居る場所から施錠したいとかです。

で、いくつか調べてみました。Bluetooth や NFC などを使って比較的近い距離間で通信できるものは多く提供されているようでしたが、現在 REST API を使って離れた場所からも操作できるもの、となると(2019年2月に私が探した限りで※)株式会社フォトシンスから提供されている Akerun (Pro) という製品だけのようでした。

※他に探した範囲では REST API が提供されていなかったり、以前は提供されていたが現在は提供されていなかったり、日本向けの情報が提供されておらずそもそも日本で入手できるのか不明だったり・・・という結果でした。

なお、Akerun 自体には(買い取り式の)個人向け製品も存在しているのですが、REST API が提供されているのは業務用の Akerun Pro という月次レンタル製品のみとのことでした。気軽に使ってみるにはちとハードルが高いかもしれないと感じたのと、それ故かあまり技術情報をウェブで見かけることがあまりありませんでした。そんな背景もあって今回ブログで紹介しようかな、と思い立ったのでした。


【システム構成】
まず Akerun Pro を使った今回のシステム構成はこんな感じになります:
2019022601


Akerun(今回利用するのは正確には "Akerun Pro" ですが、以下 "Akerun" と表記します)は既存のドアに設置可能なデバイスです。外部から信号を送ってドアのサムターン部分を回して解錠/施錠します(要はサムターンが回せる位置に Akerun を取り付けて使う、というものです)。実際には NFC などのカードを使って開閉することもできます(注 Akerun Pro では一式揃っています)が、今回は使いません。

特に REST API でリモート操作する場合は、Akerun デバイスに加えて Akerun Remote と呼ばれるインターネットとのルーターとなるデバイスを追加設置します(Akerun Remote も Akerun Pro に含まれています)。上図のように Akerun と Akerun Remote は Bluetooth で接続されます。Akerun Remote は有線または無線LANでインターネットに接続します(私は WiFi テザリングで試しました)。無線 LAN の設定等はスマホ用の専用アプリを使って Akerun Remote に設定することができます。

このようにして Akerun Remote をインターネットに接続した後は管理用画面や API を使って解錠/施錠の指示を出すことができるようになります。それらの指示はインターネットを経由して Akerun Remote へ伝わり、Akerun Remote から Akerun へ Bluetooth による指示が送られてサムターンが(指示されたように)動く、というものです。


【準備】
API の使用は申込み制となっていて、こちらのページ内の「こちらのお申込みフォーム」と書かれたリンクから申し込みを行う必要があります:
https://developers.akerun.com/#introduction

申込時に名前やメールアドレス、電話番号等を登録していくのですが、 OAuth 認証のリダイレクト URI を指定する箇所があります:
2019022602

 
この URI は実在している必要はないのですが、実在しない場合はエラー時にリダイレクトされない URI である必要があります(OAuth リダイレクト時のパラメーターを受け取る必要があるため、実在しない場合でもパラメータを保持した URI でエラー表示される必要があります)。また https:// の URI である必要がある点に注意が必要です。ここで指定した URI は後で使うのでメモしておきましょう。ここでは仮に https://myapp_for_akerun.mybluemix.net/callback という URI を指定したものとして以下を紹介します。

申し込みの手続きが完了すると(数日後に) OAuth 認証用の client_id と client_secret が記載されたメールが送信されてきます。ここでは仮に
 client_id: "my_client_id"
 client_secret: "my_client_secret"
という値が送られてきたものと仮定して以下を紹介します(実際にはランダムな文字列です)。

ここまで完了するとアクセストークンの発行ができるようになります。


【アクセストークンの取得】
ウェブブラウザで以下の URL にアクセスします:
https://api.akerun.com/oauth/authorize/?client_id=(送られてきた client_id の値)&redirect_uri=(申込時に指定したリダイレクト URI の値)&response_type=code

上記の前提であれば、具体的には以下の URL となります:
https://api.akerun.com/oauth/authorize/?client_id=my_client_id&redirect_uri=https://myapp_for_akerun.mybluemix.net/callback&response_type=code


正しい値が指定されていると redirect_uri のアドレスにリダイレクトされます。その時の URI に code 
というパラメータが付与されているので、この値を取り出します。例えばリダイレクト先が
 https://myapp_for_akerun.mybluemix.net/callback?code=XXXXXXXXXX
という URI であれば、XXXXXXXXXX 部分が該当します。この値を code 値として以下を続けます(code 値は取得から 30 分間有効なので、取得から 30 分以内に以下のアクセストークンの取得を行ってください)。

取得した code 値と HTTP POST を実行できるツール(curl など)を使って、以下の HTTP POST リクエストを実行します(実際には改行せず一行で入力します):
$ curl -X POST "https://api.akerun.com/oauth/token"
  -d grant_type=authorization_code
  -d client_id=(client_id の値)
  -d client_secret=(client_secret の値)
  -d code=(code の値)
  -d redirect_uri=(申込時に指定したリダイレクト URI の値)



上記までに取得した例の場合だと、このような(一行の)リクエストになります:
$ curl -X POST "https://api.akerun.com/oauth/token"
  -d grant_type=authorization_code
  -d client_id=
my_client_id
  -d client_secret=
my_client_secret
  -d code=XXXXXXXXXX
  -d redirect_uri=
https://myapp_for_akerun.mybluemix.net/callback


成功すると以下のような JSON がレスポンスとして返されます:
{
  "access_token": "**********",
  "token_type": "bearer",
  "refresh_token": "xxxxxxxxxx.....",
  "expires_in": 7776000,
  "created_at": 1500853017
}



この結果の "access_token" の値(********** 部分)がアクセストークンです。


【REST API の実行】
ここまでの手順でアクセストークンが取得できていれば、その値を HTTP リクエストヘッダを使って、
 Authorization: Bearer (アクセストークンの値)

のように指定して、各種 REST API を実行することができるようになります。例えばアクセストークンのオーナーが所属する組織 ID の一覧は GET https://api.akerun.com/v3/organization で取得できるのですが、このリクエスト時に
 Authorization: Bearer **********
という HTTP リクエストヘッダを付与することで正しい権限で実行できます。

例えば組織 ID : OOO1、アケルン ID : AAA1 の鍵をリモートで解錠するには、以下の HTTP リクエストを発行します:
$ curl -X POST "https://api.akerun.com/v3/organizations/OOO1/akeruns/AAA1/jobs/unlock"
  -H "Authorization: Bearer **********"



同様にして、同じ鍵をリモートで施錠する場合は以下になります:
$ curl -X POST "https://api.akerun.com/v3/organizations/OOO1/akeruns/AAA1/jobs/lock" 
  -H "Authorization: Bearer **********"




なお、開発者向けの API 情報はこちらです:
https://developers.akerun.com/#introduction