Thread Border Router - การเชื่อมต่อ IPv6 แบบ 2 ทิศทางและการค้นพบบริการที่ใช้ DNS

เกี่ยวกับ Codelab นี้
schedule22 นาที
subjectอัปเดตล่าสุดเมื่อ 23 พฤษภาคม 2568
account_circleเขียนโดย Kangping Dong, Jonathan Hui

1. บทนำ

699d673d05a55535.png

Thread คืออะไร

Thread เป็นโปรโตคอลเครือข่ายที่ทำงานร่วมกันแบบไร้สายและใช้พลังงานต่ำซึ่งอิงตาม IP ที่ช่วยให้การติดต่อระหว่างอุปกรณ์กับอุปกรณ์และอุปกรณ์กับระบบคลาวด์เป็นไปอย่างปลอดภัย เครือข่ายเทรดสามารถปรับตัวตามการเปลี่ยนแปลงของโทโปโลยีเพื่อหลีกเลี่ยงจุดที่เกิดความล้มเหลว

OpenThread คืออะไร

OpenThread ที่ Google เปิดตัวเป็นการใช้งาน Thread® แบบโอเพนซอร์ส

Thread Border Router คืออะไร

Thread Border Router จะเชื่อมต่อเครือข่าย Thread กับเครือข่ายอื่นๆ ที่ใช้ IP เช่น Wi-Fi หรืออีเทอร์เน็ต เครือข่ายเทรดต้องใช้ Border Router เพื่อเชื่อมต่อกับเครือข่ายอื่นๆ Border Router ของเทรดรองรับฟังก์ชันต่อไปนี้เป็นอย่างน้อย

  • การเชื่อมต่อ IP แบบ 2 ทิศทางระหว่างเครือข่าย Thread กับ Wi-Fi/อีเทอร์เน็ต
  • การสำรวจบริการแบบ 2 ทิศทางผ่าน mDNS (ในลิงก์ Wi-Fi/อีเทอร์เน็ต) และ SRP (ในเครือข่ายเทรด)
  • เทรดผ่านโครงสร้างพื้นฐานที่ผสานพาร์ติชันเทรดผ่านลิงก์ที่อิงตาม IP
  • การจัดเตรียมเทรดจากภายนอก (เช่น โทรศัพท์มือถือ) เพื่อตรวจสอบสิทธิ์และเข้าร่วมอุปกรณ์เทรดกับเครือข่ายเทรด

OpenThread Border Router (OTBR) ที่ Google เปิดตัวเป็นการใช้งาน Border Router แบบเทรดที่เป็นโอเพนซอร์ส

สิ่งที่คุณจะสร้าง

ในโค้ดแล็บนี้ คุณจะต้องตั้งค่า Thread Border Router และเชื่อมต่อโทรศัพท์มือถือกับอุปกรณ์ปลายทาง Thread ผ่าน Border Router

สิ่งที่คุณจะได้เรียนรู้

  • วิธีตั้งค่า OTBR
  • วิธีสร้างเครือข่ายเทรดด้วย OTBR
  • วิธีสร้างอุปกรณ์ OpenThread CLI ที่มีฟีเจอร์ SRP
  • วิธีลงทะเบียนบริการกับ SRP
  • วิธีค้นหาและเข้าถึงอุปกรณ์ปลายทางเทรด

สิ่งที่คุณต้องมี

  • เวิร์กสเตชัน Linux สำหรับการสร้างและแฟลช Thread RCP, OpenThread CLI และการทดสอบมัลติแคสต์ IPv6
  • Raspberry Pi สำหรับ Border Router แบบเทรด
  • ดองเกิล USB nRF52840 ของ Nordic Semiconductor 2 ตัว (1 ตัวสำหรับ RCP และ 1 ตัวสำหรับอุปกรณ์ปลายทางแบบเทรด)
  • โทรศัพท์ iOS ที่ใช้ iOS 14 เป็นอย่างต่ำ หรือโทรศัพท์ Android ที่ใช้ Android 8.1 เป็นอย่างต่ำ

2. ตั้งค่า OTBR

วิธีที่เร็วที่สุดในการตั้งค่า OTBR คือทำตามคู่มือการตั้งค่า OTBR

