1. Giới thiệu
OpenThread do nhóm Google Nest 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® được thiết kế để đẩy nhanh quá trình phát triển các sản phẩm dành cho nhà thông minh. Thông số kỹ thuật luồng xác định giao thức giao tiếp không dây giữa các thiết bị dựa trên IPv6, đáng tin cậy, an toàn và tiết kiệm năng lượng cho các ứng dụng xây dựng tại nhà và thương mại.
Espressif đã chuyển ngăn xếp OpenThread dựa trên FreeRTOS và LwIP, cho phép các nhà phát triển nhanh chóng xây dựng các mạng Thread. Bạn có thể lấy mã nguồn có liên quan từ GitHub. Đồng thời, Espressif cũng đã triển khai một Bộ định tuyến đường viền luồng dựa trên RTOS.
Trong lớp học lập trình này, bạn sẽ lập trình OpenThread trên phần cứng thực, tạo và quản lý mạng Thread, cũng như truyền thông báo giữa các nút.
Kiến thức bạn sẽ học được
- Xây dựng và cài đặt ROM tệp nhị phân OpenThread CLI cho các bảng ESP.
- Xây dựng và cài đặt ROM bộ định tuyến biên cho bảng Bộ định tuyến đường biên ESP.
- Quản lý các nút Thread theo cách thủ công bằng ESP Monitor và OpenThread CLI.
- Hình thành mạng Thread trên Bộ định tuyến vùng biên theo Thread.
- Bảo mật việc đưa thiết bị vào mạng Thread.
- Ping địa chỉ IPv6 giữa các nút Thread.
- Chuyển thông báo giữa các nút Thread bằng UDP.
Bạn cần có
Phần cứng:
- 2 bảng ESP với các mô-đun IEEE 802.15.4.
- 1 Bảng định tuyến đường biên ESP.
Phần mềm:
2. Bắt đầu
- Cài đặt ESP-IDF.
Vui lòng làm theo Hướng dẫn lập trình ESP-IDF để cài đặt môi trường phát triển phần mềm.
- Sao chép SDK ESP Thread Border Borderr (Bộ định tuyến biên giới luồng ESP).
ESP-string-BR là SDK chính thức của bộ định tuyến đường viền ESP Thread Border. Công cụ này hỗ trợ tất cả các tính năng mạng cơ bản để xây dựng Bộ định tuyến biên theo luồng, đồng thời tích hợp các tính năng phong phú cấp sản phẩm để nhanh chóng sản xuất.
$ cd <your-local-workspace> $ git clone --recursive https://github.com/espressif/esp-thread-br.git
3. Xây dựng và flash
Để tạo và cài đặt ROM tệp nhị phân ot-cli-ftd trên bảng ESP bằng các mô-đun IEEE 802.15.4, bạn có thể tham khảo ví dụ về ESP-IDF ot_cli để biết thêm chi tiết:
$ cd <your-idf-path>/examples/openthread/ot_cli $ idf.py set-target <your-board-type>
Bật tính năng trình kết hợp thông qua menuconfig:
$ idf.py menuconfig
Cấu hình thành phần > OpenThread > Bật trình kết hợp, sau đó tạo và cài đặt ROM.
$ idf.py -p <your-local-port> build flash monitor
Để tạo và cài đặt RCP tệp nhị phân ot-br trên Bảng định tuyến biên giới ESP, trước tiên, bạn cần xây dựng tệp nhị phân RCP. Tệp nhị phân RCP này không cần được cài đặt RCP một cách rõ ràng vào thiết bị trên Bảng định tuyến đường viền ESP. Nó sẽ được bao gồm trong tệp nhị phân Bộ định tuyến biên giới và được cài đặt ROM cho chip ESP32-H2 khi khởi động lần đầu (hoặc chương trình cơ sở RCP đã thay đổi). Bạn có thể tham khảo tài liệu về chuỗi ESP BR để biết thêm chi tiết:
$ cd <your-idf-path>/examples/openthread/ot_rcp $ idf.py set-target esp32h2 $ idf.py build $ cd <your-esp-thread-br-path>/examples/basic_thread_border_router $ idf.py set-target esp32s3
Bật tính năng uỷ quyền thông qua menuconfig:
$ idf.py menuconfig
Cấu hình thành phần > OpenThread > Bật Uỷ viên, sau đó tạo và cài đặt ROM.
$ idf.py -p <your-local-port> build flash monitor
4. Hình thành mạng Thread trên Bộ định tuyến biên giới Thread
Giờ đây, bạn có thể tạo thành một mạng Thread bằng cách sử dụng dòng lệnh OpenThread trên ESP Thread Border Router Board (Uỷ viên BR):
## BR Commissioner ## ---------------------- > dataset init new Done > dataset Active Timestamp: 1 Channel: 21 Channel Mask: 0x07fff800 Ext PAN ID: 151975d11bea97b5 Mesh Local Prefix: fd6a:b54b:d6a3:b05a::/64 Network Key: 731ab6a60a64a0a0b14b259b86b2be01 Network Name: OpenThread-1444 PAN ID: 0x1444 PSKc: 54e7f18d2575014da94db09df29c5df0 Security Policy: 672 onrc 0 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 I (59329) OPENTHREAD: Platform UDP bound to port 49153 Done I (59329) OT_STATE: netif up
Bắt đầu thao tác với giao thức Thread:
> thread start I(61709) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(62469) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(69079) OPENTHREAD:[N] RouterTable---: Allocate router id 11 I(69079) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c00 I(69089) OPENTHREAD:[N] Mle-----------: Role detached -> leader I(69089) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 I (69099) OPENTHREAD: Platform UDP bound to port 49154
Sau giây lát, hãy kiểm tra trạng thái thiết bị. Người đó phải là Thủ lĩnh.
> state leader Done >
5. Tham gia mạng Thread bằng khoá mạng
Trong lớp học lập trình này, 2 bảng ESP với các mô-đun IEEE 802.15.4 đã được chuẩn bị để tham gia mạng do Brazil hình thành. Trong buổi hội thảo này, chúng ta sẽ thêm Bảng 1 vào mạng.
Lấy khoá mạng từ Brazil:
## BR Commissioner ## ---------------------- > networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done >
Thiết lập mã mạng này thành một bo mạch ESP (Board1 Joiner) với các mô-đun IEEE 802.15.4:
## Board1 Joiner ## ---------------------- > dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01 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 I (20308) OT_STATE: netif up
Bắt đầu thao tác với giao thức Thread:
> thread start I(23058) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(23408) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(30028) OPENTHREAD:[N] Mle-----------: Attach attempt 1 unsuccessful, will try again in 0.288 seconds I(30328) OPENTHREAD:[N] Mle-----------: Attach attempt 2, AnyPartition I(33498) OPENTHREAD:[N] Mle-----------: Delay processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Role detached -> disabled I(33758) OPENTHREAD:[N] Mle-----------: Role disabled -> detached I(34178) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition I(35068) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c01 I(35068) OPENTHREAD:[N] Mle-----------: Role detached -> child
Sau giây lát, hãy kiểm tra trạng thái thiết bị. Đó phải là Tài khoản con.
> state child Done
Đặt vai trò thành Bộ định tuyến.
> state router Done I(51028) OPENTHREAD:[N] Mle-----------: RLOC16 2c01 -> 2800 I(51028) OPENTHREAD:[N] Mle-----------: Role child -> router I(51028) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >
6. Tham gia mạng Thread bằng chế độ thiết lập bảo mật
Trong buổi hội thảo này, chúng ta sẽ thêm Board2 vào mạng thông qua chế độ cài đặt bảo mật:
Nhận PSKc và panid từ Ủy viên Brazil:
## BR Commissioner ## ---------------------- > pskc 54e7f18d2575014da94db09df29c5df0 Done > panid 0x1444 Done
Định cấu hình thông tin mạng cho Board2:
## Board2 Joiner ## ---------------------- > dataset pskc 54e7f18d2575014da94db09df29c5df0 Done > dataset panid 0x1444 Done
Xác nhận tập dữ liệu này là tập dữ liệu đang hoạt động:
## Board2 Joiner ## ---------------------- > dataset commit active Done
Hiển thị giao diện IPv6:
## Board2 Joiner ## ---------------------- > ifconfig up Done I (29146) OT_STATE: netif up
Tải eui64 từ Board2:
## Board2 Joiner ## ---------------------- > eui64 4831b7fffec02be1 Done
Trên Uỷ viên Brazil, hãy bắt đầu uỷ viên và chỉ định eui64
của thiết bị có thể tham gia, cùng với Thông tin xác thực tham gia, ví dụ: J01NME
. Thông tin xác thực Joiner là một chuỗi dành riêng cho thiết bị gồm tất cả các ký tự chữ-số viết hoa (0-9 và A-Y, ngoại trừ I, O, Q và Z để dễ đọc), có độ dài từ 6 đến 32 ký tự.
## BR Commissioner ## ---------------------- > commissioner start Commissioner: petitioning Done Commissioner: active > commissioner joiner add 4831b7fffec02be1 J01NME Done
Chuyển sang Board2 Joiner. Bắt đầu vai trò người tham gia bằng Thông tin xác thực người tham gia mà bạn vừa thiết lập cho uỷ viên Brazil:
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
Trong vòng một phút, bạn sẽ nhận được thông báo xác nhận xác thực thành công:
## Board2 Joiner ## ---------------------- > Join success
Sau đó, bạn có thể bắt đầu và tham gia mạng lưới Chủ đề do Ủy viên trưởng Brazil thành lập.
Bắt đầu thao tác với giao thức Thread:
> thread start I(35727) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(36197) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(37007) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2801 I(37007) OPENTHREAD:[N] Mle-----------: Role detached -> child
Đặt vai trò thành Bộ định tuyến.
> state router Done I(46057) OPENTHREAD:[N] Mle-----------: RLOC16 2801 -> 4400 I(46057) OPENTHREAD:[N] Mle-----------: Role child -> router I(46057) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >
Bây giờ, bạn sẽ có một mạng Thread với cấu trúc liên kết hiển thị bên dưới:
7. Ping địa chỉ IPv6 giữa các nút Thread
Bạn có thể sử dụng lệnh ping để giao tiếp giữa hai bảng bất kỳ. Sử dụng lệnh ipaddr
để in địa chỉ IPv6 của từng bảng:
## BR Commissioner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fd6a:b54b:d6a3:b05a:0:ff:fe00:2c00 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 # Mesh-Local EID (ML-EID) fe80:0:0:0:687c:7248:cc14:9c4d # Link-Local Address (LLA) Done >
## Board1 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:2800 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 # Mesh-Local EID (ML-EID) fe80:0:0:0:18ac:df04:4671:6a45 # Link-Local Address (LLA) Done
## Board2 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:4400 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc # Mesh-Local EID (ML-EID) fe80:0:0:0:a8cc:1483:f696:91a2 # Link-Local Address (LLA) Done
Ví dụ: để ping Board2 MLE-ID từ BR Commissioner, bạn có thể chạy lệnh này trên BR Commissioner:
## BR Commissioner ## ---------------------- > ping fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc 16 bytes from fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc: icmp_seq=1 hlim=255 time=123ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 123/123.0/123 ms. Done
8. Chuyển thông báo giữa các nút Thread bằng UDP
Trong buổi học này, bạn sẽ tìm hiểu cách gửi tin nhắn giữa hai thiết bị sử dụng giao thức Thread. Ví dụ: mở udp và liên kết nó trên cổng 20617
và theo dõi tất cả các địa chỉ trên BR:
## BR Commissioner ## ---------------------- > udp open Done > udp bind :: 20617 I (1298739) OPENTHREAD: Platform UDP bound to port 20617 Done
Sau đó, gửi tin nhắn từ Board1 đến địa chỉ BR MLE-ID và cổng 20617
:
## Board1 Joiner ## ---------------------- > udp open Done > udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP
Bạn có thể xem tin nhắn nhận được ở Brazil:
## BR Commissioner ## ---------------------- 3 bytes from fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 49154 ESP
9. Xin chúc mừng!
Bạn đã tạo một mạng Thread thực tế bằng các bảng ESP!
Giờ đây, bạn đã biết:
- Xây dựng và cài đặt ROM tệp nhị phân OpenThread CLI cho các bảng ESP.
- Xây dựng một bộ định tuyến biên nhấp nháy cho bảng Bộ định tuyến đường biên ESP Thread.
- Quản lý các nút Thread theo cách thủ công bằng ESP Monitor và OpenThread CLI.
- Hình thành mạng Thread trên Bộ định tuyến vùng biên theo Thread.
- Bảo mật việc đưa thiết bị vào mạng Thread.
- Ping địa chỉ IPv6 giữa các nút Thread.
- Chuyển thông báo giữa các nút Thread bằng UDP.
Tài liệu đọc thêm
Bạn có thể truy cập vào openthread.io và GitHub để xem nhiều tài nguyên về OpenThread, bao gồm:
- Nền tảng được hỗ trợ — khám phá tất cả các nền tảng hỗ trợ OpenThread
- Xây dựng OpenThread – tìm hiểu thêm thông tin chi tiết về cách tạo và định cấu hình OpenThread
- Thread Primer — bao gồm tất cả các khái niệm về Thread có trong lớp học lập trình này
Tham khảo: