RAK7246にBasic Stationを入れてAWS LoRaWAN NetworkServerに接続

[最終更新] 2022年4月16日

自前で作る多分最安のLoRaWAN Gateway。プライベートでLoRaWANをいじる奇特な人にはいいかもしれない。

Raspberry Pi Zero WにLoRaなHATを載せたRAK7246を使う。

Take Your First Step into the IoT World with RAK7246 and RAK7246G – RAKwireless – IoT Made Easy

RAK7246GはGPS対応。ちゃんとやればClass Bもできるんだろうけれど、今回はClass Aのデバイスを接続します。

環境

  • RAK7246
  • Raspberry Pi Imager v1.7.2
    • RASPBERRY PI OS LITE (32-BIT)
      • Linux raspberrypi 5.15.32+ #1538
  • Basic Station 2.0.6

参考動画

基本的にこれ。これに則ってやる。が、日本ローカライズなところもあるので、そこは合わせる。

RAK7246の準備

RAK7246でまずハマるのは、「どうやってSDカード出すの?」だと思う。いや本当に。

これ、SDカードを取り出すにはネジを外してケースを開く必要がある。この設計は本当にどうかと思う。なぜそんな設計にしたのか…。

あー、あとRAK7246GはGPSも使えるんだが、GPSアンテナとRFのアンテナがどちらもSMAコネクタで特にマーカもないため、「どっちやねん」となる。これもケースを開けるとわかる。

RaspberryPi ZeroWの設定

OSをインストール

OSはRAKの用意したものではなく、素のRaspbianを入れる。以前は毎度imgを落としてきてddコマンドを使っていたが、今はインストール用のアプリRaspbian Imagerがあり、イメージを焼くだけでなくWi-fiやSSHの設定まで書き込んでくれる。注意するとすれば、Wi-fiは2.4GHz帯だよってことくらいか。

便利な世の中になった。

最初のインストール

設定したら適当にsshで入る。IPアドレスはarpでRPiなものを探す……ことはしないで、自分はいつも「LanScan」というアプリでIPスキャンしている。

sudo raspi-config
# enable SPI
3 Interface Options P4 SPI

8 Update

sudo apt update
sudo apt upgrade
sudo apt install git
sudo reboot

Basic Stationをインストール

Semtechの公開している「lorabasics/basicstation: LoRa Basics™ Station – The LoRaWAN Gateway Software」をインストールする。

git clone https://github.com/lorabasics/basicstation.git
cd basicstation/
ls
make platform=rpi variant=std
ls
cd build-rpi-std
ls
cd bin/
ls
cd

cp basicstation/examples/live-s2.sm.tc/station.conf station.conf
ls
cat station.conf

ビルドはまぁまぁ時間がかかるので、コーヒーでも入れる。設定ファイルが表示できたらOK。設定ファイルの中身よくわからん。

AWS IoT側に基地局を追加

GWに適用するIAMのロール作成

以下のような手順でロールを作成する。これは後でAWS IoT上で登録したGWに適用する。

  • 別のAWSアカウント
    • 自分のアカウントID
      • 何もチェックを入れずに次
    • ポリシーの適用
      • AWSIoTWirelessGatewayCertManager
    • 名前
      • IoTWirelessGatewayCertManagerRole
        • IAM role to allow the Configuration and Update Server to manage gateway credentials
    • 作成後、ロールを選択
      • 「信頼関係」タブ
      • 信頼関係の編集
        • Principalを編集する
          "Principal": {
            "Service": "iotwireless.amazonaws.com"
          },

という感じ。

AWS IoT Core for LoRaWANに基地局追加

AWS IoT Core for LoRaWANの「ワイヤレス接続」よりゲートウェイを追加する。

  • Gateway’s EUIは、RAK7246のMACアドレスのド真ん中にfffeを挿入したもの。
    • つまり「前半6桁fffe後半6桁」
  • 周波数帯はAS923-1

次の画面で、CUPSのエンドポイントとLNSのエンドポイントが表示される。

ここで、CUPSのエンドポイントを「cups.uri」にコピペする。cups.uriはRPiのホームディレクトリ直下(つまりstation.confと同じ)に置く。

次に、「サーバー信頼証明書をダウンロード」すると、cups.trustおよびlns.trustを取得できる。cups.trustをcups.uriと同じくRPiのホームディレクトリ直下に置く。

その次に、「ゲートウェイ証明書」で「証明書を作成」すると、.pemファイルと.keyファイルが作成できるので、これを落とす。落としたら例によってホームディレクトリ直下に置くが、このとき.pemファイルをcups.crt、.keyファイルをcups.keyにリネームする。

諸々ファイル取り終わったら「送信」。

以上より、以下のファイルがRPiのホームディレクトリ直下にできることになる。

  • cups.crt
  • cups.key
  • cups.trust
  • cups.uri
  • station.conf

これで基地局の設定ファイルは揃った。

基地局とAWS IoTの疎通を確認

以下を実行する。

RADIODEV=/dev/spidev0.0 /home/<ユーザ名>/basicstation/build-rpi-std/bin/station

すると、AWS IoTと接続して、LNS用の設定ファイルも自動で落としてくれる。tc.trustなどのファイルができる。

AWS IoTでは最後に受信したアップリンクができる。

Concentrator start failedの対応

これでよければいいんだが、ダラダラ流れているログを見ていると、ERRという嫌な文字列がある。

2022-04-13 09:39:51.232 [HAL:ERRO] [lgw_start:742] FAIL TO CONNECT BOARD
2022-04-13 09:39:51.232 [RAL:ERRO] Concentrator start failed: lgw_start
2022-04-13 09:39:51.232 [RAL:ERRO] ral_config failed with status 0x08
2022-04-13 09:39:51.232 [any:ERRO] Closing connection to muxs - error in s2e_onMsg

コンセントレータの起動に失敗している、と。Concentrator start failed: lgw_start – githubmemoryを参考に(YouTubeのビデオの人が答えてくれている)、コンセントレータで使うピンをリセットするのだ、と、よくわからないが、以下のスクリプトを実行する。

#!/bin/bash

echo "Restarting the CE0 pin..."
CSPIN=8
echo "$CSPIN" > /sys/class/gpio/export
sleep 1
echo "out" > /sys/class/gpio/gpio$CSPIN/direction
echo "0" > /sys/class/gpio/gpio$CSPIN/value
sleep 1
echo "1" > /sys/class/gpio/gpio$CSPIN/value
echo "Done\n"
sleep 1

echo "Restarting the Concentrator..."
RSTPIN=17
echo "$RSTPIN" > /sys/class/gpio/export
sleep 1
echo "out" > /sys/class/gpio/gpio$RSTPIN/direction
echo "1" > /sys/class/gpio/gpio$RSTPIN/value
sleep 1
echo "0" > /sys/class/gpio/gpio$RSTPIN/value
echo "Done\n"
sleep 2

実行すると、リンク先と同じようにエラーが出る。が、その後実行すると、コンセントレータが起動するようになった。

Uplinkの受信を確認する

何か適当に、abpでClass Aのend-deviceを起動させる。何もいじらないと周波数設定が以下っぽかったので、これにあわせてやるとよさげ。

  • 922.0
  • 922.1
  • 922.2
  • 922.6
  • 922.8
  • 923.0
  • 923.2
  • 923.4

なぜ922.1……。

で、ターミナルのログをつらつら眺めていると、RSSIとかが表示されるので「あ、受かっているな」とわかる。もちろん現時点ではSesstion Keyも何も登録していないので、復号はされない。

AWS IoTにend-deviceを追加

基地局の設定が完了し、AWS IoTやend-deviceとの疎通を確認できた。ので、次はend-deviceをAWS IoT側で設定してやれば、データの復号ができるはずである。

IAMロールの作成

  • 別のAWSアカウント
    • 自分のアカウントID
      • 何もチェックを入れずに次
    • ポリシーの作成
      • JSON

      • {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "iot:DescribeEndpoint",
                "iot:Publish"
              ],
            "Resource": "*"
            }
          ]
        }
        
      • 名前
        • IoTWirelessDestinationPolicy
    • 作ったやつを適用
    • 名前
      • IoTWirelessDestinationRole
        • IAM role to allow the Configuration and Update Server to manage gateway credentials
    • 作成後、ロールを選択
      • 「信頼関係」タブ
      • 信頼関係の編集
        • Principalを編集する
          "Principal": {
            "Service": "iotwireless.amazonaws.com"
          },

このIAM作るときが一番しんどい。

送信先Destinationの追加

AWS IoT Core for LoRaWANにて、「ワイヤレス接続」の送信先を追加する。

  • 名前
    • IoTWirelessDestination
  • ルールの作成
    • 名前
      • IoTWirelessRule
      • SELECT * FROM ‘iot’
      • AWS IoTのトピックにメッセージを再パブリッシュする
      • アクションの設定
        • topic
          • トピック名
            • lorawan
          • ロールの作成
            • IoTWirelessRepublishRule
  • Role
    • IoTWirelessDestinationRole

デバイスプロファイルを追加

end-deviceによると思うが、今使っているものだとこれ。1.0.2でClass Aでabp。

サービスプロファイルの追加

名前だけ。メタデータ追加のチェックは入れておく。

デバイスの追加

いよいよデバイスの追加。LoRaWANのバージョン、DevEUI、Devaddr,セッションキー、プロファイルの設定をする。

しばらくして、アップリンクの受信時刻が更新されていたら、受信しています!お疲れ様でした!!

テスト

MQTTテストクライアントで、「lorawan」をサブスクライブしたら、データをリアルタイムで見られます。

ルールを書き換えて、SNSなりなんなりに送れば後はいつものAWSなので、煮るなり焼くなりお好きにどうぞ。

関連記事

IoT の記事

Raspberry Pi の記事

aws の記事

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。