Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

スレッドボーダールーター-スレッド1.2マルチキャスト

608c4c35050eb280.png

スレッドとは何ですか?

スレッドは、IPベースの低電力ワイヤレスメッシュネットワーキングプロトコルであり、安全なデバイス間およびデバイス間通信を可能にします。スレッドネットワークは、トポロジの変更に適応して、シングルポイント障害を回避できます。

OpenThreadとは何ですか?

グーグルが発表しOpenThreadはThread®のオープンソース実装です。

OpenThreadボーダールーターとは何ですか?

OpenThread境界ルータグーグルが発表(OTBR)は、スレッド境界ルータのオープンソース実装です。

スレッド1.2マルチキャスト

スレッド1.2は、レルムローカルよりもスコープが大きいマルチキャストアドレスに対して、異種ネットワーク(スレッドおよびWi-Fi /イーサネットネットワークセグメント)を介したマルチキャストをサポートする一連の機能を定義します。

スレッド1.2ボーダールーターはそのバックボーンルーター(BBR)データセットを登録し、選択されたBBRサービスはプライマリバックボーンルーター(PBBR)であり、マルチキャストのインバウンド/アウトバウンドフォワードを担当します。

アドレスがレルムローカルよりも大きい場合、スレッド1.2デバイスはCoAPメッセージを送信して、マルチキャストアドレスをPBBR(マルチキャストリスナ登録、略してMLR)に登録します。 PBBRは、外部インターフェイスでMLDv2を使用して、ローカルスレッドネットワークに代わって、リッスンする必要のあるIPv6マルチキャストグループについて、より広いIPv6 LAN / WANと通信します。また、PBBRは、宛先が少なくとも1つのスレッドデバイスによってサブスクライブされている場合にのみ、マルチキャストトラフィックをスレッドネットワークに転送します。

スレッド1.2最小エンドデバイスの場合、マルチキャストアドレスを集約し、代わりにMLRを実行するか、親がスレッド1.1の場合は自分自身を登録するために、親に依存する場合があります。

詳細については、レルムローカルスコープより大きいために1.2仕様のセクション5.24マルチキャスト転送スレッドをご参照ください。

何を構築するか

このコードラボでは、スレッドボーダールーターと2つのスレッドデバイスをセットアップし、スレッドデバイスとWi-Fiデバイスでマルチキャスト機能を有効にして検証します。

あなたが学ぶこと

  • スレッド1.2マルチキャスト機能を使用してnRF52840ファームウェアを構築する方法。
  • スレッドデバイスでIPv6マルチキャストアドレスをサブスクライブする方法。

必要なもの

  • Raspberry Pi3 / 4デバイスと8GB以上の機能を備えたSDカード。
  • 3枚の北欧の半導体nRF52840 DKのボード。
  • なしのWi-Fi APのIPv6ルータアドバタイズメントGuardはルータで有効。
  • Python3がインストールされたLinux / macOSラップトップ(Raspberry Piも動作します)。

フォロースレッド境界ルータを-双方向IPv6接続とDNSベースのサービスディスカバリコードラボは、ラズベリーパイのスレッド境界ルータを設定します。

完了すると、Raspberry Piは動作するスレッドネットワークを作成し、Wi-Fiネットワークに接続されているはずです。

OTBRは数秒以内にプライマリバックボーンルーターになるはずです。

$ sudo ot-ctl bbr state
Primary
Done
$ sudo ot-ctl bbr
BBR Primary:
server16: 0xD800
seqno:    23
delay:    1200 secs
timeout:  3600 secs
Done

マルチキャストを使用してThread1.2 CLIアプリケーションを構築し、2つのnRF52840DKボードをフラッシュします。

nRF52840DKファームウェアをビルドする

指示に従ってプロジェクトのクローンを作成し、nRF52840ファームウェアをビルドします。

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recurse-submodules --depth 1 https://github.com/openthread/ot-nrf528xx.git
$ cd ot-nrf528xx/
$ script/build nrf52840 USB_trans -DOT_MLR=ON -DOT_THREAD_VERSION=1.2
$ arm-none-eabi-objcopy -O ihex build/bin/ot-cli-ftd ot-cli-ftd.hex

私たちは、で正常にビルドHEXのファームウェアを見つけることができot-cli-ftd.hex

フラッシュnRF52840DKファームウェア

使用nRF52840 DK上にファームウェアをフラッシュnrfjprogの一部であり、 NRFコマンドラインツールを

$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset

OTBRは、前の手順でスレッドネットワークを作成しました。これで、nRF52840DKをスレッドネットワークに追加できます。

OTBRから生のアクティブデータセットを取得します。

$ sudo ot-ctl dataset active -x
0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff

nRF52840DKボードに接続します。

$ screen /dev/ttyACM0 115200

nRF52840DKのアクティブデータセットを構成します。

> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Done

スレッドスタックを開始し、数秒待って、デバイスが正常に接続されたことを確認します。

> ifconfig up
Done
> thread start
Done
> state
child

上記の手順を繰り返して、他のnRF52840DKボードをスレッドネットワークに接続します。

これで、OTBRと2つのnRF52840DKボードの3つのスレッドデバイスを使用してスレッドネットワークを正常にセットアップできました。

OTBRとラップトップでWi-Fiネットワークをセットアップして、同じWi-FiAPに接続するようにします。

我々は使用することができますraspi-config設定をラズベリーパイOTBR上のセットアップのWi-Fi SSIDとパスフレーズに。

最終的なネットワークトポロジを以下に示します。

5d0f36fd69ebcc9a.png

nRF52840エンドデバイス1でff05 :: abcdをサブスクライブします。

> ipmaddr add ff05::abcd
Done

確認しff05::abcd成功裏に加入しています:

> ipmaddr
ff33:40:fdde:ad00:beef:0:0:1
ff32:40:fdde:ad00:beef:0:0:1
ff05:0:0:0:0:0:0:abcd            <--- ff05::abcd subscribed
ff02:0:0:0:0:0:0:2
ff03:0:0:0:0:0:0:2
ff02:0:0:0:0:0:0:1
ff03:0:0:0:0:0:0:1
ff03:0:0:0:0:0:0:fc
Done

ラップトップでff05 :: abcdを購読します:

私たちは、Pythonスクリプトの必要subscribe6.pyノートPC上のマルチキャストアドレスに加入すること。

以下のコードをコピーして、それを保存subscribe6.py

import ctypes
import ctypes.util
import socket
import struct
import sys

libc = ctypes.CDLL(ctypes.util.find_library('c'))
ifname, group = sys.argv[1:]
addrinfo = socket.getaddrinfo(group, None)[0]
assert addrinfo[0] == socket.AF_INET6
s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0])
interface_index = libc.if_nametoindex(ifname.encode('ascii'))
mreq = group_bin + struct.pack('@I', interface_index)
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
print("Subscribed %s on interface %s." % (group, ifname))
input('Press ENTER to quit.')

実行subscribe6.py購読するff05::abcdのWi-Fiネットワーク・インタフェース上の(例えばwlan0):

$ sudo python3 subscribe6.py wlan0 ff05::abcd
Subscribed ff05::abcd on interface wlan0.
Press ENTER to quit.

マルチキャストサブスクリプションを使用した最終的なネットワークトポロジを以下に示します。

b118448c98b2d583.png

スレッドネットワークのnRF52840エンドデバイス1とWi-Fiネットワークのラップトップの両方でIPv6マルチキャストアドレスをサブスクライブしたので、次のセクションで双方向IPv6マルチキャストの到達可能性を確認します。

今、私たちは、IPv6マルチキャストアドレスの使用スレッドのネットワークとノートパソコンでnRF52840エンドデバイス1の両方に到達することができるはずff05::abcdのWi-Fiネットワークからを。

Wi-Fiインターフェースを介してOTBRでff05 :: abcdにpingを実行します。

$ ping -6 -b -t 5 -I wlan0 ff05::abcd
PING ff05::abcd(ff05::abcd) from 2401:fa00:41:801:83c1:a67:ae22:5346 wlan0: 56 data bytes
64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=1 ttl=64 time=57.4 ms
64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=1 ttl=64 time=84.9 ms (DUP!)
64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=2 ttl=64 time=54.8 ms
64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=2 ttl=64 time=319 ms (DUP!)
64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=3 ttl=64 time=57.5 ms
64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=3 ttl=64 time=239 ms (DUP!)

我々は、彼らの両方が加入しているので、OTBRがnRF52840エンドデバイス1とノートパソコンの両方から2つのping応答を受信できることを確認することができff05::abcd 。これは、OTBRがIPv6 PingRequestマルチキャストパケットをWi-Fiネットワークからスレッドネットワークに転送できることを示しています。

nRF52840エンドデバイス2でff05 :: abcdにpingを実行します。

$ ping ff05::abcd 100 10 1
108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=12 hlim=64 time=297ms
108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=12 hlim=63 time=432ms
108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=13 hlim=64 time=193ms
108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=13 hlim=63 time=306ms
108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=14 hlim=64 time=230ms
108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=14 hlim=63 time=279ms

nRF52840エンドデバイス2は、nRF52840エンドデバイス1とラップトップの両方からping応答を受信できます。これは、OTBRがIPv6 PingReplyマルチキャストパッケージをスレッドネットワークからWi-Fiネットワークに転送できることを示しています。

おめでとうございます。スレッドボーダールーターを正常にセットアップし、双方向IPv6マルチキャストを検証しました。

OpenThread、訪問の詳細についてopenthread.io

参照ドキュメント: