はじめに
カバンから鍵出すのって面倒ですよね。そして急いでいると閉め忘れることもありますよね。そんなあなた(私)のためのスマートロックを作ってみました。V1と機能面では大した代わりはありませんが、ろくにSlack使っていないのにSlack依存している状態から脱却したかったのと勉強を兼ねて作りました。
V1はこちら
https://qiita.com/akimax74/items/6856e936946fdf2da853
使ったもの
ハードウェア
- Raspberry Pi Zero
- サーボモーター SG92R
- タミヤ ユニバーサルアームセット
ソフトウェア
- Python
- Flask
- ngrok
- SQLAlchemy
コード
説明
まずユーザー登録は/add_userに自分が設定しているパスワードと適当なユーザー名を叩くとUUIDを発行します。/lockまたは/unlockにUUIDを載せて叩くと鍵の操作が行えるという簡単な設計です。ngrokは一つだけ無料で固定のURLを発行してくれるので、それを使ってトンネルさせ、外部ネットワークからの操作を受け付けています。これらをデーモンで起動するようにしています。
フロントエンドはどの端末でも操作できるようhtmlで開閉ボタンを実装したのと、V1同様iOS ShortcutからAPI叩くことで実行できます。またユーザー追加・削除は頻繁に誰かを泊めるわけじゃないのでcurl叩いてやるようになっていますが、近いうちに勉強を兼ねってFlutterで適当なアプリを作ってみたいと思ってます。
アピールポイント
そもそも大学の課題制作から始まったもので、当初から掲げていたのは
- どこからでも鍵の操作ができること
- スマホ1台の操作で済むこと
- 家族友人に鍵をその時だけシェアできること
の3つでした。
うち上2つはクリアしていたのですが、鍵のシェアという点でiOS Shortcutを共有するとずっと操作できてしまうようになっていました(信頼してる人しか泊めないので問題ないけど)。そこで今回はユーザーの追加・削除を簡易的ですが搭載しました。各ユーザーにUUIDを振り、GETリクエストにUUIDを添えることで開閉ができます。ユーザー登録はPOSTリクエストにPWと適当なユーザー名を入力すれば行えます。ngrokを経由することでサーバーを公開することなく外部のネットワークからできるようにしています。
改善点
- SQLAlchemyでsession.getを使うとなぜかテーブルが見つからないと言われ渋々query.getを使っている
- ユーザー認証の設計が甘い
- DoS/DDoS食らうと終わる
etc...
セキュリティについてしっかり勉強しましょうという課題が残った。
終わりに
まだまだ勉強中で間違ってる内容であったり、もっといいやり方があると思います。お気づきの点がありましたら遠慮なくコメントお願いします。