私の提案(おまけ)
プレゼン発表では、近接ICをICリーダーでタッチして、webページのリストを更新する、というのを実演しました。それっぽいデモではなくて、実際にLoRaWANデバイスからデータを送信して、きちんと処理を行なっています。
この時用意したWebページはデモ用に用意したもので、あと、使用した機器類に関しても少し書こうかなと思います。
デモに使用した機器
デモに使用した機器は、次の通りです。
- LoRaWANデバイス
- Arduino
- ラズパイ
- 近接ICカード
- ICリーダー(RC S380)
ArduinoでS380が使用できない
ArduinoはUSBデバイスを認識できません。ArduinoのUSBポートは、「ArduinoをPC等に認識してもらうため」にあります。とりあえずすぐ手に入ったICリーダーがS380だったのですが、これがArduinoで認識できない。むむー。
S380はこんなのです。
ArduinoでUSB機器を認識するには、USBホストシールドなるものが必要だそう。
こんなのです。これがあれば直接ArduinoでS380を使えたのですが、私は持ってませんでした。なので、ラズパイを間に挟んでなんとかすることにしました。
pythonでIC番号を読み取り、Arduinoへ送信
ICリーダーでICカードの情報を読み取ったりするのは、調べてみるとpythonで「nfcpy」というライブラリを用いて行なっている人が多かったです。なので、それに習うことにしました。こんな感じで機器を使用しています。
デモの機器接続の図
まず、pythonでICカードにIC番号を書き込みます。厳密にはIC番号というより、ICカードにデータとして番号を書き込んでいます。
pythonでICカードの情報を読み取ります。この時、欲しい情報だけじゃなくて色々なものが表示されるので、欲しい情報であるIC番号のみを取り出します。
最後に、シリアルポートを開いて、USB経由でArduinoへIC番号を送信します。Arduino側では「Serial.readString()」というのを実行すると、string型で値を変数に格納できます。
Arduino側ではstring型で取得した値をchar型に変換して、一文字ずつループで16進数に変換し、LoRaWANデバイスで送信します。
送信したデータは、私の用意したサーバーにJSONとして届き、処理されます。
※動かしてみると、すごく情報反映が遅い…。調べてみると、シリアルポート経由でArduinoにデータを送ると、その度にArduinoが再起動するようです。さらに、「Serial.readString()」はタイムアウトまで1秒かかる模様。これらの理由で、合計5秒ほど処理が遅延していました。デモだからとりあえずこれで実装しましたが、実際の運用ではICリーダーはArduinoに直接繋げられるものを使用して、もっと早い動作を期待できます。
デモ用Webページ
デモ用のWebページは、とにかく簡単に、htmlファイルで大まかに作りました。スタイルシートもインラインで直書きです。大まかな図を見て下さい。
デモページの図
情報の更新はajaxで実装しました。3秒に1度、情報を更新します。外から大事な情報を盗み見られないように、ajaxで指定したphpファイルは「ただ他のphpをincludeしているだけ」のファイルで、実際に処理を行なうphpファイルはwebでアクセスできない、もっと上の階層に設置しました。
処理はほとんど「send_json.php」と同じです。最終的にJSONをMQTTではなくてajax用に出力しているのと、htmlファイルに最適な形にJSONの中身を多少書き換えているくらいです。
まとめ
データベース(mysql)がシステムの主役なので、あとで拡張機能をつけたくなったとき、mysqlにアクセスできる言語ならなんでもOKという自由度があります。また、車両情報、駐車場情報の登録はログイン式のWebサイトを用意し、そこからフォーム等で行なうことで簡単に運用できます。
また、時刻の比較は全部2038年問題が発生しないようなコードで書いています。ちょっとしたこだわりです。
自分なりに、問題解決に向けていい提案ができたのではないかと思います!
余談ですが、プレゼン発表前日の夜にPCの電源アダプターが断線しました。このままでは準備ができない!ということで急遽電源アダプターの断線箇所をハンダ付けすることに。運が悪い><
すごい長くなっちゃった!またねー!さき