Xây dựng mạng Thread bằng các bảng nRF52840 và OpenThread

1. Giới thiệu

26b7f4f6b3ea0700.png.

OpenThread do Google phát hành là một phương thức triển khai nguồn mở của giao thức mạng Thread®. Google Nest đã ra mắt OpenThread để cung cấp rộng rãi công nghệ dùng trong các sản phẩm Nest cho các nhà phát triển nhằm đẩy nhanh quá trình phát triển sản phẩm dành cho nhà thông minh.

Thông số kỹ thuật Thread xác định giao thức giao tiếp giữa các thiết bị không dây đáng tin cậy, an toàn và tiết kiệm năng lượng dựa trên IPv6 cho các ứng dụng trong nhà. OpenThread thực hiện tất cả các lớp mạng Thread bao gồm IPv6, 6LoWPAN, IEEE 802.15.4 với bảo mật MAC, thành lập liên kết lưới và định tuyến lưới.

Trong lớp học lập trình này, bạn sẽ lập trình OpenThread trên phần cứng thực, tạo và quản lý mạng Thread, cũng như truyền thông điệp giữa các nút.

4806d16a8c137c6d.jpeg

Kiến thức bạn sẽ học được

  • Xây dựng và cài đặt ROM tệp nhị phân OpenThread CLI cho bảng phát triển
  • Xây dựng RCP bao gồm máy Linux và bảng nhà phát triển
  • Giao tiếp với RCP bằng OpenThread Daemon và ot-ctl
  • Quản lý thủ công các nút Thread bằng GNU Screen và OpenThread CLI
  • Lắp đặt an toàn cho thiết bị trên mạng Thread
  • Cách hoạt động của chế độ phát đa hướng IPv6
  • Chuyển thông báo giữa các nút Thread bằng UDP

Bạn cần có

Phần cứng:

  • 3 Bảng phát triển chất bán dẫn Bắc Âu nRF52840
  • 3 cáp USB sang Micro-USB để kết nối các bo mạch
  • Một máy Linux có ít nhất 3 cổng USB

Phần mềm:

  • Chuỗi công cụ GNU
  • Công cụ dòng lệnh nRF5x của Bắc Âu
  • Phần mềm Segger J-Link
  • OpenThread
  • Git

2. Bắt đầu

Mô phỏng OpenThread

Trước khi bắt đầu, bạn có thể muốn tìm hiểu qua Lớp học lập trình mô phỏng OpenThread để làm quen với các khái niệm cơ bản về Thread và OpenThread CLI.

Các đầu cuối của cổng nối tiếp

Bạn sẽ làm quen với cách kết nối với cổng nối tiếp qua thiết bị đầu cuối. Lớp học lập trình này sử dụng GNU Screen và cung cấp thông tin tổng quan về cách sử dụng, nhưng bạn có thể sử dụng bất kỳ phần mềm thiết bị đầu cuối nào khác.

Máy Linux

Lớp học lập trình này được thiết kế để sử dụng một máy Linux dựa trên nền tảng i386 hoặc x86 làm máy chủ lưu trữ thiết bị Thread Co-Processor (RCP) và cài đặt RCP cho tất cả các bảng phát triển Thread. Tất cả các bước đã được kiểm tra trên Ubuntu 14.04.5 LTS (Trusty Tahr).

Bảng bán dẫn Bắc Âu nRF52840

Lớp học lập trình này sử dụng 3 bảng nRF52840 PDK.

a6693da3ce213856.png

Chúng ta sử dụng SEGGER J-Link để lập trình các bo mạch nRF52840, có các mô-đun JTAG trên bo mạch. Cài đặt tiện ích này trên máy Linux.

Tải gói phù hợp cho máy của bạn xuống và cài đặt vào vị trí thích hợp. Trên Linux, đây là /opt/SEGGER/JLink.

Cài đặt công cụ dòng lệnh nRF5x

Công cụ dòng lệnh nRF5x cho phép bạn cài đặt các tệp nhị phân OpenThread vào bảng nRF52840. Cài đặt nRF5x-Command-Line-Tools-<OS> thích hợp tạo trên máy Linux của bạn.

Đặt gói đã giải nén vào thư mục gốc ~/

Cài đặt chuỗi công cụ ARM GNU

Chuỗi công cụ ARM GNU được dùng để xây dựng.

Bạn nên đặt tệp lưu trữ đã giải nén vào /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/ trên máy Linux của mình. Làm theo hướng dẫn trong tệp readme.txt của tệp lưu trữ để xem hướng dẫn cài đặt.

Màn hình cài đặt (không bắt buộc)

Màn hình là một công cụ đơn giản để truy cập vào các thiết bị được kết nối bằng cổng nối tiếp. Lớp học lập trình này sử dụng màn hình, nhưng bạn có thể sử dụng bất kỳ ứng dụng đầu cuối cổng nối tiếp nào mà bạn muốn.

$ sudo apt-get install screen

3. Kho lưu trữ bản sao

OpenThread

Sao chép và cài đặt OpenThread. Các lệnh script/bootstrap đảm bảo bạn đã cài đặt chuỗi công cụ và định cấu hình môi trường đúng cách:

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recursive https://github.com/openthread/openthread.git
$ cd openthread
$ ./script/bootstrap

Tạo trình nền OpenThread:

$ script/cmake-build posix -DOT_DAEMON=ON

Bây giờ, bạn đã sẵn sàng để xây dựng và cài đặt ROM OpenThread vào các bảng nRF52840.

4. Thiết lập Trình tham gia RCP

