向应用程序上报自定义 HMS 错误码
TUNNEL_PROTOCOL_ID_INJECT_HMS_ERROR
mavlink消息:
接收TUNNEL_PROTOCOL_ID_INJECT_HMS_ERROR
参数:
| 名称 | 枚举值 | 描述 |
|---|---|---|
| DJI_HMS_ERROR_LEVEL_NONE | 0 | 无错误。 |
| DJI_HMS_ERROR_LEVEL_HINT | 1 | 提示级(Hint) |
| DJI_HMS_ERROR_LEVEL_WARN | 2 | 警告级(Warning) |
| DJI_HMS_ERROR_LEVEL_CRITICAL | 3 | 严重级(Critical) |
| DJI_HMS_ERROR_LEVEL_FATAL | 4 | 致命级(Fatal) |
示例
#!/usr/bin/env python3
"""
通过 MAVLink TUNNEL 消息发送 DJI HMS 结构体数据
HmsErrCode 和 HmsAlarmEnhancedCtrl
Usage:
python tunnel_hms_send.py
"""
import struct
import time
from pymavlink import mavutil
# MAVLink 组件 ID (DJI 指定)
MAV_COMP_ID_HMS = 12
# HMS 目标组件
TARGET_COMPONENT = MAV_COMP_ID_HMS
def create_hmserrcode_struct(error_code: int, error_level: int, enable: bool, error_id: int) -> bytes:
"""
创建 HmsErrCode 结构体 (7字节, packed)
typedef struct Hms_ErrorCode_Ctrl{
uint32_t errorCode; // 4 bytes
uint32_t errorLevel; // 4 byte (E_DjiHmsErrorLevel)
bool enable; // 1 byte
uint8_t id; // 1 byte
} __attribute__((packed)) HmsErrCode;
"""
return struct.pack('<IIbB', error_code, error_level, 1 if enable else 0, error_id)
def create_hmsalarminfo_struct(
alarm_type: int,
times: int,
interval: int,
action: int,
alarm_id: int
) -> bytes:
"""
创建 HmsAlarmEnhancedCtrl 结构体 (6字节, packed)
typedef struct Hms_Alarm_Enhanced_Ctrl{
uint32_t type; // 4 byte (E_DjiHmsAlarmEnhancedType)
int8_t times; // 1 byte
uint8_t reserved; // 1 byte
int16_t interval; // 2 bytes
uint32_t action; // 4 byte (E_DjiHmsAlarmEnhancedAction)
uint8_t id; // 1 byte
} __attribute__((packed)) HmsAlarmEnhancedCtrl;
"""
return struct.pack('<IbbhIB', alarm_type, times, 0, interval, action, alarm_id)
def send_tunnel_message(mavlink_conn, payload: bytes, message_type: int = 0):
"""
通过 MAVLink TUNNEL 消息发送数据
Args:
mavlink_conn: MAVLink 连接对象
payload: 要发送的数据负载 (最多 228 字节)
message_type: 消息类型标识 (可选)
"""
if len(payload) > 228:
raise ValueError(f"Payload too large: {len(payload)} bytes (max 228)")
# 填充到固定长度 (确保小端序)
payload_bytes = payload.ljust(228, b'\x00')
# 发送 TUNNEL 消息
# MAVLINK_MSG_ID_TUNNEL = 110
mavlink_conn.mav.tunnel_send(
target_system=0, # 广播到所有系统
target_component=TARGET_COMPONENT,
payload_length=len(payload),
payload_type=message_type,
payload=payload_bytes
)
def send_hms_error_code(mavlink_conn,message_type: int = 0):
"""
发送 HmsErrCode 结构体
示例数据:
errorCode: 0x1E020001 (设备错误)
errorLevel: DJI_HMS_ERROR_LEVEL_WARN (2)
enable: True
id: 1
"""
payload = create_hmserrcode_struct(
error_code=0x1E020001, # 示例错误码
error_level=2, # WARN 级别
enable=True,
error_id=1
)
# message_type 用于标识 HMS 错误码消息类型
if message_type==32771:
payload = create_hmserrcode_struct(
error_code=0x1E020001, # 示例错误码
error_level=2, # WARN 级别
enable=False,
error_id=1
)
send_tunnel_message(mavlink_conn, payload, message_type)
print(f"[HMS] 发送 HmsErrCode: errorCode=0x1E020001, level=2, enable=True, id=1")
def send_hms_alarm_enhanced(mavlink_conn):
"""
发送 HmsAlarmEnhancedCtrl 结构体
示例数据:
type: SHAKE_MOTOR (1)
times: 3
interval: 500ms
action: START (1)
id: 1
"""
payload = create_hmsalarminfo_struct(
alarm_type=3, # SHAKE_MOTOR
times=3, # 振动3次
interval=500, # 间隔500ms
action=1, # START
alarm_id=1
)
# message_type 用于标识 HMS 告警控制消息类型
HMS_ALARM_ENHANCED_TYPE = 32772
send_tunnel_message(mavlink_conn, payload, HMS_ALARM_ENHANCED_TYPE)
print(f"[HMS] 发送 HmsAlarmEnhancedCtrl: type=1, times=3, interval=500, action=1, id=1")
def main():
print("=" * 60)
print("MAVLink HMS TUNNEL 消息发送工具")
print("=" * 60)
# 创建 MAVLink UDP 连接 (监听 14550 端口)
# udpin:0.0.0.0:14550 表示监听所有网卡地址的 14550 端口
connection_string = "udpin:0.0.0.0:14550"
print(f"\n正在连接到: {connection_string}")
try:
mavlink_conn = mavutil.mavlink_connection(connection_string)
# 等待心跳包以确认连接
print("等待心跳包...")
heartbeat = mavlink_conn.wait_heartbeat(timeout=10)
if heartbeat:
print(f"已连接! ")
else:
print("警告: 未收到心跳包,继续发送...")
print("\n" + "-" * 60)
print("开始发送 HMS 消息...")
print("-" * 60)
# 发送 HmsErrCode 结构体
send_hms_error_code(mavlink_conn,32770)
time.sleep(3) # 间隔1秒
# 发送 HmsAlarmEnhancedCtrl 结构体
send_hms_alarm_enhanced(mavlink_conn)
print("\n" + "-" * 60)
print("消息发送完成!")
print("-" * 60)
# 保持连接一段时间以便接收响应
print("\n等待响应 (5秒)...")
time.sleep(5)
mavlink_conn.close()
print("连接已关闭")
except Exception as e:
print(f"错误: {e}")
raise
if __name__ == "__main__":
main()
示例使用说明
运行后,成功建立连接并发送指令
清除应用程序上显示的自定义 HMS 错误码
TUNNEL_PROTOCOL_ID_ELIMINATE_HMS_ERROR
设置
mavlink消息:
接收TUNNEL_PROTOCOL_ID_ELIMINATE_HMS_ERROR
参数:
| 名称 | 枚举值 | 描述 |
|---|---|---|
| DJI_HMS_ERROR_LEVEL_NONE | 0 | 无错误。 |
| DJI_HMS_ERROR_LEVEL_HINT | 1 | 提示级(Hint) |
| DJI_HMS_ERROR_LEVEL_WARN | 2 | 警告级(Warning) |
| DJI_HMS_ERROR_LEVEL_CRITICAL | 3 | 严重级(Critical) |
| DJI_HMS_ERROR_LEVEL_FATAL | 4 | 致命级(Fatal) |
示例
#!/usr/bin/env python3
"""
通过 MAVLink TUNNEL 消息发送 DJI HMS 结构体数据
HmsErrCode 和 HmsAlarmEnhancedCtrl
Usage:
python tunnel_hms_send.py
"""
import struct
import time
from pymavlink import mavutil
# MAVLink 组件 ID (DJI 指定)
MAV_COMP_ID_HMS = 12
# HMS 目标组件
TARGET_COMPONENT = MAV_COMP_ID_HMS
def create_hmserrcode_struct(error_code: int, error_level: int, enable: bool, error_id: int) -> bytes:
"""
创建 HmsErrCode 结构体 (7字节, packed)
typedef struct Hms_ErrorCode_Ctrl{
uint32_t errorCode; // 4 bytes
uint32_t errorLevel; // 4 byte (E_DjiHmsErrorLevel)
bool enable; // 1 byte
uint8_t id; // 1 byte
} __attribute__((packed)) HmsErrCode;
"""
return struct.pack('<IIbB', error_code, error_level, 1 if enable else 0, error_id)
def create_hmsalarminfo_struct(
alarm_type: int,
times: int,
interval: int,
action: int,
alarm_id: int
) -> bytes:
"""
创建 HmsAlarmEnhancedCtrl 结构体 (6字节, packed)
typedef struct Hms_Alarm_Enhanced_Ctrl{
uint32_t type; // 4 byte (E_DjiHmsAlarmEnhancedType)
int8_t times; // 1 byte
uint8_t reserved; // 1 byte
int16_t interval; // 2 bytes
uint32_t action; // 4 byte (E_DjiHmsAlarmEnhancedAction)
uint8_t id; // 1 byte
} __attribute__((packed)) HmsAlarmEnhancedCtrl;
"""
return struct.pack('<IbbhIB', alarm_type, times, 0, interval, action, alarm_id)
def send_tunnel_message(mavlink_conn, payload: bytes, message_type: int = 0):
"""
通过 MAVLink TUNNEL 消息发送数据
Args:
mavlink_conn: MAVLink 连接对象
payload: 要发送的数据负载 (最多 228 字节)
message_type: 消息类型标识 (可选)
"""
if len(payload) > 228:
raise ValueError(f"Payload too large: {len(payload)} bytes (max 228)")
# 填充到固定长度 (确保小端序)
payload_bytes = payload.ljust(228, b'\x00')
# 发送 TUNNEL 消息
# MAVLINK_MSG_ID_TUNNEL = 110
mavlink_conn.mav.tunnel_send(
target_system=0, # 广播到所有系统
target_component=TARGET_COMPONENT,
payload_length=len(payload),
payload_type=message_type,
payload=payload_bytes
)
def send_hms_error_code(mavlink_conn,message_type: int = 0):
"""
发送 HmsErrCode 结构体
示例数据:
errorCode: 0x1E020001 (设备错误)
errorLevel: DJI_HMS_ERROR_LEVEL_WARN (2)
enable: True
id: 1
"""
payload = create_hmserrcode_struct(
error_code=0x1E020001, # 示例错误码
error_level=2, # WARN 级别
enable=True,
error_id=1
)
# message_type 用于标识 HMS 错误码消息类型
if message_type==32771:
payload = create_hmserrcode_struct(
error_code=0x1E020001, # 示例错误码
error_level=2, # WARN 级别
enable=False,
error_id=1
)
send_tunnel_message(mavlink_conn, payload, message_type)
print(f"[HMS] 发送 HmsErrCode: errorCode=0x1E020001, level=2, enable=True, id=1")
def send_hms_alarm_enhanced(mavlink_conn):
"""
发送 HmsAlarmEnhancedCtrl 结构体
示例数据:
type: SHAKE_MOTOR (1)
times: 3
interval: 500ms
action: START (1)
id: 1
"""
payload = create_hmsalarminfo_struct(
alarm_type=3, # SHAKE_MOTOR
times=3, # 振动3次
interval=500, # 间隔500ms
action=1, # START
alarm_id=1
)
# message_type 用于标识 HMS 告警控制消息类型
HMS_ALARM_ENHANCED_TYPE = 32772
send_tunnel_message(mavlink_conn, payload, HMS_ALARM_ENHANCED_TYPE)
print(f"[HMS] 发送 HmsAlarmEnhancedCtrl: type=1, times=3, interval=500, action=1, id=1")
def main():
print("=" * 60)
print("MAVLink HMS TUNNEL 消息发送工具")
print("=" * 60)
# 创建 MAVLink UDP 连接 (监听 14550 端口)
# udpin:0.0.0.0:14550 表示监听所有网卡地址的 14550 端口
connection_string = "udpin:0.0.0.0:14550"
print(f"\n正在连接到: {connection_string}")
try:
mavlink_conn = mavutil.mavlink_connection(connection_string)
# 等待心跳包以确认连接
print("等待心跳包...")
heartbeat = mavlink_conn.wait_heartbeat(timeout=10)
if heartbeat:
print(f"已连接! ")
else:
print("警告: 未收到心跳包,继续发送...")
print("\n" + "-" * 60)
print("开始发送 HMS 消息...")
print("-" * 60)
# 发送 HmsErrCode 结构体
send_hms_error_code(mavlink_conn,32771)
time.sleep(3) # 间隔1秒
# 发送 HmsAlarmEnhancedCtrl 结构体
send_hms_alarm_enhanced(mavlink_conn)
print("\n" + "-" * 60)
print("消息发送完成!")
print("-" * 60)
# 保持连接一段时间以便接收响应
print("\n等待响应 (5秒)...")
time.sleep(5)
mavlink_conn.close()
print("连接已关闭")
except Exception as e:
print(f"错误: {e}")
raise
if __name__ == "__main__":
main()
示例使用说明
运行后,成功建立连接并发送指令
清除应用程序上显示的自定义 HMS 错误码
TUNNEL_PROTOCOL_ID_ELIMINATE_HMS_ERROR
设置
mavlink消息:
接收TUNNEL_PROTOCOL_ID_ELIMINATE_HMS_ERROR
参数:
| 名称 | 枚举值 | 描述 |
|---|---|---|
| DJI_HMS_ERROR_LEVEL_NONE | 0 | 无错误。 |
| DJI_HMS_ERROR_LEVEL_HINT | 1 | 提示级(Hint) |
| DJI_HMS_ERROR_LEVEL_WARN | 2 | 警告级(Warning) |
| DJI_HMS_ERROR_LEVEL_CRITICAL | 3 | 严重级(Critical) |
| DJI_HMS_ERROR_LEVEL_FATAL | 4 | 致命级(Fatal) |
示例
#!/usr/bin/env python3
"""
通过 MAVLink TUNNEL 消息发送 DJI HMS 结构体数据
HmsErrCode 和 HmsAlarmEnhancedCtrl
Usage:
python tunnel_hms_send.py
"""
import struct
import time
from pymavlink import mavutil
# MAVLink 组件 ID (DJI 指定)
MAV_COMP_ID_HMS = 12
# HMS 目标组件
TARGET_COMPONENT = MAV_COMP_ID_HMS
def create_hmserrcode_struct(error_code: int, error_level: int, enable: bool, error_id: int) -> bytes:
"""
创建 HmsErrCode 结构体 (7字节, packed)
typedef struct Hms_ErrorCode_Ctrl{
uint32_t errorCode; // 4 bytes
uint32_t errorLevel; // 4 byte (E_DjiHmsErrorLevel)
bool enable; // 1 byte
uint8_t id; // 1 byte
} __attribute__((packed)) HmsErrCode;
"""
return struct.pack('<IIbB', error_code, error_level, 1 if enable else 0, error_id)
def create_hmsalarminfo_struct(
alarm_type: int,
times: int,
interval: int,
action: int,
alarm_id: int
) -> bytes:
"""
创建 HmsAlarmEnhancedCtrl 结构体 (6字节, packed)
typedef struct Hms_Alarm_Enhanced_Ctrl{
uint32_t type; // 4 byte (E_DjiHmsAlarmEnhancedType)
int8_t times; // 1 byte
uint8_t reserved; // 1 byte
int16_t interval; // 2 bytes
uint32_t action; // 4 byte (E_DjiHmsAlarmEnhancedAction)
uint8_t id; // 1 byte
} __attribute__((packed)) HmsAlarmEnhancedCtrl;
"""
return struct.pack('<IbbhIB', alarm_type, times, 0, interval, action, alarm_id)
def send_tunnel_message(mavlink_conn, payload: bytes, message_type: int = 0):
"""
通过 MAVLink TUNNEL 消息发送数据
Args:
mavlink_conn: MAVLink 连接对象
payload: 要发送的数据负载 (最多 228 字节)
message_type: 消息类型标识 (可选)
"""
if len(payload) > 228:
raise ValueError(f"Payload too large: {len(payload)} bytes (max 228)")
# 填充到固定长度 (确保小端序)
payload_bytes = payload.ljust(228, b'\x00')
# 发送 TUNNEL 消息
# MAVLINK_MSG_ID_TUNNEL = 110
mavlink_conn.mav.tunnel_send(
target_system=0, # 广播到所有系统
target_component=TARGET_COMPONENT,
payload_length=len(payload),
payload_type=message_type,
payload=payload_bytes
)
def send_hms_error_code(mavlink_conn,message_type: int = 0):
"""
发送 HmsErrCode 结构体
示例数据:
errorCode: 0x1E020001 (设备错误)
errorLevel: DJI_HMS_ERROR_LEVEL_WARN (2)
enable: True
id: 1
"""
payload = create_hmserrcode_struct(
error_code=0x1E020001, # 示例错误码
error_level=2, # WARN 级别
enable=True,
error_id=1
)
# message_type 用于标识 HMS 错误码消息类型
if message_type==32771:
payload = create_hmserrcode_struct(
error_code=0x1E020001, # 示例错误码
error_level=2, # WARN 级别
enable=False,
error_id=1
)
send_tunnel_message(mavlink_conn, payload, message_type)
print(f"[HMS] 发送 HmsErrCode: errorCode=0x1E020001, level=2, enable=True, id=1")
def send_hms_alarm_enhanced(mavlink_conn):
"""
发送 HmsAlarmEnhancedCtrl 结构体
示例数据:
type: SHAKE_MOTOR (1)
times: 3
interval: 500ms
action: START (1)
id: 1
"""
payload = create_hmsalarminfo_struct(
alarm_type=3, # SHAKE_MOTOR
times=3, # 振动3次
interval=500, # 间隔500ms
action=1, # START
alarm_id=1
)
# message_type 用于标识 HMS 告警控制消息类型
HMS_ALARM_ENHANCED_TYPE = 32772
send_tunnel_message(mavlink_conn, payload, HMS_ALARM_ENHANCED_TYPE)
print(f"[HMS] 发送 HmsAlarmEnhancedCtrl: type=1, times=3, interval=500, action=1, id=1")
def main():
print("=" * 60)
print("MAVLink HMS TUNNEL 消息发送工具")
print("=" * 60)
# 创建 MAVLink UDP 连接 (监听 14550 端口)
# udpin:0.0.0.0:14550 表示监听所有网卡地址的 14550 端口
connection_string = "udpin:0.0.0.0:14550"
print(f"\n正在连接到: {connection_string}")
try:
mavlink_conn = mavutil.mavlink_connection(connection_string)
# 等待心跳包以确认连接
print("等待心跳包...")
heartbeat = mavlink_conn.wait_heartbeat(timeout=10)
if heartbeat:
print(f"已连接! ")
else:
print("警告: 未收到心跳包,继续发送...")
print("\n" + "-" * 60)
print("开始发送 HMS 消息...")
print("-" * 60)
# 发送 HmsErrCode 结构体
send_hms_error_code(mavlink_conn,32772)
time.sleep(3) # 间隔1秒
# send_hms_error_code(mavlink_conn,32771)
# time.sleep(3) # 间隔1秒
# 发送 HmsAlarmEnhancedCtrl 结构体
send_hms_alarm_enhanced(mavlink_conn)
print("\n" + "-" * 60)
print("消息发送完成!")
print("-" * 60)
# 保持连接一段时间以便接收响应
print("\n等待响应 (5秒)...")
time.sleep(5)
mavlink_conn.close()
print("连接已关闭")
except Exception as e:
print(f"错误: {e}")
raise
if __name__ == "__main__":
main()
示例使用说明
运行后,成功建立连接并发送指令
作者:孙渝泓 创建时间:2026-06-17 14:10
最后编辑:孙渝泓 更新时间:2026-06-18 18:17
最后编辑:孙渝泓 更新时间:2026-06-18 18:17