12-第12章-EdgeX消息格式解析
字段类型说明idstring事件唯一 IDdeviceNamestring设备名称readings读数数组originint64事件时间戳(纳秒)string设备配置文件名称(可选)sourceNamestring数据源名称(可选)字段类型说明idstring读数唯一 IDstring资源名称(如 temperature、humidity)valuestring读数数值(字符串格式)valueTy
·
第12章:EdgeX消息格式解析
12.1 EdgeX Foundry 消息架构
12.1.1 MessageEnvelope 格式
EdgeX Foundry 使用 MessageEnvelope 作为消息传输的标准格式。
// edgex/models.go:6-11
type EdgeXMessage struct {
CorrelationID string `json:"correlationId,omitempty"`
MessageType string `json:"messageType,omitempty"`
Origin int64 `json:"origin,omitempty"`
Payload json.RawMessage `json:"payload"`
}
字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| correlationId | string | 消息追踪 ID,用于分布式追踪 |
| messageType | string | 消息类型,如 “event”、“request” 等 |
| origin | int64 | 消息创建时间戳(纳秒) |
| payload | json.RawMessage | 实际消息载荷 |
12.1.2 完整消息示例
{
"correlationId": "abc-123-def-456",
"messageType": "event",
"origin": 1677721600000000000,
"payload": {
"id": "event-001",
"deviceName": "TemperatureSensor-001",
"readings": [
{
"id": "reading-001",
"resourceName": "temperature",
"value": "25.5",
"valueType": "Float32",
"origin": 1677721600000000000,
"deviceName": "TemperatureSensor-001"
}
],
"origin": 1677721600000000000
}
}
12.2 Event 消息结构
12.2.1 Event 结构定义
// edgex/models.go:14-21
type EdgeXEvent struct {
ID string `json:"id"`
DeviceName string `json:"deviceName"`
Readings []EdgeXReading `json:"readings"`
Origin int64 `json:"origin"`
ProfileName string `json:"profileName,omitempty"`
SourceName string `json:"sourceName,omitempty"`
}
字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 事件唯一 ID |
| deviceName | string | 设备名称 |
| readings | []EdgeXReading | 读数数组 |
| origin | int64 | 事件时间戳(纳秒) |
| profileName | string | 设备配置文件名称(可选) |
| sourceName | string | 数据源名称(可选) |
12.3 Reading 消息结构
12.3.1 Reading 结构定义
// edgex/models.go:24-34
type EdgeXReading struct {
ID string `json:"id"`
ResourceName string `json:"resourceName"`
Value string `json:"value"`
ValueType string `json:"valueType,omitempty"`
Origin int64 `json:"origin"`
ProfileName string `json:"profileName,omitempty"`
DeviceName string `json:"deviceName,omitempty"`
BaseType string `json:"baseType,omitempty"`
Metadata json.RawMessage `json:"metadata,omitempty"`
}
字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 读数唯一 ID |
| resourceName | string | 资源名称(如 temperature、humidity) |
| value | string | 读数数值(字符串格式) |
| valueType | string | 值类型(如 Float32、Int32、Bool) |
| origin | int64 | 读数时间戳(纳秒) |
| profileName | string | 设备配置文件名称(可选) |
| deviceName | string | 设备名称(可选) |
| baseType | string | 基础类型(如 Float、Int) |
| metadata | json.RawMessage | 元数据(可选) |
12.3.2 ValueType 类型
EdgeX Foundry 支持的值类型:
| ValueType | 说明 | 示例 |
|---|---|---|
| Bool | 布尔值 | “true”, “false” |
| String | 字符串 | “hello world” |
| Uint8 | 8位无符号整数 | “255” |
| Uint16 | 16位无符号整数 | “65535” |
| Uint32 | 32位无符号整数 | “4294967295” |
| Uint64 | 64位无符号整数 | “18446744073709551615” |
| Int8 | 8位有符号整数 | “-128” |
| Int16 | 16位有符号整数 | “-32768” |
| Int32 | 32位有符号整数 | “-2147483648” |
| Int64 | 64位有符号整数 | “-9223372036854775808” |
| Float32 | 32位浮点数 | “3.14159” |
| Float64 | 64位浮点数 | “3.14159265359” |
| Binary | 二进制数据(base64) | “SGVsbG8=” |
| Object | JSON 对象 | “{“key”: “value”}” |
| Array | JSON 数组 | “[1, 2, 3]” |
12.4 消息处理流程
12.4.1 消息解析实现
// edgex/processor.go:11-33
func ProcessMessage(payload []byte) (*EdgeXEvent, error) {
var edgexMsg EdgeXMessage
if err := json.Unmarshal(payload, &edgexMsg); err != nil {
return nil, err
}
if edgexMsg.MessageType != "event" && edgexMsg.MessageType != "Event" {
log.Printf("Ignoring message with type: %s", edgexMsg.MessageType)
return nil, nil
}
var event EdgeXEvent
if err := json.Unmarshal(edgexMsg.Payload, &event); err != nil {
return nil, err
}
event.DeviceName = common.FormatDeviceName(event.DeviceName)
return &event, nil
}
12.4.2 处理步骤详解
- 解析 MessageEnvelope:将 JSON 字节解析为 EdgeXMessage 结构
- 验证消息类型:只处理 “event” 类型的消息
- 解析 Event 载荷:从 Payload 字段解析出 EdgeXEvent
- 格式化设备名:确保设备名称符合索引要求
- 返回事件对象:返回解析后的事件供后续处理
12.5 值解析
12.5.1 值类型转换
// common/utils.go 中的值解析
func ParseValue(valueStr string) interface{} {
if valueStr == "true" {
return true
}
if valueStr == "false" {
return false
}
if intVal, err := strconv.ParseInt(valueStr, 10, 64); err == nil {
return intVal
}
if floatVal, err := strconv.ParseFloat(valueStr, 64); err == nil {
return floatVal
}
return valueStr
}
12.6 实战练习
练习 12.1:自定义消息处理
添加对新的消息类型(如 “request”)的支持。
练习 12.2:数据验证
为 EdgeX 消息添加更严格的数据验证。
练习 12.3:消息转换
实现将 sfsEdgeStore 数据转换回 EdgeX 格式的功能。
12.7 本章小结
本章深入解析了 EdgeX Foundry 消息格式:
- MessageEnvelope 消息信封格式
- Event 事件结构
- Reading 读数结构
- 值类型系统
- 消息处理流程
理解 EdgeX 消息格式是深度集成的基础。
本书版本:1.0.0
最后更新:2026-03-08
sfsEdgeStore - 让边缘数据存储更简单!🚀
技术栈 - Go语言、sfsDb与EdgeX Foundry。纯golang工业物联网边缘计算技术栈
项目地址:GitHub
GitCode 镜像:GitCode
更多推荐
所有评论(0)