第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 处理步骤详解

  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

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

更多推荐