1. Введение
Что такое пограничный маршрутизатор потоков?
Thread — это протокол беспроводной ячеистой сети с низким энергопотреблением на основе IP, который обеспечивает безопасную связь между устройствами и между устройствами и облаком. Сети потоков могут адаптироваться к изменениям топологии, чтобы избежать единой точки отказа.
Пограничный маршрутизатор потока соединяет сеть потока с другими сетями на основе IP, такими как Wi-Fi или Ethernet. Для сети Thread требуется пограничный маршрутизатор для подключения к другим сетям. Пограничный маршрутизатор потоков минимально поддерживает следующие функции:
- Двунаправленное IP-соединение между сетями Thread и Wi-Fi/Ethernet.
- Обнаружение двунаправленной службы через mDNS (по каналу Wi-Fi/Ethernet) и SRP (в сети Thread).
- Инфраструктура Thread-over-Infrastructure, которая объединяет разделы Thread по IP-каналам.
- Ввод в эксплуатацию внешнего потока (например, мобильного телефона) для аутентификации и присоединения устройства Thread к сети Thread.
OpenThread Border Router (OTBR), выпущенный Google, представляет собой реализацию Thread Border Router с открытым исходным кодом.
Что ты построишь
В этой лабораторной работе вы собираетесь настроить пограничный маршрутизатор потока и подключить свой мобильный телефон к оконечному устройству потока через пограничный маршрутизатор.
Что вы узнаете
- Как настроить ОТБР
- Как сформировать сеть потоков с помощью OTBR
- Как создать устройство OpenThread CLI с функцией SRP
- Как зарегистрировать услугу в SRP
- Как обнаружить и добраться до конечного устройства потока.
Что вам понадобится
- Устройство Raspberry Pi 3/4 и SD-карта объемом не менее 8 ГБ.
- 2 платы разработки Nordic Semiconductor nRF52840 .
- Точка доступа Wi-Fi без включенной на маршрутизаторе защиты IPv6 Router Advertisement Guard .
- Телефон iOS с версией iOS не ниже 14 или телефон Android с версией Android не ниже 8.1.
2. Настройка ОТБР
Настройка Raspberry Pi
Настроить новое устройство Raspberry Pi с помощью инструмента rpi-imager
просто, следуя инструкциям на сайте raspberrypi.org (вместо использования последней версии ОС Raspberry Pi в инструменте загрузите 2021-05-07-raspios-buster-armhf -облегчите сами). Чтобы выполнить действия с мобильным телефоном в этой лаборатории кода, вам необходимо подключить Raspberry Pi к точке доступа Wi-Fi. Следуйте этому руководству, чтобы настроить беспроводное соединение. Заходить на Raspberry Pi по SSH удобно, инструкцию можно найти здесь .
Получить ОТБР-код
Войдите в свой Raspberry Pi и клонируйте ot-br-posix
с GitHub:
$ git clone https://github.com/openthread/ot-br-posix.git --depth 1
Сборка и установка OTBR
В OTBR есть два сценария, которые загружают и настраивают пограничный маршрутизатор потоков:
$ cd ot-br-posix $ ./script/bootstrap $ INFRA_IF_NAME=wlan0 ./script/setup
OTBR работает как с интерфейсом потока, так и с сетевым интерфейсом инфраструктуры (например, Wi-Fi/Ethernet), который указан с помощью INFRA_IF_NAME
. Интерфейс Thread создается самим OTBR и по умолчанию называется wpan0
, а интерфейс инфраструктуры имеет значение по умолчанию wlan0
, если INFRA_IF_NAME
не указано явно. Если ваш Raspberry Pi подключен с помощью кабеля Ethernet, укажите имя интерфейса Ethernet (например, 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 и лаборатории кода OpenThread», чтобы собрать и прошить устройство RCP nRF52840:
$ script/build nrf52840 USB_trans
Запустите OTBR и проверьте статус
Подключите плату nRF52840 к Raspberry Pi и запустите службу 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
3. Сформируйте сеть потоков
Существует команда 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
4. Настройте конечное устройство клиента SRP.
Сборка и прошивка OT CLI
Выполните шаг 5 статьи «Создание сети потоков с помощью плат nRF52840 и лаборатории кода OpenThread», чтобы создать и прошить конечное устройство CLI nRF52840.
Но вместо включения OT_COMMISSIONER
и OT_JOINER
узлу CLI требуются функции OT_SRP_CLIENT
и OT_ECDSA
.
Таким образом, полный вызов сборки должен выглядеть так:
$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Присоединяйтесь к сети ОТБР
Чтобы присоединиться к сети Thread, созданной службой otbr-agent
, нам необходимо получить активный набор операционных данных с устройства OTBR. Вернемся к командной строке otbr-agent
и получим активный набор данных:
$ sudo ot-ctl dataset active -x 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
Вернитесь к сеансу экрана клиентского узла SRP и установите активный набор данных:
> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
Затем запустите интерфейс Thread:
> ifconfig up Done > thread start Done
Подождите несколько секунд и проверьте, успешно ли было присоединение к сети Thread:
> 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. Теперь мы можем пропинговать OMR-адрес OTBR:
> 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
5. Опубликуйте службу на конечном устройстве.
mDNS широко использовался для публикации службы DNS-SD на локальном канале. Но многоадресные сообщения потребляют слишком большую полосу пропускания и быстро разряжают батарею маломощных устройств. Thread использует протокол одноадресной рассылки SRP для регистрации своих служб на пограничном маршрутизаторе и полагается на пограничный маршрутизатор для рекламы услуг по каналу Wi-Fi или Ethernet.
Мы можем зарегистрировать службу с помощью команды srp client
.
Перейдите к сеансу экрана узла клиента SRP и автоматически запустите клиент SRP:
> srp client autostart enable Done
Установите имя хоста, которое будет объявляться по ссылке Wi-Fi/Ethernet:
> srp client host name ot-host Done
Чтобы устройство, находящееся по каналу Wi-Fi/Ethernet, могло достичь конечного устройства Thread, необходимо объявить адрес 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/Ethernet. Пришло время обнаружить и добраться до конечного устройства прямо сейчас!
6. Откройте для себя услугу
Откройте для себя услугу с помощью мобильного телефона
Мы используем приложение Service Browser для обнаружения служб mDNS на телефоне Android. Аналогичное приложение также можно найти для мобильных устройств iOS. Откройте приложение, и служба _ipps._tcp
должна появиться.
Откройте для себя сервис с хостом Linux
Если вы хотите обнаружить службу с другого хоста Linux, вы можете использовать команду avahi-browse
.
Установите avahi-daemon
и avahi-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 "" ...
7. Пропингуйте конечное устройство
Пинг с мобильного телефона
Возьмем, к примеру, телефон Pixel. Мы можем узнать адрес OMR ранее зарегистрированной службы «ot-service» на странице сведений об экземпляре службы в приложении Service Browser.
Теперь мы можем проверить адрес OMR с помощью другого приложения Network Analyser .
К сожалению, версия приложения Network Analyzer для Android не поддерживает запросы mDNS для утилиты ping, и мы не можем напрямую проверить имя хоста ot-host.local
(мы можем проверить имя хоста с помощью версии приложения для iOS).
Пинг с хоста Linux/macOS
Пограничный маршрутизатор потока отправляет объявления маршрутизатора ICMPv6 (RA) для объявления префиксов (с помощью параметра информации о префиксе) и маршрутов (с помощью параметра информации о маршруте) по каналу Wi-Fi/Ethernet.
Подготовьте хост Linux
Важно убедиться, что на вашем хосте включены RA и RIO:
-
net.ipv6.conf.wlan0.accept_ra
должно быть не менее1
если переадресация IP не включена, и2
в противном случае. -
net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen
не должно быть меньше64
.
В большинстве дистрибутивов accept_ra
по умолчанию имеет значение 1
. Но могут быть и другие сетевые демоны, которые переопределят эту опцию (например, dhcpcd
на Raspberry Pi переопределяет 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, а интервал между двумя незапрошенными сообщениями RA может составлять несколько сотен секунд. Один из способов — отключиться и повторно подключиться к точке доступа Wi-Fi для отправки сообщений запроса маршрутизатора, чтобы OTBR ответил запрошенными RA. Другой вариант — перезапустить функцию пограничной маршрутизации на пограничном маршрутизаторе:
$ sudo ot-ctl br disable Done $ sudo ot-ctl br enable Done
Если вы пытаетесь повторно подключить Wi-Fi или перезапустить интерфейс Ethernet, убедитесь, что dhcpcd не используется для управления вашей сетью Wi-Fi/Ethernet IPv6. Потому что dhcpcd всегда переопределяет параметр accept_ra
при каждом перезапуске интерфейса, и ваша конфигурация accept_ra
будет потеряна. Добавьте следующие строки в файл конфигурации dhcpcd (например, /etc/dhcpcd.conf
), чтобы явно отключить IPv6 в dhcpcd:
noipv6 noipv6rs
Вам необходимо перезагрузиться, чтобы изменения вступили в силу.
Подготовьте хост macOS
Обе опции accept_ra*
включены по умолчанию, но вам необходимо обновить вашу систему как минимум до macOS Big Sur.
Пинг имя хоста или адрес IPv6
Теперь мы можем пропинговать имя хоста ot-host.local
с помощью команды ping -6
( ping6
для 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 -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 ...
8. Конечное устройство отменяет публикацию услуги
Чтобы удалить адрес и службу, зарегистрированные на клиентском узле SRP:
> srp client host remove Done
Сейчас вы не сможете обнаружить службу _ipps._tcp
.
9. Поздравления
Поздравляем, вы успешно настроили OTBR в качестве пограничного маршрутизатора потоков для обеспечения двунаправленного IP-соединения и обнаружения сервисов для конечных устройств потоков.
Что дальше?
Посмотрите некоторые из этих кодовых лабораторий...