Bộ định tuyến đường viền luồng – Đa hướng IPv6

Thông tin về lớp học lập trình này
schedule17 phút
subjectLần cập nhật gần đây nhất: 5 tháng 5, 2025
account_circleTác giả: Simon Lin, Jonathan Hui

1. Giới thiệu

608c4c35050eb280.png

Luồng là gì?

Thread là một giao thức 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ới thiết bị và thiết bị với đám mây. Mạng luồng có thể thích ứng với các thay đổi về cấu trúc liên kết để tránh lỗi điểm đơn.

OpenThread là gì?

OpenThread do Google phát hành là một 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 cách triển khai nguồn mở của Thread Border Router.

Truyền đa điểm IPv6

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

Bộ định tuyến biên của luồng đăng ký Tập dữ liệu bộ định tuyến xương sống (BBR) và dịch vụ BBR đã chọn là Bộ định tuyến xương sống chính (PBBR), chịu trách nhiệm chuyển tiếp/đón nhận nội dung đa điểm.

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

Đối với Thiết bị đầu cuối tối thiểu của luồng, các thiết bị này có thể phụ thuộc vào thiết bị mẹ để tổng hợp địa chỉ đa điểm và thay mặt thực hiện MLR, hoặc tự đăng ký nếu thiết bị mẹ là Luồng 1.1.

Để biết thêm thông tin chi tiết, vui lòng tham khảo Quy cách về luồng.

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 một Bộ định tuyến biên Thread và hai thiết bị Thread, sau đó bật và xác minh các tính năng Truyền đ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 tạo firmware nRF52840 có hỗ trợ tính năng Truyền đa hướng IPv6.
  • Cách đăng ký địa chỉ phát đa hướng IPv6 trên các thiết bị Thread.

Những điều bạn cần

  • Một máy trạm Linux, để tạo và cài đặt ROM Thread RCP, OpenThread CLI và kiểm thử tính năng truyền tin đa điểm IPv6.
  • Raspberry Pi cho bộ định tuyến biên Thread.
  • 2 thiết bị USB nRF52840 của Nordic Semiconductor (một cho RCP và hai cho thiết bị đầu cuối Thread).

2. Thiết lập OTBR

Cách nhanh nhất để thiết lập OTBR là làm theo Hướng dẫn thiết lập OTBR.

Sau khi thiết lập OTBR, hãy sử dụng ot-ctl để xác thực rằng OTBR đã trở thành Bộ định tuyến xương sống chính trong vòng vài giây.

> bbr state
Primary
Done
> bbr
BBR Primary:
server16: 0xF800
seqno:    21
delay:    5 secs
timeout:  3600 secs
Done

3. Tạo bản dựng và truyền nhanh thiết bị Thread

Tạo ứng dụng Thread CLI bằng tính năng Truyền đa hướng và cài đặt ROM cho hai bo mạch nRF52840 DK.

Tạo chương trình cơ sở nRF52840 DK

Làm theo hướng dẫn để nhân bản dự án và tạo phần mềm nRF52840.

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_MLR=ON

Tiếp tục với phần Tạo mạng Thread bằng các bảng nRF52840 và lớp học lập trình OpenThread như đã viết. Sau khi thiết bị cuối được cài đặt ROM bằng hình ảnh CLI, hãy làm theo hướng dẫn Tham gia nút thứ hai vào mạng Thread để thêm thiết bị Thread vào mạng Thread. Lặp lại cho thiết bị đầu cuối Luồng thứ hai.

4. Đăng ký địa chỉ đa hướng IPv6

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

> ipmaddr add ff05::abcd
Done

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

> 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

Đă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ỉ đa điểm trên Máy tính xách tay.

Sao chép mã bên dưới 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 mạng cuối cùng có các gói thuê bao truyền tin nhiều điểm được hiển thị bên dưới:

b118448c98b2d583.png

Giờ đây, khi đã đăng ký địa chỉ đa truy cập IPv6 trên cả Thiết bị đầu cuối nRF52840 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 đa truy cập IPv6 hai chiều trong các phần sau.

5. Xác minh tính năng Truyền đa hướng IPv6 đến

Bây giờ, chúng ta có thể kết nối với cả Thiết bị đầu cuối nRF52840 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 thông 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ị đầu cuối nRF52840 1 và Máy tính xách tay vì cả hai đều đã đăng ký ff05::abcd. Điều này cho thấy rằng OTBR có thể chuyển tiếp các gói phát đa hướng Yêu cầu ping IPv6 từ mạng Wi-Fi đến mạng Thread.

6. Xác minh tính năng Truyền đa hướng IPv6 đi

Ping ff05::abcd trên Thiết bị đầu 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

Thiết bị cuối nRF52840 2 có thể nhận được phản hồi ping từ cả Thiết bị cuối nRF52840 1 và Máy tính xách tay. Điều này cho thấy rằng OTBR có thể chuyển tiếp các gói đa hướng Ping Reply IPv6 từ mạng Thread đến mạng Wi-Fi.

7. Xin chúc mừng

Xin chúc mừng! Bạn đã thiết lập thành công Bộ định tuyến biên Thread và xác minh tính năng truyền tin đa hướng IPv6 hai chiều!

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

Tài liệu tham khảo: