EdgexAgent/device-gps-go
2025-07-10 20:40:32 +08:00
..
internal 边缘代理监测项目 2025-07-10 20:30:06 +08:00
log 边缘代理监测项目 2025-07-10 20:30:06 +08:00
openapi 边缘代理监测项目 2025-07-10 20:30:06 +08:00
pkg 边缘代理监测项目 2025-07-10 20:30:06 +08:00
run 边缘代理监测项目 2025-07-10 20:30:06 +08:00
snap 边缘代理监测项目 2025-07-10 20:30:06 +08:00
vendor 添加gitignore 2025-07-10 20:40:32 +08:00
.dockerignore 边缘代理监测项目 2025-07-10 20:30:06 +08:00
.golangci.yml 边缘代理监测项目 2025-07-10 20:30:06 +08:00
go.mod 边缘代理监测项目 2025-07-10 20:30:06 +08:00
go.sum 边缘代理监测项目 2025-07-10 20:30:06 +08:00
Jenkinsfile 边缘代理监测项目 2025-07-10 20:30:06 +08:00
LICENSE 边缘代理监测项目 2025-07-10 20:30:06 +08:00
Makefile 边缘代理监测项目 2025-07-10 20:30:06 +08:00
README.md 边缘代理监测项目 2025-07-10 20:30:06 +08:00
version.go 边缘代理监测项目 2025-07-10 20:30:06 +08:00

EdgeX GPS设备服务

这是一个基于EdgeX框架的GPS设备服务用于通过串口读取NMEA GPS数据并集成到EdgeX生态系统中。

🚀 功能特性

核心功能

  • 串口通信: 异步读取GPS设备的串口数据
  • NMEA解析: 支持多种NMEA语句类型RMC、GGA、GLL、GSA、GSV、VTG等
  • 数据格式化: 将原始GPS数据转换为人类易读的格式
  • 智能0值处理: 正确处理静止、正北等有效的0值状态
  • 数据缓存: 智能缓存GPS数据避免数据丢失
  • EdgeX集成: 完全集成到EdgeX设备服务框架
  • 实时监控: 实时解析和显示GPS位置信息

支持的NMEA语句

  • RMC (Recommended Minimum): 推荐最小定位信息
  • GGA (Global Positioning System Fix Data): GPS定位数据
  • GLL (Geographic Position): 地理位置
  • GSA (GPS DOP and active satellites): GPS精度因子和活跃卫星
  • GSV (GPS Satellites in view): 可见GPS卫星信息
  • VTG (Track made good and Ground speed): 航向和地面速度

📁 项目结构

device-gps-go/
├── run/
│   ├── cmd/device-gps/           # 主程序入口
│   │   ├── main.go              # 主函数
│   │   ├── configuration.yaml   # 服务配置
│   │   ├── device.gps.yaml     # 设备配置文件
│   │   └── devices.yaml        # 设备实例配置
│   ├── driver/                  # GPS驱动实现
│   │   ├── gpsdriver.go        # EdgeX驱动接口实现
│   │   ├── gpsController.go    # GPS设备控制器
│   │   ├── nmea.go            # NMEA协议解析
│   │   ├── serial_port.go     # 串口通信
│   │   └── gps_test.go        # 单元测试
│   └── config/
│       └── configuration.go    # 配置结构定义
├── test_gps_parsing.go         # GPS解析测试程序
└── bin/
    └── device-gps              # 编译后的可执行文件

🛠️ 技术架构

数据流程

串口数据 → UartRX_Task → 数据缓冲区 → NMEA解析 → GPS数据结构 → EdgeX命令处理

关键组件

  1. UartRX_Task: 异步串口读取任务

    • 使用独立的goroutine处理串口数据
    • 智能缓冲区管理,防止数据溢出
    • 错误处理和自动恢复
  2. NMEA解析器:

    • 支持多种NMEA语句格式
    • 校验和验证确保数据完整性
    • 容错处理,跳过无效数据
  3. EdgeX驱动接口:

    • 实现标准的ProtocolDriver接口
    • 支持读取GPS位置、速度、航向等数据
    • 自动事件推送到EdgeX核心服务

📊 支持的数据类型

数据格式化输出

所有GPS数据都经过格式化处理提供人类易读的输出格式

资源名称 数据类型 格式示例 描述
latitude String 39°58'08.6"N GPS纬度度分秒格式
longitude String 116°29'30.0"E GPS经度度分秒格式
altitude String 123.4 米 海拔高度(带单位)
speed String 23.15 km/h 地面速度(带单位)
course String 45.2° (东北) 航向角度(带方向描述)
utc_time String 12:34:56.00 UTC时间HH:MM:SS格式
fix_quality String GPS定位 定位质量(描述性文本)
satellites_used String 8 颗卫星 使用的卫星数量(描述性文本)
hdop String 1.20 (良好) 水平精度因子(带质量评估)
gps_status String ACTIVE GPS状态

特殊值处理

系统能够正确处理以下有效的0值情况

  • 0°00'00.0" - 赤道和本初子午线交点坐标
  • 0.0 米 - 海平面高度
  • 0.00 km/h - 静止状态(停车、等红灯)
  • 0.0° (北) - 正北方向
  • 00:00:00.00 - 午夜时间
  • 无定位 - GPS信号丢失状态
  • 0 颗卫星 - 室内或信号遮挡环境

🔧 配置说明

串口配置

GPSCustom:
  SerialPort: "/dev/ttyUSB0"  # 串口设备路径
  BaudRate: 9600              # 波特率
  ReadTimeout: "100ms"        # 读取超时
  Debug: true                 # 调试模式

设备协议配置

protocols:
  UART:
    deviceLocation: "/dev/ttyUSB0"
    baudRate: "9600"
    dataBits: "8"
    stopBits: "1"
    parity: "none"

🚀 快速开始

1. 编译项目

cd /home/clint/EdgeX/device-gps-go
go build -o bin/device-gps ./run/cmd/device-gps

2. 运行测试

# 运行NMEA解析测试
go run test_gps_parsing.go

# 运行单元测试
go test ./run/driver -v

# 运行特定测试
go test ./run/driver -run TestDataFormatting -v      # 数据格式化测试
go test ./run/driver -run TestZeroValueHandling -v   # 0值处理测试
go test ./run/driver -run TestNMEAParsing -v         # NMEA解析测试

3. 启动GPS设备服务

./bin/device-gps

📝 示例NMEA数据

项目支持解析以下格式的NMEA数据

$GBGGA,055525.000,3044.368753,N,10357.548051,E,1,04,2.40,129.3,M,-32.3,M,,*5A
$GBRMC,055525.000,A,3044.368753,N,10357.548051,E,0.00,000.00,100625,,,A,C*13
$GBGLL,3044.368753,N,10357.548051,E,055525.000,A,A*4B
$GBGSA,A,2,34,21,07,44,,,,,,,,,2.59,2.40,1.00,4*03
$GBGSV,6,1,21,10,80,005,27,34,76,067,33,38,75,161,28,21,57,046,29,1*71
$GBVTG,000.00,T,,M,0.00,N,0.00,K,A*2F

🔍 API接口

读取GPS位置

GET /api/v3/device/name/{deviceName}/location

响应示例:

{
  "latitude": "39°58'08.6\"N",
  "longitude": "116°29'30.0\"E",
  "altitude": "123.4 米"
}

读取GPS状态

GET /api/v3/device/name/{deviceName}/status

响应示例:

{
  "fix_quality": "GPS定位",
  "satellites_used": "8 颗卫星",
  "hdop": "1.20 (良好)",
  "gps_status": "ACTIVE"
}

读取运动信息

GET /api/v3/device/name/{deviceName}/motion

响应示例:

{
  "speed": "23.15 km/h",
  "course": "45.2° (东北)"
}

读取所有GPS数据

GET /api/v3/device/name/{deviceName}/all_data

响应示例:

{
  "latitude": "39°58'08.6\"N",
  "longitude": "116°29'30.0\"E",
  "altitude": "123.4 米",
  "speed": "23.15 km/h",
  "course": "45.2° (东北)",
  "utc_time": "12:34:56.00",
  "fix_quality": "GPS定位",
  "satellites_used": "8 颗卫星",
  "hdop": "1.20 (良好)",
  "gps_status": "ACTIVE"
}

🛡️ 错误处理与数据完整性

错误处理机制

  • 串口连接失败: 自动重试连接
  • 数据解析错误: 跳过无效数据,继续处理
  • 缓冲区溢出: 自动清空缓冲区,防止内存泄漏
  • 校验和错误: 丢弃无效的NMEA语句

数据完整性保护

  • 0值智能处理: 区分"无数据"和"有效0值"
  • 多数据源验证: 从多个NMEA语句获取数据提高可靠性
  • 数据有效性检查: 验证坐标格式和方向标识
  • 容错机制: 单个数据源失败不影响其他数据获取

特殊情况处理

  • 静止状态: 正确处理0速度车辆停止
  • 正北方向: 正确处理0航向指向正北
  • 特殊位置: 正确处理赤道/本初子午线坐标
  • 信号丢失: 优雅处理GPS信号中断情况

📈 性能优化

  • 使用异步goroutine处理串口数据
  • 智能缓冲区管理,避免频繁内存分配
  • 高效的NMEA解析算法
  • 最小化锁竞争,提高并发性能

🔧 故障排除

常见问题

  1. 串口权限问题

    sudo chmod 666 /dev/ttyUSB0
    
  2. GPS设备未连接

    • 检查USB连接
    • 确认设备路径正确
  3. NMEA数据格式错误

    • 检查GPS设备输出格式
    • 确认波特率设置正确

📄 许可证

本项目基于Apache 2.0许可证开源。

🤝 贡献

欢迎提交Issue和Pull Request来改进这个项目