O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Roteador de borda Thread - conectividade IPv6 bidirecional e descoberta de serviços baseada em DNS

1. Introdução

699d673d05a55535.png

O que é um roteador de borda com linha de execução?

A Thread é um protocolo de rede mesh sem fio de baixo consumo baseado em IP que permite a comunicação segura de dispositivo para dispositivo e de nuvem para dispositivo. As redes Thread podem se adaptar a mudanças de topologia para evitar pontos únicos de falha.

Um roteador de borda da linha de execução conecta uma rede Thread a outras redes baseadas em IP, como Wi-Fi ou Ethernet. Uma rede Thread exige a conexão de um roteador de borda para se conectar a outras redes. Um roteador de borda da linha de execução é minimamente compatível com as seguintes funções:

  • Conectividade IP bidirecional entre redes Thread e Wi-Fi/Ethernet.
  • Descoberta bidirecional de serviços via mDNS (no link Wi-Fi/Ethernet) e SRP (na rede Thread).
  • Thread-over-Infrastructure que mescla partições Thread sobre links baseados em IP.
  • Comissões externas de linha de execução (por exemplo, um smartphone) para autenticar e mesclar um dispositivo Thread em uma rede Thread.

O OpenThread Border Router (OTBR) lançado pelo Google é uma implementação de código aberto do Thread Border Router.

O que você vai criar

Neste codelab, você configurará um roteador de borda com linha de execução e conectará seu smartphone a um dispositivo final com o roteador de borda.

O que você vai aprender

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

Pré-requisitos

  • Um dispositivo Raspberry Pi 3/4 e um cartão SD com pelo menos 8 GB de capacidade
  • 2 placas de desenvolvedor Nordic Semiconductor nRF52840
  • Um Wi-Fi AP sem a proteção de publicidade do roteador IPv6 ativado.
  • Um smartphone iOS com pelo menos o iOS 14 ou um smartphone Android com pelo menos o Android 8.1.

2. Configurar OTBR

Configurar o Raspberry Pi

É simples configurar um dispositivo Raspberry Pi recente com a ferramenta rpi-imager seguindo as instruções em raspberrypi.org. Em vez de usar o Raspberry Pi OS mais recente na ferramenta, faça o download de 2021-05-07-raspios-buster-armhf-lite por conta própria. Para concluir as etapas do smartphone 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 fazer login no Raspberry Pi com SSH. Veja instruções neste link.

Receber código OTBR

Faça login no Raspberry Pi e clone ot-br-posix do GitHub:

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

Criar e instalar o OTBR

O OTBR tem dois scripts que inicializam e configuram o roteador de borda do Thread:

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

O OTBR funciona em uma interface Thread e uma interface de rede de infraestrutura (por exemplo, Wi-Fi/Ethernet), que é especificado com INFRA_IF_NAME. A interface Thread é criada pelo próprio OTBR e nomeada como wpan0. A interface de infraestrutura tem um valor padrão de wlan0 se INFRA_IF_NAME não for explicitamente especificado. Se o Raspberry Pi estiver conectado 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:

$ 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 serviço otbr-agent não esteja ativo, porque ele precisa de um chip RCP para ser executado.

Reinicie o Raspberry Pi para que as alterações entrem em vigor.

Criar e atualizar o firmware do RCP

O OTBR é compatível com um chip de rádio de 15.4 no modo Cocoprocessador de rádio (RCP). Nesse modo, a pilha do OpenThread está em execução no lado do host e transmite/recebe frames sobre o transceptor IEEE802.15.4.

Siga a etapa 4 do codelab Criar uma rede Thread com placas nRF52840 e OpenThread para criar e atualizar um dispositivo nRF52840 RCP:

$ script/build nrf52840 USB_trans

Iniciar OTBR e verificar o status

Conecte a placa nRF52840 ao Raspberry Pi e inicie o serviço otbr-agent:

$ sudo service otbr-agent restart

Verifique se o serviço otbr-agent 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. Formar uma rede Thread

Há um comando ot-ctl que pode ser usado para controlar o serviço otbr-agent. ot-ctl aceita todos os comandos da CLI do OpenThread. Consulte o Guia da CLI do OpenThread para saber mais.

Formar 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

Espere alguns segundos para ver que o OTBR está agindo como uma linha de execução leader e que há um prefixo off-mesh-routable (OMR) nos dados da rede da linha de execução:

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

Criar e atualizar a CLI de OT

Siga a etapa 5 do codelab Criar uma rede Thread com placas nRF52840 e OpenThread para criar e atualizar um dispositivo final da CLI nRF52840.

Mas, em vez de ativar OT_COMMISSIONER e OT_JOINER, o nó da CLI exige os recursos OT_SRP_CLIENT e OT_ECDSA.

Dessa forma, a invocação completa do build ficará assim:

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

Conectar-se à rede OTBR

Para mesclar a rede Thread criada pelo serviço otbr-agent, precisamos do conjunto de dados operacional ativo do dispositivo OTBR. Volte para a linha de comando otbr-agent e veja o conjunto de dados ativo:

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

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

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Em seguida, inicie a interface da linha de execução:

> ifconfig up
Done
> thread start
Done

Aguarde alguns segundos e verifique se a conexão com a rede foi concluída:

> 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 dados impressos no OTBR. Podemos dar um ping no endereço OMR do OTBR's:

> 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. Publicar o serviço no dispositivo final

O mDNS tem sido amplamente usado na publicação do serviço DNS-SD no link-local. No entanto, as mensagens multicast consomem muita largura de banda e esgotarão a bateria para dispositivos de baixo consumo de energia rapidamente. A Thread usa o protocolo SRP do unicast para registrar os serviços dele com o roteador de borda e depende do roteador de borda para anunciar os serviços no link Wi-Fi ou Ethernet.

É possível registrar um serviço com o comando srp client.

Acesse a sessão de tela do nó do cliente SRP e inicie-o automaticamente:

> 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, registre um serviço _ipps._tcp falso:

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

Aguarde alguns segundos para ver o serviço registrado:

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

Concluímos todo o trabalho de configuração e o serviço _ipps._tcp deve ter sido anunciado no link Wi-Fi/Ethernet. Chegou a hora de descobrir e alcançar seu dispositivo final.

6. Descubra o serviço

Descubra o serviço com um smartphone

54a136a8940897cc.png

Usamos o app Navegador de serviços para descobrir serviços de mDNS com o smartphone Android. Também podemos encontrar um app equivalente para dispositivos móveis iOS. Abra o app, e o serviço _ipps._tcp aparecerá.

Descubra o serviço com um host do Linux

Se você quiser descobrir o serviço de outro host do Linux, use o comando avahi-browse.

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 do macOS

Use 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. Dar um ping no dispositivo final

Fazer ping em um smartphone

Veja o exemplo do smartphone Pixel, onde podemos descobrir o endereço OMR do serviço registrado "ot-service" na página de detalhes da instância de serviço, no app do navegador de serviços.

bb992962e68d250b.png 888daa1df1e1a9bf.png

É possível dar um ping no endereço OMR com outro app Network Analyzer.

A versão para Android do app Network Analyzer não é compatível com as consultas de mDNS para o utilitário de ping, e não é possível dar um ping diretamente no nome do host ot-host.local. Podemos dar um ping no nome do host com a versão do iOS do app.

Ping de um host Linux/macOS

O roteador de borda da linha de execução envia anúncios de roteador ICMPv6 (RA) para anunciar prefixos (por meio da opção de informações de prefixo) e trajetos (via opção de informações de trajeto) no link Wi-Fi/Ethernet.

Preparar host do Linux

É importante garantir que a RA e o RIO estejam ativados no host:

  1. net.ipv6.conf.wlan0.accept_ra precisa ser pelo menos 1 se o encaminhamento do IP não estiver ativado. Caso contrário, será 2.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen não pode ser menor que 64.

O padrão da accept_ra é 1 para a maioria das distribuições. No entanto, pode haver outros daemons da rede que substituirão essa opção, por exemplo, dhcpcd no Raspberry Pi modificará accept_ra para 0. Verifique o valor de accept_ra com:

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

E defina o valor como 1 (ou 2 caso o encaminhamento de IP esteja ativado) com:

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

Na maioria das distribuições do Linux, a opção accept_ra_rt_info_max_plen é definida como 0 por padrão. Basta defini-la como 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, anexe os comandos abaixo a /etc/sysctl.conf para ativar permanentemente o RIO:

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

Talvez seja tarde demais para mudar essas configurações porque o OTBR já envia mensagens de RA, e o intervalo entre duas mensagens não solicitadas de RA pode ser de várias centenas de segundos. Uma maneira é desconectar e reconectar ao AP do Wi-Fi para enviar mensagens de solicitação do roteador para que o OTBR responda com RAs solicitadas. Outra opção é reiniciar a função "Roteamento de borda" no roteador de borda:

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

Se você estiver tentando reconectar a rede Wi-Fi ou reiniciar a interface Ethernet, verifique se dhcpcd não é usado para gerenciar sua rede Wi-Fi/Ethernet IPv6. Como o dhcpcd sempre substitui a opção accept_ra sempre que a interface é reiniciada e a configuração de accept_ra é perdida. Anexe as linhas abaixo ao arquivo de configuração dhcpcd (por exemplo, /etc/dhcpcd.conf) para desativar explicitamente o IPv6 no dhcpcd:

noipv6
noipv6rs

É necessário reiniciar para que a alteração entre em vigor.

Preparar host do macOS

Ambas as opções de accept_ra* estão ativadas por padrão, mas você precisa fazer upgrade do seu sistema para pelo menos o macOS Big Sur.

Dê um ping no nome do host ou no endereço IPv6

Agora, podemos dar um ping no 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
...

Esse comando pode falhar em hosts Linux com o erro "Name or service not known". Isso ocorre porque o comando ping não está resolvendo o nome de ot-host.local. com consultas mDNS. Abra /etc/nsswitch.conf e adicione mdns6_minimal à linha que começa com hosts:

hosts:          files mdns4_minimal mdns6_minimal dns

É possível dar um ping diretamente no endereço 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. Cancelamento da publicação do serviço pelo dispositivo final

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

> srp client host remove
Done

Você não conseguirá descobrir o serviço _ipps._tcp.

9. Parabéns

Parabéns! Você configurou o OTBR como um roteador de borda para oferecer conectividade de IP bidirecional e descoberta de serviços para dispositivos finais.

Qual é a próxima etapa?

Confira alguns dos seguintes codelabs:

Documentos de referência