yincheng.zhong
7 天以前 b53fff11e6f0d560594834de32886239cbba90a3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*******************************************************************************
 * File Name         : MQTTApp.h
 * Description       : MQTT应用层头文件
 *******************************************************************************/
#ifndef __MQTT_APP_H__
#define __MQTT_APP_H__
 
#ifdef __cplusplus
extern "C" {
#endif
 
/*******************************************************************************
 *                              Include Files                                  *
 *******************************************************************************/
#include "HIDO_Typedef.h"
#include "MsgPack.h"
 
/*******************************************************************************
 *                                  Macro                                      *
 *******************************************************************************/
 
/*******************************************************************************
 *                             Type Definition                                 *
 *******************************************************************************/
 
/* GPS数据结构(应用层使用) */
typedef struct
{
    HIDO_UINT64 timestamp;
    HIDO_CHAR gps_raw[256];
    ST_IMUData imu_data;
    ST_StatusData status;
} ST_MQTTAppGpsData;
 
/* 控制指令数据结构 */
typedef struct
{
    HIDO_CHAR command[32];        // 指令:start, stop, pause, resume, emergency_stop
    HIDO_CHAR request_id[64];     // 请求ID
    HIDO_CHAR parameters[256];    // 参数(JSON字符串)
} ST_MQTTAppControlData;
 
/* 路径点坐标结构 */
typedef struct
{
    HIDO_FLOAT x;  // X坐标,单位:米
    HIDO_FLOAT y;  // Y坐标,单位:米
} ST_MQTTAppPathPoint;
 
/* 基站原点数据 */
typedef struct
{
    HIDO_CHAR latitude_dm[32];           // 纬度(度分格式)
    HIDO_CHAR latitude_hemisphere[4];    // 纬度半球 N/S
    HIDO_CHAR longitude_dm[32];          // 经度(度分格式)
    HIDO_CHAR longitude_hemisphere[4];   // 经度半球 E/W
    HIDO_FLOAT altitude;                 // 海拔高度,单位:米
} ST_MQTTAppBasestationData;
 
/* 路径数据结构 */
#define MQTT_APP_MAX_PATH_POINTS1  1000  // 最大路径点数量
#define MQTT_APP_MAX_PATH_POINTS2  4000  // 最大路径点数量
typedef struct
{
    HIDO_CHAR msg_id[64];                // 消息ID
    HIDO_UINT64 timestamp;               // 时间戳
    HIDO_CHAR user_id[32];               // 用户ID
    HIDO_CHAR device_id[32];             // 设备ID
    HIDO_CHAR command[32];               // 命令类型
    
    ST_MQTTAppBasestationData basestation;  // 基站原点数据
    
    HIDO_CHAR path_id[64];               // 路径ID
    HIDO_CHAR coordinate_system[32];     // 坐标系
    HIDO_CHAR mowing_pattern[32];        // 割草模式
    
    HIDO_UINT32 boundary_point_count;    // 边界点数量
    ST_MQTTAppPathPoint boundary_points[MQTT_APP_MAX_PATH_POINTS1];  // 边界点数组
    
    HIDO_UINT32 navigation_point_count;  // 导航点数量
    ST_MQTTAppPathPoint navigation_points[MQTT_APP_MAX_PATH_POINTS2];  // 导航点数组
} ST_MQTTAppPathData;
 
/* 控制指令回调函数 */
typedef HIDO_VOID (*FN_MQTTAppControlCallback)(ST_MQTTAppControlData *_pstCtrlData, HIDO_VOID *_pArg);
 
/* 路径数据回调函数 */
typedef HIDO_VOID (*FN_MQTTAppPathCallback)(ST_MQTTAppPathData *_pstPathData, HIDO_VOID *_pArg);
 
/* MQTT应用层配置 */
typedef struct
{
    FN_MQTTAppControlCallback fnControlCallback;  // 控制指令回调
    HIDO_VOID *pControlArg;
    FN_MQTTAppPathCallback fnPathCallback;        // 路径数据回调
    HIDO_VOID *pPathArg;
} ST_MQTTAppConfig;
 
/*******************************************************************************
 *                        Global Function Declaration                          *
 *******************************************************************************/
 
/**
 * @brief MQTT应用层初始化
 * @param _pstConfig 配置参数
 * @return HIDO_OK/HIDO_ERR
 */
HIDO_INT32 MQTTApp_Init(ST_MQTTAppConfig *_pstConfig);
 
/**
 * @brief 上报GPS数据
 * @param _pstGpsData GPS数据
 * @return HIDO_OK/HIDO_ERR
 */
HIDO_INT32 MQTTApp_ReportGps(ST_MQTTAppGpsData *_pstGpsData);
 
/**
 * @brief 解析下发消息(由MQTTClient调用)
 * @param _pcTopic 主题
 * @param _pu8Payload 消息负载
 * @param _u32PayloadLen 负载长度
 * @return HIDO_OK/HIDO_ERR
 */
HIDO_INT32 MQTTApp_ParseMessage(HIDO_CHAR *_pcTopic, HIDO_UINT8 *_pu8Payload, HIDO_UINT32 _u32PayloadLen);
 
/**
 * @brief 填充GPS数据(辅助函数)
 * @param _pstGpsData GPS数据结构
 * @param _pcGpsRaw GPS原始数据
 * @param _fRoll 横滚角
 * @param _fPitch 俯仰角
 * @param _fYaw 偏航角
 * @param _u8BattLevel 电池电量百分比
 * @param _fBattVolt 电池电压
 * @return HIDO_OK/HIDO_ERR
 */
HIDO_INT32 MQTTApp_FillGpsData(ST_MQTTAppGpsData *_pstGpsData,
                                const HIDO_CHAR *_pcGpsRaw,
                                HIDO_FLOAT _fRoll,
                                HIDO_FLOAT _fPitch,
                                HIDO_FLOAT _fYaw,
                                HIDO_UINT8 _u8BattLevel,
                                HIDO_FLOAT _fBattVolt);
 
/**
 * @brief 从GPS模块获取数据并上报(使用GGA格式)
 * @return HIDO_OK/HIDO_ERR
 */
HIDO_INT32 MQTTApp_ReportGpsFromDevice(HIDO_VOID);
 
/**
 * @brief 虚拟GPS数据上报(用于测试,不依赖真实硬件)
 * @return HIDO_OK/HIDO_ERR
 */
HIDO_INT32 MQTTApp_ReportGpsVirtual(HIDO_VOID);
 
#ifdef __cplusplus
}
#endif
 
#endif /* __MQTT_APP_H__ */