Bộ định tuyến đường viền - Thread 1.2 Multicast

1. Giới thiệu

608c4c35050eb280.png.

Luồng là gì?

Thread là giao thức nối mạng lưới không dây công suất thấp dựa trên IP, cho phép giao tiếp an toàn giữa thiết bị và thiết bị với đám mây. Mạng luồng có thể thích ứng với sự thay đổi của cấu trúc liên kết để tránh lỗi một điểm.

OpenThread là gì?

OpenThread do Google phát hành là phương thức triển khai Thread® nguồn mở.

Bộ định tuyến biên OpenThread là gì?

OpenThread Border Router (OTBR) do Google phát hành là một phương thức triển khai nguồn mở của Bộ định tuyến đường viền luồng.

Thread 1.2 phát đa hướng

Luồng 1.2 xác định một loạt các tính năng hỗ trợ phát đa hướng trên một mạng không đồng nhất (phân đoạn Luồng và Wi-Fi/Mạng Ethernet) cho các địa chỉ phát đa hướng có phạm vi lớn hơn vùng cục bộ.

A Thread 1.2 Border Router registers its Backbone Router (BBR) Dataset, and the selected BBR service is the Primary Backbone Router (PBBR), which is responsible for the multicast inbounding/outbounding forward.

Thiết bị Chủ đề 1.2 gửi thông báo CoAP để đăng ký địa chỉ phát đa hướng tới PBBR (Đăng ký trình nghe đa hướng, viết tắt là MLR) nếu địa chỉ lớn hơn vùng cục bộ. PBBR sử dụng MLDv2 trên Giao diện bên ngoài để giao tiếp với IPv6 LAN/WAN rộng hơn về các nhóm phát đa hướng IPv6 mà nó cần lắng nghe, thay mặt cho Mạng luồng cục bộ của nó. Ngoài ra, PBBR chỉ chuyển tiếp lưu lượng truy cập đa hướng đến Mạng luồng nếu ít nhất một thiết bị luồng đã đăng ký đích đến này.

Đối với Thiết bị cuối tối thiểu Thread 1.2, chúng có thể phụ thuộc vào cha mẹ để tổng hợp địa chỉ phát đa hướng và thực hiện MLR thay mặt chúng, hoặc tự đăng ký nếu cha mẹ chúng ở Thread 1.1.

Để biết thêm thông tin chi tiết, vui lòng tham khảo Thread 1.2 Specification Section 5.24 Multicast Forward for Lớn hơn Realm-Local Scope.

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ thiết lập Bộ định tuyến đường viền (Thread Border Router) và 2 thiết bị Thread (Luồng), sau đó bật và xác minh các tính năng phát đa hướng trên thiết bị Thread và thiết bị Wi-Fi.

Kiến thức bạn sẽ học được

  • Cách xây dựng chương trình cơ sở nRF52840 với các tính năng Đa hướng Thread 1.2.
  • Cách đăng ký địa chỉ phát đa hướng IPv6 trên thiết bị Thread.

Bạn cần có

2. Thiết lập OTBR

Làm theo các lớp học lập trình về Bộ định tuyến đường viền - Kết nối IPv6 hai chiều và Khám phá dịch vụ dựa trên DNS để thiết lập Bộ định tuyến đường viền luồng trên Raspberry Pi.

Khi hoàn tất, Raspberry Pi sẽ tạo ra một mạng Thread hoạt động và kết nối với mạng Wi-Fi.

OTBR sẽ trở thành Bộ định tuyến đường trục chính trong vòng vài giây.

$ sudo ot-ctl bbr state
Primary
Done
$ sudo ot-ctl bbr
BBR Primary:
server16: 0xD800
seqno:    23
delay:    1200 secs
timeout:  3600 secs
Done

3. Thiết bị bản dựng và Flash Thread

Xây dựng ứng dụng Thread 1.2 CLI với Multicast và flash hai bo mạch nRF52840 DK.

Xây dựng chương trình cơ sở nRF52840 DK

Làm theo hướng dẫn để nhân bản dự án và tạo chương trình cơ sở nRF52840.

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recurse-submodules --depth 1 https://github.com/openthread/ot-nrf528xx.git
$ cd ot-nrf528xx/
$ script/build nrf52840 USB_trans -DOT_MLR=ON -DOT_THREAD_VERSION=1.2
$ arm-none-eabi-objcopy -O ihex build/bin/ot-cli-ftd ot-cli-ftd.hex

Chúng tôi có thể tìm thấy chương trình cơ sở HEX được tạo thành công tại ot-cli-ftd.hex.

Chương trình cơ sở Flash nRF52840 DK

Chuyển chương trình cơ sở sang nRF52840 DK bằng nrfjprog, một phần của Công cụ dòng lệnh nRF.

$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset

4. Đính kèm thiết bị Chuỗi vào Mạng chuỗi

OTBR đã tạo một mạng Luồng trong các bước trước. Bây giờ, chúng ta có thể thêm nRF52840 DK vào mạng Thread:

Nhận tập dữ liệu hoạt động thô từ OTBR:

$ sudo ot-ctl dataset active -x
0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff

Kết nối với bo mạch DRF nRF52840:

$ screen /dev/ttyACM0 115200

Định cấu hình Tập dữ liệu đang hoạt động cho nRF52840 DK:

> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Done

Khởi động ngăn xếp luồng và đợi vài giây rồi xác minh thiết bị đã được đính kèm thành công:

> ifconfig up
Done
> thread start
Done
> state
child

Lặp lại các bước trên để gắn bo mạch DRF52840 DK khác vào mạng Thread.

Hiện chúng tôi đã thiết lập thành công mạng Thread với 3 thiết bị Thread: OTBR và hai bo mạch nRF52840 DK.

5. Thiết lập mạng Wi-Fi

Thiết lập mạng Wi-Fi trên OTBR và máy tính xách tay để chúng kết nối với cùng một mạng Wi-Fi.

Chúng ta có thể sử dụng raspi-config để thiết lập SSID và cụm mật khẩu Wi-Fi trên Raspberry Pi OTBR.

Cấu trúc liên kết mạng cuối cùng được hiển thị dưới đây:

5d0f36fd69ebcc9a.pngs

6. Đăng ký địa chỉ phát đa hướng IPv6

Đăng ký ff05::abcd trên thiết bị cuối nRF52840 1:

> ipmaddr add ff05::abcd
Done

Xác minh ff05::abcd đã được đăng ký thành công:

> ipmaddr
ff33:40:fdde:ad00:beef:0:0:1
ff32:40:fdde:ad00:beef:0:0:1
ff05:0:0:0:0:0:0:abcd            <--- ff05::abcd subscribed
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

Đăng ký ff05::abcd trên máy tính xách tay:

Chúng ta cần một tập lệnh Python subscribe6.py để đăng ký một địa chỉ phát đa hướng trên Máy tính xách tay.

Sao chép mã dưới đây và lưu dưới dạng 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.')

Chạy subscribe6.py để đăng ký ff05::abcd trên giao diện mạng Wi-Fi (ví dụ: wlan0):

$ sudo python3 subscribe6.py wlan0 ff05::abcd
Subscribed ff05::abcd on interface wlan0.
Press ENTER to quit.

Cấu trúc liên kết mạng cuối cùng với các gói thuê bao phát đa hướng được trình bày dưới đây:

b118448c98b2d583.png.

Bây giờ chúng ta đã đăng ký địa chỉ phát đa hướng IPv6 trên cả nRF52840 End Device 1 trong mạng Thread và Máy tính xách tay trong mạng Wi-Fi, chúng ta sẽ xác minh khả năng kết nối phát đa hướng IPv6 hai chiều trong các phần sau.

7. Xác minh phát đa hướng IPv6 đến

Bây giờ, chúng ta sẽ có thể tiếp cận cả nRF52840 End Device 1 trong mạng Thread và Máy tính xách tay bằng địa chỉ phát đa hướng IPv6 ff05::abcd từ mạng Wi-Fi.

Ping ff05::abcd trên OTBR qua giao diện 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

Chúng ta có thể thấy rằng OTBR có thể nhận được hai phản hồi ping từ cả Thiết bị cuối 1 nRF52840 và Máy tính xách tay vì cả hai đều đã đăng ký ff05::abcd. Điều này cho thấy OTBR có thể chuyển tiếp các gói phát đa hướng Yêu cầu IPv6 từ mạng Wi-Fi đến mạng Luồng.

8. Xác minh phát đa hướng IPv6 chiều đi

Ping ff05::abcd trên thiết bị cuối 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 End Device 2 có thể nhận câu trả lời ping từ cả nRF52840 End Device 1 và Máy tính xách tay. Điều này cho thấy OTBR có thể chuyển tiếp các gói phát đa hướng IPv6 Ping Reply từ mạng Thread đến mạng Wi-Fi.

9. Xin chúc mừng

Xin chúc mừng, bạn đã thiết lập thành công Bộ định tuyến đường viền luồng và phát đa hướng IPv6 hai chiều đã được xác minh!

Để biết thêm thông tin về OpenThread, hãy truy cập openthread.io.

Tài liệu tham khảo: