Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Mô phỏng một mạng Thread bằng OpenThread trong Docker

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

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 (Luồng). Google Nest đã phát hành OpenThread để cung cấp rộng rãi công nghệ có sẵn 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 các sản phẩm cho ngôi nhà thông minh.

Đặc tả luồng xác định một giao thức kết nối thiết bị không dây với độ tin cậy, bảo mật và thấp, dựa trên IPv6 cho các ứng dụng trong 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 tính năng bảo mật MAC, Thiết lập lưới liên kết và Định tuyến lưới.

Lớp học lập trình này sẽ hướng dẫn bạn mô phỏng Mạng Thread trên các thiết bị được mô phỏng bằng Docker.

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 nút Luồng
  • Cách quản lý mạng Thread bằng OpenThread Daemon

Những gì bạn cần

  • Docker
  • Có kiến thức cơ bản về Linux, định tuyến mạng

2. Thiết lập Docker

Lớp học lập trình này được thiết kế để sử dụng Docker trên máy Linux, Mac OS X hoặc Windows. Linux là môi trường được đề xuất.

Cài đặt Docker

Cài đặt Docker trên hệ điều hành mà bạn chọn.

Kéo hình ảnh Docker

Sau khi cài đặt Docker, hãy mở cửa sổ dòng lệnh và kéo hình ảnh Docker openthread/environment. Hình ảnh này có OpenThread và OpenThread Daemon được tạo sẵn và sẵn sàng sử dụng cho Lớp học lập trình này.

$ docker pull openthread/environment:latest

Xin lưu ý rằng quá trình tải xuống hoàn toàn có thể mất vài phút.

Trong cửa sổ dòng lệnh, hãy bắt đầu một vùng chứa Docker từ hình ảnh và kết nối với shell bash của vùng chứa đó:

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/environment bash

Lưu ý các cờ bắt buộc phải có trong Lớp học lập trình này:

  • --sysctl net.ipv6.conf.all.disable_ipv6=0 — bật IPv6 trong vùng chứa
  • --cap-add=net_admin — bật tính năng NET_ADMIN, cho phép bạn thực thi các thao tác liên quan đến mạng, chẳng hạn như thêm các tuyến IP

Khi ở trong vùng chứa, bạn sẽ có một lời nhắc tương tự như sau:

root@c0f3912a74ff:/#

Trong ví dụ trên, c0f3912a74ff là mã vùng chứa. Mã vùng chứa cho thực thể của vùng chứa Docker sẽ khác với mã vùng chứa trong lời nhắc cho Lớp học lập trình này.

Sử dụng Docker

Lớp học lập trình này giả định rằng bạn đã nắm được các khái niệm cơ bản về việc sử dụng Docker. Bạn nên duy trì trong vùng chứa Docker trong toàn bộ Lớp học lập trình.

3. Mô phỏng Mạng luồng

Ứng dụng mẫu 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 và giao diện quản lý OpenThread 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ị Chuỗi được mô phỏng từ một thiết bị Luồng khác được mô phỏng.

Hình ảnh dưới đây mô tả cấu trúc liên kết mạng Chủ đề 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ây: Người đứng đầu chuỗi và Trình định tuyến chuỗi bằng một kết nối giữa những nút đó.

6e3aa07675f902dc.pngS

Tạo mạng

1. Nút bắt đầu 1

Nếu bạn chưa thực hiện việc này, trong cửa sổ dòng lệnh, hãy khởi động vùng chứa Docker và kết nối với vỏ bash:

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/environment bash

Trong vùng chứa Docker, hãy tạo quy trình CLI cho thiết bị Luồng được mô phỏng bằng cách sử dụng tệp nhị phân ot-cli-ftd.

root@c0f3912a74ff:/# /openthread/build/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. Trình điều khiển vô tuyến IEEE 802.15.4 được triển khai trên đầu UDP (khung 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 "factory được chỉ định" IEEE EUI-64 cho thiết bị được mô phỏng. Giá trị này cũng được dùng khi liên kết với cổng UDP cho quy trình mô phỏng vô tuyến IEEE 802.15.4 (cổng = 9000 + chỉ số mô tả tệp). Mỗi thực thể của một thiết bị Luồng đượ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 nhau.

Lưu ý: Chỉ sử dụng các chỉ số mô tả tệp là 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 0 được dành riêng cho mục đích sử dụng khác.

Tạo Tập dữ liệu hoạt động mới và xác định 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 dưới dạng 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 giao thức Luồng:

> thread start
Done

Đợi vài giây và xác minh rằng thiết bị đã trở thành Trưởng nhóm luồng. Nhà lãnh đạo là thiết bị chịu trách nhiệm quản lý việc gán mã nhận dạng bộ định tuyến.

