1. Введение
Что такое поток?
Thread — это беспроводной сетевой протокол с низким энергопотреблением на основе IP, который обеспечивает безопасную связь между устройствами и между устройствами и облаком. Сети Thread могут адаптироваться к изменениям топологии, чтобы избежать сбоев в одной точке.
Что такое OpenThread?
OpenThread, выпущенный Google, представляет собой реализацию Thread® с открытым исходным кодом.
Что такое пограничный маршрутизатор OpenThread?
OpenThread Border Router (OTBR), выпущенный Google, представляет собой реализацию Thread Border Router с открытым исходным кодом.
Многоадресная рассылка IPv6
Thread определяет ряд функций для поддержки многоадресной передачи в гетерогенной сети (сегменты Thread и сети Wi-Fi/Ethernet) для многоадресных адресов с областью действия, превышающей локальную область.
Пограничный маршрутизатор потока регистрирует свой набор данных магистрального маршрутизатора (BBR), а выбранная служба BBR является основным магистральным маршрутизатором (PBBR), который отвечает за многоадресную входящую/исходящую пересылку.
Устройство Thread отправляет сообщение CoAP для регистрации адреса многоадресной рассылки в PBBR (регистрация прослушивателя многоадресной рассылки, сокращенно MLR), если адрес больше локальной области. PBBR использует MLDv2 на своем внешнем интерфейсе для связи с более широкой сетью IPv6 LAN/WAN о группах многоадресной рассылки IPv6, которые ему необходимо прослушивать, от имени своей локальной сети Thread. И PBBR пересылает трафик многоадресной рассылки в сеть Thread только в том случае, если на пункт назначения подписано хотя бы одно устройство Thread.
Для конечных устройств с минимальным потоком они могут зависеть от своего родителя в плане агрегации многоадресного адреса и выполнения MLR от их имени или регистрироваться самостоятельно, если их родительский узел имеет поток 1.1.
Более подробную информацию см. в разделе «Спецификация резьбы» .
Что вы построите
В этой лабораторной работе вы настроите маршрутизатор Thread Border Router и два устройства Thread, а затем включите и проверьте функции Multicast на устройствах Thread и устройствах Wi-Fi.
Чему вы научитесь
- Как собрать прошивку nRF52840 с поддержкой IPv6 Multicast.
- Как подписаться на многоадресные адреса IPv6 на устройствах Thread.
Что вам понадобится
- Рабочая станция Linux для сборки и прошивки Thread RCP, OpenThread CLI и тестирования многоадресной рассылки IPv6.
- Raspberry Pi для маршрутизатора Thread Border.
- 2 USB-ключа Nordic Semiconductor nRF52840 (один для RCP и два для конечных устройств Thread).
2. Настройка ОТБР
Самый быстрый способ настроить OTBR — следовать Руководству по настройке OTBR .
После завершения настройки OTBR используйте ot-ctl
, чтобы убедиться, что OTBR стал основным магистральным маршрутизатором в течение нескольких секунд.
> bbr state Primary Done > bbr BBR Primary: server16: 0xF800 seqno: 21 delay: 5 secs timeout: 3600 secs Done
3. Сборка и прошивка потоковых устройств
Создайте приложение Thread CLI с Multicast и прошейте две платы nRF52840 DK.
Сборка прошивки nRF52840 DK
Следуйте инструкциям по клонированию проекта и сборке прошивки nRF52840.
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_MLR=ON
Продолжайте с Build a Thread network with nRF52840 boards and OpenThread codelab, как написано. После того, как конечное устройство будет прошито образом CLI, следуйте Присоедините второй узел к Thread network, чтобы добавить Thread device в Thread network. Повторите для второго конечного Thread device.
4. Подпишитесь на многоадресный адрес IPv6
Подпишитесь на ff05::abcd на nRF52840 Конечное устройство 1:
> ipmaddr add ff05::abcd Done
Убедитесь, что ff05::abcd
успешно подписан:
> ipmaddr ff05:0:0:0:0:0:0:abcd <--- ff05::abcd subscribed ff33:40:fdde:ad00:beef:0:0:1 ff32:40:fdde:ad00:beef:0:0:1 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
для подписки на многоадресный адрес на ноутбуке.
Скопируйте код ниже и сохраните его как 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.
Окончательная топология сети с многоадресными подписками показана ниже:
Теперь, когда мы подписали адрес многоадресной рассылки IPv6 на конечном устройстве nRF52840 1 в сети Thread и на ноутбуке в сети Wi-Fi, мы собираемся проверить доступность двунаправленной многоадресной рассылки IPv6 в следующих разделах.
5. Проверка входящей многоадресной рассылки IPv6
Теперь мы сможем связаться как с конечным устройством 1 nRF52840 в сети Thread, так и с ноутбуком, используя многоадресный адрес IPv6 ff05::abcd
из сети Wi-Fi.
Пингуем ff05::abcd на OTBR через интерфейс Wi-Fi:
$ 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!) # If using MacOS, use this command. The interface is typically not "wlan0" for Mac. $ ping6 -h 5 -I wlan0 ff05::abcd
Мы видим, что OTBR может получать два ответа ping как от nRF52840 End Device 1, так и от Laptop, поскольку они оба подписаны на ff05::abcd
. Это показывает, что OTBR может пересылать пакеты многоадресной рассылки IPv6 Ping Request из сети Wi-Fi в сеть Thread.
6. Проверка исходящей многоадресной рассылки IPv6
Пинг ff05::abcd на nRF52840 Конечное устройство 2:
> 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 может получать ответы на ping как от конечного устройства nRF52840 1, так и от ноутбука. Это показывает, что OTBR может пересылать пакеты многоадресной рассылки Ping Reply IPv6 из сети Thread в сеть Wi-Fi.
7. Поздравления
Поздравляем, вы успешно настроили Thread Border Router и проверили двунаправленную многоадресную рассылку IPv6!
Более подробную информацию об OpenThread можно найти на сайте openthread.io .
Справочные документы: