Xây dựng mạng Thread với ESP32H2 và ESP Thread Border Router Board

1. Giới thiệu

26b7f4f6b3ea0700.png.

OpenThread do nhóm Google Nest phát hành là một bản 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 sản phẩm cho nhà thông minh. Thông số kỹ thuật luồng 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 dành cho các ứng dụng xây dựng gia đì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 mạng Thread. Bạn có thể lấy mã nguồn liên quan từ GitHub. Đồng thời, Espressif cũng đã triển khai 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 điệp giữa các nút.

Espressif_hardware_setup.jpg

Kiến thức bạn sẽ học được

  • Xây dựng và cài đặt tệp nhị phân OpenThread CLI vào các bảng ESP.
  • Xây dựng và cài đặt ROM bộ định tuyến biên vào bảng Bộ định tuyến đường viền luồng ESP.
  • Quản lý thủ công các nút Thread bằng ESP Monitor và OpenThread CLI.
  • Hình thành một mạng Thread trên Bộ định tuyến đường viền Thread.
  • Bảo mật cho thiết bị chạy trên mạng Thread.
  • Ping địa chỉ IPv6 giữa các nút Thread.
  • Truyề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 bo mạch ESP với các mô-đun IEEE 802.15.4.
  • 1 Bảng bộ định tuyến đường viền luồng ESP.

Phần mềm:

2. Bắt đầu

  1. 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.

  1. Sao chép SDK Bộ định tuyến đường viền luồng ESP.

ESP-THREAD-BR là SDK chính thức của Bộ định tuyến đường viền luồng ESP. Nền tảng 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 đường viền Thread, đồ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. Tạo và cài đặt ROM

Để xây dựng 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 Joiner, sau đó tạo bản dựng và flash.

$ 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 đường viền luồng 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 phải đượ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 luồng ESP. Nó sẽ được đưa vào tệp nhị phân Border Router và được flash vào 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ề BR Thread ESP để 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ỷ viê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 đường viền Thread

Bây giờ, bạn có thể tạo một mạng Thread bằng cách sử dụng dòng lệnh OpenThread trên Bảng định tuyến đường viền luồng ESP (BR Commissioner):

## 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à Người lãnh đạo.

> state
leader
Done
> 

5. Tham gia mạng Thread thông qua 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ị để kết nối với mạng hình thành ở Brazil. Trong phiên đào tạo này, chúng ta sẽ thêm Board1 vào mạng.

Lấy khoá mạng từ Brazil:

## BR Commissioner ##
----------------------
> networkkey
731ab6a60a64a0a0b14b259b86b2be01
Done
> 

Đặt khoá mạng này thành một bảng 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à Child.

> state
child
Done

Thiết lập vai trò cho 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
> 

esp_ot_tp_LR.jpg

6. Tham gia mạng Thread thông qua phương thức vận hành an toàn

Trong phiên họp này, chúng ta sẽ thêm Board2 vào mạng lưới thông qua hoạt động chạy thử 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 Hội viên cấp cao Brazil, khởi động trình điều phối và chỉ định eui64 của thiết bị có thể tham gia, cùng với Thông tin xác thực của người tham gia, ví dụ: J01NME. Chứng chỉ Tham gia là một chuỗi dành riêng cho thiết bị gồm tất cả các ký tự chữ và số viết hoa (0-9 và A-Y, ngoại trừ I, O, Q và Z để dễ đọc), với độ 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 (Trình tham gia Board2). Bắt đầu vai trò tham gia bằng Chứng chỉ người tham gia mà bạn vừa thiết lập cho Ủy 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 Thread do Uỷ viên Brazil tạo.

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

Thiết lập vai trò cho 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ẽ nhận được một mạng Thread với cấu trúc liên kết như bên dưới:

esp_ot_tp_LRR.jpg

7. Ping địa chỉ IPv6 giữa các nút luồng

Bạn có thể 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 mỗi 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ừ Ủy viên BR, bạn có thể chạy lệnh này trên Ủy viên BR:

## 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 phiên này, bạn sẽ tìm hiểu cách gửi tin nhắn giữa 2 thiết bị Thread. Ví dụ: mở udp và liên kết udp trên cổng 20617 rồi theo dõi tất cả địa chỉ trên Brazil:

## 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 thông báo nhận được vào ngày BR:

## 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 bảng ESP!

esp_ot_final_topology.jpg

Giờ đây, bạn đã biết:

  • Xây dựng và cài đặt tệp nhị phân OpenThread CLI vào các bảng ESP.
  • Xây dựng bộ định tuyến biên nhấp nháy trên bảng Bộ định tuyến đường viền luồng ESP.
  • Quản lý thủ công các nút Thread bằng ESP Monitor và OpenThread CLI.
  • Hình thành một mạng Thread trên Bộ định tuyến đường viền Thread.
  • Bảo mật cho thiết bị chạy trên mạng Thread.
  • Ping địa chỉ IPv6 giữa các nút Thread.
  • Truyền thông báo giữa các nút Thread bằng UDP.

Tài liệu đọc thêm

Hãy tham khảo openthread.ioGitHub để xem nhiều tài nguyên OpenThread, bao gồm:

Tham khảo: