1. Giới thiệu
OpenThread do Google phát hành là triển khai nguồn mở của giao thức mạng Thread. Google Nest đã phát hành OpenThread để cung cấp công nghệ này trong các sản phẩm Nest cho nhiều nhà phát triển, giúp đẩy nhanh quá trình phát triển sản phẩm cho nhà thông minh.
Thông số kỹ thuật của luồng xác định giao thức giao tiếp giữa thiết bị và thiết bị không dây với độ tin cậy, dựa trên IPv6 dành 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, Mesh Link SETUP và Mesh Route.
Lớp học lập trình này sẽ hướng dẫn bạn cách mô phỏng mạng Thread trên 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 chuỗi
- Cách xác thực nút Luồng
- Cách quản lý mạng Thread bằng OpenThread Daemon
Bạn cần có
- Docker
- 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 Docker được cài đặt, hãy mở cửa sổ dòng lệnh và kéo hình ảnh Docker openthread/environment
. Hình ảnh này bao gồm 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ổ thiết bị đầu cuối, hãy bắt đầu vùng chứa Docker từ hình ảnh và kết nối với vỏ bash
của hình ảnh:
$ docker run --name codelab_otsim_ctnr -it --rm \ --sysctl net.ipv6.conf.all.disable_ipv6=0 \ --cap-add=net_admin openthread/environment bash
Xin lưu ý rằng các cờ này là bắt buộc đối với Lớp học lập trình này:
--sysctl net.ipv6.conf.all.disable_ipv6=0
— thao tác này sẽ 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 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 phiên bản 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 đã biết kiến thức cơ bản về việc sử dụng Docker. Bạn nên duy trì trong vùng chứa Docker cho toàn bộ Lớp học lập trình.
3. Mô phỏng một mạng Chuỗi
Ứng dụng mẫu bạn sẽ sử dụng cho Lớp học lập trình này minh họa ứng dụng OpenThread tối thiểu để hiển thị giao diện quản lý và cấu hình 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 đã mô phỏng từ một thiết bị Luồng khác được mô phỏng.
Hình bên dưới mô tả 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ây: Một đường kẻ dẫn đầu và Bộ định tuyến luồng bằng một kết nối duy nhất giữa chúng.
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 màn hình 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, xuất hiện quy trình CLI cho thiết bị Chuỗi đã mô phỏng bằ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 vào 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 chuyển trong tải trọng UDP).
Đối số của 1
là phần mô tả tệp thể hiện các bit ít quan trọng nhất của "Factory do Hoạt động chỉ định" IEEE EUI-64 cho thiết bị được 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 radio IEEE 802.15.4 (cổng = 9000 + bộ mô tả tệp). Mỗi bản sao của một thiết bị Chuỗi được mô phỏng 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 trình mô tả tệp 1
trở lên như đã ghi chú trong Lớp học lập trình này khi tạo ra quy trình cho thiết bị được mô phỏng. Phần 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à cam kết đó là dữ liệu đang hoạt động. Tập dữ liệu hoạt động là cấu hình cho Mạng chuỗi 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
Cam kết 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 thao tác Giao thức chuỗi:
> thread start Done
Đợi vài giây và xác minh rằng thiết bị đã trở thành Trưởng nhóm chuỗi. Trưởng nhóm 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 các địa chỉ IPv6 được chỉ định cho giao diện Thread của Nút 1\39; đầu ra của bạn sẽ khác nhau):
> 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ỉ mạng địa phương được phân loại thêm:
- Chứa
ff:fe00
= Bộ định tuyến bộ định tuyến (RLAT) - Không chứa
ff:fe00
= Mã nhận dạng điểm cuối (EID)
Xác định EID trong dữ liệu đầu ra của bảng điều khiển. Hãy ghi chú lại để sử dụng sau này. Trong kết quả mẫu ở trên, EID là:
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. Bắt đầu Nút 2
Mở một thiết bị đầu cuối mới và thực thi một khung bash
trong vùng chứa Docker hiện đang chạy để 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 ra quy trình CLI với đối số 2
. Đây là thiết bị Chuỗi 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 vào enter
.
Định cấu hình Khóa mạng Thread và Mã PAN, sử dụng các giá trị giống như Tập dữ liệu hoạt động của Nút 1\39:
> dataset networkkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
Cam kết 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 thao tác Giao thức chuỗi:
> thread start Done
Thiết bị sẽ tự khởi chạy với tư cách là trẻ em. Phần tử con Thread tương đương với Thiết bị cuối, là một thiết bị Thread truyền và nhận lưu lượng truy cập unicast chỉ với một Thiết bị mẹ.
> state child Done
Trong vòng 2 phút, bạn sẽ thấy nút chuyển trạng thá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ị Thread. Đây cũng đượ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 tình trạng kết nối
Trên Nút 2, hãy nhận RLAT16. RLAT16 là 16 bit cuối cùng của địa chỉ RLAT 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 RLAT16 của Nút 2. Trước tiên, hãy đảm bảo rằng 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 RLAT 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 1 từ nút 2
Xác minh khả năng kết nối giữa hai thiết bị Chuỗi đã 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ị Chuỗi được mô phỏng, kiểm tra mạng lưới bằng cách đưa một nút vào chế độ ngoại tuyến.
Quay lại Nút 1 và dừng Chuỗi:
> 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 thấy biến thể dẫn đầu (Nút 1) ngoại tuyến và bạn sẽ thấy Nút 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 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 Docker bash
. Thao tác đặ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 sẽ 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 để đưa lại lời nhắc >
sau lệnh factoryreset
. Không thoát khỏi vùng chứa Docker.
Đồng thời đặt lại về trạng thái ban đầu và thoát khỏi Nút 1:
> factoryreset > > exit root@c0f3912a74ff:/#
Xem Tham khảo OpenLI CLI để khám phá tất cả các lệnh CLI có sẵn.
4. Xác thực nút bằng tính năng Phí hoa hồng
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à 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ộ liên kết IPv6 chưa được xác thực chuyển giữa các thiết bị. Để định tuyến lưu lượng truy cập IPv6 chung giữa các nguồn này (và Internet qua bộ định tuyến biên của 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à Ủy viên. Ủy viên là máy chủ xác thực hiện được bầu cho các thiết bị Chuỗi mới và 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.
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, Trưởng nhóm chuỗi sẽ đóng vai trò là Ủy viên, Bộ định tuyến chuỗi với tư cách là Người tham gia.
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 từ 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 đã mở. Nếu không, hãy xem bước Khắc phục sự cố Docker 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, đưa 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 vào enter
.
Tạo Tập dữ liệu hoạt động mới, chỉ định tập dữ liệu đó 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
Cam kết 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 thao tác Giao thức chuỗi:
> thread start Done
Đợi vài giây và xác minh rằng thiết bị đã trở thành Trưởng nhóm chuỗi:
> state leader Done
2. Bắt đầu vai trò Ủy viên
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ùng với Thông tin xác thực người tham gia J01NME
sẽ được uỷ quyền trên mạng. Người tham gia là một thiết bị do quản trị viên con người thêm vào Mạng chuỗi được ủy quyền.
> commissioner joiner add * J01NME Done
3. Bắt đầu vai trò Người tham gia
Trong cửa sổ thiết bị đầu cuối 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 tham gia bằng thông tin đăng nhập J01NME
của người tham gia.
> ifconfig up Done > joiner start J01NME Done
... hãy đợi vài giây để xác nhận ...
Join success
Là Người tham gia, thiết bị (Nút 2) đã 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ờ, Nút 2 đã được xác thực, hãy bắt đầu Chuỗi
> thread start Done
4. Xác thực quy trình xác thực mạng
Kiểm tra state
trên Nút 2 để xác thực rằng thiết bị hiện đã kết nối với mạng. Trong vòng hai phút, Nút 2 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 Luồng, thực hiệ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 để đưa lại lời nhắc >
sau lệnh factoryreset
.
5. 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 phiên bản CLI (một thiết bị Chuỗi SoC được nhúng) và một phiên bản Bộ xử lý vô tuyến (RCP).
ot-daemon
là chế độ của ứng dụng OpenThread Posix sử dụng cổng UNIX làm đầu vào và đầu ra để lõi OpenThread có thể chạy dưới dạng dịch vụ. Ứng dụng 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ổng bằng cách sử dụng giao thứ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. Sử dụng công cụ này, chúng ta sẽ kết nối RCP với mạng do thiết bị Chuỗi.
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 từ bài tập trước, bạn nên có 2 lời nhắc bash
trong cùng một vùng chứa Docker đã 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 3 cửa sổ dòng lệnh, tương ứng với các điều kiện sau:
- Phiên bản CLI của thiết bị Chuỗi đã mô phỏng (Nút 1)
ot-daemon
quá trình- Phiên bản CLI
ot-ctl
1. Nút bắt đầu 1
Trong cửa sổ thiết bị đầu cuối đầu tiên, hãy hiển thị quy trình CLI cho thiết bị Tạo chuỗi mà bạn 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 vào enter
.
Tạo Tập dữ liệu hoạt động mới, chỉ định tập dữ liệu đó 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
Cam kết 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 thao tác Giao thức chuỗi:
> 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 ở địa phương (fe80
) và ba địa chỉ là lưới cục bộ (fd
). EID là địa chỉ mạng cục bộ 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
sẽ được dùng để giao tiếp với nút.
2. Khởi động ot-daemon
Trong cửa sổ thiết bị đầu cuối thứ hai, hãy tạo một 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 dữ liệu trong các thiết bị ảo. Bạn có thể gặp lỗi nếu thiết bị đã được tạo — điều này là bình thường và có thể bỏ qua.
Khởi động ot-daemon
cho nút RCP, chúng ta sẽ gọi nút này là Nút 2. Dùng cờ chi tiết -v
để xem kết quả nhật ký và xác nhận rằng thẻ đ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
trong chế độ chi tiết 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 ở chế độ 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 thác Nút 2 (RCP) ot-daemon
cho bất kỳ mạng Chuỗi nào. Đây là lúc ot-ctl
hoạt động. ot-ctl
sử dụng cùng CLI với ứng dụng OpenThread CLI. Do đó, bạn có thể điều khiển các nút ot-daemon
theo cách tương tự như các thiết bị Chuỗi khác được mô phỏng.
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 đã ở 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ổ đầu cuối thứ ba này để quản lý Nút 2 (nút RCP) mà bạn đã bắt đầu trong cửa sổ đầu cuối thứ hai bằng ot-daemon
. Kiểm tra state
của Nút 2:
> state disabled Done
Nhận eui64
Nút 2\39; để hạn chế việc tham gia người Tham gia cụ thể:
> eui64 18b4300000000001 Done
Trên Nút 1 (cửa sổ đầu tiên của thiết bị đầu cuối), hãy khởi động Ủy viên và hạn chế chỉ tham gia vào eui64 đó:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
Trong cửa sổ thiết bị đầu cuối 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
Là Người tham gia, RCP (Nút 2) đã 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 Chuỗi (một lần nữa, trong cửa sổ đầu cuối thứ ba):
> thread start Done
4. Xác thực quy trình 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ị hiện đã kết nối với mạng. Trong vòng hai phút, Nút 2 chuyển từ child
sang router
:
> state child Done ... > state router Done
5. Xác thực kết nối
Trong cửa sổ thiết bị đầu cuối thứ ba, hãy thoát khỏi ot-ctl
bằng cách 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. Từ bảng điều khiển này, ping nút 1, sử dụng EID với lệnh ping6
. Nếu phiên bản RCP ot-daemon
được kết nối 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ố của Docker
Nếu bạn đã thoát khỏi vùng chứa Docker
bash
lời nhắc, bạn có thể cần kiểm tra xem tính năng này có đang chạy và khởi động lại/vào lại hay không nếu cần.
Cách cho biết những 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ả vùng chứa Docker (cả hai đều đang 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 dữ liệu đầu ra của 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 bị xóa), hãy khởi động lại docker ps
:
$ 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
"Hoạt động không được phép" lỗi
Nếu gặp lỗi Operation not permitted
khi tạo các nút OpenThread mới (sử dụ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ế độ 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 Do Open Sau Docker mô phỏng
- Mô phỏng một mạng Chuỗi
- Xác thực nút nút trên chuỗi
- 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:
- Sơn lót chuỗi trên Openthread.io
- Quy cách của chuỗi cuộc trò chuyện
- Kho lưu trữ OpenThread GitHub
- Tài liệu tham khảo về CLI của OpenThread
- Hỗ trợ Opencker Docker bổ sung
Hoặc, hãy thử sử dụng Bộ định tuyến đường viền OpenThread trong vùng chứa Docker!