Tạo và cài đặt ROM

Xây dựng ví dụ OpenThread nRF52840 với chức năng Joiner và chức năng USB gốc. Một thiết bị sử dụng vai trò Tham gia để được xác thực và ủy quyền một cách an toàn trên mạng Thread. USB gốc cho phép sử dụng USB CDC ACM làm phương thức truyền tải nối tiếp giữa nRF52840 và máy chủ.

Luôn xoá kho lưu trữ của các bản dựng trước đó trước bằng cách chạy rm -rf build.

$ cd ~/src
$ git clone --recursive https://github.com/openthread/ot-nrf528xx.git
$ cd ot-nrf528xx
$ script/build nrf52840 USB_trans

Chuyển đến thư mục có tệp nhị phân OpenThread RCP rồi chuyển đổi sang định dạng hex:

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex

Gắn cáp USB vào cổng gỡ lỗi Micro-USB bên cạnh chân nguồn bên ngoài trên bảng nRF52840, sau đó cắm vào máy Linux. Đặt công tắc Nguồn điện nRF trên bảng nRF52840 thành VDD. Khi được kết nối đúng cách, LED5 sẽ bật.

20a3b4b480356447.pngS

Nếu đây là bo mạch đầu tiên được gắn vào máy Linux, thì bo mạch đó sẽ có dạng cổng nối tiếp /dev/ttyACM0 (tất cả các bo mạch nRF52840 đều sử dụng ttyACM làm giá trị nhận dạng cổng nối tiếp).

$ ls /dev/ttyACM*
/dev/ttyACM0

Lưu ý số sê-ri của bảng nRF52840 được dùng cho RCP:

c00d519ebec7e5f0.jpeg

Điều hướng đến vị trí của Công cụ dòng lệnh nRFx và cài đặt RCP tệp hex OpenThread lên bảng nRF52840, sử dụng số sê-ri của bảng. Lưu ý rằng nếu bỏ qua cờ --verify, bạn sẽ thấy thông báo cảnh báo cho biết quá trình flash có thể không thành công mà không có lỗi.

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924  --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset

Kết quả sau đây được tạo khi thành công:

Parsing hex file.
Erasing user available code and UICR flash areas.
Applying system reset.
Checking that the area to write is not protected.
Programing device.
Applying system reset.
Run.

Gắn nhãn cho bảng là "RCP" để sau này bạn không nhầm lẫn các vai trò trong bảng.

Kết nối với USB gốc

Vì bản dựng OpenThread RCP cho phép sử dụng ACM USB CDC gốc làm phương tiện truyền tải nối tiếp, nên bạn phải sử dụng cổng nRF USB trên bảng nRF52840 để giao tiếp với máy chủ RCP (máy Linux).

Tháo đầu Micro-USB của cáp USB khỏi cổng gỡ lỗi của bảng nRF52840 đã được nhấp nháy, sau đó gắn lại vào cổng nRF USB Micro-USB ở bên cạnh nút reset (Đặt lại). Đặt công tắc Nguồn điện nRF thành USB.

46e7b670d2464842.pngS

Khởi động OpenThread Daemon

Trong thiết kế RCP, hãy sử dụng OpenThread Daemon để giao tiếp và quản lý thiết bị Thread. Khởi động ot-daemon bằng cờ chi tiết -v để bạn có thể xem đầu ra nhật ký và xác nhận rằng mã đang chạy:

$ cd ~/src/openthread
$ sudo ./build/posix/src/posix/ot-daemon -v \
    'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=115200'

Khi thành công, ot-daemon ở chế độ chi tiết sẽ tạo ra kết quả tương tự như sau:

ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05
ot-daemon[12463]: Thread version: 4
ot-daemon[12463]: Thread interface: wpan0
ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10

Để cửa sổ dòng lệnh này mở để có thể xem nhật ký từ ot-daemon.

Sử dụng ot-ctl để giao tiếp với nút RCP. ot-ctl sử dụng cùng CLI với ứng dụng OpenThread CLI. Do đó, bạn có thể điều khiển các nút ot-daemon theo cách tương tự như các thiết bị Thread mô phỏng khác.

Trong cửa sổ dòng lệnh thứ hai, hãy khởi động ot-ctl:

$ sudo ./build/posix/src/posix/ot-ctl
>

Kiểm tra state của Nút 2 (nút RCP) mà bạn đã bắt đầu bằng ot-daemon:

> state
disabled
Done

5. Thiết lập FTD

Hai nút Thread khác được sử dụng trong lớp học lập trình này là Thiết bị luồng đầy đủ (FTD) trên thiết kế Hệ thống trên chip (SoC) tiêu chuẩn. Trong chế độ cài đặt Phát hành công khai, bạn có thể sử dụng wpantund, trình điều khiển giao diện mạng cấp sản xuất, để điều khiển các thực thể OpenThread NCP. Tuy nhiên, trong lớp học lập trình này, chúng ta sẽ sử dụng ot-ctl, OpenThread CLI.

Một thiết bị có vai trò là Uỷ viên, để xác thực và cài đặt các thiết bị trong mạng đó một cách an toàn. Thiết bị còn lại hoạt động như một Joiner mà Commissioner có thể xác thực với mạng Thread.

Tạo và cài đặt ROM

Xây dựng ví dụ về OpenThread FTD cho nền tảng nRF52840, với các vai trò Commissioner (Uỷ viên) và Joiner (Tham gia) được bật:

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

Chuyển đến thư mục có tệp nhị phân OpenThread Full Thread Device (FTD) CLI, rồi chuyển đổi sang định dạng hex:

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex

Gắn cáp USB vào cổng Micro-USB bên cạnh chân cắm nguồn bên ngoài trên bảng nRF52840, sau đó cắm vào máy Linux. Nếu RCP vẫn được gắn vào máy Linux, bo mạch mới này sẽ xuất hiện dưới dạng cổng nối tiếp /dev/ttyACM1 (tất cả bo mạch nRF52840 đều sử dụng ttyACM làm giá trị nhận dạng cổng nối tiếp).

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1

Như trước đây, hãy lưu ý số sê-ri của bảng nRF52840 đang được dùng cho FTD:

c00d519ebec7e5f0.jpeg

Điều hướng đến vị trí của Công cụ dòng lệnh nRFx và cài đặt tệp hex OpenThread CLI FTD lên bảng nRF52840, sử dụng số sê-ri của bảng:

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset

Gắn nhãn bảng là "Uỷ viên".

Kết nối với USB gốc

Vì bản dựng OpenThread FTD cho phép sử dụng ACM USB CDC gốc làm phương tiện truyền tải nối tiếp, nên bạn phải sử dụng cổng nRF USB trên bảng nRF52840 để giao tiếp với máy chủ RCP (máy Linux).

Tháo đầu Micro-USB của cáp USB khỏi cổng gỡ lỗi của bảng nRF52840 đã được nhấp nháy, sau đó gắn lại vào cổng nRF USB Micro-USB ở bên cạnh nút reset (Đặt lại). Đặt công tắc Nguồn điện nRF thành USB.

46e7b670d2464842.pngS

Xác minh bản dựng

Xác minh một bản dựng thành công bằng cách truy cập vào OpenThread CLI bằng GNU Screen từ cửa sổ dòng lệnh. Các bo mạch nRF52840 sử dụng tốc độ baud là 115200.

$ screen /dev/ttyACM1 115200

Trong cửa sổ mới, hãy nhấn Return trên bàn phím vài lần để hiện lời nhắc OpenThread CLI >. Hiển thị giao diện IPv6 và kiểm tra địa chỉ:

> ifconfig up
Done
> ipaddr
fe80:0:0:0:1cd6:87a9:cb9d:4b1d
Done

Nhấn tổ hợp phím Ctrl+a →

d tháo khỏi màn hình FTD Commissioner CLI (CLI của Ủy viên FTD) và quay lại cửa sổ dòng lệnh Linux để bảng tiếp theo có thể nhấp nháy. Để nhập lại CLI bất cứ lúc nào, hãy sử dụng screen -r từ dòng lệnh. Để xem danh sách màn hình có sẵn, hãy sử dụng screen -ls:

$ screen -ls
There is a screen on:
        74182.ttys000.mylinuxmachine        (Detached)
1 Socket in /tmp/uscreens/S-username.

Thiết lập Trình tham gia FTD

Lặp lại quy trình trên để cài đặt ROM bảng nRF52840 thứ ba bằng bản dựng ot-cli-ftd.hex hiện có. Khi hoàn tất, hãy nhớ kết nối lại bo mạch với máy tính bằng cổng USB nRF và đặt công tắc nguồn điện nRF thành VDD.

Nếu hai nút còn lại được gắn vào máy Linux khi bảng thứ ba được gắn, bảng thứ ba sẽ xuất hiện dưới dạng cổng nối tiếp /dev/ttyACM2:

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1  /dev/ttyACM2

Gắn nhãn bảng là "Joiner" (Tham gia).

Khi xác minh bằng Màn hình, thay vì tạo một phiên bản mới của Màn hình từ dòng lệnh, hãy đính kèm lại vào phiên bản hiện có và tạo một cửa sổ mới bên trong (cửa sổ mà bạn đã sử dụng cho FTD Commissioner):

$ screen -r

Tạo cửa sổ mới trong Màn hình bằng tổ hợp phím Ctrl+a → c.

Một dòng lệnh mới sẽ xuất hiện. Truy cập vào OpenThread CLI dành cho Trình kết hợp FTD:

$ screen /dev/ttyACM2 115200

Trong cửa sổ mới này, hãy nhấn Return trên bàn phím vài lần để hiện lời nhắc OpenThread CLI >. Hiển thị giao diện IPv6 và kiểm tra địa chỉ:

> ifconfig up
Done
> ipaddr
fe80:0:0:0:6c1e:87a2:df05:c240
Done

Giờ đây, FTD Joiner CLI nằm trong cùng một phiên bản Màn hình với FTD Commissioner (Uỷ viên FTD) nên bạn có thể chuyển đổi giữa các thành phần này bằng cách sử dụng Ctrl+a → n.

Nhấn tổ hợp phím Ctrl+a →

d bất cứ lúc nào để thoát khỏi Màn hình.

6. Thiết lập cửa sổ dòng lệnh

Từ nay trở đi, bạn sẽ thường xuyên chuyển đổi giữa các thiết bị Thread. Vì vậy, hãy đảm bảo tất cả các thiết bị đó đều đang hoạt động và dễ truy cập. Cho đến nay, chúng ta đã sử dụng Màn hình để truy cập vào 2 FTD và công cụ này cũng cho phép chia đôi màn hình trên cùng một cửa sổ dòng lệnh. Sử dụng thông tin này để xem cách một nút phản ứng với các lệnh được phát hành trên một nút khác.

Tốt nhất là bạn nên có sẵn bốn cửa sổ:

  1. ot-daemon dịch vụ / nhật ký
  2. Tham gia RCP thông qua ot-ctl
  3. Ủy viên FTD thông qua OpenThread CLI
  4. FTD Joiner qua OpenThread CLI

Nếu bạn muốn sử dụng công cụ hoặc cấu hình thiết bị đầu cuối / cổng nối tiếp của riêng mình, vui lòng chuyển sang bước tiếp theo. Định cấu hình cửa sổ dòng lệnh cho tất cả thiết bị sao cho phù hợp nhất với bạn.

Sử dụng màn hình

Để dễ sử dụng, hãy chỉ bắt đầu một phiên Screen. Bạn đã có một tài khoản Google Ads khi thiết lập cả hai FTD.

Tất cả các lệnh trong Màn hình đều bắt đầu bằng tổ hợp phím Ctrl+a.

Các lệnh trên Màn hình cơ bản:

Đính kèm lại vào phiên Màn hình (từ dòng lệnh)

screen -r

Rời khỏi phiên Màn hình

Ctrl+a → d

Tạo cửa sổ mới trong phiên Screen

Ctrl+a → c

Chuyển đổi giữa các cửa sổ trong cùng một phiên Màn hình

Ctrl+a → n (tiến)Ctrl+a → p (quay lại)

Tắt cửa sổ hiện tại trong phiên Screen

Ctrl+a → k

Chia đôi màn hình

Với Màn hình, bạn có thể chia thiết bị đầu cuối thành nhiều cửa sổ:

f1cbf1258cf0a5a.png

Bạn có thể sử dụng các lệnh trong screen bằng cách nhấn tổ hợp phím Ctrl+a. Mọi lệnh nên bắt đầu với tổ hợp khoá truy cập này.

Nếu đã theo dõi chính xác lớp học lập trình này, bạn sẽ có hai cửa sổ (FTD Commissioner, FTD Joiner) trên cùng một phiên bản Screen. Để chia đôi màn hình giữa hai chế độ này, trước tiên, hãy nhập phiên truy cập Màn hình hiện tại của bạn:

$ screen -r

Bạn phải đang sử dụng một trong các thiết bị FTD. Làm theo các bước sau trong Màn hình:

  1. Ctrl+a → S để chia cửa sổ theo chiều ngang
  2. Ctrl+a → Tab để di chuyển con trỏ đến cửa sổ trống mới
  3. Ctrl+a → n để chuyển cửa sổ mới đó sang cửa sổ tiếp theo
  4. Nếu giống với cửa sổ trên cùng, hãy nhấn tổ hợp phím Ctrl+a → n một lần nữa để xem thiết bị FTD khác

Giờ đây, cả hai đều hiển thị. Chuyển đổi giữa các chế độ đó bằng cách nhấn tổ hợp phím Ctrl+a → Tab. Bạn nên đặt lại tiêu đề cho từng cửa sổ bằng cách nhấn tổ hợp phím Ctrl+a → A để tránh nhầm lẫn.

Cách sử dụng nâng cao

Để chia màn hình thành các góc phần tư hơn nữa và xem nhật ký ot-daemon cũng như Trình kết hợp RCP ot-ctl, các dịch vụ đó phải được bắt đầu trong cùng một thực thể Màn hình này. Để thực hiện việc này, hãy dừng ot-daemon và thoát khỏi ot-ctl, sau đó khởi động lại các ứng dụng này trong cửa sổ Màn hình mới (Ctrl+a → c).

Quy trình thiết lập này là không bắt buộc và chỉ để người dùng thực hiện một bài tập.

Chia tách và điều hướng giữa các cửa sổ bằng các lệnh sau:

Tạo cửa sổ mới

Ctrl+a → c

Chia cửa sổ theo chiều dọc

Ctrl+a →

Chia cửa sổ theo chiều ngang

Ctrl+a → S

Chuyển đến cửa sổ hiển thị tiếp theo

Ctrl+a → Tab

Chuyển cửa sổ hiển thị về phía trước hoặc phía sau

Ctrl+a → n hoặc p

Đổi tên cửa sổ hiện tại

Ctrl+a → A

Thoát khỏi Màn hình bất cứ lúc nào bằng cách nhấn tổ hợp phím Ctrl+a → d rồi đính kèm lại bằng screen -r qua dòng lệnh.

Để biết thêm thông tin về Màn hình, hãy xem phần Tài liệu tham khảo nhanh về Màn hình GNU.

7. Tạo mạng Thread

Giờ đây, bạn đã định cấu hình xong tất cả các màn hình và cửa sổ dòng lệnh, hãy tạo mạng Thread của chúng ta. Trên FTD Commissioner (Uỷ viên FTD), hãy tạo một Tập dữ liệu hoạt động mới và cam kết tập đó là tập dữ liệu đang hoạt động. Tập dữ liệu hoạt động là cấu hình cho mạng Thread mà bạn đang tạo.

## FTD Commissioner ##
----------------------

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 11
Channel Mask: 07fff800
Ext PAN ID: c0de7ab5c0de7ab5
Mesh Local Prefix: fdc0:de7a:b5c0/64
Network Key: 1234c0de7ab51234c0de7ab51234c0de
Network Name: OpenThread-c0de
PAN ID: 0xc0de
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

Ghi lại Khoá mạng 1234c0de7ab51234c0de7ab51234c0de để dùng sau này.

Xác nhận tập dữ liệu này là tập dữ liệu đang hoạt động:

> dataset commit active
Done

Hiển thị giao diện IPv6:

> ifconfig up
Done

Bắt đầu thao tác với giao thức Thread:

> thread start
Done

