Payload 载荷
Payload 类用于管理 Signal 和 Directive 中携带的数据。它提供了读写不同类型数据的方法。
获取 Payload 对象
Payload 不能直接实例化,通过 Signal 或 Directive 的 get_payload() 方法获取:
# 从 Signal 获取
signal = Signal("sensor.data")
payload = signal.get_payload()
# 从 Directive 获取
def on_directive(directive):
payload = directive.get_payload()写入方法
set_number
payload.set_number(key: str, value: float) -> None设置数字类型的值(整数或浮点数)。
参数:
key(str) - 键名value(float) - 数值
示例:
payload.set_number("temperature", 25.5)
payload.set_number("count", 100)
payload.set_number("percentage", 95.8)set_string
payload.set_string(key: str, value: str) -> None设置字符串类型的值。
参数:
key(str) - 键名value(str) - 字符串值
示例:
payload.set_string("status", "active")
payload.set_string("message", "Hello, StreamInd")
payload.set_string("device_id", "sensor-001")set_boolean
payload.set_boolean(key: str, value: bool) -> None设置布尔类型的值。
参数:
key(str) - 键名value(bool) - 布尔值
示例:
payload.set_boolean("enabled", True)
payload.set_boolean("alarm", False)
payload.set_boolean("is_online", True)读取方法
get_number
value = payload.get_number(key: str) -> float获取数字类型的值。
参数:
key(str) - 键名
返回:
float- 数值
异常:
- 如果键不存在或类型不匹配,可能抛出异常
示例:
temperature = payload.get_number("temperature")
count = int(payload.get_number("count")) # 转换为整数get_string
value = payload.get_string(key: str) -> str获取字符串类型的值。
参数:
key(str) - 键名
返回:
str- 字符串值
示例:
status = payload.get_string("status")
message = payload.get_string("message")get_boolean
value = payload.get_boolean(key: str) -> bool获取布尔类型的值。
参数:
key(str) - 键名
返回:
bool- 布尔值
示例:
enabled = payload.get_boolean("enabled")
is_online = payload.get_boolean("is_online")has_key
exists = payload.has_key(key: str) -> bool检查指定的键是否存在。
参数:
key(str) - 键名
返回:
bool- 如果键存在返回 True,否则返回 False
示例:
if payload.has_key("temperature"):
temp = payload.get_number("temperature")
else:
print("温度数据不存在")完整示例
写入数据到 Signal
from streamind_sdk import Signal
# 创建信号
signal = Signal("sensor.multi_data")
payload = signal.get_payload()
# 写入不同类型的数据
payload.set_number("temperature", 25.5)
payload.set_number("humidity", 60.0)
payload.set_string("location", "room_01")
payload.set_string("sensor_id", "TH-001")
payload.set_boolean("is_calibrated", True)
payload.set_boolean("alarm", False)
# 发送信号
await sdk.send_signal("terminal-1", signal)读取 Directive 数据
def on_directive(directive):
payload = directive.get_payload()
# 安全读取数据
if payload.has_key("action"):
action = payload.get_string("action")
print(f"动作: {action}")
if payload.has_key("value"):
value = payload.get_number("value")
print(f"值: {value}")
if payload.has_key("enabled"):
enabled = payload.get_boolean("enabled")
print(f"启用: {enabled}")
sdk.set_directive_callback("terminal-1", on_directive)数据验证
def validate_and_read_payload(payload):
"""验证并读取 payload 数据"""
required_keys = ["temperature", "humidity", "location"]
# 检查必需字段
for key in required_keys:
if not payload.has_key(key):
raise ValueError(f"缺少必需字段: {key}")
# 读取数据
temperature = payload.get_number("temperature")
humidity = payload.get_number("humidity")
location = payload.get_string("location")
# 数据范围验证
if not -50 <= temperature <= 150:
raise ValueError(f"温度超出范围: {temperature}")
if not 0 <= humidity <= 100:
raise ValueError(f"湿度超出范围: {humidity}")
return {
"temperature": temperature,
"humidity": humidity,
"location": location
}
# 使用
try:
data = validate_and_read_payload(payload)
print(f"有效数据: {data}")
except ValueError as e:
print(f"数据验证失败: {e}")数据类型对应
Python 类型与 Payload 方法的对应关系:
| Python 类型 | Payload 方法 | 示例 |
|---|---|---|
int, float | set_number() / get_number() | 25, 3.14 |
str | set_string() / get_string() | "hello" |
bool | set_boolean() / get_boolean() | True, False |
常见使用模式
传感器数据
payload = signal.get_payload()
payload.set_number("temperature", 25.5)
payload.set_number("humidity", 60.0)
payload.set_number("pressure", 1013.25)
payload.set_string("unit", "metric")
payload.set_boolean("calibrated", True)设备状态
payload = signal.get_payload()
payload.set_string("status", "online")
payload.set_number("battery_level", 85)
payload.set_boolean("charging", True)
payload.set_string("firmware_version", "1.2.3")
payload.set_number("uptime_seconds", 86400)控制指令
# 读取控制指令
payload = directive.get_payload()
action = payload.get_string("action") # "set_power"
value = payload.get_boolean("value") # True
priority = payload.get_number("priority") # 5JSON 风格的数据结构
虽然 Payload 不支持嵌套对象,但可以使用命名约定模拟结构:
# 使用点分隔表示层级
payload.set_string("device.id", "sensor-001")
payload.set_string("device.type", "temperature")
payload.set_number("data.temperature", 25.5)
payload.set_number("data.humidity", 60.0)
payload.set_string("metadata.location", "room_01")
payload.set_string("metadata.timestamp", "2024-01-01T00:00:00Z")错误处理
def safe_get_number(payload, key, default=0.0):
"""安全获取数字,失败时返回默认值"""
try:
if payload.has_key(key):
return payload.get_number(key)
return default
except Exception as e:
print(f"读取 {key} 失败: {e}")
return default
def safe_get_string(payload, key, default=""):
"""安全获取字符串,失败时返回默认值"""
try:
if payload.has_key(key):
return payload.get_string(key)
return default
except Exception as e:
print(f"读取 {key} 失败: {e}")
return default
# 使用
temperature = safe_get_number(payload, "temperature", 0.0)
location = safe_get_string(payload, "location", "unknown")性能建议
- 批量操作 - 一次性设置所有数据,避免多次调用
- 数据大小 - 避免单个 payload 携带过多数据
- 类型一致 - 同一个键始终使用相同的数据类型
- 键名简洁 - 使用简短但清晰的键名
最佳实践
- 检查存在性 - 读取前使用
has_key()检查 - 类型安全 - 确保读取的类型与写入的类型一致
- 默认值 - 提供合理的默认值处理缺失数据
- 文档化 - 在代码中注释 payload 的数据结构
- 验证数据 - 对关键数据进行范围和有效性验证
示例:完整的数据封装
class SensorData:
"""传感器数据封装"""
def __init__(self, temperature: float, humidity: float, location: str):
self.temperature = temperature
self.humidity = humidity
self.location = location
def to_payload(self, payload):
"""转换为 Payload"""
payload.set_number("temperature", self.temperature)
payload.set_number("humidity", self.humidity)
payload.set_string("location", self.location)
@staticmethod
def from_payload(payload):
"""从 Payload 创建"""
temperature = payload.get_number("temperature")
humidity = payload.get_number("humidity")
location = payload.get_string("location")
return SensorData(temperature, humidity, location)
# 使用
# 发送数据
data = SensorData(25.5, 60.0, "room_01")
signal = Signal("sensor.data")
data.to_payload(signal.get_payload())
await sdk.send_signal("terminal-1", signal)
# 接收数据
def on_directive(directive):
data = SensorData.from_payload(directive.get_payload())
print(f"温度: {data.temperature}, 湿度: {data.humidity}")相关 API
Last updated on