1. Giới thiệu
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ó
- Thiết bị Raspberry Pi 3/4 và thẻ SD có khả năng hoạt động ít nhất 8 GB.
- 3 bo mạch bán dẫn Bắc Âu nRF52840 DK.
- Một AP Wi-Fi không bật Bộ bảo vệ quảng cáo bằng 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 cài đặt Python3.
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:
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:
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: