Docker 模拟 Thread 网络
- 模拟两个节点之间通信
- 验证连接情况
- 对节点进行身份验证
OpenThread官方文档为我们提供了多种模拟构建Thread网络的方式,本人使用 windows + wsl + Ubuntu20.04 + Docker 的形式模拟。配置中最为困难的是Docker:由于其在24年末所有镜像都被封禁,必须自行寻找修改私源,这是本人修改的方式,做完这一切后,模拟起来就简单了。
以管理员方式打开终端,输入wsl进入root用户,拉取 openthread/environment 映像
docker pull openthread/environment:latest
从映像启动 Docker 容器并连接到它的bash shell,可选项 --rm 会在退出容器时自动删除该容器
docker run --name codelab_otsim_ctnr -it --rm \--sysctl net.ipv6.conf.all.disable_ipv6=0 \--cap-add=net_admin openthread/environment bash
由于篇幅原因,以下只展示几项比较常用的示例,其他操作原理相同
模拟两个节点之间通信
保持上述配置不动,在此终端中使用 ot-cli-ftd 二进制文件为模拟的 Thread 设备生成CLI进程
/openthread/build/examples/apps/cli/ot-cli-ftd 1
创建新的操作数据集,查看数据集信息,将其提交为活跃数据集,启动 IPV6 接口,启动 Thread 协议操作。
dataset init new
dataset
dataset commit active
ifconfig up
thread start
等待几秒后查看节点状态,发现该设备已经成为线程主要设备 leader,即负责管理路由器 ID 分配的设备:
查看节点1 的 Thread 接口的 IPV6 地址(不同设备输出会不同)
ipaddr
打开一个新终端,打开容器,创建节点2
docker exec -it codelab_otsim_ctnr bash
/openthread/build/examples/apps/cli/ot-cli-ftd 2
使用和节点 1 的操作数据集相同的值配置 Thread 网络密钥和 PAN ID
dataset networkkey yourfirstnetworkkey
dataset panid yourfirstpanid
用和 节点1 相同的方式,查看数据集信息,将其提交为活跃数据集,启动 IPV6 接口,启动 Thread 协议操作。
查看设备状态(初始化状态为 child ,但在一小段时间后会切换为 router)
验证连接情况
在节点 2 上,获取 RLOC16,即 IPV6 地址的最后16位
rloc16
在节点 1 上检查节点 2 的 RLOC16 路由器表,确保节点 2 已经切换到路由器状态。
router table
找到节点 1 的 EID,从节点 2 对节点 1 进行 ping 操作
ping yourfirstpointEID
在进行完以上操作后,不要退出,否则容器将被删除。下一个示例用于调试节点的身份验证功能,因此,我们需要对这两个节点恢复出厂设置。
停止节点 1 并停止 Thread
thread stop
查看节点 2 的状态,节点 2 检测到节点 1 已离线,节点 2 会转换为 leader
确认后将节点 2 停止 thread 并将节点 2 恢复 出厂设置,退出到 Docker bash 提示符
thread stop
factoryreset
exit
同时将节点 1 进行相同操作
对节点进行身份验证
创建过程与前面相似,不再给出命令行
创建一个新的节点 1,将其提交为活跃数据集,启动 IPV6 接口,启动 Thread 协议操作
在节点 1 上,启动 Commissioner 角色
commissioner start
允许具有 J01NME
连接者凭据的任何连接者通过 *
通配符委托到网络中。连接者是由真人管理员添加到委托 Thread 网络的设备
commissioner joiner add * J01NME
在第二个终端中建立节点 2,用 J01NME
Joiner 凭据启用 Joiner 角色,当看到 Join success 时,代表通过节点 1 的身份验证
启动节点 2 的 Thread
thread start
检查节点 2 的状态以验证是否已加入网络,观察到 child 变化为 router
同时,节点 1 会输出以下类似信息:
通过以上实践,我们了解了如何配置节点、接入网络、身份验证等,这也为我们后续开源该协议提供了参考。