LoRaWANでIoTプラットフォーム（The Things Network）にデータを上げる方法 その２

# これまでのお話

1. [LoRaでIoTプラットフォーム（ThingSpeak）にデータを上げる方法](http://qiita.com/openwave-co-jp/items/fc4695f6de36fc9cd398)
2. [LoRaWANでIoTプラットフォーム（The Things Network）にデータを上げる方法](http://qiita.com/openwave-co-jp/items/7edb3661ab5703e38e7c)
3. [LoRaにGPSを付けて、会社の周りを歩いてみた（Google Earthで位置情報をプロットする）](http://qiita.com/openwave-co-jp/items/8dae802638cf6ac62650)
4. [複数のLoRaノードをゲートウェイにアクセスさせるときに気を付けること](http://qiita.com/openwave-co-jp/items/80f86e61d538d78ee6bb)
5. [LoRa機器の受信強度（RSSI）の取得方法](http://qiita.com/openwave-co-jp/items/c8634ef311ac29c506cd)
6. [LoRaと法律の関係について](http://qiita.com/openwave-co-jp/items/e8126105f0f6473929c2)

# イントロダクション
[以前の投稿](http://qiita.com/openwave-co-jp/items/7edb3661ab5703e38e7c)で、LoRaWANへの接続の方法をご紹介しましたが、このほどDragino社のゲートウェイLG01-P-JPのファームがアップデートがありまして、そちらを使うとより簡単にLoRaWANへ接続できるようになりました。

今回はファームのアップデートから、LoRaWANに接続するまでをまとめたいと思います。

使用する機器は、弊社（[株式会社オープンウェーブ](http://www.openwave.co.jp/)）の[LoRa IoT スターターキット](http://www.openwave.co.jp/lorawan/)、接続するIoTプラットフォームにはThe Things Network（以降TTN）となります。


# 全体像
![全体像lorawan.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/47f5b6ff-9888-1d91-daf6-782a06692aff.png)
デバイス：LoRa Mini
ゲートウェイ：LG01-JP
デバイスの固定文字列「Hello, world!」を、LoRaWANプロトコルでTTNへ送信します。

## 使用ハードウェア
- Dragino社のLoRa IoT スターターキット
    - Dragino LG01-JP：LoRaゲートウェイ
    - Dragino LoRa mini：LoRaノード

## ファームのアップデートファイル
今回アップデートするファームウェアのバージョンはfirmware 4.2.3です。

- [dragino-IoT--v4.3.0-squashfs-sysupgrade.bin](http://www.dragino.com/downloads/index.php?dir=motherboards/ms14/Firmware/IoT/IoT--build-v4.3.0-20170927-2125/&file=dragino-IoT--v4.3.0-squashfs-sysupgrade.bin)

## ビルド済みArduinoプログラム
ゲートウェイのArduino部分のプログラムは、コンパイルされた実行ファイルを直接取り込みます。

- [single_pkt_fwd_v002.hex](http://www.dragino.com/downloads/index.php?dir=motherboards/lg01/sketch/&file=single_pkt_fwd_v002.hex)


## 使用ソフト
- Arduino用LMiCのライブラリ(下記をダウンロードして、Arduino IDEのライブラリにインクルードしておく)
https://github.com/matthijskooijman/arduino-lmic

## 使用プログラム
https://github.com/openwave-co-jp/LoRaWANExample

- LoRaWANExample/lora-arduino/lora-arduino.ino　　→デバイス（LoRa mini）


# 手順

## ファームウェアのアップデート
TeratermなどでLG01-P-JPにログインし、バージョンが4.2.3より前のバージョンであれば、ファームウェアのアップデートを行います。

![UP00.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/9c2bda65-c901-a5a9-4691-d1da9bd8b2ec.png)

### ファームウェアファイルのインストール
LG01-P-JPにブラウザでアクセスし、「System」→「Backup/Flash Fireware」を開きます。

![UP01.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/54fcd96f-3866-f638-4f6f-6d2cfa1541dd.png)

現在のファームウェアのバックアップをダウンロードします。
![UP02.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/939c5a5f-d7af-0315-19c3-3289c29a8071.png)

ダウンロードした「dragino-IoT--v4.2.3-squashfs-sysupgrade.bin」を下記の項目からアップロードします。
![UP03.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/307363e2-4798-bdb9-6147-11115b098616.png)

アップデートの実行をします。
![UP04.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/b43de9af-16ee-2c2f-a9db-619eb14ae142.png)

実行中の画面です。
![UP05.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/525b9de2-6556-7353-190f-1feb0ac98e4f.png)

実行が完了すると、ログイン画面が表示されます。
![UP06.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/983466f9-ca67-d45a-cd4e-27191f1938c2.png)



## TTNの設定
https://www.thethingsnetwork.org/

### アプリケーションとデバイスの登録
TTNにアカウントを作成し、アプリケーションの登録と、そのアプリケーションにデバイスを登録します。
アプリケーションは作成後、ABPに変更します。（デフォルトはOTAA）
デバイスを作成した時に得られた、Network Session Key、App Session Key、Device Addressを控えます。
![TTN.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/8fa36086-caaa-b665-cca1-773d6bde69d5.png)
)


### ゲートウェイの登録

次の点に注意し、TTNでゲートウェイを作成します。

- 予めLG01-JPにTeraTerm等でログインし、MACアドレス※1を控えておきます
- TTNでゲートウェイの登録を行います
    - 「I'm using the legacy packet forwarder」を選択した上で作成します
    - Gateway IDはLG01-JPのMACアドレスを上3桁、FF、FF、下三桁で登録します
        - 例：MACアドレス「AA BB CC 11 22 33」の場合「AA BB CC FF FF 11 22 33」となる
    - 他は適宜設定します※2

※1：MACアドレスについて、LG01-JPには複数あります。（WiFiと有線の口ですね）
WiFiと有線のどちらのMACアドレスを使うのか？という疑問が出てくるかと思いますが、実はどちらでも構いません。
※2：ゲートウェイの接続先ルータの設定について。
ゲートウェイのプログラミングでは、現在router.au.thethings.network（オーストラリア）のサーバへ接続しています。
そのため、下記の設定では、アジアのルータを設定してください。
![TTN_GW設定.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/8cf4245d-bc64-1058-648f-26c2ae6401ae.png)


## ゲートウェイのプログラミング
ゲートウェイでは、LoRaでデバイスからデータを受信し、TTNにデータをアップロードするArduinoのプログラムを書き込みます。

「Sensor」→「Flash MCU」を開きます。
![UP07.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/3c7cd04f-f1e9-18e7-30e5-25472773fbc9.png)

ダウンロードした「single_pkt_fwd_v002.hex」をアップロードします。
![UP08.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/11fd056d-c0be-3057-d1d5-4cbb4868bce1.png)

「Flash Image」で書き込みが実行されます。
![UP09.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/21d0fe22-0abc-c852-40d3-0900c6bbfb18.png)

## ゲートウェイの設定
バージョン4.2.3のファームウェアでは、ブラウザ上からLoRaWANの設定を行います。

「Sensor」→「LoRa/LoRaWAN」を開きます。
![UP10.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/5bbeb172-827c-b074-4b03-0fcac5e2631c.png)

LoRaWANのゲートウェイの設定に合わせて、各項目を設定します。
![UP11.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/34346a2c-8987-22aa-e0b1-04eecd928634.png)

下にスクロールすると、LoRaのチャネルの設定があります。
以降のLMiCのライブラリの設定に合わせて、LoRaの周波数を指定してください。
![UP12.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/d823913a-9edb-c1c4-f867-6c271eaa7080.png)


## デバイスのプログラミング
デバイス側では、LMiCライブラリの修正とデバイス情報の設定が必要になります。

### LMiCライブラリの修正
LMiCとは、IBMが作成した暗号化を含めたLoRaのMACプロトコル→LoRaMACのライブラリです。（LoraMac in Cの略）

2017/3現在のLMiCライブラリ（v1.5ベース）は、EUとUS基準の無線周波数の設定が用意されています。そのまま日本では使えないので、とりあえず簡単に日本で使っても良い設定に変更します。

Arduino IDEを通常通りインストールすると、インクルードしたライブラリは\Documents\Arduino\librariesに配置されます。
\Documents\Arduino\libraries\arduino-lmic-master\src\lmic\lorabase.hを開き、EUの設定を書き換えます。

```c:lorabase.h修正前
// Default frequency plan for EU 868MHz ISM band
// Bands:
//  g1 :   1%  14dBm
//  g2 : 0.1%  14dBm
//  g3 :  10%  27dBm
//                 freq             band     datarates
enum { EU868_F1 = 868100000,      // g1   SF7-12
       EU868_F2 = 868300000,      // g1   SF7-12 FSK SF7/250
       EU868_F3 = 868500000,      // g1   SF7-12
       EU868_F4 = 868850000,      // g2   SF7-12
       EU868_F5 = 869050000,      // g2   SF7-12
       EU868_F6 = 869525000,      // g3   SF7-12
       EU868_J4 = 864100000,      // g2   SF7-12  used during join
       EU868_J5 = 864300000,      // g2   SF7-12   ditto
       EU868_J6 = 864500000,      // g2   SF7-12   ditto
};
enum { EU868_FREQ_MIN = 863000000,
       EU868_FREQ_MAX = 870000000 };
```

```c:lorabase.h修正後
// Default frequency plan for EU 868MHz ISM band
// Bands:
//  g1 :   1%  14dBm
//  g2 : 0.1%  14dBm
//  g3 :  10%  27dBm
//                 freq             band     datarates
enum { EU868_F1 = 923200000,      // g1   SF7-12
       EU868_F2 = 923200000,      // g1   SF7-12 FSK SF7/250
       EU868_F3 = 923200000,      // g1   SF7-12
       EU868_F4 = 923200000,      // g2   SF7-12
       EU868_F5 = 923200000,      // g2   SF7-12
       EU868_F6 = 923200000,      // g3   SF7-12
       EU868_J4 = 923200000,      // g2   SF7-12  used during join
       EU868_J5 = 923200000,      // g2   SF7-12   ditto
       EU868_J6 = 923200000,      // g2   SF7-12   ditto
};
enum { EU868_FREQ_MIN = 920600000,
       EU868_FREQ_MAX = 928000000 };
```

### デバイスのプログラミング

「使用プログラム」のlora-arduino.inoを、Arduino IDEで開きます。
「[アプリケーションとデバイスの登録](http://qiita.com/openwave-co-jp/items/7edb3661ab5703e38e7c#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%AE%E7%99%BB%E9%8C%B2)」で控えたNetwork Session Key、App Session Key、Device Addressで下記を書き換えます。

```cpp:lora-arduino.ino
//ttn
static const PROGMEM u1_t NWKSKEY[16] = { 0x19, 0x7C, 0x79, 0x8E, 0x6D, 0xDE, 0xEB, 0xA6, 0x92, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0FF, 0xFF };
// LoRaWAN AppSKey, application session key
// This is the default Semtech key, which is used by the prototype TTN
// network initially.
//ttn
static const u1_t PROGMEM APPSKEY[16] = { 0x07, 0x8C, 0xB1, 0x4F, 0x1E, 0xAD, 0x39, 0x4A, 0x99, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0FF, 0xFF };
// LoRaWAN end-device address (DevAddr)
// See http://thethingsnetwork.org/wiki/AddressSpace
//ttn
static const u4_t DEVADDR = 0x2600FFFF;
```
このソース内でmydataという変数が、送信するデータです。
→LoRa miniに書き込み
![LoRamini.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/53f97613-ca3c-f671-4a4e-aabf1e779f87.png)

## 接続確認
TTNにログインし、コンソールでデバイスの画面を開きます。
![wan01.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/457f4baa-a34e-57c1-73b3-e0c829727f68.png)

データを受信すると、リストに表示されます。
![UP14.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/8531b39d-fe7b-f76b-40b2-17b976466611.png)

行を展開すると、受信したデータの詳細を見ることができます。
![wan03.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/e7f49d6d-064f-3bcc-4a95-f9b8f7b788d6.png)

Payloadの「48656C6C6F2C20776F726C6421」が、デバイスのmydataになります。
この数字をASCII文字で表現すると、「Hello, world!」になります。

# 最後に
今回のファームアップデートでは、LoRaWANゲートウェイの使い勝手が格段に良くなったと思います。
弊社からDragino社への情報提供もあってか、ファームウェアとArduinoプログラムの構成は、[以前の投稿のプログラム](http://qiita.com/openwave-co-jp/items/7edb3661ab5703e38e7c)と似ている部分があります。（我々がpythonで作った部分をファームウェアのCプログラムに置き換えたような構造です）

Dragino社の製品はファームウェアもソースがオープンなので、内容を見てみるのも面白いかと思います。

# 注意

プログラミングにはArduino IDEを使用しますが、事前にArduino IDEに次の設定が必要です。

- Dragino向けの設定をしておく必要があります。
http://www.ibeacondo.com/download/LG01_LoRa_Gateway_Manual_JP.pdf
- 次のライブラリを検索してインクルードしておく必要があります。
    - 「LoRa」(LoRaライブラリ)

この記事で使用するソースは、使用するハードに依存している部分が大きいため、他のハードとの組み合わせでどうなるかは分かりません。

また、今回使用したプログラムは、LoRaWANの仕様を完全に満たしているわけではありません。（最も簡単なLoRaWANによるデータのアップロードをしているだけです。パケットのカウントや、SN比の算出など、ゲートウェイやデバイスの状態を表す値の取得の実装もダミーで実装しています。）

[株式会社オープンウェーブ](http://www.openwave.co.jp/)