หลังจากตั้งค่า OTBR เสร็จแล้ว ให้ใช้ ot-ctl เพื่อตรวจสอบว่า OTBR ทํางานเป็น Thread leader

$ sudo ot-ctl state
leader
Done

และตรวจสอบว่า OTBR ได้กําหนดค่าส่วนหน้า off-mesh-routable (OMR) โดยอัตโนมัติในข้อมูลเครือข่ายเทรด

$ 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

3. ตั้งค่าอุปกรณ์ปลายทางของไคลเอ็นต์ SRP

สร้างและแฟลช OT CLI

ทำตามขั้นตอนที่ 5 ของโค้ดแล็บสร้างเครือข่ายเทรดด้วยบอร์ด nRF52840 และ OpenThread เพื่อสร้างและแฟลชอุปกรณ์ปลายทาง CLI ของ nRF52840

แต่โหนด CLI ต้องใช้ฟีเจอร์ OT_SRP_CLIENT และ OT_ECDSA แทนที่จะเปิดใช้ OT_COMMISSIONER และ OT_JOINER

ดังนั้นการเรียกใช้บิลด์แบบเต็มจึงควรมีลักษณะดังนี้

$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

เข้าร่วมเครือข่ายเทรด

หากต้องการเข้าร่วมเครือข่ายเทรด เราจำเป็นต้องรับชุดข้อมูลการทํางานที่ใช้งานอยู่จากอุปกรณ์ OTBR กลับไปที่ ot-ctl และรับชุดข้อมูลที่ใช้งานอยู่

$ sudo ot-ctl dataset active -x
0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

กลับไปที่เซสชันหน้าจอโหนดไคลเอ็นต์ SRP และตั้งค่าชุดข้อมูลที่ใช้งานอยู่ โดยทำดังนี้

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

จากนั้นเริ่มอินเทอร์เฟซเทรดดังนี้

> ifconfig up
Done
> thread start
Done

รอ 2-3 วินาทีแล้วตรวจสอบว่าการเข้าร่วมเครือข่ายเทรดสำเร็จหรือไม่ โดยทำดังนี้

> 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

ตรวจสอบว่าข้อมูลเครือข่ายตรงกับข้อมูลที่พิมพ์ใน OTBR ตอนนี้เราปิงที่อยู่ OMR ของ 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

4. เผยแพร่บริการในอุปกรณ์ปลายทาง

mDNS มีการใช้งานอย่างแพร่หลายเพื่อเผยแพร่บริการ DNS-SD ในลิงก์ภายใน แต่ข้อความมัลติแคสต์จะใช้แบนด์วิดท์มากเกินไปและจะทำให้แบตเตอรี่ของอุปกรณ์พลังงานต่ำหมดเร็ว เทรดใช้โปรโตคอล SRP แบบยูนิแคสต์เพื่อลงทะเบียนบริการกับ Border Router และอาศัย Border Router เพื่อโฆษณาบริการในลิงก์ Wi-Fi หรืออีเทอร์เน็ต

เราลงทะเบียนบริการด้วยคําสั่ง srp client ได้

ไปที่เซสชันหน้าจอโหนดไคลเอ็นต์ SRP และเริ่มไคลเอ็นต์ SRP โดยอัตโนมัติ โดยทำดังนี้

> srp client autostart enable
Done

ตั้งค่าชื่อโฮสต์ที่จะแสดงในลิงก์ Wi-Fi/อีเทอร์เน็ต โดยทำดังนี้

> srp client host name ot-host
Done

หากต้องการให้อุปกรณ์ในลิงก์ Wi-Fi/อีเทอร์เน็ตเข้าถึงอุปกรณ์ปลายทางเทรด อุปกรณ์ปลายทางต้องประกาศที่อยู่ OMR ดังนี้

> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
Done

ในตอนท้าย ให้ลงทะเบียนบริการ _ipps._tcp ปลอม โดยทำดังนี้

> srp client service add ot-service _ipps._tcp 12345
Done

โปรดรอสักครู่และเราควรจะเห็นบริการที่ลงทะเบียนแล้ว

> srp client service
instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0
Done

