4. DroneCAN节点行为

在 DroneCAN 网络中,一个节点从“上电”到“被总线认可”并不是一步完成的。它需要经历初始化、匿名通信、动态 ID 申请、正式上线、周期心跳、异常恢复等一连串行为。理解这些行为,是设备一致性测试的核心:测试用例本质上是在验证节点是否按照协议规定的状态迁移、报文时序和参数约束运行。本节围绕节点状态机、心跳机制、动态节点 ID 分配和节点发现四条主线展开,并给出可落地的测试观察点。

一、节点状态机:从匿名到在线的迁移路径

DroneCAN 节点上电后首先进入初始化状态,完成外设自检、参数加载和 CAN 控制器配置。随后节点进入“匿名”阶段:此时它还没有合法节点 ID,只能使用匿名报文参与动态分配流程。一旦成功获得唯一 ID,节点进入“在线”状态,开始发送心跳并响应服务请求。若在运行中检测到总线错误、ID 冲突或看门狗复位,节点会回到初始化或匿名状态重新申请。

状态机的关键测试点在于:迁移条件是否严格、迁移顺序是否可预测、异常后是否能自动恢复。例如节点在未获得 ID 前不应发送带源 ID 的业务报文;获得 ID 后应在规定时间内发出首帧心跳。测试时可用总线分析仪记录状态迁移的时间戳,验证其符合协议窗口。

DroneCAN 节点状态机与动态 ID 分配流程 初始化 自检 / 参数加载 匿名状态 发送匿名分配请求 ID 申请中 等待分配响应 在线运行 心跳 / 服务响应 上电完成 发起分配 获得唯一 ID ID 冲突 / 总线错误 看门狗复位 心跳机制 • 周期 1 Hz,携带节点健康状态 • 状态:OK / INITIALIZING / WARNING / ERROR • 模式:OPERATIONAL / INITIALIZATION • 超时 3 秒未收到判定离线 • 心跳丢失触发节点发现重扫 动态 ID 分配与节点发现 • 匿名报文广播分配请求 • 分配器返回唯一节点 ID • 节点 ID 范围 1 ~ 127 • 节点发现:GetNodeInfo 查询 • 记录节点名称、软件版本、硬件版本

二、心跳机制:在线状态的“生命体征”

心跳是 DroneCAN 节点最基础的周期报文,默认周期为 1 秒。心跳报文中包含节点健康状态(health)和运行模式(mode)两个关键字段。健康状态通常有 OK、INITIALIZING、WARNING、ERROR 四档;运行模式则有 OPERATIONAL、INITIALIZATION、MAINTENANCE 等。测试时不仅要看心跳是否按时发出,还要验证状态字段是否与实际工况一致。

例如,当节点传感器校准失败时,心跳健康状态应变为 WARNING 或 ERROR,而不是继续报 OK。若节点处于固件升级模式,运行模式应切换为 MAINTENANCE。心跳超时是节点发现和故障检测的重要依据:接收端连续 3 秒未收到某节点心跳,即可认为该节点离线,并从活动节点列表中移除。

心跳测试建议同时记录时间戳与状态字段,形成“时间—状态”序列。仅检查心跳存在性,无法发现状态字段长期不更新的隐性缺陷。

三、动态节点 ID 分配:匿名请求与唯一性保证

DroneCAN 允许节点 ID 动态分配,避免出厂固化 ID 带来的冲突。流程如下:节点上电后以匿名身份广播动态分配请求;网络中负责分配的节点(通常是飞控或分配器)收到请求后,从可用 ID 池中选择一个未被占用的 ID,通过分配响应报文返回;申请节点收到响应后,切换到该 ID 并开始正常通信。

测试重点在于唯一性和冲突处理。若两个节点同时申请,分配器必须保证返回不同 ID;若某节点在申请过程中收到其他节点已占用目标 ID 的心跳,应放弃该 ID 并重新申请。节点 ID 有效范围为 1 到 127,0 保留给匿名报文,128 及以上通常不用于普通节点。

# 典型动态分配报文观察(伪代码)
DynamicNodeIDAllocationRequest:
  node_id      = 0            # 匿名
  preferred_id = 0            # 无偏好
  unique_id    = 0x1A2B3C4D   # 硬件唯一标识

DynamicNodeIDAllocationResponse:
  node_id      = 42           # 分配结果
  unique_id    = 0x1A2B3C4D   # 对应申请者

四、节点发现:让总线知道“谁在线”

节点发现通常通过 GetNodeInfo 服务实现。测试工具或飞控向总线广播 GetNodeInfo 请求,在线节点逐一响应,返回节点名称、软件版本、硬件版本、唯一 ID 等信息。节点发现的结果构成活动节点列表,是后续参数读写、固件升级和故障定位的基础。

在一致性测试中,节点发现需要验证三点:第一,节点是否响应 GetNodeInfo;第二,返回信息是否完整且与设备实际一致;第三,节点离线后是否从发现列表中正确移除。若节点心跳丢失但发现列表仍保留,会导致上层误判设备在线。

行为 关键报文/服务 周期或超时 一致性测试观察点
心跳 NodeStatus 1 Hz,3 秒超时 周期稳定性、健康状态字段正确性
动态 ID 分配 AllocationRequest / Response 申请后 1 秒内响应 ID 唯一性、冲突回退、范围合法性
节点发现 GetNodeInfo 请求后 1 秒内响应 信息完整性、离线移除及时性
状态迁移 内部状态机 上电后 2 秒内上线 迁移顺序、异常恢复能力

五、常见误区与复盘

  • 误区一:只测心跳存在,不测状态字段。心跳按时到达但 health 永远为 OK,可能掩盖传感器故障。
  • 误区二:忽略匿名阶段的报文约束。节点在未获得 ID 前发送业务报文,会破坏总线秩序。
  • 误区三:动态 ID 分配后不验证冲突。两个节点获得相同 ID 时,总线会出现不可预测的仲裁错误。
  • 误区四:节点发现只做一次。节点热插拔后未重新发现,活动列表与实际不符。
一致性测试中,节点状态机、心跳、动态 ID 分配和节点发现应作为一组联合用例执行。单独验证某一项通过,并不代表节点在真实总线环境中行为正确。

综上,节点行为测试的核心是“时序 + 状态 + 唯一性”。测试工程师应使用总线分析仪记录完整报文序列,结合状态迁移图和心跳时间线,判断节点是否真正符合 DroneCAN 协议要求。只有把状态机、心跳、动态 ID 分配和节点发现放在同一张测试网中联动验证,才能覆盖节点上线、运行和异常恢复的完整生命周期。