1. Giới thiệu
Bộ định tuyến đường viền 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.
Bộ định tuyến đường viền chuỗi kết nối một mạng Thread với các mạng dựa trên IP khác, chẳng hạn như Wi-Fi hoặc Ethernet. Mạng luồng yêu cầu Bộ định tuyến biên để kết nối với các mạng khác. Bộ định tuyến đường viền luồng hỗ trợ tối thiểu các chức năng sau:
- Kết nối IP hai chiều giữa mạng Thread và mạng Wi-Fi/Ethernet.
- Khám phá dịch vụ hai chiều qua mDNS (trên liên kết Wi-Fi/Ethernet) và SRP (trên mạng Chuỗi).
- Hạ tầng luồng trên cơ sở hợp nhất các phân vùng Chuỗi trên các đường liên kết dựa trên IP.
- Ủy quyền luồng bên ngoài (ví dụ: điện thoại di động) để xác thực và kết nối thiết bị Thread với mạng Thread.
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.
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à kết nối điện thoại di động của mình với một thiết bị kết thúc luồng (thread) qua bộ định tuyến biên.
Kiến thức bạn sẽ học được
- Cách thiết lập OTBR
- Cách tạo mạng Thread bằng OTBR
- Cách xây dựng thiết bị CLI OpenThread với tính năng SRP
- Cách đăng ký dịch vụ với SRP
- Cách khám phá và tiếp cận thiết bị kết thúc chuỗi.
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.
- 2 bo mạch nhà phát triển bán dẫn Bắc Âu nRF52840.
- 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.
- Điện thoại iOS chạy phiên bản iOS 14 trở lên hoặc điện thoại Android chạy phiên bản Android 8.1 trở lên.
2. Thiết lập OTBR
Thiết lập Raspberry Pi
Bạn có thể dễ dàng thiết lập thiết bị Raspberry Pi mới bằng công cụ rpi-imager
bằng cách làm theo hướng dẫn trên raspberrypi.org (thay vì sử dụng hệ điều hành Raspberry Pi mới nhất trong công cụ này, hãy tự tải 2021-05-07-raspios-buster-armhf-lite xuống). Để hoàn tất các bước dành cho điện thoại di động trong lớp học lập trình này, bạn cần kết nối Raspberry Pi với điểm phát sóng Wi-Fi. Làm theo hướng dẫn này để thiết lập kết nối không dây. Thật thuận tiện khi đăng nhập vào Raspberry Pi bằng SSH, bạn có thể tìm thấy hướng dẫn tại đây.
Nhận mã OTBR
Đăng nhập vào Raspberry Pi và sao chép ot-br-posix
từ GitHub:
$ git clone https://github.com/openthread/ot-br-posix.git --depth 1
Xây dựng và cài đặt OTBR
OTBR có hai tập lệnh tự khởi động và thiết lập Bộ định tuyến đường viền luồng:
$ cd ot-br-posix $ ./script/bootstrap $ INFRA_IF_NAME=wlan0 ./script/setup
OTBR hoạt động trên cả giao diện luồng và giao diện mạng cơ sở hạ tầng (ví dụ: Wi-Fi/Ethernet) được chỉ định bằng INFRA_IF_NAME
. Giao diện luồng do chính OTBR tạo và được đặt tên là wpan0
theo mặc định, còn giao diện cơ sở hạ tầng có giá trị mặc định là wlan0
nếu INFRA_IF_NAME
không được chỉ định rõ ràng. Nếu Raspberry Pi của bạn được kết nối bằng cáp Ethernet, hãy chỉ định tên giao diện Ethernet (ví dụ: eth0
):
$ INFRA_IF_NAME=eth0 ./script/setup
Kiểm tra xem OTBR đã được cài đặt thành công hay chưa:
$ 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)
Có thể dịch vụ otbr-agent
không hoạt động vì cần có chip RCP
.
Khởi động lại Raspberry Pi để các thay đổi có hiệu lực.
Tạo và cài đặt chương trình cơ sở RCP
OTBR hỗ trợ chip radio 15.4 ở chế độ Radio Co-Processor (RCP). Ở chế độ này, ngăn xếp OpenThread đang chạy ở phía máy chủ và truyền/nhận khung hình qua bộ thu phát IEEE802.15.4.
Làm theo bước 4 của lớp học Xây dựng mạng Thread với bảng nRF52840 và OpenThread để tạo và cài đặt nRF52840 RCP cho thiết bị:
$ script/build nrf52840 USB_trans
Khởi động OTBR và xác minh trạng thái
Kết nối bo mạch nRF52840 với Raspberry Pi và bắt đầu dịch vụ otbr-agent
:
$ sudo service otbr-agent restart
Xác minh rằng dịch vụ otbr-agent
đang hoạt động:
$ 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. Tạo một Mạng luồng
Có một lệnh ot-ctl
có thể dùng để điều khiển dịch vụ otbr-agent
. ot-ctl
chấp nhận tất cả các lệnh CLI OpenThread, xem Hướng dẫn về CLI OpenThread để biết thêm chi tiết.
Hình thành mạng Chuỗi với 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
Chờ vài giây, chúng ta sẽ thấy rằng OTBR đang hoạt động như một Thread leader
và có tiền tố off-mesh-routable
(OMR) trong Dữ liệu mạng Thread:
$ 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. Thiết lập thiết bị cuối của khách hàng SRP
Xây dựng và flash COT OT
Làm theo bước 5 của lớp học Xây dựng mạng Thread với bảng mạch nRF52840 và OpenThread để tạo và cài đặt iRF52840 CLI cho thiết bị cuối.
Tuy nhiên, thay vì bật OT_COMMISSIONER
và OT_JOINER
, nút CLI sẽ yêu cầu các tính năng OT_SRP_CLIENT
và OT_ECDSA
.
Lệnh gọi bản dựng đầy đủ sẽ có dạng như sau:
$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Tham gia mạng OTBR
Để tham gia mạng Chuỗi do dịch vụ otbr-agent
tạo, chúng ta cần lấy Tập dữ liệu hoạt động đang hoạt động từ thiết bị OTBR. Hãy quay lại dòng lệnh otbr-agent
và nhận tập dữ liệu đang hoạt động:
$ sudo ot-ctl dataset active -x 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
Quay lại phiên màn hình nút ứng dụng khách SRP và đặt tập dữ liệu đang hoạt động:
> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
Sau đó, hãy bắt đầu giao diện Thread:
> ifconfig up Done > thread start Done
Đợi vài giây và xác minh xem đã tham gia mạng Chuỗi thành công hay chưa:
> 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
Đảm bảo rằng dữ liệu mạng khớp với dữ liệu đã in trên OTBR. Bây giờ chúng ta có thể ping địa chỉ OMR của OTBR:
> 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. Xuất bản dịch vụ trên thiết bị cuối
mDNS đã được sử dụng rộng rãi để xuất bản dịch vụ DNS-SD trên link-local. Tuy nhiên, các thông báo phát đa hướng tiêu tốn quá nhiều băng thông và sẽ nhanh hết pin cho các thiết bị có công suất thấp. Thread sử dụng giao thức SRP đơn nhất để đăng ký dịch vụ của họ với Bộ định tuyến biên và dựa vào Bộ định tuyến biên để quảng cáo các dịch vụ trên đường liên kết Wi-Fi hoặc Ethernet.
Chúng ta có thể đăng ký một dịch vụ bằng lệnh srp client
.
Chuyển đến phiên màn hình nút máy khách SRP và tự động khởi động máy khách SRP:
> srp client autostart enable Done
Đặt tên máy chủ sẽ được quảng cáo trên liên kết Wi-Fi/Ethernet:
> srp client host name ot-host Done
Đối với thiết bị trên đường liên kết Wi-Fi/Ethernet để kết nối với thiết bị kết thúc Luồng, địa chỉ OMR của thiết bị cuối cần được quảng cáo:
> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 Done
Cuối cùng, hãy đăng ký một dịch vụ _ipps._tcp
giả mạo:
> srp client service add ot-service _ipps._tcp 12345 Done
Hãy chờ vài giây, sau đó chúng tôi mới có thể thấy dịch vụ được đăng ký:
> srp client service instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0 Done
Chúng tôi đã hoàn tất tất cả các bước thiết lập và đã quảng cáo dịch vụ _ipps._tcp
trên đường liên kết Wi-Fi/Ethernet. Đã đến lúc khám phá và tiếp cận thiết bị cuối cùng ngay bây giờ!
6. Khám phá dịch vụ
Khám phá dịch vụ qua điện thoại di động
Chúng tôi sử dụng Ứng dụng trình duyệt dịch vụ để khám phá các dịch vụ mDNS với điện thoại Android, bạn cũng có thể tìm thấy Ứng dụng tương đương cho thiết bị di động iOS. Mở Ứng dụng và dịch vụ _ipps._tcp
sẽ hiển thị.
Khám phá dịch vụ thông qua máy chủ lưu trữ Linux
Nếu muốn khám phá dịch vụ từ một máy chủ Linux khác, bạn có thể sử dụng lệnh avahi-browse
.
Cài đặt avahi-daemon
và avahi-utils
:
$ sudo apt-get install -y avahi-daemon avahi-utils
Giải quyết dịch vụ:
$ 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 = [] ...
Khám phá dịch vụ thông qua máy chủ macOS
Bạn có thể sử dụng dns-sd
trên macOS để giải quyết dịch vụ:
$ 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. Ping thiết bị cuối
Ping trên điện thoại di động
Lấy điện thoại Pixel làm ví dụ, chúng ta có thể tìm hiểu địa chỉ OMR của dịch vụ "ot-service" đã đăng ký trước đó trên trang chi tiết của phiên bản dịch vụ trong Ứng dụng trình duyệt dịch vụ.
Bây giờ, chúng ta có thể ping địa chỉ OMR bằng một ứng dụng Trình phân tích mạng khác.
Rất tiếc, phiên bản Android của Ứng dụng phân tích mạng không hỗ trợ truy vấn mDNS cho tiện ích ping và chúng tôi không thể ping trực tiếp tên máy chủ ot-host.local
(chúng tôi có thể ping tên máy chủ bằng phiên bản iOS của ứng dụng).
Ping từ máy chủ Linux/macOS
Bộ định tuyến đường viền chuỗi gửi Quảng cáo bộ định tuyến ICMPv6 (RA) để quảng cáo tiền tố (thông qua Tùy chọn thông tin tiền tố) và các tuyến (thông qua Tùy chọn thông tin tuyến đường) trên liên kết Wi-Fi/Ethernet.
Chuẩn bị máy chủ Linux
Điều quan trọng là phải đảm bảo rằng RA và RIO được bật trên máy chủ lưu trữ của bạn:
net.ipv6.conf.wlan0.accept_ra
phải tối thiểu là1
nếu tính năng chuyển tiếp ip chưa được bật và2
.net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen
không được nhỏ hơn64
.
accept_ra
được đặt mặc định là 1
cho hầu hết các hệ điều hành. Nhưng có thể có các trình nền mạng khác sẽ ghi đè tuỳ chọn này (ví dụ: dhcpcd
trên Raspberry Pi sẽ ghi đè accept_ra
thành 0
). Bạn có thể kiểm tra giá trị accept_ra
bằng:
$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra 0
Và đặt giá trị thành 1
(hoặc 2
trong trường hợp tính năng chuyển tiếp IP đã bật) với:
$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra=1 Net.ipv6.conf.wlan0.accept_ra = 1
Theo mặc định, tuỳ chọn accept_ra_rt_info_max_plen
trên hầu hết các bản phân phối Linux là 0
và thiết lập thành 64
với:
$ 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
Thay đổi sẽ bị mất sau khi khởi động lại máy chủ. Ví dụ: thêm các lệnh dưới đây vào /etc/sysctl.conf
để bật RIO vĩnh viễn:
$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64
Có thể đã quá muộn để thay đổi các cấu hình đó vì OTBR đã gửi thông báo RA và khoảng thời gian giữa hai thông báo RA không mong muốn có thể là vài trăm giây. Một cách là ngắt kết nối rồi kết nối lại với Wi-Fi AP để gửi thông báo Khuyến khích bộ định tuyến sao cho OTBR có phản hồi với các RA đã xin phép. Tùy chọn khác là khởi động lại chức năng Định tuyến biên trên Bộ định tuyến biên:
$ sudo ot-ctl br disable Done $ sudo ot-ctl br enable Done
Nếu bạn đang cố gắng kết nối lại Wi-Fi hoặc khởi động lại giao diện Ethernet, hãy đảm bảo rằng dhcpcd không được sử dụng để quản lý mạng Wi-Fi/Ethernet IPv6 của bạn. Vì dhcpcd luôn ghi đè tuỳ chọn accept_ra
mỗi khi giao diện được khởi động lại và cấu hình accept_ra
của bạn sẽ bị mất. Nối các dòng bên dưới vào tệp cấu hình dhcpcd (ví dụ: /etc/dhcpcd.conf
) để vô hiệu hóa rõ ràng IPv6 trong dhcpcd:
noipv6 noipv6rs
Bạn cần khởi động lại để thay đổi có hiệu lực.
Chuẩn bị máy chủ macOS
Cả hai tùy chọn accept_ra*
đều được bật theo mặc định, nhưng bạn cần nâng cấp hệ thống của mình lên ít nhất là macOS Big Sur.
Ping tên máy chủ hoặc địa chỉ IPv6
Giờ đây, chúng ta có thể ping tên máy chủ bằng lệnh ping -6
(ping6
cho macOS):ot-host.local
$ 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 ...
Lệnh này có thể không thành công trên các máy chủ Linux có lỗi "Name or service not known"
. Nguyên nhân là do lệnh ping
không phân giải được tên ot-host.local.
bằng các truy vấn mDNS. Mở /etc/nsswitch.conf
rồi thêm mdns6_minimal
vào dòng bắt đầu bằng hosts
:
hosts: files mdns4_minimal mdns6_minimal dns
Tất nhiên, bạn luôn có thể ping trực tiếp địa chỉ 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. Thiết bị cuối Không xuất bản dịch vụ
Để xóa địa chỉ và dịch vụ đã đăng ký khỏi nút ứng dụng khách SRP:
> srp client host remove Done
Bạn không thể khám phá dịch vụ _ipps._tcp
ngay bây giờ.
9. Xin chúc mừng
Xin chúc mừng, bạn đã thiết lập thành công OTBR làm Bộ định tuyến đường viền luồng để cung cấp khả năng kết nối IP hai chiều và khám phá dịch vụ cho các thiết bị đầu cuối Thread.
Tiếp theo là gì?
Hãy xem một số lớp học lập trình này...