Sau giây lát, hãy kiểm tra trạng thái thiết bị. Người đó phải là Người lãnh đạo. Ngoài ra, hãy tải rlOC16 để tham khảo sau này.

## FTD Commissioner ##
----------------------

> state
leader
Done
> rloc16
0c00
Done

Kiểm tra địa chỉ IPv6 của thiết bị:

## FTD Commissioner ##
----------------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:c00         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:6394:5a75:a1ad:e5a    # Mesh-Local EID (ML-EID)
fe80:0:0:0:1cd6:87a9:cb9d:4b1d         # Link-Local Address (LLA)

"Lớp học lập trình" mạng hiện hiển thị khi được quét từ các thiết bị Thread khác.

Từ ot-ctl trên Chương trình tham gia RCP:

## RCP Joiner ##
----------------

> scan
| PAN  | MAC Address      | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |

Từ OpenThread CLI trên FTD Joiner:

## FTD Joiner ##
----------------

> scan
| PAN  | MAC Address      | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

Nếu "lớp học lập trình" không xuất hiện trong danh sách, hãy thử quét lại.

8. Thêm trình tham gia RCP

Tính năng Uỷ quyền Thread không hoạt động trên mạng, nghĩa là chúng ta cần thêm RCP Joiner vào mạng Thread mà chúng ta vừa tạo bằng quy trình uỷ quyền ngoài băng tần.

Chúng tôi đã ghi lại Khoá mạng, ví dụ như 1234c0de7ab51234c0de7ab51234c0de, trong FTD Commissioner (Uỷ viên FTD). Nếu bạn cần tra cứu lại Khoá mạng, hãy chạy lệnh sau trên FTD Commissioner (Uỷ viên FTD):

## FTD Commissioner ##

> dataset networkkey
1234c0de7ab51234c0de7ab51234c0de
Done

Tiếp theo, trên RCP Joiner, đặt Khoá mạng của bộ dữ liệu đang hoạt động thành Khoá mạng FTD Commissioner:

## RCP Joiner ##
----------------

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

Kiểm tra tập dữ liệu để đảm bảo tập dữ liệu được thiết lập chính xác.

## RCP Joiner ##
----------------

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

Hiển thị Thread để tham gia RCP tham gia "lớp học lập trình" mạng. Đợi vài giây, kiểm tra trạng thái, rlOC16 và địa chỉ IPv6 của nó:

## RCP Joiner ##
----------------

> ifconfig up
Done
> thread start
Done
> state
child
Done
> rloc16
0c01
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:0c01         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f    # Mesh-Local EID (ML-EID)
fe80:0:0:0:18e5:29b3:a638:943b          # Link-Local Address (LLA)
Done

Ghi lại Địa chỉ IPv6 Mesh-Local (fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f tại đây), bạn sẽ sử dụng sau.

Hãy quay lại FTD Commissioner (Uỷ viên FTD), kiểm tra bộ định tuyến và bảng con để xác nhận cả hai thiết bị thuộc cùng một mạng. Sử dụng rlOC16 để xác định Trình kết hợp RCP.

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  35 | 1ed687a9cb9d4b1d |

Done
> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|VER| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+---+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|  2| 1ae529b3a638943b |
Done

Ping địa chỉ lưới cục bộ của Trình kết hợp RCP (địa chỉ Mesh-Local nhận được từ đầu ra ipaddr của Trình tham gia RCP) để xác minh kết nối:

## FTD Commissioner ##
----------------------

> ping fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
> 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=1 hlim=64 time=40ms

Chúng ta hiện có một mạng Thread bao gồm 2 nút, được minh hoạ bằng sơ đồ cấu trúc liên kết sau:

otcodelab_top01C_2nodes.png

Sơ đồ cấu trúc liên kết

Khi bạn thực hiện phần còn lại của lớp học lập trình này, chúng ta sẽ hiển thị một sơ đồ cấu trúc liên kết Thread mới bất cứ khi nào trạng thái mạng thay đổi. Vai trò của nút được biểu thị như sau:

b75a527be4563215.png

Bộ định tuyến luôn là hình ngũ giác và Thiết bị cuối luôn là hình tròn. Các số trên mỗi nút đại diện cho Mã bộ định tuyến hoặc Mã nhận dạng con hiển thị trong đầu ra CLI, tuỳ thuộc vào vai trò và trạng thái hiện tại của mỗi nút tại thời điểm đó.

9. Ủy quyền cho Người tham gia FTD

Bây giờ, hãy thêm thiết bị Thread thứ ba vào "lớp học lập trình" mạng. Lần này, chúng ta sẽ sử dụng quy trình uỷ quyền trong băng tần an toàn hơn và chỉ cho phép FTD Joiner tham gia.

Trên FTD Joiner, hãy lấy eui64 để FTD Commissioner có thể xác định:

## FTD Joiner ##
----------------

> eui64
2f57d222545271f1
Done

Trên FTD Commissioner (Uỷ viên FTD), hãy khởi động uỷ viên và chỉ định eui64 của thiết bị có thể tham gia, cùng với Thông tin đăng nhập của người tham gia, ví dụ: J01NME. Chứng chỉ Tham gia là một chuỗi dành riêng cho thiết bị gồm tất cả các ký tự chữ và số viết hoa (0-9 và A-Y, ngoại trừ I, O, Q và Z để dễ đọc), với độ dài từ 6 đến 32 ký tự.

## FTD Commissioner ##
----------------------

> commissioner start
Done
> commissioner joiner add 2f57d222545271f1 J01NME
Done

Chuyển sang Trình kết hợp FTD. Bắt đầu vai trò người tham gia bằng Chứng chỉ người tham gia mà bạn vừa thiết lập cho Ủy viên FTD:

## FTD Joiner ##
----------------

> ifconfig up
Done
> joiner start J01NME
Done

Trong vòng một phút, bạn sẽ nhận được thông báo xác nhận xác thực thành công:

## FTD Joiner ##
----------------

>
Join success

Hiển thị Thread để Tham gia FTD tham gia "lớp học lập trình" mạng và ngay lập tức kiểm tra trạng thái và rlOC16:

## FTD Joiner ##
----------------

> thread start
Done
> state
child
Done
> rloc16
0c02
Done

Hãy kiểm tra địa chỉ IPv6 của thiết bị. Lưu ý rằng không có ALOC. Lý do là thiết bị này không phải là Thủ lĩnh và cũng không có vai trò dành riêng cho Anycast mà cần có ALOC.

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:c02         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)

Chuyển ngay sang FTD Commissioner (Uỷ viên FTD) rồi kiểm tra bộ định tuyến và bảng con để xác nhận rằng có 3 thiết bị trong "lớp học lập trình" mạng:

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   2 | 0x0c02 |        240 |         15 |     3 |   44 |1|1|1|1| e6cdd2d93249a243 |
Done

Dựa trên rlOC16, FTD Joiner đã kết nối vào mạng như một Thiết bị cuối (con). Sau đây là cấu trúc liên kết mới được cập nhật:

otcodelab_top01C_ed01.png

10. Luồng trong thực tế

Thiết bị Thread trong lớp học lập trình này là một loại thiết bị Full Thread (FTD) cụ thể được gọi là Thiết bị đầu đủ điều kiện cho bộ định tuyến (REED). Điều này có nghĩa là các thiết bị này có thể hoạt động như một Bộ định tuyến hoặc Thiết bị cuối và có thể tự quảng bá từ một Thiết bị cuối đến Bộ định tuyến.

Thread có thể hỗ trợ tối đa 32 Bộ định tuyến, nhưng cố gắng giữ số lượng Bộ định tuyến trong khoảng từ 16 đến 23. Nếu REED đính kèm dưới dạng một Thiết bị cuối (con) và số Bộ định tuyến nhỏ hơn 16, thì sau một khoảng thời gian ngẫu nhiên trong vòng 2 phút, nó sẽ tự động chuyển thành Bộ định tuyến.

Nếu bạn có hai con trong mạng Thread sau khi thêm FTD Joiner, hãy đợi ít nhất 2 phút, sau đó kiểm tra lại bộ định tuyến và bảng con trên FTD Commissioner (Uỷ viên FTD):

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
Done

FTD Joiner (Extended MAC = e6cdd2d93249a243) tự quảng bá lên một Bộ định tuyến. Xin lưu ý rằng rlOC16 khác (b800 thay vì 0c02). Đó là vì BLEOC16 dựa trên Mã bộ định tuyến và Mã nhận dạng con của thiết bị. Khi chuyển đổi từ Thiết bị cuối sang Bộ định tuyến, các giá trị ID bộ định tuyến và ID con sẽ thay đổi, và rlOC16 cũng thay đổi.

otcodelab_top01C.png

Xác nhận trạng thái mới và rlOC16 trên FTD Joiner:

## FTD Joiner ##
----------------

> state
router
Done
> rloc16
b800
Done

Hạ cấp Trình tham gia FTD

Bạn có thể kiểm tra hành vi này bằng cách hạ cấp FTD Joiner từ Bộ định tuyến xuống Thiết bị cuối theo cách thủ công. Thay đổi trạng thái thành con và kiểm tra rlOC16:

## FTD Joiner ##
----------------

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

Trở lại với FTD Commissioner (Uỷ viên FTD), giờ đây, FTD Joiner sẽ xuất hiện trong bảng con (mã nhận dạng = 3). Thậm chí có thể xảy ra ở cả hai trong khi chuyển đổi:

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   3 | 0x0c03 |        240 |         16 |     3 |   94 |1|1|1|1| e6cdd2d93249a243 |
Done

Sau một thời gian, thiết bị này sẽ chuyển về Bộ định tuyến có rlOC là b800.

otcodelab_top01C.png

Xoá Người lãnh đạo

Người lãnh đạo tự chọn trong số tất cả các Bộ định tuyến luồng. Điều này có nghĩa là nếu Trưởng nhóm hiện tại bị xoá khỏi mạng Thread, một trong các Bộ định tuyến khác sẽ trở thành Trưởng nhóm mới.

Trên FTD Commissioner (Uỷ viên FTD), hãy tắt Thread để xoá Thread khỏi mạng Thread:

## FTD Commissioner ##
----------------------

> thread stop
Done
> ifconfig down
Done

Trong vòng hai phút, FTD Joiner trở thành trưởng nhóm mới của Thread. Kiểm tra trạng thái và địa chỉ IPv6 của Trình kết hợp FTD để xác minh:

## FTD Joiner ##
----------------

> state
leader
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00       # Now it has the Leader ALOC!
fdc0:de7a:b5c0:0:0:ff:fe00:b800
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd
fe80:0:0:0:e4cd:d2d9:3249:a243
Done

otcodelab_top02C_01.png

