Mô phỏng mạng luồng bằng OTNS

Thông tin về lớp học lập trình này
schedule30 phút
subjectLần cập nhật gần đây nhất: 15 tháng 5, 2025
account_circleTác giả: Simon Lin, Colin Tan, Esko Dijk

1. Giới thiệu

Hình ảnh về cấu trúc liên kết mạng lưới của Thread

Thread và OTNS là gì?

Thread là một giao thức mạng lưới không dây công suất thấp dựa trên IP, cho phép giao tiếp an toàn giữa thiết bị với thiết bị và giữa thiết bị với đám mây. Mạng luồng có thể thích ứng với các thay đổi về cấu trúc để tránh một điểm lỗi.

OpenThread do Google phát hành là một phương thức 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 hỗ trợ tất cả các tính năng được xác định trong Quy cách luồng.

Bạn có thể dùng Trình mô phỏng mạng OpenThread (OTNS) để mô phỏng 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 được mô phỏng. Bạn cũng có thể mô phỏng theo tập lệnh (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 nó
  • Tìm hiểu thông tin cơ bản về OTNS-CLI
  • Cách thêm/di chuyển/xoá 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 tính năng không có điểm lỗi duy nhất của OpenThread
  • Xem lưu lượng 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 có tính 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ó

  • Tốt nhất là Linux x86_64 hoặc Mac OS có Homebrew. Ubuntu 22/24 trong Windows WSL2 cũng sẽ hoạt động nhưng có thể cần phải đ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.
  • Thread Primer (Hướng dẫn về luồng). Bạn cần nắm được các khái niệm cơ bản về Luồng để hiểu nội dung được dạy trong Lớp học lập trình này.

Thuật ngữ

Thuật ngữ "Trình định tuyến" được dùng làm thuật ngữ kỹ thuật cho Trình mở rộng mạng lưới Thread (ban đầu được gọi là Trình định tuyến Thread). "Điểm cuối" đề cập đến mọi thiết bị OpenThread được mô phỏng trong quá trình 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ả Python3 và Go/Golang, nếu cần) và cài đặt OTNS. Thư viện này cũng tạo nhiều loại nút OT có thể được sử 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, 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.

Nếu otns không được cài đặt đúng cách

Tập lệnh có thể báo cáo 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 $PATH.

Trong trường hợp gặp lỗi khác, bạn có thể tạo 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 trình duyệt web để trực quan hoá và quản lý mạng (OTNS-Web):

Cửa sổ OTNS-Web khi khởi động

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ý hoạt động mô phỏng OTNS thông qua OTNS-CLIOTNS-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 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ề CLI của OTNS để biết danh sách đầy đủ các lệnh. Đừng lo, bạn sẽ chỉ 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 trong 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 sử 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 bản trình bày trực quan về các nút, thông báo và đường liên kết của mạng Luồng được mô phỏng. Lưu ý các phần tử khác nhau của OTNS-Web:

Giải thích các phần tử OTNS-Web

5. Thêm nút

Thêm nút thông qua OTNS-CLI

Thêm Trình định tuyến luồng 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 bắt đầu ở dạng Bộ định tuyến và trở thành Nút điều phối trong vài giây:

Một nút trong vai trò Người lãnh đạo

Để 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 được uỷ quyền với 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:

Mạng Thread có 4 nút

Ngoài ra, trong OTNS-Web, bạn có thể chọn bất kỳ nút nào để xem bảng thông tin có thêm thông tin về nút đó. Ví dụ: trong hình dưới đây, 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 dẫn đầu.

Mạng luồng có 4 nút, nút 1 được chọn

Thêm nút theo OTNS-Web

Bạn cũng có thể thêm 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ẽ tham gia phân vùng Luồng hiện có:

Thêm một Bộ định tuyến, tổng cộng 5 nút

Ngoài ra, hãy 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. Bây giờ, bạn sẽ có tổng cộng 9 nút. Nếu muốn, hãy kéo một số nút xung quanh đến các vị trí khác để tạo một cấu trúc mạng thực tế khác.

Thêm nhiều nút mới, tổng cộng 9 nút

Bây giờ, bạn đã tạo một mạng Luồng của 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 chạy 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, nghĩa là thời gian mô phỏng đã trôi qua cho đến thời điểm này giống với thời gian thực tế kể từ khi chúng ta tạo nút đầu tiên.

Điều chỉnh tốc độ thông qua 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 thông báo thường xuyên hơn nhiều so với trước.

Đặt tốc độ mô phỏng thành MAX

> speed max
Done

Hiện tại, 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 thông báo.

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 quá trình 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 quá trình mô phỏng.

Điều chỉnh tốc độ thông qua OTNS-Web

Nút điều khiển tốc độ

Tìm các nút điều khiển tố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ể được 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 Nút tăng tốc độ cho đến khi tốc độ đạt đến MAX: Chỉ báo tốc độ mô phỏng MAX.

Chạy chậm quá trình mô phỏng

Bạn có thể làm chậm quá trình mô phỏng bằng cách nhấp vào nút Nút giảm tốc độ.

Tạm dừng mô phỏng

Nhấp vào nút Nút tạm dừng để tạm dừng quá trình mô phỏng khi quá trình này đang chạy. Nút này sẽ được thay đổi thành Nút phát.

Tiếp tục mô phỏng

Nhấp vào nút Nút phát để tiếp tục quá trình mô phỏng khi quá trình này bị tạm dừng. Nút này sẽ được thay đổi trở lại thành Nút tạm dừng.

Đặ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 Trình định tuyến (hình lục giác), có thể là một Trình định tuyến biên (hình vuông) và nhiều trình định tuyến con, đồng thời chạy với tốc độ gấp 10 lần.

Tìm Trình điều khiển chính hiện tại (viền màu đỏ) của 2 Trình định tuyến, nhấp một lần để chọn trình điều khiển đó:

Mạng luồng có nút Leader 1 (Đầu mối) được chọn

Tắt radio

Nhấp vào nút Nút Tắt đài trên Thanh thao tác để tắt nút chọn của nút Leader (Đầu tàu). Người dẫn đầu sẽ không thể gửi hoặc nhận tin nhắn khi tắt đài.

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ình dẫn đầu mới:

Phân vùng mới được tạo với nút 9 làm Leader mới

Mạng Luồng tự động khôi phục sau khi Luồng chính bị lỗi bằng cách tạo một phân vùng mới với Luồng chính 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 đã tắt đài. Nhấp vào nút Nút bật radio trên Action Bar để khôi phục kết nối đài:

Nút 1 tham gia phân vùng sau khi bật lại đài

Thiết bị đầu tiên 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 thông qua OTNS-CLI

Di chuyển nút Bộ định tuyến biên 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 sẽ tạo một phân vùng riêng với Mã phân vùng mới. Bạn có thể kiểm tra Mã 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.

Nút 5 được di chuyển ra khỏi các nút khác và tạo thành một phân vùng mới

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 xảy ra do thông tin cũ về một phần tử con vẫn được lưu giữ trong bảng con của một phần tử mẹ cũ. Hoặc đó có thể là thông tin cũ về đường liên kết giữa bộ định tuyến với bộ định tuyến trước đây giữa nút 9 và nút 5. (Hoặc có thể, trong trường hợp này, thậm chí là lỗi kết xuất.) 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á 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:

Nút 5 bị xoá khỏi quá trình mô phỏng

Xoá các nút thông qua OTNS-Web

Chọn nút Bộ định tuyến biên 9 rồi nhấp vào nút Nút xóa trên Action Bar để xoá nút 9:

Xoá nút Bộ định tuyến biên 9

Node 1 sẽ trở thành Leader của một phân vùng mới và tất cả các nút còn lại sẽ đính kèm dưới dạng Child vào nút 1.

10. Ngữ cảnh nút OTNS-CLI

OTNS-CLI cung cấp chế độ ngữ cảnh nút để dễ dàng tương tác với các nút nhằm giúp nhà phát triển chẩn đoán trạng thái của nút. Ngoài ra, 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>

Lệnh 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 ngữ cảnh nút khác

node 1> node 2
Done
node 2> 

Thoát khỏi ngữ cảnh nút

node 1> exit
Done
>

Một cách khác để thoát khỏi ngữ cảnh nút là lệnh node 0.

11. Xem nhật ký nút và gói bắt

Nhật ký nút OpenThread

Theo mặc định, OTNS tạo 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_.log. Ví dụ: phần trích dẫn tệp nhật ký được hiển thị bên dưới:

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 hiển thị ở 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.

Tính năng chặn bắt gói tin của 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 khi mô phỏng. Do tính năng mã hoá lớp liên kết của Luồng, 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 đúng cách. Theo mặc định, một Khoá mạng phổ biến được sử dụng để dễ dàng giải mã khung bằng Wireshark.

Hãy xem ảnh chụp màn hình bên dưới để biết ví dụ về cách kiểm tra gói OpenThread trong Wireshark.

Ảnh chụp màn hình phân tích gói OpenThread trong Wireshark

Để định cấu hình khoá giải mã, hãy chọn trong trình đơn Edit -> Preferences (Chỉnh sửa -> Lựa chọn ưu tiên). Sau đó, trong cửa sổ 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 nhập mới, nhập khoá 00112233445566778899aabbccddeeff (32 ký tự) rồi chọn "Hash luồng" trong trường "Hash khoá". Bạn có thể để "Chỉ mục khoá giải mã" là 0. Sau đó, hãy 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 hiển thị 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 hiển thị 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 điệp nhật ký với các khung vô tuyến đã truyền hoặc đã nhận. Tuy nhiên, các giá trị này thường không giống nhau đến độ chính xác một micro giây: phần cứng vô tuyến IEEE 802.15.4 được 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 thi thành công quy trình 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 nó. Bạn đã bắt đầu mô phỏng OTNS bằng các nút mô phỏng OpenThread. Bạn đã tìm hiểu cách thao tác với mô phỏng theo nhiều cách thông qua cả OTNS-CLIOTNS-Web.

Giờ đây, bạn đã biết OTNS là gì và cách sử dụng OTNS để mô phỏng mạng OpenThread.

Tiếp theo là gì?

Hãy xem một số lớp học lập trình này...

Tài liệu tham khảo