1. Giới thiệu
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 (Luồng). Google Nest đã phát hành OpenThread để cung cấp rộng rãi công nghệ cho 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 cho ngôi nhà thông minh.
Đặc tả luồng xác định một giao thức truyền dữ liệu từ thiết bị tới thiết bị không dây công suất thấp, bảo mật và đáng tin cậy 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 với bảo mật MAC, Thiết lập liên kết lưới và Định tuyến lưới.
Lớp học lập trình này hướng dẫn bạn mô phỏng Mạng luồng trên thiết bị được 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 luồng
- Cách xác thực các nút Luồng
- 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 phải có Git để hoàn thành lớp học lập trình này. Hãy tải xuống và cài đặt ứng dụng này trước khi tiếp tục.
Sau khi cài đặt xong, 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 phải có XCode để cài đặt và tạo OpenThread trên Mac OS X.
Sau khi XCode được cài đặt, hãy cài đặt Công cụ dòng lệnh XCode:
$ xcode-select --install
Xây dựng trên Linux / Mac OS X
Các hướng dẫn cài đặt này đã được thử nghiệm 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 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 $ ./bootstrap
Sử dụng Windows
Nếu muốn dùng Windows, bạn nên dùng thử phiên bản Docker của Lớp học lập trình này.
3. Xây dựng ứng dụng OpenThread
Sau khi cài đặt xong, hãy tạo ứng dụng OpenThread mẫu. Đối với 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ột mạng Thread
Ứng dụng mẫu mà bạn sẽ sử dụng cho Lớp học lập trình này minh hoạ ứng dụng OpenThread tối thiểu hiển thị cấu hình OpenThread và các giao diện quản lý thông qua giao diện dòng lệnh cơ bản (CLI).
Bài tập này sẽ hướng dẫn bạn các bước tối thiểu cần thiết để ping một thiết bị luồng được mô phỏng từ một thiết bị luồng mô phỏng khác.
Hình bên dưới mô tả cấu trúc liên kết mạng Thread cơ bản. Đối với bài tập này, chúng ta sẽ mô phỏng hai nút trong vòng tròn màu xanh lục: một Thread Leader và Thread Router có một kết nối duy nhất giữa chúng.
Ping một nút
1. Bắt đầu Nút 1
Chuyển đến thư mục openthread
và tạo quy trình CLI cho một thiết bị Chuỗi đã 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 (khung hình IEEE 802.15.4 được truyền trong tải trọng UDP).
Đối số của 1
là phần mô tả tệp đại diện cho các bit ít quan trọng nhất của IEEE EUI-64 "được nhà máy chỉ định" cho thiết bị mô phỏng. Giá trị này cũng được sử dụng khi liên kết với cổng UDP cho mô phỏng vô tuyến IEEE 802.15.4 (port = 9000 + bộ mô tả tệp). Mỗi thực thể của một thiết bị Mô phỏng (Thread) trong lớp học lập trình này sẽ sử dụng một bộ mô tả tệp khác.
Lưu ý: Chỉ sử dụng các phần mô tả tệp 1
trở lên như đã nêu trong Lớp học lập trình này khi tạo quy trình cho thiết bị được mô phỏng. Chỉ số mô tả tệp là 0
được dành để sử dụng cho mục đích khác.
Tạo Tập dữ liệu hoạt động mới và cam kết 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 Luồng 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
Hiển thị giao diện IPv6:
> ifconfig up Done
Bắt đầu hoạt động của giao thức Thread:
> thread start Done
Chờ vài giây và xác minh rằng thiết bị đã trở thành Trình quản lý chuỗi. Người lãnh đạo là thiết bị chịu trách nhiệm quản lý việc chỉ định ID bộ định tuyến.
> state leader Done
Xem các địa chỉ IPv6 được gán cho giao diện Chủ đề của Nút 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ỉ lưới địa phương được phân loại thêm:
- Chứa
ff:fe00
= Bộ định tuyến bộ định tuyến (RLOC) - Không chứa
ff:fe00
= Mã định danh điểm cuối (EID)
Xác định EID trong dữ liệu đầu ra của Play Console rồi ghi chú để sử dụng sau. Trong đầu ra mẫu ở trên, EID là:
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. Bắt đầu Nút 2
Mở một cửa sổ dòng lệnh mới rồi chuyển đến thư mục openthread
rồi tạo quy trình CLI. Đây là thiết bị Luồng 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 Khóa mạng Thread và PAN ID, sử dụng cùng các giá trị 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
Hiển thị giao diện IPv6:
> ifconfig up Done
Bắt đầu hoạt động của giao thức Thread:
> thread start Done
Thiết bị sẽ tự khởi chạy dưới dạng Cấp độ con. Thread Child tương đương với End Device (Thiết bị cuối) là thiết bị Thread (truyền) và chỉ nhận lưu lượng truy cập đơn (unicast) với thiết bị mẹ.
> state child Done
Trong vòng 2 phút, bạn sẽ thấy trạng thái chuyển đổi từ child
sang router
. Bộ định tuyến luồng có khả năng định tuyến lưu lượng truy cập giữa các thiết bị luồng. Đây còn được gọi là cấp độ gốc.
> 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 bộ định tuyến.
1. Kiểm tra kết nối
Trên Nút 2, nhận RLOC16. RLOC16 là 16 bit cuối cùng của địa chỉ RLOC IPv6 của thiết bị.
> rloc16 5800 Done
Trên Nút 1, hãy kiểm tra bảng bộ định tuyến cho RLOC16 của Nút 2. Trước tiên, hãy đảm bảo Nút 2 chuyển sang trạng thái bộ định tuyến.
> 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 |
Đã tìm thấy RLOC của 0xa800
của nút 1 trong bảng, xác nhận rằng nút này đã được kết nối với lưới.
2. Ping nút 1 từ nút 2
Xác minh khả năng kết nối giữa hai thiết bị Thread được mô phỏng. Trong Nút 2, ping
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 lời nhắc CLI >
.
Kiểm tra mạng
Bây giờ, bạn có thể ping thành công giữa 2 thiết bị Thread được mô phỏng, hãy kiểm tra mạng lưới bằng cách thực hiện ngoại tuyến một nút.
Quay lại Nút 1 và dừng Luồng:
> thread stop Done
Chuyển sang Nút 2 và kiểm tra trạng thái. Trong vòng hai phút, Node 2 phát hiện ra rằng biến thể dẫn đầu (Node 1) đang ngoại tuyến và bạn sẽ thấy Node 2 chuyển đổi thành leader
của mạng:
> state router Done ... > state leader Done
Sau khi được xác nhận, hãy dừng Thread và khôi phục cài đặt gốc cho nút 2 trước khi thoát. Việc đặt lại về trạng thái ban đầu được thực hiện nhằm đảm bảo thông tin xác thực của luồng Thread mà chúng ta dùng trong bài tập này sẽ không được chuyển sang bài tập tiếp theo.
> thread stop Done > factoryreset > > exit
Cũng khôi phục cài đặt gốc và thoát Nút 1:
> factoryreset > > exit
Xem Tài liệu tham khảo CLI về OpenThread để khám phá tất cả các lệnh CLI hiện có.
5. Xác thực nút bằng cách Ủy quyền
Trong bài tập trước, bạn đã thiết lập mạng Thread với hai thiết bị mô phỏng và kết nối đã xác minh. Tuy nhiên, việc này chỉ cho phép lưu lượng truy cập cục bộ qua đường liên kết IPv6 chưa được xác thực truyền qua lại giữa các thiết bị. Để định tuyến lưu lượng truy cập IPv6 toàn cục giữa chúng (và Internet 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 có vai trò là Ủy viên. Ủy viên hội đồng là máy chủ xác thực hiện được chọn cho các thiết bị Chuỗi mới, đồng thời là người ủy 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 này.
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 hai nút như trước đây. Để xác thực, Người quản lý luồng sẽ đóng vai trò là Ủy viên, Bộ định tuyến luồng với tư cách là Người tham gia.
1. Tạo mạng
Nếu tiếp tục từ bài tập trước, bạn đã mở sẵn 2 cửa sổ dòng lệnh. Nếu không, hãy đảm bảo rằng hai hộp này đã mở và sẵn sàng để sử dụng. Một nút sẽ hoạt động như Nút 1, nút còn lại dưới dạng Nút 2.
Trong Nút 1, tạo ra 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 Tập dữ liệu hoạt động mới, xác nhận tập dữ liệu này 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
Hiển thị giao diện IPv6:
> ifconfig up Done
Bắt đầu hoạt động của giao thức Thread:
> thread start Done
Chờ vài giây và xác minh rằng thiết bị đã trở thành Trình quản lý chuỗi:
> state leader Done
2. Bắt đầu vai trò Ủy viên
Trong khi vẫn ở Nút 1, hãy bắt đầu vai trò Ủy viên:
> commissioner start Done
Cho phép bất kỳ Người tham gia nào (bằng cách sử dụng ký tự đại diện *
) có Thông tin đăng nhập chung của J01NME
để đưa vào mạng. Người liên kết là một thiết bị do quản trị viên con người thêm vào Mạng luồng được ủy 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, 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ò Người kết hợp bằng cách sử dụng Thông tin xác thực người tham gia J01NME
.
> ifconfig up Done > joiner start J01NME Done
... đợi vài giây để xác nhận ...
Join success
Với tư cách là Người tham gia, thiết bị (Nút 2) đã tự xác thực thành công với Ủy viên (Nút 1) và nhận được thông tin đăng nhập Mạng luồng.
Bây giờ, Nút 2 đã được xác thực, hãy bắt đầu Luồng:
> thread start Done
4. Xác thực mạng
Kiểm tra state
trên Nút 2 để xác thực rằng nút đó hiện đã tham gia mạng. Trong vòng hai phút, Nút 2 chuyển đổi 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, dừng Luồng, khôi phục cài đặt gốc và thoát khỏi thiết bị Luồng mô phỏng:
> thread stop Done > factoryreset > > exit
Bạn có thể phải nhấn enter
vài lần để đưa lại lời nhắc >
sau lệnh factoryreset
.
6. Quản lý mạng bằng OpenThread Daemon
Đối với bài tập này, chúng ta sẽ mô phỏng một thực thể CLI (một thiết bị SoC Thread được nhúng) và một thực thể Radio Co-Processor (RCP).
ot-daemon
là một chế độ của ứng dụng OpenThread Posix sử dụng ổ cắm UNIX làm đầu vào và đầu ra, để lõi OpenThread có thể chạy dưới dạng một dịch vụ. Máy khách có thể giao tiếp với dịch vụ này bằng cách kết nối với ổ cắm có OpenThread CLI làm giao thức.
ot-ctl
là 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 các cửa sổ sau:
- Bản sao CLI của thiết bị Chủ đề được mô phỏng (Nút 1)
ot-daemon
quá trình- Phiên bản CLI
ot-ctl
Nếu tiếp tục từ bài tập trước, bạn phải mở sẵn 2 cửa sổ dòng lệnh. Mở một phần ba để đảm bảo rằng bạn có ba cửa sổ dòng lệnh để thực hiện bài tập này.
1. Bắt đầu Nút 1
Trong cửa sổ dòng lệnh đầu tiên, hãy tạo quy trình CLI cho thiết bị Luồng đã mô phỏng:
$ 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 Tập dữ liệu hoạt động mới, xác nhận tập dữ liệu này 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
Hiển thị giao diện IPv6:
> ifconfig up Done
Bắt đầu hoạt động của giao thức Thread:
> thread start Done
Xem các địa chỉ IPv6 được gán cho giao diện luồng của nút 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 chuỗi, một địa chỉ là liên kết cục bộ (fe80
) và ba địa chỉ là cục bộ lưới (fd
). EID là địa chỉ lưới cục bộ không chứa ff:fe00
trong địa chỉ. Trong mẫu đầu ra này, EID là fd55:cf34:dea5:7994:460:872c:e807:c4ab
.
Xác định EID cụ thể từ đầu ra ipaddr
sẽ được dùng để giao tiếp với nút này.
2. Bắt đầu ot-daemon
Trong cửa sổ dòng lệnh thứ hai, hãy chuyển đến thư mục openthread
và bắt đầu ot-daemon
cho nút RCP mà chúng ta sẽ gọi 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 nhật ký đang chạy, đồng thời đảm bảo 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 đầu ra 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
Để thiết bị đầu cuối này ở trạng thái mở và chạy trong nền. Bạn sẽ không nhập thêm lệnh nào trong đó.
3. Sử dụng ot-ctl để kết nối mạng
Chúng tôi chưa uỷ quyền cho Nút 2 (RCP ot-daemon
) cho bất kỳ mạng Thread nào. Đây là nơi ot-ctl
xuất hiện. ot-ctl
sử dụng CLI tương tự như ứng dụng CLI OpenThread. 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ị Luồng đã mô phỏng khác.
Trong cửa sổ dòng lệnh thứ ba, hãy khởi động 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ẽ sử dụng ot-ctl
trong cửa sổ dòng lệnh thứ ba này để quản lý Nút 2 (nút RCP) mà bạn đã bắt đầu trong cửa sổ dòng lệnh thứ hai với ot-daemon
. Kiểm tra state
của Nút 2:
> state disabled Done
Tải eui64
của Nút 2 để hạn chế tham gia vào Người tham gia cụ thể:
> eui64 18b4300000000001 Done
Trên Nút 1 (cửa sổ dòng lệnh đầu tiên), hãy khởi động Ủy viên và hạn chế chỉ tham gia eui64 đó:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
Trên Nút 2 (cửa sổ dòng lệnh thứ ba), hiển thị giao diện mạng và tham gia mạng:
> ifconfig up Done > joiner start J01NME Done
... đợi vài giây để xác nhận ...
Join success
Với tư cách là Người tham gia, RCP (Nút 2) đã tự xác thực thành công với Ủy viên (Nút 1) và nhận được thông tin xác thực của Mạng Thread.
Bây giờ hãy kết nối Nút 2 với mạng Luồng:
> thread start Done
4. Xác thực mạng
Kiểm tra state
trên Nút 2 để xác thực rằng nút đó hiện đã tham gia mạng. Trong vòng hai phút, Nút 2 chuyển đổi từ child
sang router
:
> state child Done ... > state router Done
5. Xác thực kết nối
Thoát ot-ctl
bằng cách sử dụng lệnh Ctrl+D hoặc exit
và trên dòng lệnh của máy chủ, ping Node 1, bằng cách sử dụng EID với lệnh ping6
. Nếu thực thể RCP ot-daemon
được liên kết và giao tiếp thành công với mạng Thread, thì quá trình ping 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 của bạ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ột mạng Thread
- Xác thực các nút Luồng
- Quản lý mạng Thread bằng OpenThread Daemon
Nếu bạn muốn tìm hiểu thêm, hãy khám phá những tài liệu tham khảo sau: