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

スレッドボーダールーター-双方向IPv6接続とDNSベースのサービスディスカバリ

699d673d05a55535.png

スレッドボーダールーターとは何ですか?

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

スレッドボーダールーターは、スレッドネットワークをWi-Fiやイーサネットなどの他のIPベースのネットワークに接続します。スレッドネットワークでは、他のネットワークに接続するためにボーダールーターが必要です。スレッドボーダールーターは、最低限、次の機能をサポートします。

  • スレッドネットワークとWi-Fi /イーサネットネットワーク間の双方向IP接続。
  • 双方向サービスを経由して発見のmDNS (のWi-Fi /イーサネットリンク上)とSRP (スレッドネットワーク上)。
  • IPベースのリンクを介してスレッドパーティションをマージするスレッドオーバーインフラストラクチャ。
  • スレッドデバイスを認証してスレッドネットワークに参加させるための外部スレッドコミッショニング(携帯電話など)。

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

構築するもの

このコードラボでは、スレッドボーダールーターをセットアップし、ボーダールーターを介して携帯電話をスレッドエンドデバイスに接続します。

あなたが学ぶこと

  • OTBRの設定方法
  • OTBRでスレッドネットワークを形成する方法
  • SRP機能を使用してOpenThreadCLIデバイスを構築する方法
  • SRPにサービスを登録する方法
  • スレッドエンドデバイスを検出して到達する方法。

必要なもの

RaspberryPiをセットアップする

新鮮なラズベリーパイデバイスセットアップすることは簡単ですrpi-imagerの指示に従って、ツールをraspberrypi.orgを、ダウンロード(代わりのツールで、最新のラズベリーパイOSを使用して2021年5月7日- raspiosバスター-armhf -Lite )自分で。このコードラボで携帯電話の手順を完了するには、RaspberryPiをWi-FiAPに接続する必要があります。フォローこのワイヤレス接続をセットアップするためのガイドを。あなたの指示を見つけることができ、SSHでラズベリーパイにログインすると便利です、ここ

OTBRコードを取得する

あなたのラズベリーパイにログインし、クローンot-br-posix GitHubのから:

$ git clone https://github.com/openthread/ot-br-posix.git --depth 1

OTBRをビルドしてインストールします

OTBRには、スレッドボーダールーターをブートストラップしてセットアップする2つのスクリプトがあります。

$ cd ot-br-posix
$ ./script/bootstrap
$ INFRA_IF_NAME=wlan0 ./script/setup

OTBRがで指定されている(例えばのWi-Fi /イーサネット)スレッド・インタフェースおよびインフラストラクチャネットワークインタフェースの両方で動作しますINFRA_IF_NAME 。スレッドインタフェースはOTBR自体によって作成され、命名されwpan0デフォルトでは、インフラインターフェイスは、デフォルト値があるwlan0場合INFRA_IF_NAME明示的に指定されていません。あなたのラズベリーパイをイーサネットケーブルで接続されている場合は、(例えば、イーサネットインターフェイス名を指定してeth0 ):

$ INFRA_IF_NAME=eth0 ./script/setup

OTBRが正常にインストールされているかどうかを確認します。

$ sudo service otbr-agent status
● otbr-agent.service - Border Router Agent
   Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled)
   Active: activating (auto-restart) (Result: exit-code) since Mon 2021-03-01 05:43:38 GMT; 2s ago
  Process: 2444 ExecStart=/usr/sbin/otbr-agent $OTBR_AGENT_OPTS (code=exited, status=2)
 Main PID: 2444 (code=exited, status=2)

ことが期待されているotbr-agentそれが必要なため、サービスは、アクティブでないRCP実行するためにチップを。

Raspberry Piを再起動して、変更を有効にします。

RCPファームウェアのビルドとフラッシュ

OTBRは15.4ラジオチップをサポートラジオコプロセッサ(RCP)モード。このモードでは、OpenThreadスタックはホスト側で実行され、IEEE802.15.4トランシーバーを介してフレームを送受信します。

フォローこのコードラボの手順4を構築し、nRF52840 RCPデバイスをフラッシュ。あなたは追加オプション必要-DOT_THREAD_VERSION=1.2ビルドステップのために:

$ script/build nrf52840 USB_trans -DOT_THREAD_VERSION=1.2

OTBRを起動し、ステータスを確認します

あなたのラズベリーパイにnRF52840ボードを接続し、起動otbr-agentサービスを:

$ sudo service otbr-agent restart

ていることを確認しotbr-agentサービスが有効です:

$ sudo service otbr-agent status
● otbr-agent.service - Border Router Agent
   Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-03-01 05:46:26 GMT; 2s ago
 Main PID: 2997 (otbr-agent)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/otbr-agent.service
           └─2997 /usr/sbin/otbr-agent -I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM0

Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Stop publishing service
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [adproxy] Stopped
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: PSKc is not initialized
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Check if PSKc is initialized: OK
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Initialize OpenThread Border Router Agent: OK
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Border router agent started.
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-CORE----: Notifier: StateChanged (0x00038200) [NetData PanId NetName ExtPanId]
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-PLAT----: Host netif is down

ありot-ctl制御に使用できるコマンドotbr-agentサービスが。 ot-ctl 、すべてのOpenThread CLIコマンドを受け付け、参照OpenThread CLIガイドを詳細については。

OTBRを使用してスレッドネットワークを形成します。

$ sudo ot-ctl dataset init new
Done
$ sudo ot-ctl dataset commit active
Done
$ sudo ot-ctl ifconfig up
Done
$ sudo ot-ctl thread start
Done

数秒待って、私たちはOTBRがスレッドとして動作していることを確認することができるはずleaderとありoff-mesh-routableスレッドネットワークデータで(OMR)接頭辞は:

$ sudo ot-ctl state
leader
Done
$ sudo ot-ctl netdata show
Prefixes:
Prefixes:
fd76:a5d1:fcb0:1707::/64 paos med 4000
Routes:
fd49:7770:7fc5:0::/64 s med 4000
Services:
44970 5d c000 s 4000
44970 01 9a04b000000e10 s 4000
Done
$ sudo ot-ctl ipaddr      
fda8:5ce9:df1e:6620:0:ff:fe00:fc11
fda8:5ce9:df1e:6620:0:0:0:fc38
fda8:5ce9:df1e:6620:0:ff:fe00:fc10
fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9
fda8:5ce9:df1e:6620:0:ff:fe00:fc00
fda8:5ce9:df1e:6620:0:ff:fe00:4000
fda8:5ce9:df1e:6620:3593:acfc:10db:1a8d
fe80:0:0:0:a6:301c:3e9f:2f5b
Done

OTCLIをビルドしてフラッシュする

フォローこのコードラボの手順5を構築し、nRF52840 CLIのエンドデバイスをフラッシュ。しかし、その代わりになるのOT_COMMISSIONEROT_JOINER有効になって、CLIのノードが必要ですOT_SRP_CLIENTOT_ECDSA特徴:

$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

OTBRネットワークに参加する

作成されたスレッドのネットワークに参加するにはotbr-agentサービスを、私たちはOTBRデバイスからアクティブ運用データセットを取得する必要があります。さんがに戻りましょうotbr-agentコマンドラインとアクティブなデータセットを取得します:

$ sudo ot-ctl dataset active -x
0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

SRPクライアントノード画面セッションに戻り、アクティブなデータセットを設定します。

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

次に、スレッドインターフェイスを開始します。

> ifconfig up
Done
> thread start
Done

数秒待って、スレッドネットワークへの参加が成功したかどうかを確認します。

> state
child
Done
> netdata show
Prefixes:
fd76:a5d1:fcb0:1707::/64 paos med 4000
Routes:
fd49:7770:7fc5:0::/64 s med 4000
Services:
44970 5d c000 s 4000
44970 01 9a04b000000e10 s 4000
Done
> ipaddr
fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
fda8:5ce9:df1e:6620:0:ff:fe00:4001
fda8:5ce9:df1e:6620:ed74:123:cc5d:74ba
fe80:0:0:0:d4a9:39a0:abce:b02e
Done

ネットワークデータがOTBRに印刷されているものと一致していることを確認してください。これで、OTBRのOMRアドレスにpingを実行できます。

> ping fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9
Done
> 16 bytes from fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9: icmp_seq=1 hlim=64 time=49ms

mDNSは、リンクローカルでDNS-SDサービスを公開するために広く使用されています。ただし、マルチキャストメッセージは帯域幅を消費しすぎて、低電力デバイスのバッテリーをすぐに使い果たしてしまいます。スレッドには、ユニキャストの使用SRPの境界ルータとそのサービスを登録するプロトコルをとWi-Fiまたはイーサネットリンク上でサービスを宣伝するために境界ルータに依存しています。

私たちは、とサービスを登録することができますsrp clientコマンド。

SRPクライアントノード画面セッションに移動し、SRPクライアントを自動起動します。

> srp client autostart enable
Done

Wi-Fi /イーサネットリンクでアドバタイズされるホスト名を設定します。

> srp client host name ot-host
Done

Wi-Fi /イーサネットリンク上のデバイスがスレッドエンドデバイスに到達するには、エンドデバイスのOMRアドレスをアドバタイズする必要があります。

> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
Done

最後には、偽の登録_ipps._tcpサービスを:

> srp client service add ot-service _ipps._tcp 12345
Done

数秒待つと、サービスが登録されていることがわかります。

> srp client service
instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0
Done

我々は、すべてのセットアップ作業を完了していると_ipps._tcpサービスは、のWi-Fi /イーサネットリンク上で宣伝されている必要があります。今すぐエンドデバイスを見つけて到達する時が来ました!

携帯電話でサービスを発見する

54a136a8940897cc.png

私たちは、使用サービスブラウザ、Androidの携帯電話でのmDNSサービスを発見するためにアプリケーションを同等のアプリケーションはまた、iOSモバイルデバイスのために見つけることができます。アプリを開くと、サービス_ipps._tcp単に表示されるはずです。

Linuxホストでサービスを発見する

あなたは他のLinuxホストからのサービスを発見したい場合は、使用することができるavahi-browseコマンドを。

インストールavahi-daemonavahi-utils

$ sudo apt-get install -y avahi-daemon avahi-utils

サービスを解決します。

$ sudo service avahi-daemon start # Ensure the avahi daemon is started.
$ avahi-browse -r _ipps._tcp
+ wlan0 IPv6 ot-service                                    Secure Internet Printer local
= wlan0 IPv6 ot-service                                    Secure Internet Printer local
   hostname = [ot-host.local]
   address = [fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927]
   port = [12345]
   txt = []
...

macOSホストでサービスを発見する

あなたは使用することができdns-sdサービスを解決するためにMacOSの上に:

$ dns-sd -Z _ipps._tcp local.
Browsing for _ipps._tcp.local.
DATE: ---Sun 14 Mar 2021---
21:31:42.125  ...STARTING...

; To direct clients to browse a different domain, substitute that domain in place of '@'
lb._dns-sd._udp                                 PTR     @

; In the list of services below, the SRV records will typically reference dot-local Multicast DNS names.
; When transferring this zone file data to your unicast DNS server, you'll need to replace those dot-local
; names with the correct fully-qualified (unicast) domain name of the target host offering the service.

_ipps._tcp                                      PTR     ot-service._ipps._tcp
ot-service._ipps._tcp                           SRV     0 0 12345 ot-host.local. ; Replace with unicast FQDN of target host
ot-service._ipps._tcp                           TXT     ""
...

携帯電話からのping

Pixelスマートフォンを例にとると、サービスブラウザアプリのサービスインスタンスの詳細ページで、以前に登録したサービス「ot-service」のOMRアドレスを確認できます。

bb992962e68d250b.png888daa1df1e1a9bf.png

私たちは今、他とのOMRアドレスに対してpingを実行できるネットワーク・アナライザのアプリケーションを。

残念ながら、ネットワークアナライザアプリケーションのAndroidのバージョンは、pingユーティリティのためのmDNSクエリをサポートしていないと、私たちは、ホスト名に対してpingを実行することはできませんot-host.local (我々はアプリケーションのiOSのバージョンとホスト名にpingを実行することができます)を直接。

Linux / macOSホストからのping

スレッド境界ルーターは、ICMPv6ルーターアドバタイズメント(RA)を送信して、Wi-Fi /イーサネットリンク上のプレフィックス(プレフィックス情報オプションを介して)およびルート(ルート情報オプションを介して)をアドバタイズします。

Linuxホストを準備する

ホストでRAとRIOが有効になっていることを確認することが重要です。

  1. net.ipv6.conf.wlan0.accept_ra 、少なくともする必要があります1 IP転送が有効でない場合、および2そう。
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plenより小さくすべきではない64

accept_raにデフォルト設定された1ほとんどのディストリビューションのために。しかし、(例えば、このオプションを無効にします、他のネットワークデーモンがあるかもしれませんdhcpcdラズベリーパイには上書きされますaccept_raする0 )。あなたは確認することができaccept_ra持つ価値を:

$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra
0

とに値を設定1 (又は2でIP転送が有効になっている場合)。

$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra=1
Net.ipv6.conf.wlan0.accept_ra = 1

accept_ra_rt_info_max_plenほとんどのLinuxディストリビューション上のオプションがデフォルトにある0に設定し、 64で:

$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen=64
net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64

ホストを再起動すると、変更は失われます。例えば、コマンドに以下の内容を追加し/etc/sysctl.confには、恒久的にRIOを有効にします。

$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64

OTBRはすでにRAメッセージを送信しており、2つの一方的なRAメッセージの間隔は数百秒になる可能性があるため、これらの構成を変更するには遅すぎる可能性があります。 1つの方法は、Wi-Fi APを切断して再接続し、ルーター要請メッセージを送信して、OTBRが要請されたRAで応答するようにすることです。別のオプションは、ボーダールーターでボーダールーティング機能を再起動することです。

$ sudo ot-ctl br disable
Done
$ sudo ot-ctl br enable
Done

あなたはのWi-Fiまたは再起動イーサネットインターフェイスを再接続しようとしている場合は、ことを確認してくださいdhcpcdをがあなたのWiFi- /イーサネットのIPv6ネットワークを管理するために使用されていません。 dhcpcdを、常に上書きされますのでaccept_raオプション毎回インタフェースが再起動され、あなたのaccept_ra設定が失われます。 dhcpcdを設定ファイルに行(例えば、以下の追加/etc/dhcpcd.conf dhcpcdを中に明示的に無効にIPv6へ):

noipv6
noipv6rs

変更を有効にするには、再起動する必要があります。

macOSホストを準備する

どちらaccept_ra*オプションはデフォルトで有効にされていますが、少なくとも、MacOSのビッグ・サーにシステムをアップグレードする必要があります。

ホスト名またはIPv6アドレスにpingを実行します

私たちは今、ホスト名のpingを実行することができot-host.localコマンドでping -6ping6のMacOS用):

$ ping -6 ot-host.local.
PING ot-host.local.(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927)) 56 data bytes
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=1 ttl=63 time=170 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=2 ttl=63 time=64.2 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=3 ttl=63 time=22.8 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=4 ttl=63 time=37.7 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=5 ttl=63 time=28.7 ms
...

このコマンドは、とLinuxホスト上で失敗することがあり"Name or service not known"エラー。だpingコマンドが解決されていないot-host.local. mDNSクエリを使用した名前。オープン/etc/nsswitch.confおよび追加mdns6_minimal持つ行が始まるまでhosts

hosts:          files mdns4_minimal mdns6_minimal dns

もちろん、いつでもIPv6アドレスに直接pingを実行できます。

$ ping -6 fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
PING fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927) 56 data bytes
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=1 ttl=63 time=32.9 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=2 ttl=63 time=27.8 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=3 ttl=63 time=29.9 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=4 ttl=63 time=73.5 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=5 ttl=63 time=26.4 ms
...

SRPクライアントノードから登録されているアドレスとサービスを削除するには、次の手順に従います。

> srp client host remove
Done

あなたは発見できないようにする必要があり_ipps._tcp今のサービスを。

おめでとうございます。OTBRをスレッド境界ルーターとして正常にセットアップし、スレッドエンドデバイスに双方向IP接続とサービス検出を提供しました。

次は何ですか?

これらのコードラボのいくつかをチェックしてください...

リファレンスドキュメント