เราได้ทําการตั้งค่าทั้งหมดเรียบร้อยแล้ว และบริการ _ipps._tcp ควรแสดงในลิงก์ Wi-Fi/อีเทอร์เน็ต ได้เวลาค้นพบและเข้าถึงอุปกรณ์ปลายทางแล้ว

5. สำรวจบริการ

สำรวจบริการด้วยโทรศัพท์มือถือ

54a136a8940897cc.png

เราใช้แอปเครื่องมือค้นหาบริการเพื่อค้นหาบริการ mDNS ด้วยโทรศัพท์ Android นอกจากนี้ คุณยังดูแอปที่เทียบเท่าสำหรับอุปกรณ์เคลื่อนที่ iOS ได้ด้วย เปิดแอปแล้วบริการ _ipps._tcp ควรปรากฏขึ้น

ค้นหาบริการด้วยโฮสต์ Linux

หากต้องการค้นหาบริการจากโฮสต์ Linux เครื่องอื่น ให้ใช้คำสั่ง avahi-browse

วิธีติดตั้ง avahi-daemon และ avahi-utils

$ sudo apt-get install -y avahi-daemon avahi-utils

แก้ปัญหาบริการ

$ 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 = []
...

สำรวจบริการด้วยโฮสต์ macOS

คุณใช้ dns-sd ใน macOS เพื่อแก้ปัญหาบริการได้ดังนี้

$ 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     ""
...

6. ตรวจสอบอุปกรณ์ปลายทาง

พิงค์จากโทรศัพท์มือถือ

ยกตัวอย่างเช่น โทรศัพท์ Pixel เราจะดูที่อยู่ OMR ของบริการ "ot-service" ที่ลงทะเบียนไว้ก่อนหน้านี้ได้ในหน้ารายละเอียดของอินสแตนซ์บริการในแอป Service Browser

bb992962e68d250b.png 888daa1df1e1a9bf.png

ตอนนี้เราปิงที่อยู่ OMR ด้วยแอปเครื่องมือวิเคราะห์เครือข่ายอื่นได้แล้ว

ขออภัย แอปวิเคราะห์เครือข่ายเวอร์ชัน Android ไม่รองรับการค้นหา mDNS สำหรับยูทิลิตี ping และเราไม่สามารถ ping ชื่อโฮสต์ ot-host.local ได้โดยตรง (เรา ping ชื่อโฮสต์ด้วยแอปเวอร์ชัน iOS ได้)

สั่ง ping จากโฮสต์ Linux/macOS

Border Router ของเทรดจะส่งการโฆษณาเราเตอร์ ICMPv6 (RA) เพื่อโฆษณาคำนำหน้า (ผ่านตัวเลือกข้อมูลคำนำหน้า) และเส้นทาง (ผ่านตัวเลือกข้อมูลเส้นทาง) ในลิงก์ Wi-Fi/อีเทอร์เน็ต

เตรียมโฮสต์ Linux

คุณต้องตรวจสอบว่าเปิดใช้ RA และ RIO ในโฮสต์แล้ว โดยทำดังนี้

  1. net.ipv6.conf.wlan0.accept_ra ควรมีค่าอย่างน้อย 1 หากไม่ได้เปิดใช้การส่งต่อ IP และ 2 หากเปิดใช้
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen ต้องไม่น้อยกว่า 64

accept_ra จะมีค่าเริ่มต้นเป็น 1 สำหรับระบบปฏิบัติการส่วนใหญ่ แต่อาจมีเดมอนเครือข่ายอื่นๆ ที่จะลบล้างตัวเลือกนี้ (เช่น dhcpcd ใน Raspberry Pi จะลบล้าง accept_ra เป็น 0) คุณสามารถตรวจสอบค่า accept_ra ได้โดยทำดังนี้

$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra
0

และตั้งค่าเป็น 1 (หรือ 2 ในกรณีที่เปิดใช้การส่งต่อ IP) ด้วย

$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra=1
Net.ipv6.conf.wlan0.accept_ra = 1

