1. Giới thiệu
Luồng là gì?
Thread là một giao thức mạng lưới không dây 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 các thiết bị và giữa các thiết bị. Mạng Thread có thể thích ứng với các thay đổi về 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à một cách triển khai nguồn mở của Thread®.
Bộ định tuyến đường viền OpenThread là gì?
Trình định tuyến đường viền OpenThread (OTBR) do Google phát hành là một bản triển khai nguồn mở của Bộ định tuyến đường viền luồng.
Thread 1.2 Đa hướng
Luồng 1.2 định nghĩa một loạt tính năng hỗ trợ phát đa hướng qua 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ộ.
Bộ định tuyến đường biên Thread 1.2 đăng ký Tập dữ liệu bộ định tuyến xương sống (BBR) và dịch vụ BBR được chọn là Bộ định tuyến đường xương chính (PBBR), chịu trách nhiệm về việc truyền vào/đi ra đa hướng về phía trước.
Một thiết bị Thread 1.2 gửi một thông báo CoAP để đăng ký địa chỉ multicast đến PBBR (Multicast Listener Registration, ngắn gọn 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 của nó để giao tiếp với mạng LAN/WAN IPv6 rộng hơn về các nhóm multicast IPv6 mà nó cần nghe, thay mặt cho Mạng Thread cục bộ của nó. Ngoài ra, PBBR chỉ chuyển tiếp lưu lượng truy cập phát đa hướng vào Mạng Thread nếu đích đến được ít nhất một thiết bị Thread đăng ký.
Đối với Thiết bị cuối tối thiểu Thread 1.2, chúng có thể dựa vào thành phần mẹ để tổng hợp địa chỉ multicast và thực hiện MLR thay mặt họ hoặc tự đăng ký nếu mẹ của chúng là Thread 1.1.
Để biết thêm chi tiết, vui lòng tham khảo Phần 5.24 Thông số kỹ thuật luồng 1.2 tại Mục 5.24 Chuyển tiếp nhiều hướng đối với phạm vi lớn hơn phạm vi Realm-Local.
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 Thread Border Router và 2 thiết bị Thread, sau đó bật và xác minh các tính năng Multicast 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 tính năng Thread 1.2 Multicast.
- Cách đăng ký địa chỉ multicast IPv6 trên thiết bị Thread.
Bạn cần có
- Một thiết bị Raspberry Pi 3/4 và một thẻ SD có dung lượng ít nhất 8 GB.
- 3 Bảng bán dẫn Bắc Âu nRF52840 DK.
- Một AP Wi-Fi không bật Trình bảo vệ quảng cáo bộ định tuyến IPv6 trên bộ định tuyến.
- Máy tính xách tay Linux/macOS (Raspberry Pi cũng hoạt động) đã cài đặt Python3.
2. Thiết lập OTBR
Tham khảo lớp học lập trình Bộ định tuyến đường viền luồng – 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 phải tạo một mạng Thread hoạt động và được kết nối với mạng Wi-Fi.
OTBR sẽ trở thành Bộ định tuyến 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ị Build và Flash Thread
Xây dựng ứng dụng Thread 1.2 CLI với Multicast và flash hai bảng nRF52840 DK.
Xây dựng chương trình cơ sở nRF52840 DK
Làm theo hướng dẫn để sao chép dự án và xây dựng 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 đã tạo thành công tại ot-cli-ftd.hex
.
Chương trình cơ sở Flash nRF52840 DK
Cài đặt ROM chương trình cơ sở này lên nRF52840 DK bằng nrfjprog
thuộc Công cụ dòng lệnh nRF.
$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset
4. Gắn các thiết bị Thread vào mạng Thread
OTBR đã tạo một mạng Thread trong các bước trước. Bây giờ, chúng ta có thể thêm nRF52840 DK vào mạng Thread:
Lấy tập dữ liệu đang hoạt động thô từ OTBR:
$ sudo ot-ctl dataset active -x 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Kết nối với bảng DK nRF52840:
$ screen /dev/ttyACM0 115200
Định cấu hình Tập dữ liệu hoạt động cho DK nRF52840:
> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff Done
Bắt đầu ngăn xếp Thread rồi đợi vài giây rồi kiểm tra để đảm bảo thiết bị đã kết nối thành công:
> ifconfig up Done > thread start Done > state child
Lặp lại các bước trên để đính kèm bảng DK nRF52840 khác vào mạng Thread.
Bây giờ chúng ta đã 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 được kết nối với cùng một AP 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.
Dưới đây là cấu trúc liên kết mạng sau cùng:
6. Đăng ký địa chỉ đa hướng IPv6
Đăng ký ff05::abcd trên nRF52840 Thiết bị cuối 1:
> ipmaddr add ff05::abcd Done
Xác minh rằng 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 có một tập lệnh Python subscribe6.py
để đăng ký một địa chỉ đa hướng trên Máy tính xách tay.
Sao chép mã dưới đây rồi 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.
Dưới đây là cấu trúc liên kết mạng cuối cùng với các gói thuê bao multicast:
Bây giờ chúng ta đã đăng ký địa chỉ multicast IPv6 trên cả nRF52840 Thiết bị đầu 1 trong mạng Thread và Máy tính xách tay trong mạng Wi-Fi, chúng tôi sẽ xác minh khả năng kết nối đa hướng IPv6 hai chiều trong các phần sau.
7. Xác minh đa hướng IPv6 chiều đến
Bây giờ, chúng ta có thể kết nối với cả nRF52840 Thiết bị cuối 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 hai phản hồi ping từ cả nRF52840 Thiết bị cuối 1 và Máy tính xách tay vì cả hai thiết bị này đề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 Ping IPv6 từ mạng Wi-Fi đến mạng Thread.
8. Xác minh đa hướng IPv6 đi
Ping ff05::abcd trên nRF52840 Thiết bị cuối 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 Thiết bị đầu 2 có thể nhận phản hồi ping từ cả nRF52840 Thiết bị cuối 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 Ping Reply (Trả lời) IPv6 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à xác minh đ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: