1. Giới thiệu

OpenThread do Google phát hành là một cách triển khai nguồn mở của giao thức mạng Thread. Google Nest đã phát hành OpenThread để cung cấp rộng rãi công nghệ được dùng trong các sản phẩm của Nest cho nhà phát triển nhằm đẩy nhanh quá trình phát triển sản phẩm cho nhà thông minh.
Quy cách Thread xác định một giao thức giao tiếp không dây đáng tin cậy, an toàn và tiêu thụ ít điện năng giữa các thiết bị dựa trên IPv6 cho các ứng dụng gia đình. OpenThread triển khai tất cả các lớp mạng Thread, bao gồm IPv6, 6LoWPAN, IEEE 802.15.4 có tính năng bảo mật MAC, Thiết lập liên kết mạng và Định tuyến mạng.
Lớp học lập trình này hướng dẫn bạn mô phỏng một mạng Thread trên các thiết bị mô phỏng.
Kiến thức bạn sẽ học được
- Cách thiết lập chuỗi công cụ bản dựng OpenThread
- Cách mô phỏng mạng Thread
- Cách xác thực các nút Thread
- Cách quản lý mạng Thread bằng OpenThread Daemon
Bạn cần có
- git
- Kiến thức cơ bản về Linux, định tuyến mạng
2. Thiết lập hệ thống xây dựng
Git
Bạn cần có Git để hoàn tất Lớp học lập trình này. Hãy tải và cài đặt ứng dụng này trước khi tiếp tục.
Sau khi cài đặt, hãy làm theo hướng dẫn dành cho hệ điều hành cụ thể của bạn để tải xuống và tạo OpenThread.
XCode cho Mac OS X
Bạn cần có XCode để cài đặt và tạo OpenThread trên Mac OS X.
Sau khi cài đặt XCode, hãy cài đặt Công cụ dòng lệnh XCode:
$ xcode-select --install
Tạo trên Linux / Mac OS X
Chúng tôi đã thử nghiệm các hướng dẫn cài đặt này trên Ubuntu Server 14.04 LTS và Mac OS X Sierra 10.12.6.
Cài đặt OpenThread. Các lệnh bootstrap đảm bảo rằng chuỗi công cụ được cài đặt và môi trường được định cấu hình đúng cách:
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap
Sử dụng Windows
Nếu muốn dùng Windows, bạn nên thử phiên bản Docker của Lớp học lập trình này.
3. Tạo các ứng dụng OpenThread
Sau khi cài đặt xong, hãy tạo ứng dụng OpenThread mẫu. Trong Lớp học lập trình này, chúng ta sẽ sử dụng ví dụ mô phỏng.
$ cd ~/src/openthread $ ./script/cmake-build simulation
Bây giờ, hãy tạo OpenThread Daemon:
$ ./script/cmake-build posix -DOT_DAEMON=ON
4. Mô phỏng mạng Thread
Ứng dụng mẫu mà bạn sẽ dùng cho Lớp học lập trình này minh hoạ một ứng dụng OpenThread tối thiểu, hiển thị các giao diện quản lý và cấu hình OpenThread thông qua một giao diện dòng lệnh (CLI) cơ bản.
Bài tập này sẽ hướng dẫn bạn thực hiện các bước tối thiểu cần thiết để ping một thiết bị giao thức Thread mô phỏng từ một thiết bị giao thức Thread mô phỏng khác.
Hình dưới đây mô tả một cấu trúc liên kết mạng Thread cơ bản. Trong bài tập này, chúng ta sẽ mô phỏng 2 nút trong vòng tròn màu xanh lục: Trưởng nhóm luồng và Bộ định tuyến luồng với một kết nối duy nhất giữa chúng.

