Technical Information/etc.

Edit  

The Things Networkを利用したメッセージ交換アプリの作成

2020/8/3

WSB000221.PNG

The Things Network (TTN) はLoRaWANを用いたオープンソースのIoT用ネットワークサーバーです。センサ端末(エンドノード)からのデータ収取(アップリンク)が主な使用方法になりますが、センサ端末のパラメータ設定用にダウンリンクも可能となっています。TTNはLoRaWANの通信クラスAで運用されており、ダウンリンクはアップリンク直後でしか行われないという制約がありますが、双方向通信が可能です。ここではテストとして、TTNと外部のアプリケーションサーバーを利用したセンサ端末同士の双方向通信アプリケーションを作成してみます。

WSB000222.PNG
ES920LR 1 <-> ES920LR 2 の間でメッセージを交換

 
Edit  

1.TTN Consoleにてアプリケーションの追加&設定

 
Edit  

アプリケーションの登録および設定

  • TTNのコンソールにログインし、「アプリケーション一覧」をクリックします。(あるいは、右上のメニューから「アプリケーション」をクリックします」

    WSB000127.PNG

  • アプリケーション一覧が表示されるので、右側の「アプリケーションを追加」をクリックします。

    WSB000158.PNG

  • アプリケーション追加画面が表示されるので、必要事項を入力し、「アプリケーションの追加」ボタンを押します。
    • アプリケーションID : アプリケーションを識別するIDです。外部から参照する際に使用します。ここでは msg_appとします。
    • 記述 : アプリケーションの説明文です。
    • ハンドラー登録 : ttn-handler-asia-se に設定します。

      WSB000194.PNG

  • アプリケーションが登録されましたので、つづいてこのアプリケーションで使用するデバイスを登録します。
 
Edit  

デバイスの登録及び設定(その1)

  • 「アプリケーション一覧」画面の「デバイス」の項目にて、「デバイス登録」をクリックします。

    WSB000195.PNG

  • 登録デバイス 画面が表示されますので、必要事項を入力します。
    • デバイスID : デバイスを識別するIDをアルファベットの小文字で入力します。
    • デバイスEUI : 「WSB000218.PNG」ボタンを押してサーバー上で生成します。

      WSB000196.PNG

  • デバイスEUIの入力部分に「この項目が生成されました」と表示されることを確認します。最後に「登録」ボタンを押して設定を確定させます。

    WSB000197.PNG

  • 引き続き画面右上の「設定」ボタンを押して、さらに設定を続けます。

    WSB000199.PNG

  • 「デバイス設定」画面が表示されるので、必要事項を入力します。
    • 記述 : デバイスの説明文です。(ここではアプリケーションの説明文と同じにしています)
    • アクティベーション方法 : 「ABP」をクリックして設定を変更します。(RFが1CHのゲートウェイだとOTAAによるアクティベーションはできないようですので、ABPとしています)

      WSB000200.PNG

  • 最後に「保存」ボタンを押して設定を確定します。

    WSB000201.PNG

  • 再び「デバイスを一覧」画面が表示されますので、アクティベーション方法が「ABP」になっていることを確認した後、下記項目をメモしておきます。
    • アプリケーションID : msg_app
    • デバイスID : es920lr0ab3
    • デバイスアドレス : 26041C4A
    • ネットワークセッションキー : 709BD6979B88437AAB8FE50EDA9D9B33
    • Appセッションキー : E2106E6BE1F1F765026E38AD58E6B733

      WSB000202.PNG

      • ネットワークセッションキーとAppセッションキーは、「WSB000219.PNG」ボタンを押すことで表示されます。
      • ABP方式では デバイスEUIとアプリケーションEUIは使用しません。
      • 結局、ユーザが任意に設定できるのはアプリケーションIDとデバイスIDの2つだけで、あとはTTNサーバーが自動的に設定します。
 
Edit  

デバイスの登録及び設定(その2)

  • 「デバイスの登録及び設定(その1)」と同じ手順で、2台目のデバイスの登録を行います。登録内容は以下のようにしました。
    • アプリケーションID : msg_app
    • デバイスID : es920lr0ab4
    • デバイスアドレス : 260410B4
    • ネットワークセッションキー : EDC3B1FA8C8D4BF5D72752C447E186A7
    • Appセッションキー : 7C97A7931F77DCC461B4C9CF22BC545C

      WSB000203.PNG

      • まだ実際の端末は動作していないので、画面下側の「ステータス」は「発見できません」となっています。
  • 以上でTTNの設定は完了です。最後に、アプリケーション一覧画面にもどり、デバイスが2つ登録されていることを確認します。また、画面下の「アクセスキー」の項目より、アクセスキーをメモしておきます。
    • アクセスキー : ttn-account-v2.a8nqW8Xj6of8ia9r3GeABEVSETO15jM<以下省略>

      WSB000205.PNG

 
Edit  

2.ES920LR の設定

  • ES920LRは、株式会社EASELが販売するLoRa変調を採用した920MHz帯長距離無線モジュールです。ファームウェアを書き換えることでLoRaWANエンドノードとして動作させることができます。

    WSB000003.JPG
    ES920LR+自作ブレイクアウト基板

  • 予め、ES920LRのファームウェアをLoRaWAN用のものに書き換えておきます。方法はソフトウェア開発環境説明書に書かれています。
  • なお、ES920LRのLoRaWANファームウェアは、メーカーにリクエストしてメールで送ってもらう必要があります。シリアル付きですので、手持ちのモジュールの個数分要求してください。また、書き込みソフトは通常のルートでは入手できなくなっているようですので、同時に送付してもらってください。
  • ES920LRとパソコンを UART-USB変換モジュールなどを用いて接続します。COMポートの通信速度はデフォルトで115200bpsです。以下、設定していきます。
 
Edit  

1台目設定(0ab3)

  • ES920LRの起動直後(リセット直後)はキーボードより "1" を押してターミナルモードで起動します。ソフトウェアバージョンとメニューが表示されますので、順に設定を行っていきます。特に、g.のdevaddr、h.のnwkskey、およびi.のappskeyはそれぞれ、TTNのデバイス登録時に設定したデバイスアドレス、ネットワークセッションキー、およびAppセッションキーとなります。
a. class     :  変更なし。(class a)
b. adr       :  ON->OFF に変更         b 2
c. activate  :  OTAA -> ABP に変更     c 2
d. deveui    :  設定不要(otaa用)
e. appeui    :  設定不要(otaa用)
f. appkey    :  設定不要(otaa用)
g. devaddr   :  TTNでの設定値を入力    g 26041C4A
h. nwkskey   :  TTNでの設定値を入力    h 709BD6979B88437AAB8FE50EDA9D9B33
i. appskey   :  TTNでの設定値を入力    i E2106E6BE1F1F765026E38AD58E6B733
j. ack       :  ON->OFFに設定          j 2
k. retry     :  変更なし (3回)
l. rssi      :  変更なし (off)
m. operation :  変更なし (config)
n. baudrate  :  変更なし (115200bps)
o. sleep     :  変更なし (1 no sleep)
p. sleeptime :  変更なし (50)
q. datarate  :  変更なし (DR2)
s. power     :  変更なし (13dBm)
t. dtime     :  変更なし (NO LIMIT)
u. duty      :  変更なし (<1%)
w. save      :  設定内容保存           w
y. show      :                         y
・・
Select Mode [1.terminal or 2.processor]
1
OK


 Software Version : VER 0.7.4
 LoRaWAN Version : VER 1.0.2

 Configuration Mode
------------------------------------------
 a. class       select LoRaWAN Class
 b. adr         select ADR Mode
 c. activate    select Activation Mode
 d. deveui      set DevEUI
 e. appeui      set AppEUI
 f. appkey      set AppKey
 g. devaddr     set DevAddr
 h. nwkskey     set NwkSKey
 i. appskey     set AppSKey
 j. ack         select Acknowledge Mode
 k. retry       set send retry count
 l. rssi        select RSSI Information
 m. operation   select Configuration or Operation
 n. baudrate    select UART baudrate
 o. sleep       select Sleep Mode
 p. sleeptime   set Sleep Wakeup Timer value
 q. datarate    select Default Data Rate
 s. power       select Output Power
 t. dtime       select Uplink DwellTime
 u. duty        select Duty Cycle
 v. version     software version
 w. save        save parameters
 x. load        load default parameters
 y. show        show parameters
 z. start       Transite Operation
 A. format      set Data Format
 ?. help        help

LoRaWAN > y

  configuration setting is below
  -------------------------------------
  Class                       : Class A
  ADR                         : ON
  Activate                    : Over The Air Activation
  DevEUI                      : 000AD0D000000AB3
  AppEUI                      : 0000000000000000
  AppKey                      : 00000000000000000000000000000000
  DevAddr                     : 00000000
  NwkSKey                     : 00000000000000000000000000000000
  AppSKey                     : 00000000000000000000000000000000
  Acknowledge                 : ON
  Retry count                 : 3
  RSSI information            : OFF
  Config/Operation            : Configuration
  UART baudrate               : 115200
  Sleep Mode                  : No Sleep
  Sleep Time                  : 50
  Default Data rate           : DR2
  Output Power                : 13dBm
  UplinkDwellTime             : No Limit
  Duty Cycle                  : < 1%
  Format                      : ASCII

LoRaWAN > b

  1. ON
  2. OFF

  select number > 2

  ADR is OFF.

LoRaWAN > c

  1. Over The Air Activation
  2. Activation by Personalization

  select number > 2

  Activation by Personalization is selected.

LoRaWAN > g

  please set DevAddr (00000000 - FFFFFFFF) > 26041C4A

  DevAddr is 26041C4A

LoRaWAN > h

  please set NwkSKey (16byte) > 709BD6979B88437AAB8FE50EDA9D9B33

  NwkSKey is 709BD6979B88437AAB8FE50EDA9D9B33

LoRaWAN > i

  please set AppSKey (16byte) > E2106E6BE1F1F765026E38AD58E6B733

  AppSKey is E2106E6BE1F1F765026E38AD58E6B733

LoRaWAN > j

  1. ON
  2. OFF

  select number > 2

  Acknowledge is OFF.

LoRaWAN > w

save parameter ... Done

LoRaWAN > y

  configuration setting is below
  -------------------------------------
  Class                       : Class A
  ADR                         : OFF
  Activate                    : Activation by Personalization
  DevEUI                      : 000AD0D000000AB3
  AppEUI                      : 0000000000000000
  AppKey                      : 00000000000000000000000000000000
  DevAddr                     : 26041C4A
  NwkSKey                     : 709BD6979B88437AAB8FE50EDA9D9B33
  AppSKey                     : E2106E6BE1F1F765026E38AD58E6B733
  Acknowledge                 : OFF
  Retry count                 : 3
  RSSI information            : OFF
  Config/Operation            : Configuration
  UART baudrate               : 115200
  Sleep Mode                  : No Sleep
  Sleep Time                  : 50
  Default Data rate           : DR2
  Output Power                : 13dBm
  UplinkDwellTime             : No Limit
  Duty Cycle                  : < 1%
  Format                      : ASCII

LoRaWAN >
 
Edit  

2台目設定(0ab4)

  • 同様の手順で、2台目の設定を行います。
a. class     :  変更なし。(class a)
b. adr       :  ON->OFF に変更         b 2
c. activate  :  OTAA -> ABP に変更     c 2
d. deveui    :  設定不要(otaa用)
e. appeui    :  設定不要(otaa用)
f. appkey    :  設定不要(otaa用)
g. devaddr   :  TTNでの設定値を入力    g 260410B4
h. nwkskey   :  TTNでの設定値を入力    h EDC3B1FA8C8D4BF5D72752C447E186A7
i. appskey   :  TTNでの設定値を入力    i 7C97A7931F77DCC461B4C9CF22BC545C
j. ack       :  ON->OFFに設定          j 2
k. retry     :  変更なし (3回)
l. rssi      :  変更なし (off)
m. operation :  変更なし (config)
n. baudrate  :  変更なし (115200bps)
o. sleep     :  変更なし (1 no sleep)
p. sleeptime :  変更なし (50)
q. datarate  :  変更なし (DR2)
s. power     :  変更なし (13dBm)
t. dtime     :  変更なし (NO LIMIT)
u. duty      :  変更なし (<1%)
w. save      :  設定内容保存           w
y. show      :                         y
  • 設定した結果は下のようになります。
LoRaWAN > y

  configuration setting is below
  -------------------------------------
  Class                       : Class A
  ADR                         : OFF
  Activate                    : Activation by Personalization
  DevEUI                      : 000AD0D000000AB4
  AppEUI                      : 0000000000000000
  AppKey                      : 00000000000000000000000000000000
  DevAddr                     : 260410B4
  NwkSKey                     : EDC3B1FA8C8D4BF5D72752C447E186A7
  AppSKey                     : 7C97A7931F77DCC461B4C9CF22BC545C
  Acknowledge                 : OFF
  Retry count                 : 3
  RSSI information            : OFF
  Config/Operation            : Configuration
  UART baudrate               : 115200
  Sleep Mode                  : No Sleep
  Sleep Time                  : 50
  Default Data rate           : DR2
  Output Power                : 13dBm
  UplinkDwellTime             : No Limit
  Duty Cycle                  : < 1%
  Format                      : ASCII

LoRaWAN >
  • いずれの端末も、最後に z コマンドを入力することにより通信が開始されます。以後はコンソールから入力した文字列がデータとしてTTNサーバーに送信され、ダウンリンクメッセージがあればその直後に受信します。下記は「TEST」というメッセージをTTNサーバーに送信(アップリンク)し、直後に(予めTTNサーバーにダウンリンクを予約されていた)メッセージ「01」を受信(ダウンリンク)している例です。
LoRaWAN > z
OK

 ----- Activation by Personalization start -----
TEST
Send Finish
Receive Data(01)

以上で、ES920LRの設定は完了しました。

 
Edit  

3.IBM Cloud上のNode-REDを用いたTTNサーバーのメッセージ処理の設定

  • TTNサーバー(LoRaWANネットワークサーバー)のコンソールにてエンドノード(先程設定したES920LRなどの無線センサ端末)からアップリンクされたデータやダウンリンクするデータを確認することができますが、コンソールから確認するだけでは不便です。ここではアプリケーションサーバーとしてIBM Cloud上に設置したNode-REDを利用し、データの加工とルーティングを行わせてみます。

    what-700x383.png

  • IBM Cloudの登録、およびNode-REDの初期環境設定については、@nishikyonさんのサイト(IBM CloudでNode-REDの立ち上げ方)で詳しく説明されていますので参考にしてください。ここでは初期設定が終わっていることを前提に説明を行います。
  • Node-RED右上のメニューからパレットの管理で、「node-red-contrib-ttn」を検索します。「ノードを追加」ボタンを押してノードを追加します。

    ADD_NODE.PNG

  • フローエディタを用い、パレットからワークスペースにノードをドラッグ&ドロップして下図のように配線します。

    WSB000220.PNG

  • それぞれのノードについて設定を行います。
  • WSB000190.PNG Device ID に、uplink元のデバイスIDを設定します。

    WSB000208.PNG

    WSB000209.PNG

    • App の項目は、初回設定時のみ「WSB000207.PNG」ボタンを押してアプリケーションIDとアクセスキーを設定します。次回からはプルダウンメニューから選定できます。

      WSB000206.PNG

  • WSB000189.PNG ユーザペイロードが"#"に一致する場合は、ダウンリンクしません。

    WSB000173.PNG

  • WSB000188.PNG msg.dev_id を空にします。(理由は後述)

    WSB000174.PNG

  • WSB000191.PNG Device ID にダウンリンクさせたいデバイスIDを設定します。Schedule にlastと設定すると、メッセージはサーバーのキューの最後に蓄積されます。


WSB000210.PNG

WSB000213.PNG

  • 最後に、画面右上の「デプロイ」ボタンを押します。

    WSB000193.PNG

  • これでIBM Cloud上のNode-RED のフローが動作を開始します。
 
Edit  

双方向メッセージ伝送の動作確認

  • エンドノード(センサ端末)であるES920LR 2台の電源を入れ、ターミナルを用いてzコマンドにてTTNに接続します。続いて適当にメッセージを入力し、リターンキーを押すことでサーバにメッセージが送信(アップリンク)されます。サーバに送られたメッセージは逐一アプリケーションサーバであるNode-REDに伝送され、メッセージの解析後、特定のセンサ端末へ(ここでは端末が2台しかありませんので、もう一方の端末へ)ダウンリンクするようルーティングされます。メッセージ以外にコマンド"#"が入力できます。この文字だけを送信すると、相手にメッセージを送信することなしにサーバにある自分宛てのメッセージのみをダウンロード(ダウンリンク)します。
  • 以下は実行例です。メッセージはサーバに蓄積されている可能性がありますので、メッセージ送信前に自局あてのダウンリンクがなくなるまで"#"を送信し、相手からのメッセージを確認する、といった運用の仕方になります。

    WSB000216.jpg

    WSB000217.jpg

 
Edit  

補足

  • ttn downlinkノードの中身
    "use strict"
    var initNode = require("../lib/init")
    
    module.exports = function (RED) {
      RED.nodes.registerType("ttn downlink", function (config) {
        var node = this
    
        RED.nodes.createNode(node, config)
    
        node.dev_id = config.dev_id
        node.port = config.port ? parseInt(config.port, 10) : null
        node.confirmed = config.confirmed || false
        node.schedule = config.schedule || "replace"
    
        var client = initNode(RED, node, config)
    
        if (!client) {
          return
        }
    
        this.on("input", function (msg) {
          var dev_id = msg.dev_id || node.dev_id
          // 何故か msg.dev_id(uplinkもとのdev_id)とnode.dev_id(config.dev_id,すなわち
          // downlink先のdev_id)のどちらにもdownlinkさせる設定となっている。これではメッセージを
          // 交換できないので、事前にmsg_dev_idを空にするfunctionを挿入して対処する。
          var port = msg.port || node.port || null
          var confirmed = ("confirmed" in msg) ? msg.confirmed : node.confirmed
          var schedule = msg.schedule || node.schedule || "replace"
    
          if (!dev_id) {
            node.error("No dev_id set")
            return
          }
    
          client.then(function (client) {
            client.send(dev_id, msg.payload, port, confirmed, schedule)
          })
        })
      })
    }
  • ttn uplinkノードの中身
    "use strict"
    
    var init = require("../lib/init")
    
    module.exports = function (RED) {
      RED.nodes.registerType("ttn uplink", function (config) {
        var node = this
    
        RED.nodes.createNode(node, config)
    
        node.dev_id = config.dev_id || "+"
        node.field = config.field
    
        var client = init(RED, node, config)
    
        if (!client) {
          return
        }
    
        client.then(function (client) {
          client.on("uplink", node.dev_id, node.field, function (dev_id, data) {
            var msg = node.field ? {} : data
            msg.dev_id = dev_id
            msg.payload = node.field ? data : (data.payload_fields || data.payload_raw)
            node.send([ msg ])
          })
        })
      })
    }
  • LoRaWANは送信時間の制約(Duty Cycle)があります。一般的には1%とされています。具体的には、ゲートウェイ及びエンドデバイスの送信時間は1時間あたり30秒までとされます。
  • 更にTTNではアップリンク通信時間をノードあたり1日30秒(24時間)に制限し、ダウンリンクメッセージをノードあたり1日10メッセージ(24時間)に制限する公正アクセスポリシーが設定されていますので、システムの運用にあたってはこのポリシーを遵守する必要があります。

トップ   リロード   一覧 単語検索