ตัวเลือก accept_ra_rt_info_max_plen ในระบบปฏิบัติการ Linux ส่วนใหญ่จะตั้งค่าเริ่มต้นเป็น 0 ให้ตั้งค่าเป็น 64 โดยใช้คำสั่งต่อไปนี้

$ 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

การเปลี่ยนแปลงจะหายไปหลังจากรีบูตโฮสต์ เช่น ต่อท้ายคําสั่งด้านล่างลงใน /etc/sysctl.conf เพื่อเปิดใช้ RIO ถาวร

$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64

คุณอาจเปลี่ยนการกำหนดค่าเหล่านั้นไม่ทันแล้วเนื่องจาก OTBR ส่งข้อความ RA ไปแล้ว และช่วงเวลาระหว่างข้อความ RA ที่ไม่ได้รับเชิญ 2 ข้อความอาจนานหลายร้อยวินาที วิธีหนึ่งคือ ยกเลิกการเชื่อมต่อและเชื่อมต่อกับ AP ของ Wi-Fi อีกครั้งเพื่อส่งข้อความขอเราเตอร์เพื่อให้ OTBR ตอบกลับด้วย RA ที่ขอ อีกตัวเลือกหนึ่งคือการรีสตาร์ทฟังก์ชัน Border Routing ใน Border Router โดยทำดังนี้

$ sudo ot-ctl br disable
Done
$ sudo ot-ctl br enable
Done

หากคุณพยายามเชื่อมต่อ Wi-Fi อีกครั้งหรือรีสตาร์ทอินเทอร์เฟซอีเทอร์เน็ต ให้ตรวจสอบว่าไม่ได้ใช้ dhcpcd ในการจัดการเครือข่าย IPv6 ของ Wi-Fi/อีเทอร์เน็ต เนื่องจาก dhcpcd จะลบล้างตัวเลือก accept_ra ทุกครั้งที่อินเทอร์เฟซรีสตาร์ท และการกำหนดค่า accept_ra จะหายไป เพิ่มบรรทัดด้านล่างลงในไฟล์การกําหนดค่า dhcpcd (เช่น /etc/dhcpcd.conf) เพื่อปิดใช้ IPv6 ใน dhcpcd อย่างชัดแจ้ง

noipv6
noipv6rs

คุณต้องรีบูตเพื่อให้การเปลี่ยนแปลงมีผล

เตรียมโฮสต์ macOS

ระบบจะเปิดใช้ตัวเลือก accept_ra* ทั้ง 2 รายการโดยค่าเริ่มต้น แต่คุณต้องอัปเกรดระบบเป็น macOS Big Sur เป็นอย่างน้อย

พิงค์ชื่อโฮสต์หรือที่อยู่ IPv6

ตอนนี้เราปิงชื่อโฮสต์ ot-host.local ด้วยคำสั่ง ping -6 (ping6 สำหรับ macOS) ได้แล้ว

$ 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
...

คำสั่งนี้อาจไม่สำเร็จในโฮสต์ Linux ด้วยข้อผิดพลาด "Name or service not known" นั่นเป็นเพราะคำสั่ง ping ไม่ได้แก้ไขชื่อ ot-host.local. ด้วยการค้นหา mDNS เปิด /etc/nsswitch.conf แล้วเพิ่ม mdns6_minimal ลงในบรรทัดเริ่มต้นด้วย hosts

hosts:          files mdns4_minimal mdns6_minimal dns

นอกจากนี้ คุณยัง ping ที่อยู่ 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
...

7. อุปกรณ์ปลายทางยกเลิกการเผยแพร่บริการ

วิธีนำที่อยู่และบริการที่ลงทะเบียนออกจากโหนดไคลเอ็นต์ SRP

> srp client host remove
Done

คุณไม่ควรค้นพบบริการ _ipps._tcp ในตอนนี้

8. ขอแสดงความยินดี

ยินดีด้วย คุณได้ตั้งค่า OTBR เป็น Thread Border Router เพื่อมอบการเชื่อมต่อ IP แบบ 2 ทิศทางและการค้นพบบริการสำหรับอุปกรณ์ปลายทาง Thread เรียบร้อยแล้ว

ขั้นตอนถัดไปคือ

ลองดู Codelab เหล่านี้...

เอกสารอ้างอิง