1. Введение
Что такое нить?
Thread — это протокол беспроводной ячеистой сети с низким энергопотреблением на основе IP, который обеспечивает безопасную связь между устройствами и между устройствами и облаком. Сети потоков могут адаптироваться к изменениям топологии, чтобы избежать единичных сбоев.
Что такое OpenThread?
OpenThread, выпущенный Google, представляет собой реализацию Thread® с открытым исходным кодом.
Что такое пограничный маршрутизатор OpenThread?
OpenThread Border Router (OTBR), выпущенный Google, представляет собой реализацию Thread Border Router с открытым исходным кодом.
Многоадресная рассылка IPv6
Thread определяет ряд функций для поддержки многоадресной рассылки в гетерогенной сети (сегменты сети Thread и Wi-Fi/Ethernet) для адресов многоадресной рассылки с областью действия, превышающей локальную область.
Пограничный маршрутизатор потока регистрирует свой набор данных магистрального маршрутизатора (BBR), а выбранная служба BBR является основным магистральным маршрутизатором (PBBR), который отвечает за входящую/исходящую многоадресную рассылку.
Потоковое устройство отправляет сообщение CoAP для регистрации адреса многоадресной рассылки в PBBR (регистрация прослушивателя многоадресной рассылки, сокращенно MLR), если адрес больше, чем локальная область. PBBR использует MLDv2 на своем внешнем интерфейсе для связи с более широкой LAN/WAN IPv6 о группах многоадресной рассылки IPv6, которые ему необходимо прослушивать, от имени своей локальной сети потоков. И PBBR пересылает многоадресный трафик в сеть потоков только в том случае, если на пункт назначения подписано хотя бы одно устройство потока.
Для оконечных устройств с минимальным потоком они могут зависеть от того, что их родительский элемент агрегирует адрес многоадресной рассылки и выполняет MLR от их имени, или регистрируется самостоятельно, если их родительский элемент относится к потоку 1.1.
Более подробную информацию можно найти в разделе «Спецификация резьбы» .
Что вы построите
В этой лаборатории кода вы собираетесь настроить пограничный маршрутизатор Thread и два устройства Thread, а затем включить и проверить функции многоадресной рассылки на устройствах Thread и устройствах Wi-Fi.
Что вы узнаете
- Как собрать прошивку nRF52840 с поддержкой IPv6 Multicast.
- Как подписаться на многоадресные адреса IPv6 на устройствах Thread.
Что вам понадобится
- Рабочая станция Linux для создания и прошивки Thread RCP, интерфейса командной строки OpenThread и тестирования многоадресной рассылки IPv6.
- Raspberry Pi для пограничного маршрутизатора Thread.
- 2 USB-ключа Nordic Semiconductor nRF52840 (один для RCP и два для устройств с резьбовыми концами).
2. Настройка ОТБР
Самый быстрый способ настроить OTBR — использовать Docker, следуя инструкциям OTBR с Docker Guide .
После завершения настройки OTBR используйте ot-ctl
, чтобы убедиться, что OTBR стал основным магистральным маршрутизатором в течение нескольких секунд.
> bbr state Primary Done > bbr BBR Primary: server16: 0xF800 seqno: 21 delay: 5 secs timeout: 3600 secs Done
3. Сборка и прошивка устройств Thread
Создайте приложение Thread CLI с поддержкой многоадресной рассылки и прошейте две платы nRF52840 DK.
Сборка прошивки nRF52840 DK.
Следуйте инструкциям, чтобы клонировать проект и собрать прошивку nRF52840.
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_MLR=ON
Продолжайте работу над созданием сети Thread с платами nRF52840 и кодовой лабораторией OpenThread, как написано. После того как на конечном устройстве будет прошит образ CLI, следуйте инструкциям «Присоединить второй узел к сети Thread», чтобы добавить устройство Thread в сеть Thread. Повторите то же самое для второго концевого устройства резьбы.
4. Подпишитесь на многоадресный адрес IPv6.
Подпишитесь на ff05::abcd на конечном устройстве 1 nRF52840:
> 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 как на конечном устройстве 1 nRF52840 в сети 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 может получить два ответа на пинг как от конечного устройства 1 nRF52840, так и от ноутбука, поскольку они оба подписаны на ff05::abcd
. Это показывает, что OTBR может пересылать многоадресные пакеты запроса Ping IPv6 из сети Wi-Fi в сеть Thread.
6. Проверьте исходящую многоадресную рассылку IPv6.
Пинг ff05::abcd на конечном устройстве 2 nRF52840:
> 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
Конечное устройство 2 nRF52840 может получать ответы на ping как от конечного устройства 1 nRF52840, так и от ноутбука. Это показывает, что OTBR может пересылать пакеты многоадресной рассылки IPv6 Ping Reply из сети Thread в сеть Wi-Fi.
7. Поздравления
Поздравляем, вы успешно настроили пограничный маршрутизатор потоков и подтвердили двунаправленную многоадресную рассылку IPv6!
Дополнительную информацию об OpenThread можно найти на openthread.io .
Справочные документы:
1. Введение
Что такое нить?
Thread — это протокол беспроводной ячеистой сети с низким энергопотреблением на основе IP, который обеспечивает безопасную связь между устройствами и между устройствами и облаком. Сети потоков могут адаптироваться к изменениям топологии, чтобы избежать единичных сбоев.
Что такое OpenThread?
OpenThread, выпущенный Google, представляет собой реализацию Thread® с открытым исходным кодом.
Что такое пограничный маршрутизатор OpenThread?
OpenThread Border Router (OTBR), выпущенный Google, представляет собой реализацию Thread Border Router с открытым исходным кодом.
Многоадресная рассылка IPv6
Thread определяет ряд функций для поддержки многоадресной рассылки в гетерогенной сети (сегменты сети Thread и Wi-Fi/Ethernet) для адресов многоадресной рассылки с областью действия, превышающей локальную область.
Пограничный маршрутизатор потока регистрирует свой набор данных магистрального маршрутизатора (BBR), а выбранная служба BBR является основным магистральным маршрутизатором (PBBR), который отвечает за входящую/исходящую многоадресную рассылку.
Потоковое устройство отправляет сообщение CoAP для регистрации адреса многоадресной рассылки в PBBR (регистрация прослушивателя многоадресной рассылки, сокращенно MLR), если адрес больше, чем локальная область. PBBR использует MLDv2 на своем внешнем интерфейсе для связи с более широкой LAN/WAN IPv6 о группах многоадресной рассылки IPv6, которые ему необходимо прослушивать, от имени своей локальной сети потоков. И PBBR пересылает многоадресный трафик в сеть потоков только в том случае, если на пункт назначения подписано хотя бы одно устройство потока.
Для оконечных устройств с минимальным потоком они могут зависеть от того, что их родительский элемент агрегирует адрес многоадресной рассылки и выполняет MLR от их имени, или регистрируется самостоятельно, если их родительский элемент относится к потоку 1.1.
Более подробную информацию можно найти в разделе «Спецификация резьбы» .
Что вы построите
В этой лаборатории кода вы собираетесь настроить пограничный маршрутизатор Thread и два устройства Thread, а затем включить и проверить функции многоадресной рассылки на устройствах Thread и устройствах Wi-Fi.
Что вы узнаете
- Как собрать прошивку nRF52840 с поддержкой IPv6 Multicast.
- Как подписаться на многоадресные адреса IPv6 на устройствах Thread.
Что вам понадобится
- Рабочая станция Linux для создания и прошивки Thread RCP, интерфейса командной строки OpenThread и тестирования многоадресной рассылки IPv6.
- Raspberry Pi для пограничного маршрутизатора Thread.
- 2 USB-ключа Nordic Semiconductor nRF52840 (один для RCP и два для устройств с резьбовыми концами).
2. Настройка ОТБР
Самый быстрый способ настроить OTBR — использовать Docker, следуя инструкциям OTBR с Docker Guide .
После завершения настройки OTBR используйте ot-ctl
, чтобы убедиться, что OTBR стал основным магистральным маршрутизатором в течение нескольких секунд.
> bbr state Primary Done > bbr BBR Primary: server16: 0xF800 seqno: 21 delay: 5 secs timeout: 3600 secs Done
3. Сборка и прошивка устройств Thread
Создайте приложение Thread CLI с поддержкой многоадресной рассылки и прошейте две платы nRF52840 DK.
Сборка прошивки nRF52840 DK.
Следуйте инструкциям, чтобы клонировать проект и собрать прошивку nRF52840.
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_MLR=ON
Продолжайте работу над созданием сети Thread с платами nRF52840 и кодовой лабораторией OpenThread, как написано. После того как на конечном устройстве будет прошит образ CLI, следуйте инструкциям «Присоединить второй узел к сети Thread», чтобы добавить устройство Thread в сеть Thread. Повторите то же самое для второго концевого устройства резьбы.
4. Подпишитесь на многоадресный адрес IPv6.
Подпишитесь на ff05::abcd на конечном устройстве 1 nRF52840:
> 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 как на конечном устройстве 1 nRF52840 в сети 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 может получить два ответа на пинг как от конечного устройства 1 nRF52840, так и от ноутбука, поскольку они оба подписаны на ff05::abcd
. Это показывает, что OTBR может пересылать многоадресные пакеты запроса Ping IPv6 из сети Wi-Fi в сеть Thread.
6. Проверьте исходящую многоадресную рассылку IPv6.
Пинг ff05::abcd на конечном устройстве 2 nRF52840:
> 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
Конечное устройство 2 nRF52840 может получать ответы на ping как от конечного устройства 1 nRF52840, так и от ноутбука. Это показывает, что OTBR может пересылать пакеты многоадресной рассылки IPv6 Ping Reply из сети Thread в сеть Wi-Fi.
7. Поздравления
Поздравляем, вы успешно настроили пограничный маршрутизатор потоков и подтвердили двунаправленную многоадресную рассылку IPv6!
Дополнительную информацию об OpenThread можно найти на openthread.io .
Справочные документы: