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. Google Nest đã ra mắt OpenThread để cung cấp rộng rãi công nghệ dùng 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 sản phẩm dành cho nhà thông minh.
Thông số kỹ thuật Thread xác định giao thức giao tiếp giữa các thiết bị không dây đáng tin cậy, an toàn và tiết kiệm năng lượng dựa trên IPv6 cho các ứng dụng trong nhà. OpenThread thực hiện 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, thành lập liên kết lưới và định tuyến lưới.
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 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ụ tạo OpenThread
- Cách mô phỏng mạng Thread
- Cách xác thực nút Thread
- 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. Bạn nên sử dụng môi trường Linux.
Cài đặt Docker
Cài đặt Docker trên hệ điều hành 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 rồi 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 khởi động 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
Tuỳ chọn --rm
sẽ xoá vùng chứa khi bạn thoát khỏi vùng chứa. Không sử dụng lựa chọn này nếu bạn không muốn xoá vùng chứa.
Lưu ý về các cờ 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ẽ thấy 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ã xuất hiện trong lời nhắc của 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 bạn đã nắm được kiến thức cơ bản về việc sử dụng Docker. Bạn nên ở trong vùng chứa Docker trong toàn bộ lớp học lập trình này.
3. Mô phỏng 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ạ một ứng dụng OpenThread tối giản 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ị Thread được mô phỏng qua một thiết bị Thread được mô phỏng khác.
Hình dưới đây 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 2 nút trong vòng tròn màu xanh lục: Thread Leader và Thread Router (Bộ định tuyến luồng) có một kết nối duy nhất giữa chúng.
Tạo mạng
1. Bắt đầu Nút 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 rồi 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
Trong vùng chứa Docker, hãy tạo quy trình CLI cho một 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 nền UDP (khung hình IEEE 802.15.4 được truyền trong tải trọng UDP).
Đối số của 1
là chỉ số mô tả tệp đại diện cho các bit có ý nghĩa nhỏ nhất trong thuộc tính "do nhà máy 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 một cổng UDP để mô phỏng vô tuyến IEEE 802.15.4 (cổng = 9000 + bộ mô tả tệp). Mỗi thực thể của 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 chỉ số mô tả tệp từ 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 một 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 một Tập dữ liệu hoạt động mới và cam kết tập đó là tập đang hoạt động. Tập dữ liệu hoạt động là cấu hình cho mạng Thread 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 thao tác với giao thức Thread:
> thread start Done
Đợi vài giây rồi xác minh rằng thiết bị đã trở thành Thread Leader (Trưởng nhóm luồng). Người lãnh đạo là thiết bị chịu trách nhiệm quản lý việc chỉ định mã 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 (đầ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
= Grid-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 vị bộ định tuyến (rlOC) - Không chứa
ff:fe00
= Giá trị 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, ghi lại thông tin này để 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. Khởi động nút 2
Mở một thiết bị đầu cuối mới và thực thi một 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, hãy tạo quy trình CLI với đối số 2
. Đây là thiết bị Thread được mô phỏng thứ hai:
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 Khoá mạng chuỗi và mã PAN, 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 thao tác với giao thức Thread:
> thread start Done
Thiết bị sẽ tự khởi tạo dưới dạng một Cấp độ con. Con Thread tương đương với một 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ỉ bằng 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 có thể định tuyến lưu lượng truy cập giữa các thiết bị Thread. Nó 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. Hãy kiểm tra khả năng kết nối
Trên Nút 2, hãy lấy rlOC16. rlOC16 là 16 bit cuối cùng trong đị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 để tìm 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 của 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 rlOC của nút 2 là 0x5800
trong bảng, xác nhận rằng nút này đã 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 2 thiết bị Thread được mô phỏng. Trong Nút 2, ping
EID được gán 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 đưa một nút vào chế độ ngoại tuyến.
Quay lại Nút 1 và dừng Thread:
> thread stop Done
Chuyển sang Nút 2 và kiểm tra trạng thái. Trong vòng 2 phút, Nút 2 phát hiện ra rằng trưởng nhóm (Nút 1) đang 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 xác nhận, hãy dừng Thread và đặt lại Nút 2 về trạng thái ban đầu trước khi quay lại lời nhắc bash
của Docker. Chúng tôi sẽ đặt lại về trạng thái ban đầu để đảm bảo thông tin đăng nhập mạng Thread mà chúng ta đã sử 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 để hiển thị 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 Nút 1:
> factoryreset > > exit root@c0f3912a74ff:/#
Xem Tài liệu tham khảo về CLI của OpenThread để khám phá tất cả các lệnh CLI hiện có.
4. Xác thực các nút bằng tính năng uỷ quyền
Trong bài tập trước, bạn đã thiết lập một mạng Thread gồm 2 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 truyền giữa các thiết bị. Để định tuyến lưu lượng truy cập IPv6 toàn cầu giữa các nút này (và Internet thông 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 hoạt động với vai trò là Uỷ viên. Uỷ viên này là máy chủ xác thực hiện được chọn cho các thiết bị Thread mới và là người uỷ 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, Thread Leader sẽ đóng vai trò là Commissioner (Uỷ viên), Thread Router (Bộ định tuyến luồng) đóng vai trò là Joiner.
Docker
Đối với mỗi Nút (cửa sổ thiết bị đầu cuối) trong các bài tập còn lại, hãy đảm bảo bạn đang chạy vùng chứa Docker bằng bản dựng OpenThread. Nếu tiếp tục bài tập trước, bạn vẫn sẽ 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 hoặc chỉ cần làm lại bài tập Mô phỏng mạng Thread.
1. Tạo một mạng
Trong Nút 1, hãy tạo 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 một Tập dữ liệu hoạt động mới, xác nhận tập đó là tập đang hoạt động và bắt đầu Thread:
> 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 thao tác với giao thức Thread:
> thread start Done
Chờ vài giây rồi xác minh rằng thiết bị đã trở thành Thread Leader (Trưởng nhóm luồng):
> 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 mọi Người tham gia (bằng cách dùng ký tự đại diện *
) có Chứng chỉ danh tính người tham gia J01NME
để truy cập vào mạng. Tham gia là một thiết bị do quản trị viên con người thêm vào một Mạng luồng được uỷ quyền.
> commissioner joiner add * J01NME Done
3. Bắt đầu vai trò Tham gia
Trong cửa sổ dòng lệnh thứ hai, trong vùng chứa Docker, hãy tạo 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 của người tham gia J01NME
.
> ifconfig up Done > joiner start J01NME Done
... đợi vài giây để xác nhận ...
Join success
Là một 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 Thread.
Giờ đây, Nút 2 đã được xác thực, hãy bắt đầu Thread:
> thread start Done
4. Xác thực 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 đã kết nối với mạng. Trong vòng 2 phút, Nút 2 sẽ 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 Thread, đặt lại về trạng thái ban đầu và thoát khỏi thiết bị Thread được mô phỏng:
> thread stop Done > factoryreset > > exit root@c0f3912a74ff:/#
Bạn có thể phải nhấn enter
vài lần để hiển thị lại 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 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 như 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 sử dụng OpenThread CLI làm giao thức.
ot-ctl
là một 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.
Docker
Đối với mỗi Nút (cửa sổ thiết bị đầu cuối) trong bài tập này, hãy đảm bảo bạn đang chạy vùng chứa Docker bằng bản dựng OpenThread. Nếu tiếp tục từ bài tập trước, bạn sẽ có 2 lời nhắc bash
trong cùng một vùng chứa Docker đang 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ị luồng được mô phỏng (Nút 1)
- Quy trình
ot-daemon
ot-ctl
thực thể CLI
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ị Thread đượ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 một Tập dữ liệu hoạt động mới, xác nhận tập đó là tập đang hoạt động và bắt đầu Thread:
> 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 thao tác với giao thức Thread:
> thread start Done
Xem các địa chỉ IPv6 được chỉ định 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 Thread, 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ỉ cục bộ dạng lưới không chứa ff:fe00
trong địa chỉ. Trong dữ liệu đầ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
. Giá trị này sẽ được dùng để giao tiếp với nút.
2. Bắt đầu ot-daemon
Trong cửa sổ dòng lệnh thứ hai, hãy tạo một nút thiết bị tun
và thiết lập 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 các 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 một nút RCP. Chúng ta sẽ gọi nút này 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 nó đ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
Để cửa sổ dòng lệnh này mở và chạy trong nền. Bạn sẽ không nhập thêm lệnh nào vào đó.
3. Sử dụng ot-ctl để kết nối mạng
Chúng tôi chưa uỷ quyền Nút 2 (RCP ot-daemon
) cho bất kỳ mạng Thread nào. Đây là lúc ot-ctl
xuất hiện. 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ị Thread 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 có:
$ docker exec -it codelab_otsim_ctnr bash
Sau 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ổ 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 bằng 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ới Trình kết hợp cụ thể:
> eui64 18b4300000000001 Done
Trên Nút 1 (cửa sổ thiết bị đầu cuối đầu tiên), hãy khởi động Uỷ viên và hạn chế chỉ tham gia eui64 đó:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
Trong cửa sổ dòng lệnh thứ ba, hãy hiển thị giao diện mạng cho Nút 2 và kết nối mạng:
> ifconfig up Done > joiner start J01NME Done
... đợi vài giây để xác nhận ...
Join success
Là một 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 của Mạng Thread.
Bây giờ, hãy kết nối Nút 2 với mạng Thread (một lần nữa, trong cửa sổ dòng lệnh thứ ba):
> thread start Done
4. Xác thực xác thực mạng
Trong thiết bị đầu cuối thứ ba, kiểm tra state
trên Nút 2 để xác thực rằng nút này hiện đã kết nối với mạng. Trong vòng 2 phút, Nút 2 sẽ 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
rồi 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, hãy ping Nút 1, sử dụng EID của nút đó qua lệnh ping6
. Nếu thực thể RCP ot-daemon
đã liên kết và giao tiếp thành công với mạng Thread, thì lệnh ping sẽ 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ố liên quan đến Docker
Nếu bạn đã thoát khỏi vùng chứa Docker
bash
lời nhắc, bạn có thể phải kiểm tra xem lời nhắc đó có đang chạy hay không và khởi động lại / nhập lại nếu cần. Mọi vùng chứa Docker mà bạn đã tạo mà không sử dụng tuỳ chọn --rm
vẫn sẽ tồn tại.
Cách cho biết những vùng chứa Docker đ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ả đ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 kết quả của lệnh docker ps
, hãy chạy lại lệnh đó:
$ docker run --name codelab_otsim_ctnr -it --rm \ --sysctl net.ipv6.conf.all.disable_ipv6=0 \ --cap-add=net_admin openthread/environment bash
Chỉ sử dụng tuỳ chọn --rm
nếu bạn muốn xoá vùng chứa khi thoát khỏi vùng chứa.
Nếu vùng chứa bị dừng (được liệt kê trong docker ps -a
nhưng không phải là 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 đang 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
"Không được phép thực hiện thao tác" các lỗi
Nếu bạn gặp lỗi Operation not permitted
khi tạo nút OpenThread mới (sử dụng lệnh mknod
), hãy đảm bảo 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 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:
- Khởi động và quản lý vùng chứa Docker mô phỏng OpenThread
- Mô phỏng mạng Thread
- Xác thự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:
- Chủ đề thảo luận cho chủ đề trên Openthread.io
- Quy cách của luồng
- Kho lưu trữ OpenThread GitHub
- Tài liệu tham khảo về OpenThread CLI
- Hỗ trợ thêm OpenThread Docker
Bạn cũng có thể thử sử dụng OpenThread Border Router trong vùng chứa Docker!