第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"`
}

字段说明:

字段类型说明
correlationIdstring消息追踪 ID,用于分布式追踪
messageTypestring消息类型,如 “event”、“request” 等
originint64消息创建时间戳(纳秒)
payloadjson.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"`
}

字段说明:

字段类型说明
idstring事件唯一 ID
deviceNamestring设备名称
readings[]EdgeXReading读数数组
originint64事件时间戳(纳秒)
profileNamestring设备配置文件名称(可选)
sourceNamestring数据源名称(可选)

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"`
}

字段说明:

字段类型说明
idstring读数唯一 ID
resourceNamestring资源名称(如 temperature、humidity)
valuestring读数数值(字符串格式)
valueTypestring值类型(如 Float32、Int32、Bool)
originint64读数时间戳(纳秒)
profileNamestring设备配置文件名称(可选)
deviceNamestring设备名称(可选)
baseTypestring基础类型(如 Float、Int)
metadatajson.RawMessage元数据(可选)

12.3.2 ValueType 类型

EdgeX Foundry 支持的值类型:

ValueType说明示例
Bool布尔值“true”, “false”
String字符串“hello world”
Uint88位无符号整数“255”
Uint1616位无符号整数“65535”
Uint3232位无符号整数“4294967295”
Uint6464位无符号整数“18446744073709551615”
Int88位有符号整数“-128”
Int1616位有符号整数“-32768”
Int3232位有符号整数“-2147483648”
Int6464位有符号整数“-9223372036854775808”
Float3232位浮点数“3.14159”
Float6464位浮点数“3.14159265359”
Binary二进制数据(base64)“SGVsbG8=”
ObjectJSON 对象“{“key”: “value”}”
ArrayJSON 数组“[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 处理步骤详解

  1. 解析 MessageEnvelope:将 JSON 字节解析为 EdgeXMessage 结构
  2. 验证消息类型:只处理 “event” 类型的消息
  3. 解析 Event 载荷:从 Payload 字段解析出 EdgeXEvent
  4. 格式化设备名:确保设备名称符合索引要求
  5. 返回事件对象:返回解析后的事件供后续处理

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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