RFIDを使って在庫管理をしようと思ったとき、在庫データの持たせ方は大きく2つに分類されると考えています。すなわち、
- ユニークなタグIDに品番や品名などの商品の情報を紐づけて管理する方法
- システムに商品マスタを持ち、タグIDの一部を使って商品マスタとマッチングして管理する方法
RFIDを使って在庫管理をしようと思ったとき、在庫データの持たせ方は大きく2つに分類されると考えています。すなわち、
最近 LoRaWAN を触ることになったんですが、通常は The Things Network を LoRaWANサーバとして利用しますが今回は The Things Network を経由せずに Microsoft Azure IoT Hub に接続したいという特殊な状況になってしまったためいろいろやってたんですが、これがえらいハマってしまったので記録として残しておこうと思いました。
使用する LoRaWANゲートウェイは DRAGINO の LPS8 です。
設定画面をいろいろ見ていると、Azureとかの設定もあるしこれは簡単にできそうだなーと思ったら全く違っていろいろ大変でした。
まずは端末の認証ですが、ゲートウェイ単体では OTAA(Over-the-Air Activation)はできませんので、ABP(Activation by Personalization)を使うことにします。ABPの設定は端末ごとに DevADDR、APP Session Key、Network Session Key の3つを設定画面で設定して、同じ値を端末に設定すればOKです。
以降、設定画面のキャプチャ掲載しますがファームの更新が結構頻繁にあるようなので実際とは異なる可能性あります。掲載時点でのファームのバージョンは lgw-5.4.1628078462 です。
ABPの設定をしたら、LoRaWAN Configuration の画面に移ります。Service Provider のところに、Built-in for ABP Decode to MQTT というまさしくそれな的なのがあるので選んで保存します。
この辺のマニュアルを読んでみると、Azureへの接続にはSASを利用しているように見えます。ただSASには有効期限があって、できるだけ短く(1時間とか)にするのがお作法のようで、設定しても1時間で繋がらなくなるなどになってしまうのでそれでは困るなーというわけでX.509証明書の方でやってみることにします(証明書も有効期限ありますがこちらは長く設定できるので)。
X.509証明書で接続するためにいろいろやんないといけないんですが、こちらのチュートリアルが比較的簡単に実行できました。
https://docs.microsoft.com/ja-jp/azure/iot-hub/tutorial-x509-scripts
上記チュートリアルを実行した前提で話を進めます。
接続には3つのファイルが必要になります。Azure の CA認証ファイル(ゲートウェイにデフォルトでインストールされている Azure.cer です)と、上記のチュートリアルで作成したデバイスの認証ファイル2つ(cert/new-device.cert.pem と private/new-device.key.pem)です。デバイスの認証ファイルはあらかじめゲートウェイにアップロードしておきます。
Azure設定画面を見てみると、CA認証ファイルの設定しかありません。やはりSASを利用する前提のようです。
# ------------------------------------------ # Call MQTT Publish command # 1. Case with User, Password and Client ID present (e.g. Azure) if [ ! -z "$pass" ] && [ ! -z "$user" ] && [ ! -z "$clientID" ]; then case="1" mosquitto_pub $D -h $server -p $port -q $pub_qos -i $clientID -t $pub_topic -u $user -P "$pass" $C $cafile $PUB_FLAG "$mqtt_data" # 2. Case with Certificate, Key and ClientID present (e.g. AWS) elif [ ! -z "$certfile" ] && [ ! -z "$key" ] && [ ! -z "$clientID" ]; then case="2" mosquitto_pub $D -h $server -p $port -q $pub_qos -i $clientID -t $pub_topic --cert $cert --key $key $C $cafile $PUB_FLAG "$mqtt_data" # 3. Case with no User, Certificate or ClientID present elif [ -z "$user" ] && [ -z "$certfile" ] && [ -z "$clientID" ]; then case="3" mosquitto_pub $D -h $server -p $port -q $pub_qos -t $pub_topic $PUB_FLAG "$mqtt_data" # 4. Case with no User, Certificate, but with ClientID present elif [ -z "$user" ] && [ -z "$certfile" ] && [ ! -z "$clientID" ]; then case="4" mosquitto_pub $D -h $server -p $port -q $pub_qos -i $clientID -t $pub_topic $PUB_FLAG "$mqtt_data" # 5. Case with User and ClientID present, but no Password and no Certificate present elif [ -z "$pass" ] && [ -z "$certfile" ] && [ ! -z "$user" ] && [ ! -z "$clientID" ]; then case="5" mosquitto_pub $D -h $server -p $port -q $pub_qos -i $clientID -t $pub_topic -u $user $PUB_FLAG "$mqtt_data" # 6. Case with User and Password present, but no ClientID and no Certificate present elif [ ! -z "$user" ] && [ ! -z "$pass" ] && [ -z "$clientID" ] && [ -z "$certfile" ]; then case="6" mosquitto_pub $D -h $server -p $port -q $pub_qos -t $pub_topic -u $user -P "$pass" $PUB_FLAG "$mqtt_data" # 0. Else - invalid parameters, just log else case="Invalid parameters" logger "[IoT.MQTT]:Invalid Parameters - mosquitto_pub not called." fi