Thread Border Router - Conectividade IPv6 bidirecional e descoberta de serviço baseada em DNS

1. Introdução

699d673d05a55535.png

O que é um Thread Border Router?

Thread é um protocolo de rede mesh sem fio de baixa potência baseado em IP que permite comunicações seguras de dispositivo para dispositivo e dispositivo para nuvem. As redes de thread podem se adaptar às mudanças de topologia para evitar um único ponto de falha.

Um Thread Border Router conecta uma rede Thread a outras redes baseadas em IP, como Wi-Fi ou Ethernet. Uma rede Thread requer um roteador de borda para se conectar a outras redes. Um Thread Border Router oferece suporte mínimo às seguintes funções:

  • Conectividade IP bidirecional entre redes Thread e Wi-Fi / Ethernet.
  • Descoberta do serviço bidirecional via mDNS (em Wi-Fi / link Ethernet) e SRP (na rede Thread).
  • Thread sobre infraestrutura que mescla partições Thread em links baseados em IP.
  • Comissionamento de Thread Externo (por exemplo, um telefone móvel) para autenticar e unir um dispositivo Thread a uma rede Thread.

OpenThread Border Router (OTBR) lançado pela Google é uma implementação open-source do Fio Border Router.

O que você vai construir

Neste codelab, você vai configurar um Thread Border Router e conectar seu telefone celular a um Thread End Device por meio do Border Router.

O que você aprenderá

  • Como configurar o OTBR
  • Como formar uma rede Thread com OTBR
  • Como construir um dispositivo OpenThread CLI com o recurso SRP
  • Como registrar um serviço com SRP
  • Como descobrir e alcançar um dispositivo final de Thread.

O que você precisará

  • Um dispositivo Raspberry Pi 3/4 e um cartão SD com capacidade de pelo menos 8 GB.
  • 2 Nordic Semiconductor nRF52840 placas desenv.
  • A Wi-Fi AP sem IPv6 Router Advertisement Guarda habilitado no roteador.
  • Um telefone iOS com pelo menos iOS 14 ou um telefone Android com pelo menos Android 8.1.

2. Configurar OTBR

Configuração Raspberry Pi

É simples de configurar um dispositivo Raspberry Pi fresco com a rpi-imager ferramenta seguindo as instruções sobre raspberrypi.org (em vez de usar o mais recente Raspberry Pi OS na ferramenta, baixar 2021-05-07-raspios-buster-armhf -Lite por si mesmo). Para concluir as etapas do telefone celular neste codelab, você precisa conectar o Raspberry Pi a um ponto de acesso Wi-Fi. Siga este guia para configurar a conectividade sem fio. É conveniente para acessar o Raspberry Pi com SSH, você pode encontrar instruções aqui .

Obtenha o código OTBR

Entre na sua Raspberry Pi e clone ot-br-posix do GitHub:

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

Construir e instalar OTBR

OTBR tem dois scripts que inicializam e configuram o Thread Border Router:

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

OTBR funciona tanto em uma interface de rede de interface da linha e infra-estrutura (por exemplo, Wi-Fi / Ethernet), que é especificado com INFRA_IF_NAME . A interface da linha é criada pela própria OTBR e nomeado wpan0 por padrão ea interface de infra-estrutura tem um valor padrão de wlan0 se INFRA_IF_NAME não é especificado explicitamente. Se o seu Raspberry Pi está ligado por um cabo Ethernet, especifique o nome da interface Ethernet (por exemplo, eth0 ):

$ INFRA_IF_NAME=eth0 ./script/setup

Verifique se o OTBR foi instalado com sucesso:

$ 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)

Espera-se que o otbr-agent serviço não está ativo, porque requer uma RCP chip para executar.

Reinicie o Raspberry Pi para que as alterações tenham efeito.

Construir e atualizar o firmware RCP

OTBR suporta um chip 15,4 rádio na Rádio Co-processador modo (RCP). Nesse modo, a pilha OpenThread está sendo executada no lado do host e transmite / recebe quadros pelo transceptor IEEE802.15.4.

Siga o passo 4 deste codelab para construir e piscar um dispositivo nRF52840 RCP. Você precisa de uma opção adicional -DOT_THREAD_VERSION=1.2 para a etapa de compilação:

$ script/build nrf52840 USB_trans -DOT_THREAD_VERSION=1.2

Inicie o OTBR e verifique o status

Ligue a placa nRF52840 ao seu Raspberry Pi e iniciar o otbr-agent do serviço:

$ sudo service otbr-agent restart

Verifique se o otbr-agent serviço está ativo:

$ 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. Forme uma rede Thread

Existe uma ot-ctl de comando que pode ser usado para controlar a otbr-agent serviço. ot-ctl aceita todos os comandos OpenThread CLI, consulte Guia OpenThread CLI para mais detalhes.

Forme uma rede Thread com 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

Aguarde alguns segundos, devemos ser capazes de ver que OTBR está agindo como um fio leader e há um off-mesh-routable (OMR) prefixo no segmento de dados de rede:

$ 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. Configure o dispositivo final do cliente SRP

Construir e atualizar OT CLI

Siga o passo 5 deste codelab para construir e piscar um dispositivo final nRF52840 CLI. Mas em vez de ter OT_COMMISSIONER e OT_JOINER habilitado, o nó CLI requer OT_SRP_CLIENT e OT_ECDSA apresenta:

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

Junte-se à rede OTBR

Para aderir à rede Tópico criado pelo otbr-agent serviço, precisamos obter o conjunto de dados operacional activa do dispositivo OTBR. Vamos voltar para o otbr-agent linha de comando e obter o conjunto de dados ativo:

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

Retorne à sessão de tela do nó cliente SRP e defina o conjunto de dados ativo:

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Em seguida, inicie a interface Thread:

> ifconfig up
Done
> thread start
Done

Aguarde alguns segundos e verifique se a conexão com a rede Thread foi bem-sucedida:

> 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

Certifique-se de que os dados da rede correspondam aos impressos no OTBR. Agora podemos fazer ping do endereço OMR do 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. Publique o serviço no dispositivo final

O mDNS tem sido amplamente usado para publicar o serviço DNS-SD no link-local. Mas as mensagens multicast consomem muita largura de banda e esgotam rapidamente a bateria dos dispositivos de baixo consumo de energia. Thread usa o unicast SRP protocolo para registrar seus serviços com o roteador de borda e conta com o roteador de borda para anunciar os serviços na ligação Wi-Fi ou Ethernet.

Nós podemos registrar um serviço com o srp client comando.

Vá para a sessão de tela do nó cliente SRP e inicialize automaticamente o cliente SRP:

> srp client autostart enable
Done

Defina o nome do host que será anunciado no link Wi-Fi / Ethernet:

> srp client host name ot-host
Done

Para que um dispositivo no link Wi-Fi / Ethernet alcance um dispositivo final Thread, o endereço OMR do dispositivo final precisa ser anunciado:

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

No final, registrar um falso _ipps._tcp serviço:

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

Aguarde alguns segundos e poderemos ver o serviço registrado:

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

Nós completamos todo o trabalho de instalação ea _ipps._tcp serviço deveria ter sido anunciado na ligação Wi-Fi / Ethernet. É hora de descobrir e alcançar o dispositivo final agora!

6. Descubra o serviço

Descubra o serviço com um telefone celular

54a136a8940897cc.png

Nós usamos o navegador Serviço App para descobrir serviços mDNS com o telefone Android, um aplicativo equivalente também podem ser encontradas para dispositivos móveis iOS. Abra a App eo serviço _ipps._tcp deve apenas mostrar-se.

Descubra o serviço com um host Linux

Se você quer descobrir o serviço de outro host Linux, você pode usar o avahi-browse comando.

Instale avahi-daemon e avahi-utils :

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

Resolva o serviço:

$ 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 = []
...

Descubra o serviço com um host macOS

Você pode usar dns-sd no MacOS para resolver o serviço:

$ 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. Faça ping no dispositivo final

Ping de um telefone celular

Pegue o telefone Pixel como exemplo, podemos descobrir o endereço OMR do serviço "ot-service" registrado anteriormente na página de detalhes da instância de serviço no Service Browser App.

bb992962e68d250b.png888daa1df1e1a9bf.png

Podemos agora o ping do endereço OMR com outro Network Analyzer App.

Infelizmente, a versão Android do Network Analyzer App não suporta mDNS consultas para o utilitário de ping e não podemos ping o hostname ot-host.local diretamente (que pode executar ping o nome da máquina com a versão iOS do App).

Ping de um host Linux / macOS

O Thread Border Router envia anúncios de roteador ICMPv6 (RA) para anunciar prefixos (por meio da opção de informações de prefixo) e rotas (por meio da opção de informações de rota) no link Wi-Fi / Ethernet.

Prepare o host Linux

É importante certificar-se de que RA e RIO estão habilitados em seu host:

  1. net.ipv6.conf.wlan0.accept_ra deve ser pelo menos 1 se o encaminhamento IP não está habilitado, e 2 de outra forma.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen não deve ser menor do que 64 .

o accept_ra é padronizada para 1 para a maioria das distribuições. Mas pode haver outros daemons de rede que irá substituir esta opção (por exemplo, dhcpcd em Raspberry Pi substituirá accept_ra a 0 ). Você pode verificar o accept_ra valor com:

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

E defina o valor para 1 (ou 2 no encaminhamento IP caso está habilitado) com:

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

O accept_ra_rt_info_max_plen opção na maioria das distribuições Linux é padrão para 0 , configurá-lo para 64 com:

$ 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

A alteração será perdida após a reinicialização do host. Por exemplo, anexar abaixo comandos para /etc/sysctl.conf para ativar permanentemente RIO:

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

Pode ser tarde demais para alterar essas configurações porque o OTBR já enviou mensagens RA e o intervalo entre duas mensagens RA não solicitadas pode ser de várias centenas de segundos. Uma maneira é desconectar e reconectar ao AP Wi-Fi para enviar mensagens de solicitação de roteador para que o OTBR responda com os RAs solicitados. Outra opção é reiniciar a função Border Routing no Border Router:

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

Se você está tentando se reconectar Wi-Fi ou reiniciar Ethernet interface, certifique-se de que dhcpcd não é usado para o gerenciamento de sua rede WiFi-/ Ethernet IPv6. Porque dhcpcd sempre substitui o accept_ra toda opção da interface é reiniciado e sua accept_ra configuração será perdida. Anexar abaixo linhas para o ficheiro de configuração dhcpcd (por exemplo /etc/dhcpcd.conf ) para desactivar o IPv6 explicitamente em dhcpcd:

noipv6
noipv6rs

Você precisa reiniciar para que as alterações tenham efeito.

Prepare o host macOS

Ambos os accept_ra* opções são ativadas por padrão, mas você precisa atualizar seu sistema para, pelo menos, MacOS Big Sur.

Faça ping no nome do host ou endereço IPv6

Podemos agora o ping do nome do host ot-host.local com o comando ping -6 ( ping6 para 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
...

Este comando pode falhar em hosts Linux com o "Name or service not known" erro. Isso porque o ping comando não é resolver o ot-host.local. nome com consultas mDNS. Abrir /etc/nsswitch.conf e adicione mdns6_minimal para a linha começa com hosts :

hosts:          files mdns4_minimal mdns6_minimal dns

Claro, você sempre pode executar ping no endereço IPv6 diretamente:

$ 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. Dispositivo final cancela a publicação do serviço

Para remover o endereço e o serviço registrado do nó cliente SRP:

> srp client host remove
Done

Você não deve ser capaz de descobrir a _ipps._tcp serviço agora.

9. parabéns

Parabéns, você configurou com sucesso o OTBR como um Thread Border Router para fornecer conectividade IP bidirecional e descoberta de serviço para dispositivos terminais Thread.

Qual é o próximo?

Confira alguns desses codelabs ...

Documentos de referência