自前で作る多分最安の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
- RASPBERRY PI OS LITE (32-BIT)
- 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
- IoTWirelessGatewayCertManagerRole
- 作成後、ロールを選択
- 「信頼関係」タブ
- 信頼関係の編集
- Principalを編集する
"Principal": {
"Service": "iotwireless.amazonaws.com"
},
- Principalを編集する
- 自分のアカウントID
という感じ。
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
- JSON
- 作ったやつを適用
- 名前
- IoTWirelessDestinationRole
- IAM role to allow the Configuration and Update Server to manage gateway credentials
- IoTWirelessDestinationRole
- 作成後、ロールを選択
- 「信頼関係」タブ
- 信頼関係の編集
- Principalを編集する
"Principal": {
"Service": "iotwireless.amazonaws.com"
},
- Principalを編集する
- 自分のアカウントID
このIAM作るときが一番しんどい。
送信先Destinationの追加
AWS IoT Core for LoRaWANにて、「ワイヤレス接続」の送信先を追加する。
- 名前
- IoTWirelessDestination
- ルールの作成
- 名前
- IoTWirelessRule
- SELECT * FROM 'iot'
- AWS IoTのトピックにメッセージを再パブリッシュする
- アクションの設定
- topic
- トピック名
- lorawan
- ロールの作成
- IoTWirelessRepublishRule
- トピック名
- topic
- 名前
- Role
- IoTWirelessDestinationRole
デバイスプロファイルを追加
end-deviceによると思うが、今使っているものだとこれ。1.0.2でClass Aでabp。

サービスプロファイルの追加
名前だけ。メタデータ追加のチェックは入れておく。
デバイスの追加
いよいよデバイスの追加。LoRaWANのバージョン、DevEUI、Devaddr,セッションキー、プロファイルの設定をする。
しばらくして、アップリンクの受信時刻が更新されていたら、受信しています!お疲れ様でした!!

テスト
MQTTテストクライアントで、「lorawan」をサブスクライブしたら、データをリアルタイムで見られます。
ルールを書き換えて、SNSなりなんなりに送れば後はいつものAWSなので、煮るなり焼くなりお好きにどうぞ。
コメント