EdgexAgent/device-gps-go/README.md

276 lines
7.7 KiB
Markdown
Raw Normal View History

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 颗卫星** - 室内或信号遮挡环境
## 🔧 配置说明
### 串口配置
```yaml
GPSCustom:
SerialPort: "/dev/ttyUSB0" # 串口设备路径
BaudRate: 9600 # 波特率
ReadTimeout: "100ms" # 读取超时
Debug: true # 调试模式
```
### 设备协议配置
```yaml
protocols:
UART:
deviceLocation: "/dev/ttyUSB0"
baudRate: "9600"
dataBits: "8"
stopBits: "1"
parity: "none"
```
## 🚀 快速开始
### 1. 编译项目
```bash
cd /home/clint/EdgeX/device-gps-go
go build -o bin/device-gps ./run/cmd/device-gps
```
### 2. 运行测试
```bash
# 运行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设备服务
```bash
./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
```
**响应示例:**
```json
{
"latitude": "39°58'08.6\"N",
"longitude": "116°29'30.0\"E",
"altitude": "123.4 米"
}
```
### 读取GPS状态
```
GET /api/v3/device/name/{deviceName}/status
```
**响应示例:**
```json
{
"fix_quality": "GPS定位",
"satellites_used": "8 颗卫星",
"hdop": "1.20 (良好)",
"gps_status": "ACTIVE"
}
```
### 读取运动信息
```
GET /api/v3/device/name/{deviceName}/motion
```
**响应示例:**
```json
{
"speed": "23.15 km/h",
"course": "45.2° (东北)"
}
```
### 读取所有GPS数据
```
GET /api/v3/device/name/{deviceName}/all_data
```
**响应示例:**
```json
{
"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. **串口权限问题**
```bash
sudo chmod 666 /dev/ttyUSB0
```
2. **GPS设备未连接**
- 检查USB连接
- 确认设备路径正确
3. **NMEA数据格式错误**
- 检查GPS设备输出格式
- 确认波特率设置正确
## 📄 许可证
本项目基于Apache 2.0许可证开源。
## 🤝 贡献
欢迎提交Issue和Pull Request来改进这个项目