Kiểm tra bảng con. Lưu ý rằng có một rlOC16 mới. Đây là Trình tham gia RCP, được biểu thị bằng mã nhận dạng và MAC mở rộng. Để duy trì mạng Thread, ứng dụng này đã chuyển đổi các Bộ định tuyến mẹ, từ FTD Commissioner (Uỷ viên FTD) sang FTD Joiner. Điều này dẫn đến rlOC16 mới cho RCP Joiner (vì ID bộ định tuyến của nó đã thay đổi, từ 3 thành 46).

## FTD Joiner ##
----------------

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |         27 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

Bạn có thể phải đợi vài phút để RCP Joiner đính kèm vào FTD Joiner ở dạng con. Hãy kiểm tra trạng thái và rlOC16 để xác nhận rằng:

## RCP Joiner ##
--------------

> state
child
> rloc16
b801

Đính kèm lại Ủy viên FTD

Mạng Thread có 2 nút không thú vị lắm. Hãy đưa Ủy viên FTD trở lại hoạt động trực tuyến.

Trên FTD Commissioner (Uỷ viên FTD), hãy khởi động lại Thread:

## FTD Commissioner ##
----------------------

> ifconfig up
Done
> thread start
Done

Trong vòng 2 phút, công cụ này sẽ tự động được đính kèm lại vào "lớp học lập trình" mạng dưới dạng Thiết bị cuối, sau đó tự quảng bá là Bộ định tuyến.

## FTD Commissioner ##
----------------------

> state
router
Done

Kiểm tra bộ định tuyến và bảng con trên FTD Joiner để xác minh:

## FTD Joiner ##
----------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |       63 |         0 |     3 |      3 |   0 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       46 |         0 |     0 |      0 |  15 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |        184 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

otcodelab_top02C_02.png

Mạng Thread của chúng tôi lại bao gồm 3 nút.

11. Khắc phục sự cố

Việc quản lý một mạng Thread có nhiều thiết bị trên nhiều thiết bị đầu cuối hoặc cửa sổ Screen có thể phức tạp. Sử dụng các mẹo sau để "đặt lại" trạng thái mạng hoặc không gian làm việc của bạn nếu bạn gặp phải sự cố.

Màn hình

Nếu bạn bị mất cấu hình (quá nhiều cửa sổ Màn hình hoặc Màn hình trong Màn hình), hãy tiếp tục tắt các cửa sổ Màn hình bằng Ctrl+a → k cho đến khi không có cửa sổ nào và screen -ls trên dòng lệnh sẽ xuất ra No Sockets found. Sau đó, hãy tạo lại Cửa sổ màn hình cho từng thiết bị. Trạng thái thiết bị được giữ lại ngay cả khi Màn hình bị tắt.

Nút luồng

Nếu cấu trúc liên kết mạng Thread không như mô tả trong Lớp học lập trình này hoặc các nút bị ngắt kết nối vì lý do nào đó (có thể do máy Linux cung cấp năng lượng cho chúng đã chuyển sang chế độ ngủ), thì tốt nhất bạn nên gỡ Thread xuống, xoá thông tin đăng nhập mạng rồi bắt đầu lại từ bước Tạo mạng Thread.

Cách đặt lại FTD:

## FTD Commissioner or FTD Joiner ##
------------------------------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

Bạn có thể đặt lại RCP theo cách tương tự thông qua ot-ctl:

## RCP Joiner ##
----------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

12. Sử dụng chế độ phát đa hướng

Phát đa hướng được dùng để truyền thông tin đến một nhóm thiết bị cùng một lúc. Trong mạng Thread, các địa chỉ cụ thể được dành riêng để sử dụng đa hướng với các nhóm thiết bị khác nhau, tuỳ thuộc vào phạm vi.

Địa chỉ IPv6

Phạm vi

Đã giao đến

ff02::1

Đường liên kết cục bộ

Tất cả FTD và MED

ff02::2

Đường liên kết cục bộ

Tất cả FTD và Bộ định tuyến biên

ff03::1

Mạng cục bộ

Tất cả FTD và MED

ff03::2

Mạng cục bộ

Tất cả FTD và Bộ định tuyến biên

Vì không sử dụng Bộ định tuyến biên trong lớp học lập trình này, nên chúng ta sẽ tập trung vào 2 địa chỉ đa hướng FTD và MED.

Phạm vi Link-Local bao gồm tất cả giao diện Thread có thể tiếp cận được bằng một đường truyền vô tuyến hoặc một "hop" duy nhất. Cấu trúc liên kết mạng cho biết thiết bị nào phản hồi lệnh ping đến địa chỉ đa hướng ff02::1.

Ping ff02::1 từ Uỷ viên FTD:

## FTD Commissioner ##
----------------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:e4cd:d2d9:3249:a243: icmp_seq=2 hlim=64 time=9ms

Có hai thiết bị khác trong mạng (FTD Joiner và RCP Joiner), nhưng FTD Commissioner chỉ nhận được một phản hồi từ FTD Joiner's Link-Local Address (LLA). Điều này có nghĩa là FTD Joiner là thiết bị duy nhất mà FTD Commissioner có thể tiếp cận chỉ bằng một bước nhảy.

otcodelab_top02C_02_LL.png

Hiện đang ping ff02::1 từ FTD Joiner:

## FTD Joiner ##
----------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:1cd6:87a9:cb9d:4b1d: icmp_seq=1 hlim=64 time=11ms
8 bytes from fe80:0:0:0:18e5:29b3:a638:943b: icmp_seq=1 hlim=64 time=24ms

Có hai câu trả lời! Kiểm tra địa chỉ IPv6 cho các thiết bị khác, chúng ta có thể thấy địa chỉ đầu tiên (kết thúc bằng 4b1d) là LLA của Uỷ viên FTD và địa chỉ thứ hai (kết thúc bằng 943b) là LLA của Người tham gia RCP.

otcodelab_top02C_02_LL02.png

Tức là Trình tham gia FTD được kết nối trực tiếp với cả Uỷ viên FTD và Tham gia RCP, qua đó xác nhận cấu trúc liên kết của chúng tôi.

Mạng cục bộ

Phạm vi Mesh-Local bao gồm tất cả giao diện Thread có thể truy cập được trong cùng một mạng Thread. Hãy xem phản hồi cho lệnh ping đến địa chỉ đa hướng ff03::1.

Ping ff03::1 từ Uỷ viên FTD:

## FTD Commissioner ##
----------------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:b800: icmp_seq=3 hlim=64 time=9ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=3 hlim=64 time=68ms

Lần này, Uỷ viên FTD nhận được 2 phản hồi, một từ Bộ định tuyến định tuyến của FTD Joiner (rlOC, kết thúc bằng b800) và một từ EID lưới-cục bộ của RCP (ML-EID, kết thúc bằng d55f). Đó là vì phạm vi lưới cục bộ bao gồm toàn bộ mạng Thread. Bất kể một thiết bị ở đâu trong mạng, thiết bị đó sẽ được đăng ký với địa chỉ ff03::1.

otcodelab_top02C_02_ML.png

Ping ff03::1 từ Trình kết hợp FTD để xác nhận hành vi tương tự:

## FTD Joiner ##
----------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00: icmp_seq=2 hlim=64 time=11ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=2 hlim=64 time=23ms

otcodelab_top02C_02_LL02.png

Hãy ghi lại thời gian phản hồi cho Trình kết hợp RCP trong cả hai đầu ra ping. RCP Joiner mất nhiều thời gian hơn để liên hệ với FTD Commissioner (68 mili giây) so với FTD Joiner (23 mili giây). Đó là vì nó phải thực hiện hai bước để liên hệ với Ủy viên FTD, so với một bước của FTD Joiner.

Bạn cũng có thể nhận thấy rằng ping đa hướng cục bộ trên lưới chỉ phản hồi bằng rlOC cho hai FTD – chứ không phải RCP Joiner. Điều này là do FTD là Bộ định tuyến trong mạng, trong khi RCP là Thiết bị cuối.

Kiểm tra trạng thái của Trình tham gia RCP để xác nhận:

## RCP Joiner ##
----------------

> state
child

13. Gửi thông báo bằng UDP

Một trong những dịch vụ ứng dụng mà OpenThread cung cấp là Giao thức gói dữ liệu người dùng (UDP), một giao thức Tầng truyền tải. Ứng dụng được xây dựng trên OpenThread có thể sử dụng UDP API để truyền thông báo giữa các nút trong mạng Thread hoặc tới các thiết bị khác trong mạng bên ngoài (chẳng hạn như Internet, nếu mạng Thread có tính năng Bộ định tuyến biên).

Cổng UDP được hiển thị thông qua CLI OpenThread. Hãy sử dụng công cụ này để truyền thông báo giữa hai FTD.

Lấy địa chỉ EID Mesh-Local cho FTD Joiner. Chúng tôi đang dùng địa chỉ này vì bạn có thể truy cập vào địa chỉ này từ bất cứ đâu trong mạng Thread.

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:b800        # Routing Locator (RLOC)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
Done

Khởi động UDP và liên kết UDP với một ổ cắm cho bất kỳ địa chỉ IPv6 nào:

## FTD Joiner ##
----------------

> udp open
Done
> udp bind :: 1212

Chuyển sang FTD Commissioner (Trình uỷ quyền FTD), khởi động UDP và kết nối với cổng mà bạn thiết lập trên FTD Joiner bằng ML-EID của nó:

## FTD Commissioner ##
----------------------

> udp open
Done
> udp connect fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd 1212
Done

Kết nối UDP phải đang hoạt động giữa 2 nút. Gửi tin nhắn từ Ủy viên FTD:

## FTD Commissioner ##
----------------------

> udp send hellothere
Done

Trên FTD Joiner, thông báo UDP đã được nhận!

## FTD Joiner ##
----------------

> 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere

14. Xin chúc mừng!

Bạn đã tạo một mạng Thread thực!

b915c433e7027cc7.png

Giờ đây, bạn đã biết:

  • sự khác biệt giữa loại thiết bị Thread, vai trò và phạm vi
  • cách thiết bị Thread quản lý trạng thái trong mạng
  • cách truyền thông báo đơn giản giữa các nút bằng UDP

Các bước tiếp theo

Dựa trên lớp học lập trình này, hãy thử thực hiện các bài tập sau:

  • Cập nhật lại bảng Tham gia FTD dưới dạng MTD bằng cách sử dụng tệp nhị phân ot-cli-mtd và quan sát thấy rằng nó không bao giờ tự nâng cấp lên Bộ định tuyến hoặc cố gắng trở thành Người lãnh đạo
  • Thêm các thiết bị khác (thử một nền tảng khác!) vào mạng và phác thảo cấu trúc liên kết bằng cách sử dụng bộ định tuyến và bảng con, cùng với ping đến các địa chỉ đa hướng
  • Sử dụng pyspinel để kiểm soát NCP
  • Chuyển đổi NCP thành Bộ định tuyến biên bằng Bộ định tuyến đường viền OpenThread và kết nối mạng Thread với Internet

Tài liệu đọc thêm

Hãy tham khảo openthread.ioGitHub để xem nhiều tài nguyên OpenThread, bao gồm:

Tham khảo: