跳到主要内容

Message API

Message 对象是 CycBox Lua 脚本系统中的中心数据结构。它代表流经系统的通信消息,包含原始数据、解析值、显示格式和元数据。

概述

CycBox 消息处理流程:

接收: 传输层 → 编解码器 → 转换器 → Lua 脚本 → UI
发送: UI → Lua 脚本 → 转换器 → 编解码器 → 传输层

在 Lua 脚本中,你可以:

  • 读取和修改消息的数据载荷与数据帧
  • 根据消息结构提取类型化数据
  • 访问消息元数据(时间戳、连接 ID)
  • 转换消息体提取自定义值用于数据可视化

属性

payload

local data = message.payload  -- 获取payload(Lua 字符串)
message.payload = "\\x01\\x02\\x03" -- 设置payload
message.payload = nil -- 设置为空字节

消息 payload - 移除协议帧后的实际数据内容。

  • 类型: Lua 字符串(字节数组)
  • 访问: 读/写
  • Nil 安全: 设置为 nil 清空负载(空字节)

frame

local full_frame = message.frame  -- 获取完整帧
message.frame = "[STX]data[ETX]" -- 设置帧
message.frame = nil -- 设置为空字节

完整的协议帧,包括前缀、payload、后缀和校验和。

  • 类型: Lua 字符串(字节数组)
  • 访问: 读/写
  • Nil 安全: 设置为 nil 清空帧(空字节)

timestamp

local ts = message.timestamp  -- 获取时间戳(微秒)

消息时间戳,单位为微秒(自 UNIX 纪元起)。

  • 类型: 整数 (u64)
  • 访问: 只读

connection_id

local conn_id = message.connection_id  -- 获取连接 ID
message.connection_id = 1 -- 设置连接 ID

标识源/目标连接(配置索引)。

  • 类型: 整数 (u32)
  • 访问: 读/写

values_json

local json_str = message.values_json  -- 获取所有值的 JSON 字符串
-- 示例: '{\"temperature\":25.5,\"humidity\":60,\"status\":\"ok\"}'

返回消息的所有值作为 JSON 字符串,方便检查或日志记录。

  • 类型: 字符串(JSON 格式)
  • 访问: 只读
  • 注意: 数组类型暂不支持,将显示为 null

方法

add_int_value()

message:add_int_value(id, value)

添加整数值到消息。以 64 位有符号整数 (Int64) 存储,将通过数值界面展示。

参数:

  • id (字符串,必需): 值的唯一标识符(例如"temperature"、"counter")
  • value (整数,必需): 要存储的整数值

示例:

message:add_int_value("device_id", 1001)
message:add_int_value("counter", 42)

add_float_value()

message:add_float_value(id, value)

添加浮点值到消息。以 64 位浮点数 (Float64) 存储。

参数:

  • id (字符串,必需): 值的唯一标识符
  • value (数字,必需): 要存储的浮点值

示例:

message:add_float_value("temperature", 25.5)
message:add_float_value("voltage", 3.3)
message:add_float_value("humidity", 60.2)

add_string_value()

message:add_string_value(id, value)

添加字符串值到消息。

参数:

  • id (字符串,必需): 值的唯一标识符
  • value (字符串,必需): 要存储的字符串值

示例:

message:add_string_value("status", "OK")
message:add_string_value("device_name", "Sensor-01")

add_bool_value()

message:add_bool_value(id, value)

添加布尔值到消息。

参数:

  • id (字符串,必需): 值的唯一标识符
  • value (布尔值,必需): 要存储的布尔值

示例:

message:add_bool_value("is_active", true)
message:add_bool_value("alarm", false)

get_value()

local value = message:get_value(id)

按 ID 检索值。返回原始类型的值或 nil(若未找到)。

参数:

  • id (字符串或 nil): 值的标识符

返回:

  • 整数: 对于 Int8、Int16、Int32、Int64、UInt8、UInt16、UInt32
  • 数字: 对于 UInt64(如果 > Int64 最大值)、Float32、Float64
  • 布尔值: 对于布尔值
  • 字符串: 对于字符串值
  • nil: 如果 ID 为 nil、未找到值或数组类型(暂不支持)

值的存储和可视化

添加到消息的值具有以下特性:

  1. 有时间戳: 每个值都包含消息时间戳
  2. 有类型: 保持原始数据类型(整数、浮点、字符串、布尔)
  3. 可视化: 整数和浮点值可以在 UI 中的图表上绘制
  4. 缓冲: 最近的值保存在内存中用于实时监控

注意事项

  • Nil 安全: payloadframeget_value() 能够优雅地处理 nil
  • ID 格式: 值 ID 应该是描述性的(例如"temperature"、"device:sensor1")
  • 类型一致性: 在消息中为同一值 ID 使用一致的类型
  • 性能: 每条消息添加多个值是高效的;值的存储是紧凑的
  • 数组类型: 数组值类型(Int8Array、Float32Array 等)在 Lua API 中暂不支持

另请参阅