1. Giới thiệu
Thread và OTNS là gì
Thread là một giao thức mạng lưới dạng mắt lưới không dây có công suất thấp dựa trên IP, cho phép giao tiếp an toàn giữa các thiết bị và giữa thiết bị với đám mây. Mạng Thread có thể thích ứng với các thay đổi về cấu trúc liên kết để tránh một điểm lỗi duy nhất.
OpenThread do Google phát hành là một cách triển khai nguồn mở của Thread. Mặc dù có kích thước mã và mức sử dụng bộ nhớ nhỏ, nhưng OpenThread vẫn hỗ trợ tất cả các tính năng được xác định trong Quy cách của Thread.
Bạn có thể sử dụng Trình mô phỏng mạng OpenThread (OTNS) để mô phỏng các mạng Thread bằng cách chạy các nút OpenThread được mô phỏng trên các nền tảng posix. OTNS cung cấp một giao diện Web dễ sử dụng (OTNS-Web) để trực quan hoá và vận hành các mạng Thread mô phỏng. Bạn cũng có thể sử dụng các mô phỏng theo kịch bản (bằng Python).
Kiến thức bạn sẽ học được
- Cài đặt OTNS và các phần phụ thuộc của OTNS
- Tìm hiểu thông tin cơ bản về OTNS-CLI
- Cách thêm/di chuyển/xoá các nút OpenThread trong OTNS-Web
- Sử dụng các tính năng hữu ích khác của OTNS-Web để kiểm soát hoạt động mô phỏng mạng
- Xác minh rằng OpenThread không có một điểm lỗi duy nhất
- Xem lưu lượng truy cập dữ liệu giữa các nút OpenThread trong Wireshark
Lớp học lập trình này tập trung vào OTNS-CLI và OTNS-Web để sử dụng tương tác. Các tính năng khác của OTNS, chẳng hạn như tập lệnh Python, không được đề cập.
Bạn cần có
- Thread Primer. Bạn cần nắm được các khái niệm cơ bản về Luồng để hiểu những gì được dạy trong Lớp học lập trình này.
- Tốt nhất là Linux x86_64 hoặc Mac OS có Homebrew. Ubuntu phiên bản 24 trở lên trong WSL2 của Windows cũng sẽ hoạt động nhưng có thể yêu cầu bạn điều chỉnh một số chế độ cài đặt theo cách thủ công.
- Git.
- Trình duyệt web. OTNS-Web sử dụng trình duyệt web để hiển thị các mô phỏng.
- Trình phân tích giao thức mạng Wireshark (không bắt buộc).
- Go phiên bản 1.23 trở lên.
- Tập lệnh cài đặt sẽ kiểm tra phiên bản Go đã cài đặt.
- Nếu chưa cài đặt Go, thì hệ thống sẽ cài đặt phiên bản >= 1.23 (nếu có trong trình quản lý gói).
- Nếu không có trong trình quản lý gói, bạn phải cài đặt theo cách thủ công.
- Xin lưu ý rằng Ubuntu 24.04 trở xuống không tự động hỗ trợ Go 1.23. Hãy xem trang Các phiên bản Golang hiện có trong tài liệu của Ubuntu để biết thông tin chi tiết. Bạn có thể cài đặt theo cách thủ công, bằng cách sử dụng
snap
hoặc các quy trình khác.
- Python phiên bản 3.9 trở lên.
- Tập lệnh cài đặt sẽ kiểm tra phiên bản Python đã cài đặt.
- Nếu bạn chưa cài đặt Python 3, thì ứng dụng này sẽ cài đặt phiên bản >= 3.9 (nếu có) từ trình quản lý gói.
- Nếu không có trong trình quản lý gói, bạn phải cài đặt theo cách thủ công.
Thuật ngữ
Thuật ngữ "Bộ định tuyến" được dùng làm thuật ngữ kỹ thuật cho Bộ mở rộng mạng lưới Thread. Ban đầu, thiết bị này có tên là Bộ định tuyến Thread. "Nút" dùng để chỉ mọi thiết bị OpenThread được mô phỏng trong một mô phỏng OTNS.
2. Cài đặt
Nhận mã OTNS
$ git clone https://github.com/openthread/ot-ns.git ./otns $ cd otns
Tất cả các lệnh bảng điều khiển tiếp theo trong Lớp học lập trình này đều được chạy từ thư mục otns
.
Khởi động và cài đặt
Tập lệnh bootstrap
sẽ cài đặt các phần phụ thuộc (bao gồm cả Python 3 và Go/Golang, nếu cần) và cài đặt OTNS. Xin lưu ý rằng tập lệnh có thể dừng nếu không tự động cài đặt được một số phần phụ thuộc nhất định, chẳng hạn như Python phiên bản >= 3.9 hoặc Go phiên bản >= 1.23. Tính năng tự động cài đặt yêu cầu các gói có thể được tìm thấy trong kho lưu trữ gói đã định cấu hình của hệ điều hành.
Tập lệnh này cũng tạo các loại nút OT có thể dùng trực tiếp trong quá trình mô phỏng và thực hiện một số kiểm thử cơ bản. Do các bản dựng nút này, quá trình này có thể mất vài phút.
$ ./script/bootstrap .... .... OTNS installed - use 'otns' to start it. $
Bạn có thể được yêu cầu nhập mật khẩu cho sudo
trong quá trình thực thi tập lệnh.
Nếu otns
không được cài đặt đúng cách
Tập lệnh có thể báo cáo một lỗi như:
.... OTNS installed - please add ~/go/bin to your PATH variable first, to use it. $
Trong trường hợp này, bạn cần thêm $(go env GOPATH)/bin
vào biến $PATH
.
Trong trường hợp xảy ra các lỗi khác, bạn có thể tạo một vấn đề trên GitHub.
3. Chạy OTNS lần đầu tiên
Chạy otns
:
$ otns >_ ← OTNS-CLI prompt
Khi khởi động thành công, OTNS sẽ chuyển sang bảng điều khiển CLI (OTNS-CLI
) và khởi chạy một trình duyệt web để trực quan hoá và quản lý mạng (OTNS-Web
):
Nếu bạn chỉ thấy một trang trống cho OTNS-Web, thì có thể WebGL chưa được bật trong trình duyệt của bạn. Vui lòng tham khảo https://superuser.com/a/836833 để biết cách bật WebGL.
Trong các phần sau, bạn sẽ tìm hiểu cách quản lý các hoạt động mô phỏng OTNS thông qua OTNS-CLI
và OTNS-Web
.
4. Làm quen với OTNS-CLI và OTNS-Web
OTNS-CLI
OTNS-CLI
là Giao diện dòng lệnh (CLI) để quản lý các hoạt động mô phỏng OTNS.
$ otns >_ ← OTNS-CLI prompt
Bạn có thể nhập lệnh thông qua OTNS-CLI
. Hãy tham khảo tài liệu tham khảo về OTNS CLI để biết danh sách đầy đủ các lệnh. Đừng lo lắng, bạn chỉ cần sử dụng một vài lệnh trong số này trong Lớp học lập trình này.
Nhập lệnh help
để xem thông tin tổng quan về các lệnh CLI. Danh sách này giống với tài liệu tham khảo về CLI.
> help add Add a node to the simulation and get the node ID. .... .... Done >
Để được trợ giúp thêm về một lệnh cụ thể, hãy dùng tên của lệnh đó, ví dụ:
> help add add Add a node to the simulation and get the node ID. Definition: .... .... >
OTNS-Web
OTNS-Web
là công cụ quản lý và trực quan hoá mạng của OTNS. Công cụ này cung cấp thông tin trực quan về các nút, thông báo và đường liên kết của mạng Thread mô phỏng. Lưu ý các phần tử khác nhau của OTNS-Web
:
5. Thêm nút
Thêm nút thông qua OTNS-CLI
Thêm Bộ định tuyến Thread vào mô phỏng:
> add router 1 Done
Bạn sẽ thấy một nút được tạo trong OTNS-Web
. Nút này bắt đầu với vai trò là Bộ định tuyến và trở thành Nút chính sau vài giây:
Để dễ dàng bắt đầu mô phỏng một cách tương tác, theo mặc định, mỗi nút OpenThread mới sẽ được uỷ quyền bằng một bộ thông số mạng tiêu chuẩn.
Thêm các nút khác thông qua OTNS-CLI
Bây giờ, chúng ta sẽ thêm một số nút thuộc nhiều loại.
> add fed 2 Done > add med 3 Done > add sed 4 Done
Chờ vài giây để các nút hợp nhất thành một phân vùng. Bạn sẽ thấy các nút trong OTNS-Web
:
Ngoài ra, trong OTNS-Web
, bạn có thể chọn bất kỳ nút nào để xem bảng điều khiển có thêm thông tin về nút đó. Ví dụ: trong hình bên dưới, nút 1 được chọn. Mục "Vai trò" trong bảng điều khiển xác nhận rằng đó là một Người lãnh đạo.
Thêm nút bằng OTNS-Web
Bạn cũng có thể thêm các nút thông qua OTNS-Web
. Nhấp vào nút New Router
của Action Bar
. Bạn sẽ thấy một nút được tạo ở bên phải nút đã chọn. Bộ định tuyến mới sẽ kết nối với phân vùng Thread hiện có:
Bạn cũng có thể nhấp vào các nút FED, MED, SSED và BR trên Thanh thao tác để tạo các loại nút khác này. Giờ đây, sẽ có tổng cộng 9 nút. Nếu muốn, hãy kéo một số nút đến các vị trí khác để tạo một cấu trúc liên kết mạng vật lý khác.
Giờ đây, bạn đã tạo một mạng Thread gồm một phân vùng chứa nhiều nút. Trong phần tiếp theo, chúng ta sẽ điều chỉnh tốc độ mô phỏng để quá trình mô phỏng diễn ra nhanh hơn.
6. Điều chỉnh tốc độ
Hiện tại, quá trình mô phỏng sẽ chạy ở tốc độ 1X
, tức là thời gian mô phỏng đã trôi qua cho đến nay bằng với thời gian thực kể từ khi chúng ta tạo nút đầu tiên.
Điều chỉnh tốc độ bằng cách nhấn vào biểu tượng OTNS-CLI
Bạn có thể điều chỉnh tốc độ mô phỏng thông qua OTNS-CLI
.
Đặt tốc độ mô phỏng thành 100X
> speed 100 Done
Bạn sẽ thấy các nút gửi tin nhắn thường xuyên hơn nhiều so với trước đây.
Đặt tốc độ mô phỏng thành MAX
> speed max Done
Giờ đây, OTNS đang cố gắng hết sức để mô phỏng nhanh nhất có thể, vì vậy, bạn sẽ thấy các nút gửi một số lượng lớn tin nhắn.
Tạm dừng mô phỏng
> speed 0 Done
Việc đặt tốc độ mô phỏng thành 0
sẽ tạm dừng quá trình mô phỏng.
Khôi phục mô phỏng ở tốc độ bình thường
> speed 1 Done
Việc đặt tốc độ mô phỏng thành một giá trị lớn hơn 0
sẽ tiếp tục mô phỏng.
Điều chỉnh tốc độ bằng cách nhấn vào biểu tượng OTNS-Web
Nút điều khiển tốc độ
Tìm các nút điều khiển tốc độ trên
Action Bar
. Các nút này cho biết tốc độ mô phỏng hiện tại và có thể dùng để điều chỉnh tốc độ mô phỏng cũng như tạm dừng/tiếp tục mô phỏng.
Tăng tốc độ mô phỏng
Bạn có thể tăng tốc độ mô phỏng bằng cách nhấp vào nút cho đến khi tốc độ đạt đến
MAX
: .
Giảm tốc độ mô phỏng
Bạn có thể giảm tốc độ mô phỏng bằng cách nhấp vào nút .
Tạm dừng mô phỏng
Nhấp vào nút để tạm dừng quá trình mô phỏng khi đang chạy. Nút này sẽ thay đổi thành
.
Tiếp tục mô phỏng
Nhấp vào nút để tiếp tục mô phỏng khi quá trình này bị tạm dừng. Nút này sẽ được thay đổi về
.
Đặt tốc độ mô phỏng thành 10X
Để tiết kiệm thời gian, hãy sử dụng
OTNS-CLI
để điều chỉnh tốc độ mô phỏng thành
10X
để chúng ta có thể quan sát các thay đổi về cấu trúc liên kết trong mạng nhanh hơn nhiều.
> speed 10 Done
7. Bật/tắt đài
Giờ đây, mô phỏng phải chứa ít nhất 2 Bộ định tuyến (hình lục giác), có thể là một Bộ định tuyến biên (hình vuông) và nhiều thành phần con, đồng thời chạy ở tốc độ gấp 10 lần.
Tìm Bộ định tuyến chính (đường viền màu đỏ) trong số 2 Bộ định tuyến, nhấp một lần để chọn Bộ định tuyến đó:
Tắt radio
Nhấp vào nút trên Thanh thao tác để tắt đài của nút Leader. Người dẫn đầu sẽ không thể gửi hoặc nhận tin nhắn khi đài phát tắt.
Chờ khoảng 12 giây (120 giây trong thời gian mô phỏng) để Bộ định tuyến hoặc Bộ định tuyến biên khác trở thành Trưởng nhóm mới:
Mạng Thread tự động khôi phục sau khi Bộ định tuyến ưu tiên gặp sự cố bằng cách tạo một phân vùng mới với Bộ định tuyến ưu tiên mới. Phân vùng mới cũng có màu phân vùng mới.
Bật radio
Chọn Người dẫn đầu có đài phát bị tắt. Nhấp vào nút trên
Action Bar
để khôi phục khả năng kết nối của đài phát:
Thiết bị dẫn đầu sẽ kết nối lại với mạng sau khi kết nối vô tuyến được khôi phục.
8. Di chuyển nút
OTNS cho phép người dùng dễ dàng di chuyển các nút thông qua OTNS-CLI
hoặc OTNS-Web
.
Di chuyển nút qua OTNS-CLI
Di chuyển nút Border Router 9 đến một vị trí mới:
> move 9 50 50 Done
Di chuyển nút thông qua OTNS-Web
Di chuyển nút 5 xuống dưới cùng bên phải bằng cách kéo. Vì nút 5 hiện nằm ngoài phạm vi phủ sóng vô tuyến của các Bộ định tuyến khác, nên nút này tạo thành phân vùng riêng với một Partition ID mới. Bạn có thể kiểm tra mã nhận dạng phân vùng trên bảng thông tin nút bằng cách nhấp vào các nút.
Xin lưu ý rằng một đường màu xanh lục vẫn được vẽ giữa nút 5 và nút 9. Điều này thường là do thông tin cũ về một thành phần con vẫn được lưu giữ trong bảng con của một thành phần mẹ cũ. Hoặc đó có thể là thông tin cũ về đường liên kết trước đây giữa bộ định tuyến với bộ định tuyến giữa nút 9 và nút 5. (Hoặc có thể trong trường hợp này, thậm chí là một lỗi hiển thị.) Cuối cùng, thông tin cũ sẽ được dọn dẹp trên các nút sau khi hết thời gian chờ thích hợp.
9. Xoá các nút
Xoá các nút thông qua OTNS-CLI
Xoá nút 5:
> del 5 Done
Nút 5 sẽ biến mất khỏi quá trình mô phỏng:
Xoá các nút thông qua OTNS-Web
Chọn nút Border Router 9 rồi nhấp vào nút trên
Action Bar
để xoá nút 9:
Node 1
sẽ trở thành Trưởng nhóm của một phân vùng mới và tất cả các nút còn lại sẽ được đính kèm dưới dạng Nút con vào nút 1.
10. Ngữ cảnh nút OTNS-CLI
OTNS-CLI
cung cấp chế độ ngữ cảnh của nút để dễ dàng tương tác với các nút, giúp nhà phát triển chẩn đoán trạng thái của một nút. Bạn cũng có thể bắt đầu các thao tác trên nút từ chế độ này.
Chuyển sang chế độ ngữ cảnh nút
Nhập ngữ cảnh nút của nút 1:
> node 1 Done node 1>
Dấu nhắc CLI đã thay đổi thành node 1>
, cho biết ngữ cảnh nút hiện tại. Bạn có thể nhập các lệnh OpenThread CLI để thực thi trên nút như thể bạn đang tương tác trực tiếp với nút.
Thực thi các lệnh trong ngữ cảnh nút
node 1> state leader Done node 1> channel 11 Done node 1> panid 0xface Done node 1> networkname otns Done node 1> ipaddr fdde:ad00:beef:0:0:ff:fe00:fc00 fdde:ad00:beef:0:0:ff:fe00:b400 fd00:f00d:cafe:0:2505:8719:3685:ebfb fdde:ad00:beef:0:4fd9:b9ba:44e0:96cb fe80:0:0:0:e86a:e07:ec97:777 Done
Chuyển sang một bối cảnh nút khác
node 1> node 2 Done node 2>
Ngữ cảnh nút thoát
node 1> exit Done >
Một cách khác để thoát khỏi ngữ cảnh nút là dùng lệnh node 0
.
11. Xem nhật ký nút và dữ liệu chặn bắt gói
Nhật ký nút OpenThread
Theo mặc định, OTNS tạo các tệp nhật ký chi tiết cho tất cả các nút OpenThread được mô phỏng. Bạn có thể xem các tệp này trong thư mục ./tmp
. Tên tệp là 0_
. Ví dụ: Dưới đây là đoạn trích trong tệp nhật ký:
7616488 00:00:06.326 [I] MeshForwarder-: Received IPv6 UDP msg, len:90, chksum:5915, ecn:no, from:ca72650db7b856af, sec:no, prio:net, rss:-58.0
7616488 00:00:06.326 [I] MeshForwarder-: src:[fe80:0:0:0:c872:650d:b7b8:56af]:19788
7616488 00:00:06.326 [I] MeshForwarder-: dst:[ff02:0:0:0:0:0:0:1]:19788
7616488 00:00:06.326 [D] Mle-----------: Receive MLE message
7616488 00:00:06.326 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7657544 00:00:06.367 [D] Mac-----------: ==============================[RX len=063]==============================
7657544 00:00:06.367 [D] Mac-----------: | 41 D8 7F CE FA FF FF 46 | 74 5A 33 9E 76 51 4E 7F | A......FtZ3.vQN. |
7657544 00:00:06.367 [D] Mac-----------: | 3B 02 F0 4D 4C 4D 4C 81 | E6 00 15 03 00 00 00 00 | ;..MLML......... |
7657544 00:00:06.367 [D] Mac-----------: | 00 00 00 01 46 86 7D FE | 06 CC DB 94 86 9C 88 0B | ....F.}......... |
7657544 00:00:06.367 [D] Mac-----------: | 1C 1E 26 9B 8D 21 2E 65 | 53 5A 43 4E A2 59 D6 | ..&..!.eSZCN.Y. |
7657544 00:00:06.367 [D] Mac-----------: ------------------------------------------------------------------------
7657544 00:00:06.367 [I] MeshForwarder-: Received IPv6 UDP msg, len:84, chksum:81e6, ecn:no, from:4e51769e335a7446, sec:no, prio:net, rss:-48.0
7657544 00:00:06.367 [I] MeshForwarder-: src:[fe80:0:0:0:4c51:769e:335a:7446]:19788
7657544 00:00:06.367 [I] MeshForwarder-: dst:[ff02:0:0:0:0:0:0:2]:19788
7657544 00:00:06.367 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7833912 00:00:06.543 [I] Mle-----------: AttachState ParentReq -> Idle
7833912 00:00:06.543 [N] RouterTable---: Allocate router id 12
7833912 00:00:06.543 [N] Mle-----------: RLOC16 fffe -> 3000
7833912 set node RLOC16: fffe -> 3000
7833912 00:00:06.543 [D] SubMac--------: RadioShortAddress: 0x3000
7833912 00:00:06.543 [N] Mle-----------: Role detached -> leader
7833912 00:00:06.543 [N] Mle-----------: Partition ID 0x24c35f10
7833912 00:00:06.543 [I] RouterTable---: Route table
7833912 00:00:06.543 [I] RouterTable---: 12 0x3000 - me - leader
Thời gian mô phỏng tuyệt đối tính bằng micro giây xuất hiện ở bên trái. Dấu thời gian hh:mm:ss
cho biết dấu thời gian nhật ký của chính nút OpenThread, có thể khác với thời gian mô phỏng tuyệt đối.
Dữ liệu bắt gói tin Wireshark
Theo mặc định, tất cả các khung IEEE 802.15.4 được truyền đều được ghi lại trong tệp PCAP current.pcap
. Wireshark có thể đọc tệp này trong hoặc sau quá trình mô phỏng. Do quá trình mã hoá lớp liên kết của Thread, bạn cần thực hiện một thao tác định cấu hình một lần trong Wireshark để đặt khoá giải mã cho OTNS một cách thích hợp. Theo mặc định, một Khoá mạng nổi tiếng được dùng để Wireshark dễ dàng giải mã khung.
Hãy xem ảnh chụp màn hình bên dưới để biết ví dụ về tính năng kiểm tra gói OpenThread trong Wireshark.
Để định cấu hình khoá giải mã, hãy chọn Chỉnh sửa -> Lựa chọn ưu tiên trong trình đơn. Sau đó, trong cửa sổ Preferences (Lựa chọn ưu tiên), hãy chọn Protocols -> IEEE 802.15.4 (Giao thức -> IEEE 802.15.4). Nhấp vào nút Chỉnh sửa... bên cạnh "Khoá giải mã". Nhấp vào + để tạo một mục mới, nhập khoá 00112233445566778899aabbccddeeff
(32 ký tự) và chọn "Băm luồng" trong trường "Băm khoá". Bạn có thể để "Chỉ mục khoá giải mã" là 0
. Sau đó, nhấp vào OK rồi nhấp lại vào OK. Giờ đây, tệp PCAP OTNS sẽ giải mã đúng cách khi được tải.
Dấu thời gian xuất hiện trong cột "Thời gian" (tính bằng giây) tương ứng với các giá trị thời gian mô phỏng tuyệt đối xuất hiện trong nhật ký nút OpenThread. Điều này giúp bạn dễ dàng liên kết các thông báo nhật ký với các khung vô tuyến đã truyền hoặc nhận. Tuy nhiên, các giá trị thường không giống nhau với độ chính xác đến từng phần triệu giây: phần cứng vô tuyến IEEE 802.15.4 mô phỏng có thể thêm một số độ trễ bổ sung, sau khi ngăn xếp OpenThread yêu cầu gửi một khung vô tuyến.
12. Xin chúc mừng
Xin chúc mừng! Bạn đã thực hiện thành công mô phỏng OTNS đầu tiên!
Bạn đã tìm hiểu cách cài đặt OTNS và các phần phụ thuộc của OTNS. Bạn đã bắt đầu mô phỏng OTNS bằng các nút mô phỏng OpenThread. Bạn đã học cách điều khiển hoạt động mô phỏng theo nhiều cách thông qua cả OTNS-CLI
và OTNS-Web
.
Giờ đây, bạn đã biết OTNS là gì và cách sử dụng OTNS để mô phỏng các mạng OpenThread.
Tiếp theo là gì?
Hãy xem một số lớp học lập trình này...
- Mô phỏng mạng Thread bằng OpenThread
- Mô phỏng mạng Thread bằng OpenThread trong Docker
- Xây dựng mạng Thread bằng các bảng nRF52840 và OpenThread