Ping một nút
1. Nút bắt đầu 1
Chuyển đến thư mục openthread và tạo quy trình CLI cho một thiết bị Thread mô phỏng bằng cách sử dụng tệp nhị phân ot-cli-ftd.
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Lưu ý: Nếu bạn không thấy lời nhắc > sau khi chạy lệnh này, hãy nhấn enter.
Tệp nhị phân này triển khai một thiết bị OpenThread được mô phỏng trên POSIX. Trình điều khiển vô tuyến IEEE 802.15.4 được triển khai trên UDP (các khung IEEE 802.15.4 được truyền trong tải trọng UDP).
Đối số của 1 là một chỉ số mô tả tệp biểu thị các bit ít quan trọng nhất của IEEE EUI-64 "do nhà máy chỉ định" cho thiết bị mô phỏng. Giá trị này cũng được dùng khi liên kết với một cổng UDP để mô phỏng đài IEEE 802.15.4 (cổng = 9000 + chỉ số mô tả tệp). Mỗi phiên bản của thiết bị giao thức Thread được mô phỏng trong lớp học lập trình này sẽ sử dụng một chỉ số mô tả tệp khác.
Lưu ý: Chỉ sử dụng bộ mô tả tệp từ 1 trở lên như đã lưu ý trong Lớp học lập trình này khi tạo quy trình cho một thiết bị mô phỏng. Một chỉ số mô tả tệp 0 được dành riêng cho mục đích sử dụng khác.
Tạo một Tập dữ liệu hoạt động mới và xác nhận tập dữ liệu đó 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.
> dataset init new Done > dataset Active Timestamp: 1 Channel: 20 Channel Mask: 07fff800 Ext PAN ID: d6263b6d857647da Mesh Local Prefix: fd61:2344:9a52:ede0/64 Network Key: e4344ca17d1dca2a33f064992f31f786 Network Name: OpenThread-c169 PAN ID: 0xc169 PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4 Security Policy: 0, onrcb Done
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
Mở giao diện IPv6:
> ifconfig up Done
Bắt đầu thao tác giao thức Thread:
> thread start Done
Đợi vài giây và xác minh rằng thiết bị đã trở thành Trưởng nhóm Thread. Leader là thiết bị chịu trách nhiệm quản lý việc chỉ định mã nhận dạng bộ định tuyến.
> state leader Done
Xem địa chỉ IPv6 được chỉ định cho giao diện Thread của Node 1 (đầu ra của bạn sẽ khác):
> ipaddr fd61:2344:9a52:ede0:0:ff:fe00:fc00 fd61:2344:9a52:ede0:0:ff:fe00:5000 fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6 fe80:0:0:0:94da:92ea:1353:4f3b Done
Lưu ý các loại địa chỉ IPv6 cụ thể:
- Bắt đầu bằng
fd= mesh-local - Bắt đầu bằng
fe80= link-local
Các loại địa chỉ cục bộ của mạng lưới được phân loại thêm:
- Chứa
ff:fe00= Router Locator (RLOC) - Không chứa
ff:fe00= Giá trị nhận dạng thiết bị đầu cuối (EID)
Xác định EID trong đầu ra của bảng điều khiển và ghi chú lại để sử dụng sau này. Trong đầu ra mẫu ở trên, EID là:
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. Nút bắt đầu 2
Mở một cửa sổ dòng lệnh mới, chuyển đến thư mục openthread rồi tạo quy trình CLI. Đây là thiết bị Thread mô phỏng thứ hai của bạn:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
Lưu ý: Nếu bạn không thấy lời nhắc > sau khi chạy lệnh này, hãy nhấn enter.
Định cấu hình Khoá mạng và PAN ID của Thread, sử dụng các giá trị giống như Tập dữ liệu hoạt động của Nút 1:
> dataset networkkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
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
Mở giao diện IPv6:
> ifconfig up Done
Bắt đầu thao tác giao thức Thread:
> thread start Done
Thiết bị sẽ tự khởi động dưới dạng một Thiết bị con. Thiết bị con Thread tương đương với Thiết bị đầu cuối, là thiết bị Thread chỉ truyền và nhận lưu lượng truy cập truyền đơn hướng với Thiết bị gốc.
> state child Done
Trong vòng 2 phút, bạn sẽ thấy trạng thái chuyển từ child sang router. Bộ định tuyến Thread có khả năng định tuyến lưu lượng truy cập giữa các thiết bị Thread. Thẻ này còn được gọi là Thẻ mẹ.
> state router Done
Xác minh mạng
Một cách dễ dàng để xác minh mạng lưới là xem bảng định tuyến.
1. Kiểm tra khả năng kết nối
Trên Node 2, hãy lấy RLOC16. RLOC16 là 16 bit cuối cùng của địa chỉ IPv6 RLOC của thiết bị.
> rloc16 5800 Done
Trên Nút 1, hãy kiểm tra bảng định tuyến cho RLOC16 của Nút 2. Đảm bảo rằng Nút 2 đã chuyển sang trạng thái bộ định tuyến trước.
> router table | ID | RLOC16 | Next Hop | Path Cost | LQI In | LQI Out | Age | Extended MAC | +----+--------+----------+----------+-------+---------+-----+------------------+ | 20 | 0x5000 | 63 | 0 | 0 | 0 | 0 | 96da92ea13534f3b | | 22 | 0x5800 | 63 | 0 | 3 | 3 | 23 | 5a4eb647eb6bc66c |
RLOC của nút 1 là 0xa800 có trong bảng, xác nhận rằng nút này đã kết nối với mạng lưới.
2. Ping Node 1 từ Node 2
Xác minh khả năng kết nối giữa hai thiết bị Thread mô phỏng. Trong Nút 2, ping là EID được chỉ định cho Nút 1:
> ping fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6 > 16 bytes from fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6: icmp_seq=1 hlim=64 time=12ms
Nhấn enter để quay lại dấu nhắc > CLI.
Kiểm tra mạng
Giờ đây, bạn có thể ping thành công giữa 2 thiết bị Thread mô phỏng, hãy kiểm thử mạng lưới bằng cách đưa một nút ngoại tuyến.
Quay lại Node 1 và dừng Thread:
> thread stop Done
Chuyển sang Node 2 và kiểm tra trạng thái. Trong vòng 2 phút, Node 2 sẽ phát hiện thấy nút chính (Node 1) đang ở trạng thái ngoại tuyến và bạn sẽ thấy Node 2 chuyển thành leader của mạng:
> state router Done ... > state leader Done
Sau khi xác nhận, hãy dừng Thread và đặt lại Node 2 về trạng thái ban đầu trước khi thoát. Chúng ta thực hiện thao tác đặt lại về trạng thái ban đầu để đảm bảo thông tin đăng nhập mạng giao thức Thread mà chúng ta đã dùng trong bài tập này không được chuyển sang bài tập tiếp theo.
> thread stop Done > factoryreset > > exit
Đồng thời đặt lại về trạng thái ban đầu và thoát khỏi Node 1:
> factoryreset > > exit
Hãy xem Tài liệu tham khảo về OpenThread CLI để khám phá tất cả các lệnh CLI hiện có.
5. Xác thực các nút bằng quy trình Thiết lập
Trong bài tập trước, bạn đã thiết lập một mạng Thread với 2 thiết bị mô phỏng và xác minh khả năng kết nối. Tuy nhiên, điều này chỉ cho phép lưu lượng truy cập cục bộ của đường liên kết IPv6 chưa được xác thực truyền giữa các thiết bị. Để định tuyến lưu lượng truy cập IPv6 toàn cầu giữa các thiết bị (và Internet thông qua bộ định tuyến biên Thread), các nút phải được xác thực.
Để xác thực, một thiết bị phải đóng vai trò là Người uỷ quyền. Commissioner là máy chủ xác thực hiện được chọn cho các thiết bị Thread mới và là người uỷ quyền cung cấp thông tin đăng nhập mạng cần thiết để các thiết bị tham gia mạng.
Trong bài tập này, chúng ta sẽ sử dụng cùng một cấu trúc liên kết gồm 2 nút như trước. Để xác thực, Thread Leader sẽ đóng vai trò là Commissioner, Thread Router sẽ đóng vai trò là Joiner.

1. Tạo mạng
Nếu tiếp tục từ bài tập trước, bạn sẽ có sẵn 2 cửa sổ dòng lệnh đang mở. Nếu không, hãy đảm bảo rằng có 2 cổng đang mở và sẵn sàng sử dụng. Một thiết bị sẽ đóng vai trò là Nút 1, thiết bị còn lại là Nút 2.
Trong Node 1, hãy tạo quy trình CLI:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Lưu ý: Nếu bạn không thấy lời nhắc > sau khi chạy lệnh này, hãy nhấn enter.
Tạo một Tập dữ liệu hoạt động mới, xác nhận tập dữ liệu đó là tập dữ liệu đang hoạt động và bắt đầu Luồng:
> dataset init new Done > dataset Active Timestamp: 1 Channel: 12 Channel Mask: 07fff800 Ext PAN ID: e68d05794bf13052 Mesh Local Prefix: fd7d:ddf7:877b:8756/64 Network Key: a77fe1d03b0e8028a4e13213de38080e Network Name: OpenThread-8f37 PAN ID: 0x8f37 PSKc: f9debbc1532487984b17f92cd55b21fc Security Policy: 0, onrcb Done
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
Mở giao diện IPv6:
> ifconfig up Done
Bắt đầu thao tác giao thức Thread:
> thread start Done
Đợi vài giây và xác minh rằng thiết bị đã trở thành một Thread Leader:
> state leader Done
2. Bắt đầu vai trò Uỷ viên
Khi vẫn ở Node 1, hãy bắt đầu vai trò Commissioner (Uỷ viên):
> commissioner start Done
Cho phép mọi Thiết bị tham gia (bằng cách sử dụng ký tự đại diện *) có Thông tin xác thực Thiết bị tham gia J01NME được đưa vào mạng. Joiner là thiết bị do quản trị viên thêm vào Mạng Thread được uỷ quyền.
> commissioner joiner add * J01NME Done
3. Bắt đầu vai trò Người tham gia
Trong cửa sổ dòng lệnh thứ hai, hãy tạo một quy trình CLI mới. Đây là Nút 2.
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
Trên Nút 2, hãy bật vai trò Joiner (Người tham gia) bằng cách sử dụng J01NME Joiner Credential (Thông tin xác thực của người tham gia).
> ifconfig up Done > joiner start J01NME Done
... đợi vài giây để xác nhận ...
Join success
Là một Thiết bị tham gia, thiết bị (Nút 2) đã xác thực thành công với Uỷ viên (Nút 1) và nhận được thông tin đăng nhập Mạng Thread.
Bây giờ, khi Node 2 đã được xác thực, hãy bắt đầu Thread:
> thread start Done
4. Xác thực việc xác thực mạng
Kiểm tra state trên Nút 2 để xác thực rằng nút này hiện đã tham gia mạng. Trong vòng 2 phút, Node 2 sẽ chuyển từ child sang router:
> state child Done ... > state router Done
5. Đặt lại cấu hình
Để chuẩn bị cho bài tập tiếp theo, hãy đặt lại cấu hình. Trên mỗi nút, hãy dừng Thread, đặt lại về trạng thái ban đầu và thoát khỏi thiết bị Thread mô phỏng:
> thread stop Done > factoryreset > > exit
Bạn có thể phải nhấn enter vài lần để đưa lời nhắc > trở lại sau lệnh factoryreset.
6. Quản lý mạng bằng OpenThread Daemon
Trong bài tập này, chúng ta sẽ mô phỏng một phiên bản CLI (một thiết bị Thread SoC nhúng duy nhất) và một phiên bản Radio Co-Processor (RCP).
ot-daemon là một chế độ của ứng dụng OpenThread Posix, sử dụng một socket UNIX làm đầu vào và đầu ra, nhờ đó lõi OpenThread có thể chạy dưới dạng một dịch vụ. Ứng dụng có thể giao tiếp với dịch vụ này bằng cách kết nối với ổ cắm bằng OpenThread CLI làm giao thức.
ot-ctl là một CLI do ot-daemon cung cấp để quản lý và định cấu hình RCP. Bằng cách này, chúng ta sẽ kết nối RCP với mạng do thiết bị Thread tạo.
Sử dụng ot-daemon
Bài tập này sẽ sử dụng 3 cửa sổ dòng lệnh, tương ứng với những nội dung sau:
- Phiên bản CLI của thiết bị Thread mô phỏng (Nút 1)
- Quy trình
ot-daemon ot-ctlPhiên bản CLI
Nếu tiếp tục từ bài tập trước, bạn sẽ có sẵn 2 cửa sổ dòng lệnh đang mở. Mở cửa sổ thứ ba để đảm bảo bạn có 3 cửa sổ dòng lệnh cho bài tập này.
1. Nút bắt đầu 1
Trong cửa sổ dòng lệnh đầu tiên, hãy tạo quy trình CLI cho thiết bị Thread mô phỏng của bạn:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Lưu ý: Nếu bạn không thấy lời nhắc > sau khi chạy lệnh này, hãy nhấn enter.
Tạo một Tập dữ liệu hoạt động mới, xác nhận tập dữ liệu đó là tập dữ liệu đang hoạt động và bắt đầu Luồng:
> dataset init new Done > dataset Active Timestamp: 1 Channel: 13 Channel Mask: 07fff800 Ext PAN ID: 97d584bcd493b824 Mesh Local Prefix: fd55:cf34:dea5:7994/64 Network Key: ba6e886c7af50598df1115fa07658a83 Network Name: OpenThread-34e4 PAN ID: 0x34e4 PSKc: 38d6fd32c866927a4dfcc06d79ae1192 Security Policy: 0, onrcb Done
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
Mở giao diện IPv6:
> ifconfig up Done
Bắt đầu thao tác giao thức Thread:
> thread start Done
Xem địa chỉ IPv6 được chỉ định cho giao diện Thread của Node 1:
> ipaddr fd55:cf34:dea5:7994:0:ff:fe00:fc00 fd55:cf34:dea5:7994:0:ff:fe00:d000 fd55:cf34:dea5:7994:460:872c:e807:c4ab fe80:0:0:0:9cd8:aab6:482f:4cdc Done >
Như đã giải thích trong bước Mô phỏng mạng Thread, một địa chỉ là link-local (fe80) và 3 địa chỉ là mesh-local (fd). EID là địa chỉ mesh-local không chứa ff:fe00 trong địa chỉ. Trong kết quả mẫu này, EID là fd55:cf34:dea5:7994:460:872c:e807:c4ab.
Xác định EID cụ thể từ đầu ra ipaddr. EID này sẽ được dùng để giao tiếp với nút.
2. Khởi động ot-daemon
Trong cửa sổ dòng lệnh thứ hai, hãy chuyển đến thư mục openthread rồi khởi động ot-daemon cho một nút RCP. Chúng ta sẽ gọi nút này là Nút 2. Sử dụng cờ chi tiết -v để bạn có thể xem đầu ra nhật ký và xác nhận rằng cờ này đang chạy, đồng thời nhớ sử dụng sudo:
$ cd ~/src/openthread
$ sudo ./build/posix/src/posix/ot-daemon -v \
'spinel+hdlc+forkpty://build/simulation/examples/apps/ncp/ot-rcp?forkpty-arg=2'
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ở và chạy ở chế độ nền. Bạn sẽ không nhập thêm bất kỳ lệnh nào vào đó.
3. Sử dụng ot-ctl để tham gia mạng
Chúng tôi chưa uỷ quyền cho Node 2 (RCP ot-daemon) cho bất kỳ mạng Thread nào. Đây là lúc ot-ctl phát huy tác dụng. ot-ctl sử dụng cùng một CLI như ứng dụng OpenThread CLI. Do đó, bạn có thể kiểm soát 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ứ ba, hãy bắt đầu ot-ctl:
$ sudo ./build/posix/src/posix/ot-ctl >
Lưu ý: Nếu bạn không thấy lời nhắc > sau khi chạy lệnh này, hãy nhấn enter.
Bạn sẽ dùng ot-ctl trong cửa sổ dòng lệnh thứ ba này để quản lý Node 2 (nút RCP) mà bạn đã khởi động trong cửa sổ dòng lệnh thứ hai bằng ot-daemon. Kiểm tra state của Node 2:
> state disabled Done
Lấy eui64 của Node 2 để hạn chế chỉ cho phép một Người tham gia cụ thể tham gia:
> eui64 18b4300000000001 Done
Trên Node 1 (cửa sổ dòng lệnh đầu tiên), hãy khởi động Commissioner và chỉ cho phép eui64 đó tham gia:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
Trên Node 2 (cửa sổ dòng lệnh thứ ba), hãy đưa giao diện mạng lên và tham gia mạng:
> ifconfig up Done > joiner start J01NME Done
... đợi vài giây để xác nhận ...
Join success
Là một Thiết bị tham gia, RCP (Nút 2) đã xác thực thành công với Uỷ viên (Nút 1) và nhận được thông tin đăng nhập Mạng Thread.
Bây giờ, hãy kết nối Node 2 với mạng Thread:
> thread start Done
4. Xác thực việc xác thực mạng
Kiểm tra state trên Nút 2 để xác thực rằng nút này hiện đã tham gia mạng. Trong vòng 2 phút, Node 2 sẽ chuyển từ child sang router:
> state child Done ... > state router Done
5. Xác thực khả năng kết nối
Thoát ot-ctl bằng cách dùng lệnh Ctrl+D hoặc exit, rồi trên dòng lệnh của máy chủ lưu trữ, hãy ping Node 1 bằng EID của Node 1 bằng lệnh ping6. Nếu phiên bản RCP ot-daemon được kết nối thành công và giao tiếp với mạng Thread, thì lệnh ping sẽ thành công:
$ ping6 -c 4 fd55:cf34:dea5:7994:460:872c:e807:c4ab PING fd55:cf34:dea5:7994:460:872c:e807:c4ab (fd55:cf34:dea5:7994:460:872c:e807:c4ab): 56 data bytes 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=0 ttl=64 time=4.568 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=1 ttl=64 time=6.396 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=2 ttl=64 time=7.594 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=3 ttl=64 time=5.461 ms --- fd55:cf34:dea5:7994:460:872c:e807:c4ab ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 4.568/6.005/7.594/1.122 ms
7. Xin chúc mừng!
Bạn đã mô phỏng thành công mạng Thread đầu tiên bằng OpenThread. Tuyệt vời!
Trong Lớp học lập trình này, bạn đã tìm hiểu cách:
- Thiết lập chuỗi công cụ bản dựng OpenThread
- Mô phỏng mạng Thread
- Xác thực các nút Thread
- Quản lý mạng Thread bằng OpenThread Daemon
Nếu bạn muốn tìm hiểu thêm, hãy tham khảo các tài liệu sau: