スマートロック アプリ側 wifi

パクリ9発目

パクリ元

内容

こないだモーター側とりあえず動かすだけはできたが高機能なことはできていない。でも気にしない。
あとはドアの外からラズパイにどう指令を伝えるか、という問題となる。これはパクリ元1つ目のようにいろんな会社が目的に応じていろいろな方法で作っているようだ。自分でもなんとなく調査して以下のように整理してみた。

No認証方式認証対象認証側受信装置認証方法
1人の信用門番門番が人を確認
2鍵で錠を開ける
3番号入力番号テンキー設定済み番号を入力
4磁気カード磁気カード磁気カードリーダー取得したキーを元に確認
5ICカード(NFC)フェリカ等ICカードリーダー取得したキーを元に確認
6アプリ(wifi/LTE)携帯電話ルーター取得したキーを元に確認
7アプリ(BlueTooth)携帯電話BlueTooth取得したキーを元に確認
8アプリ(QRコード)携帯電話QRコードリーダー取得したキーを元に確認
9アプリ(赤外線)携帯電話赤外線レシーバー取得したキーを元に確認
10指紋指紋リーダー取得したキーを元に確認
11カメラ取得したキーを元に確認
12網膜カメラ取得したキーを元に確認
13静脈静脈リーダー取得したキーを元に確認
14音声マイク取得したキーを元に確認
15モールス信号文字列マイク?取得したキーを元に確認
16手旗信号動きカメラ?取得したキーを元に確認
17モーション動きモーションセンサー取得したキーを元に確認
認証方式の整理

すべてに共通するのは前もって登録してあるものと一致するか否か、という点であり、一方からもう一方へどう情報を伝達して判定するか、ということである。QR決済やカード決済等も仕組み的には全く同じ。モールス信号から下はなんとなく思いついたから追加。まあよく考えたらモールス信号もQRコードも文字列をなんの手段で伝えるか、というだけなので厳密には同じなのかもしれんけど、

鍵やカード、携帯電話等持っているものを認証するのか、またはその人自体を認証するのか、という点は大きく異なる点となり、誰であっても被認証デバイスを提示するだけで認証してしまうのはセキュリティ上の問題となりうるが、ICカードの貸し借りなどたまにある話のように思える。

変わり種として、その人自身の顔の特徴点を記録したICカードを配って、読み取った特徴点とカメラで映った人物の特徴比較をして認証する、という方法を聞いたことがある。ICカードを落としても誰かに使われることがない、とのことだが、これは前もってDBなどに登録するデータを被認証デバイス自体に記録しておくという方式であり、なるほどと納得した覚えがある。

応用

とりあえず一番簡単そうな No.6:アプリ(wifi/LTE) を試す。

パクリ元2つ目、3つ目を参考にしてサーバーからサーボモーターを動かすように servo_http_test.py を作成。

from http.server import BaseHTTPRequestHandler, HTTPServer
import pigpio

host_name = '0.0.0.0'
host_port = 8000
SERVO_PIN = 18
pi = pigpio.pi()

class MyServer(BaseHTTPRequestHandler):
    def do_HEAD(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_GET(self):
        html = '''
           <html>
           <head>
            <style>
            button {
                display: block;
                width: 800px; padding: 200px; margin: 5px;
                background: #569f3c; color: #FFF;
                text-decoration: none; text-align: center; font-size: 54px;
            }
            </style>
           </head>
           <body>
           <button onclick="location.href='/open'">open</a>
           <button onclick="location.href='/close'">close</a>
           </body>
           </html>
        '''
        self.do_HEAD()
        status = ''
        if self.path=='/'or self.path=='/close':
            pi.set_servo_pulsewidth( SERVO_PIN, 1450 )

        elif self.path=='/open':
            pi.set_servo_pulsewidth( SERVO_PIN, 2500 )
        
        self.wfile.write(html.encode("utf-8"))

if __name__ == '__main__':
    http_server = HTTPServer((host_name, host_port), MyServer)
    print("Server Starts - %s:%s" % (host_name, host_port))

    try:
        http_server.serve_forever()
    except KeyboardInterrupt:
        http_server.server_close()

デーモンを立ち上げてからサーバ起動。

$ sudo pigpiod
$ python3 servo_http_test.py

同じセグメントにある携帯から http://raspberrypi.local:8000/ へアクセス

うーん、これだけでもなんか嬉しい。実際はオートロックにして画面上はopenボタンしか置かない感じですかね。

wifiパスワードとURLを知っていれば開けられるという仕組みだけど、家族という単位ぐらいならセキュリティ的にはこれでも大丈夫な気がする。他人がいる組織の場合はページの前に認証させて辞めた人を入れさせない、ぐらいやればいいかな。
他の認証方式も後で確認しよう。