> state
leader
Done

Xem các địa chỉ IPv6 được gán cho giao diện Luồng của nút 1\39 (đầ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 (RGCP)
  • Không chứa ff:fe00 = Giá trị nhận dạng điểm cuối (EID)

Hãy xác định EID trong đầu ra của bảng điều khiển để 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ở cửa sổ dòng lệnh mới và thực thi môi trường shell bash trong vùng chứa Docker hiện đang chạy để sử dụng cho Nút 2.

$ docker exec -it codelab_otsim_ctnr bash

Tại lời nhắc bash mới này, tạo quy trình CLI với đối số 2. Đây là thiết bị Chuỗi được mô phỏng thứ hai của bạn:

root@c0f3912a74ff:/# /openthread/build/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 chuỗi và mã nhận dạng PAN, 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 dưới dạng 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 giao thức Luồng:

> thread start
Done

Thiết bị sẽ tự khởi chạy dưới dạng Cấp độ con. Chuỗi con tương đương với Thiết bị kết thúc. Đây là một Thiết bị luồng chỉ truyền và nhận lưu lượng truy cập unicast qua một Thiết bị mẹ.

> 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 luồng hỗ trợ định tuyến lưu lượng truy cập giữa các thiết bị tạo luồng. Được gọi là Cấp độ gốc.

> state
router
Done

Xác minh mạng

Cách dễ dàng để xác minh mạng lưới là xem bảng bộ định tuyến.

1. Kiểm tra khả năng kết nối

Trên Node 2, hãy nhận RGCP16. RREACH16 là 16 bit cuối cùng của địa chỉ RGCP 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 RGCP16 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 | LQ In  | LQ Out  | Age | Extended MAC   |
+----+--------+----------+-----------+--------+-------+---+--------------------+
| 20 | 0x5000 |       63 |         0 |      0 |     0 |   0 | 96da92ea13534f3b |
| 22 | 0x5800 |       63 |         0 |      3 |     3 |  23 | 5a4eb647eb6bc66c |

Tìm thấy R cốt lõi của nút 2 của 0x5800 trong bảng, xác nhận rằng nút này được kết nối với lưới.

2. Nút ping 1 từ nút 2

Xác minh khả năng kết nối giữa hai thiết bị Luồng đượ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

Giờ đây, bạn có thể ping thành công giữa hai thiết bị Luồng được mô phỏng, hãy kiểm tra mạng lưới bằng cách chọn một nút khi không có mạng.

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, Nút 2 phát hiện rằng biến thể dẫn đầu (Nút 1) đang ngoại tuyến và bạn sẽ thấy Nút chuyển đổi 2 là leader của mạng:

> state
router
Done
...
> state
leader
Done

Sau khi được xác nhận, hãy dừng Luồng và đặt lại Nút 2 về trạng thái ban đầu trước khi thoát trở lại lời nhắc bash của Docker. Quá trình đặt lại về trạng thái ban đầu được thực hiện để đảm bảo rằng thông tin đăng nhập mạng 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
root@c0f3912a74ff:/#

Bạn có thể phải nhấn enter vài lần để khôi phục lời nhắc > sau lệnh factoryreset. Không thoát vùng chứa Docker.

Đồng thời đặt lại và thoát khỏi Nút 1:

> factoryreset
>
> exit
root@c0f3912a74ff:/#

Hãy xem Tài liệu tham khảo về CLI của OpenThread để tìm hiểu tất cả các lệnh CLI có sẵn.

4. Xác thực nút bằng chiến lược Phí hoa hồng

Trong bài tập trước, bạn đã thiết lập Mạng theo luồng với hai thiết bị được mô phỏng và khả năng kết nối đã xác minh. Tuy nhiên, điều 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 chuyển qua lại giữa các thiết bị. Để định tuyến lưu lượng truy cập IPv6 chung trên các thiết bị này (và Internet thông qua bộ định tuyến đường viền Thread), bạn phải xác thực các nút.

Để xác thực, một thiết bị phải hoạt động với vai trò là Uỷ viên. Ủy viên là máy chủ xác thực hiện được chọn cho các thiết bị Luồng mới và người ủy quyền cung cấp thông tin đăng nhập mạng cần thiết để thiết bị tham gia mạng.

Trong bài tập này, chúng ta sẽ sử dụng cấu trúc liên kết hai nút như trước đây. Để xác thực, Lãnh đạo luồng sẽ đóng vai trò là Ủy viên, Bộ định tuyến luồng dưới dạng Người kết hợp.

d6a67e8a0d0b5dcb.png.

Docker

Đối với mỗi Nút (cửa sổ đầu cuối) trong các bài tập còn lại, hãy đảm bảo rằng bạn đang chạy vùng chứa Docker với bản dựng OpenThread. Nếu tiếp tục thực hiện bài tập trước, bạn vẫn cần có hai lời nhắc bash trong cùng một vùng chứa Docker. Nếu không, hãy xem bước Docker Khắc phục sự cố hoặc chỉ cần thực hiện lại bài tập Mô phỏng mạng chuỗi.

1. Tạo mạng

Trong Nút 1, tạo ra quy trình CLI:

root@c0f3912a74ff:/# /openthread/build/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 đây là tập dữ liệu đang hoạt động và bắt đầu Chuỗi:

> 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 dưới dạng 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 giao thức Luồng:

> thread start
Done

Đợi vài giây và xác minh rằng thiết bị đã trở thành Trưởng nhóm luồng:

> state
leader
Done

2. Bắt đầu vai trò Uỷ viên

Khi vẫn ở trên Nút 1, hãy bắt đầu vai trò Uỷ viên:

> commissioner start
Done

Cho phép bất kỳ Người liên kết nào (bằng cách sử dụng ký tự đại diện *) có Thông tin xác thực người kết hợp J01NME sẽ có phí hoa hồng trên mạng. Trình kết hợp 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 kết hợp

Trong cửa sổ dòng lệnh thứ hai, trong vùng chứa Docker, tạo ra một quy trình CLI mới. Đây là Nút 2.

root@c0f3912a74ff:/# /openthread/build/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 kết hợp J01NME.

> ifconfig up
Done
> joiner start J01NME
Done

... hãy đợ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 Uỷ viên (Nút 1) và nhận được thông tin xác thực của Mạng Luồng.

Hiện tại, 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 này 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, hãy dừng Chuỗi cuộc trò chuyện, đặt lại về trạng thái ban đầu và thoát khỏi thiết bị Chuỗi đã mô phỏng:

> thread stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

Bạn có thể phải nhấn enter vài lần để khôi phục lời nhắc > sau lệnh factoryreset.

5. 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ị Luồng SoC duy nhất) và một phiên bản Bộ xử lý vô tuyến (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ụ. Ứ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 cách sử dụng CThread OpenThread 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ị Luồng tạo.

Docker

Đối với mỗi Nút (cửa sổ đầu cuối) trong bài tập này, hãy đảm bảo rằng bạn đang chạy vùng chứa Docker với bản dựng OpenThread. Nếu tiếp tục thực hiện bài tập trước, bạn phải có hai lời nhắc bash trong cùng một vùng chứa Docker đã được mở. Nếu không, hãy xem bước Khắc phục sự cố docker.

Sử dụng ot-daemon

Bài tập này sẽ sử dụng ba cửa sổ dòng lệnh, tương ứng với những mục sau:

  1. Phiên bản CLI của thiết bị Luồng mô phỏng (Nút 1)
  2. Quy trình ot-daemon
  3. Bản sao CLI ot-ctl

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ị Luồng được mô phỏng:

root@c0f3912a74ff:/# /openthread/build/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 đây là tập dữ liệu đang hoạt động và bắt đầu Chuỗi:

> 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 dưới dạng 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 giao thức Luồng:

> thread start
Done

Xem các địa chỉ IPv6 được chỉ định cho giao diện Luồng của Nút 1\39:

> 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à đường liên kết cục bộ (fe80) và 3 địa chỉ là lưới cục bộ (fd). EID là địa chỉ lưới cục bộ không chứa ff:fe00 trong địa chỉ. Trong đầu ra mẫu 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.

2. Bắt đầu biểu diễn ot-daemon

Trong cửa sổ dòng lệnh thứ hai, hãy tạo nút thiết bị tun và đặt quyền đọc/ghi:

root@c0f3912a74ff:/# mkdir -p /dev/net && mknod /dev/net/tun c 10 200
root@c0f3912a74ff:/# chmod 600 /dev/net/tun

Thiết bị này dùng để truyền và nhận gói trong thiết bị ảo. Bạn có thể gặp lỗi nếu thiết bị đã được tạo. Đây là điều bình thường và bạn có thể bỏ qua.

Khởi động ot-daemon cho nút RCP mà chúng ta sẽ gọi là Nút 2. Hãy sử dụng cờ chi tiết -v để bạn có thể xem kết quả nhật ký và xác nhận rằng kết quả đó đang chạy:

root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-daemon -v \
'spinel+hdlc+forkpty:///openthread/build/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[31]: Running OPENTHREAD/297a880; POSIX; Feb  1 2022 04:43:39
ot-daemon[31]: Thread version: 3
ot-daemon[31]: Thread interface: wpan0
ot-daemon[31]: RCP version: OPENTHREAD/297a880; SIMULATION; Feb  1 2022 04:42:50

Để thiết bị đầu cuối này 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 ủy quyền cho Nút 2 (ot-daemon RCP) cho bất kỳ mạng Luồng nào. Đây là lúc ot-ctl xuất hiện. ot-ctl sử dụng cùng CLI 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ị Chuỗi được mô phỏng khác.

Mở cửa sổ dòng lệnh thứ ba và thực thi vùng chứa hiện tại:

$ docker exec -it codelab_otsim_ctnr bash

Khi đang ở trong vùng chứa, hãy bắt đầu ot-ctl:

root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-ctl
>

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

Nhận eui64 của Nút 2 để hạn chế việc tham gia vào Trình tham gia cụ thể:

> eui64
18b4300000000001
Done

Trên Nút 1 (cửa sổ dòng lệnh đầu tiên), hãy bắt đầu Uỷ viên và chỉ cho phép tham gia eui64 đó:

> commissioner start
Done
> commissioner joiner add 18b4300000000001 J01NME
Done

Trong cửa sổ dòng lệnh thứ ba, hiển thị giao diện mạng cho Nút 2 và tham gia mạng:

> ifconfig up
Done
> joiner start J01NME
Done

... hãy đợ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 Uỷ viên (Nút 1) và nhận được thông tin xác thực Mạng chuỗi.

Bây giờ, hãy kết nối Nút 2 với mạng Luồng (một lần nữa, trong cửa sổ dòng lệnh thứ ba):

> thread start
Done

4. Xác thực mạng

Trong thiết bị đầu cuối thứ ba, hãy kiểm tra state trên Nút 2 để xác thực rằng thiết bị này 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 khả năng kết nối

Trong cửa sổ dòng lệnh thứ ba, hãy thoát khỏi ot-ctl bằng cách sử dụng lệnh Ctrl+D hoặc exit và quay lại bảng điều khiển bash của vùng chứa. Trên bảng điều khiển này, ping Node 1, sử dụng EID với lệnh ping6. Nếu phiên bản RCP ot-daemon được tham gia và giao tiếp thành công với mạng Thread, thì ping thành công:

root@c0f3912a74ff:/# 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

6. Khắc phục sự cố Docker

Nếu bạn đã thoát vùng chứa Docker

bash lời nhắc, bạn có thể cần kiểm tra xem thiết bị có đang chạy không và khởi động lại / nhập lại khi cần.

Cách hiển thị vùng chứa Docker nào đang chạy:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
505fc57ffc72        environment       "bash"              10 minutes ago      Up 10 minutes                           codelab_otsim_ctnr

Cách hiển thị tất cả các vùng chứa Docker (cả chạy và dừng):

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
505fc57ffc72        environment       "bash"              10 minutes ago      Up 10 minutes                           codelab_otsim_ctnr

Nếu bạn không thấy vùng chứa codelab_otsim_ctnr trong đầu ra của một trong hai lệnh docker ps, hãy chạy lại vùng chứa đó:

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/environment bash

Nếu vùng chứa đã dừng (được liệt kê trong docker ps -a nhưng không được docker ps), hãy khởi động lại vùng chứa đó:

$ docker start -i codelab_otsim_ctnr

Nếu vùng chứa Docker đã chạy (được liệt kê trong docker ps), hãy kết nối lại với vùng chứa trong mỗi thiết bị đầu cuối:

$ docker exec -it codelab_otsim_ctnr bash

"Thao tác không được phép" lỗi

Nếu gặp lỗi Operation not permitted khi tạo nút OpenThread mới (bằng lệnh mknod), hãy đảm bảo rằng bạn đang chạy Docker với tư cách là người dùng gốc theo các lệnh được cung cấp trong Lớp học lập trình này. Lớp học lập trình này không hỗ trợ chạy Docker ở chế độ không gốc.

7. Xin chúc mừng!

Bạn đã mô phỏng thành công mạng Thread đầu tiên của mình 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:

  • Bắt đầu và quản lý vùng chứa Docker Simulate Docker
  • Mô phỏng Mạng luồng
  • Xác thực các nút Luồng
  • Quản lý mạng Thread bằng OpenThread Daemon

Để tìm hiểu thêm về Thread và OpenThread, hãy khám phá các tài liệu tham khảo sau:

Bạn cũng có thể thử sử dụng OpenThread Border Router trong vùng chứa Docker!