EC800(8189).h 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #ifndef _EC800_H_
  2. #define _EC800_H_
  3. //----------------------包含
  4. #include "usart.h"
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <stdbool.h>
  9. #include <ctype.h>
  10. #include "cJSON.h"
  11. #include "cmsis_os2.h"
  12. #include "nmea.h"
  13. #include "main.h"
  14. #include "turnDetection.h"
  15. #include "EC800_FTP_OTA.h"
  16. #include "electronicFence.h"
  17. #include "task_ec800_upload.h"
  18. #include "task_communication.h"
  19. #include "global.h"
  20. #include "flash.h"
  21. //----------------------宏
  22. //--------参数定义
  23. #define TIMEOUT_MS 2 // 接收响应的等待时间,单位为100毫秒
  24. #define TURN_INTERVAL_TIME_MS 10 // 发布消息的间隔时间单位为100毫秒 转弯过程中的上传时间间隔
  25. #define PUBLISH_TIME_MS 30 // 发布消息的间隔时间单位为100毫秒 行车过程中的上传时间间隔
  26. #define CTR_CODE_JUDETIME 106 // 对时响应的控制代码
  27. #define CTR_CODE_REALDATE 202 // 实时数据响应的控制代码
  28. #define CTR_CODE_REMOTE 602 // 远程响应的控制代码
  29. #define CTR_CODE_LOGIN 102 // 登录响应的控制代码
  30. #define CTR_CODE_FENCES 605 // 围栏数据响应的控制代码
  31. //--------AT指令基础配置
  32. #define AT_CMD_TEST "AT\r\n" // 检查模组状态 模块返回:OK
  33. #define AT_CMD_ATE0 "ATE0\r\n" // 取消模块回显 模块返回:OK
  34. #define AT_CMD_CPIN "AT+CPIN?\r\n" // 检查SIM是否正常 模块返回:+CPIN: READY
  35. #define AT_CMD_CSQ "AT+CSQ\r\n" // 检查信号 模块返回:+CSQ: 25,99 注:主要25这个字段小于31就行
  36. #define AT_CMD_CREG "AT+CREG?\r\n" // 查询模组是否注册上GSM网络 模块返回:+CREG: 0,1 注:1或者5为正常
  37. #define AT_CMD_QIDEACT "AT+QIDEACT=1\r\n" // 关闭移动场景 模块返回:OK
  38. #define AT_CMD_QIACT "AT+QIACT=1\r\n" // 打开移动场景 模块返回:OK
  39. #define AT_CIMI "AT+CIMI\r\n" // 查询 IMSI 模块返回: <IMSI> OK
  40. //--------连接mqtt服务器
  41. #define client_idx 0 // 整型。 MQTT 客户端标识符。 范围: 0~5。
  42. #define AT_CMD_QMTCFG \
  43. do { \
  44. "AT+QMTCFG=\"qmtping\",0,30\r\n" \
  45. } while (0) // 设置MQTT心跳 模块返回:OK
  46. #define AT_CMD_QMTCFG_QOS "AT+QMTCFG=\"will\",0,1,1,0,255,255\r\n" // 设置QOS为1至少发送1次,无需配置Will Flag,
  47. #define AT_CMD_QMTCFG_SET_DATA_MODE "AT+QMTCFG=\"recv/mode\",0,0,1\r\n" // 设置接收数据的模式 模块返回:OK
  48. #define AT_CMD_QMTOPEN "AT+QMTOPEN=0,\"39.98.37.180\",32449\r\n" // 为模块打开一个网络 模块返回:+QMTOPEN: 0,0
  49. #define AT_CMD_QMTCONN "AT+QMTCONN=0,\"NULL\",\"hechun\",\"admin123\"\r\n" // 连接到mqtt服务器 模块返回:+QMTCONN: 0,0,0
  50. //--------订阅主题以及发布
  51. #define TOPIC1 "" // 订阅主题1
  52. #define TOPIC2 "" // 订阅主题2
  53. #define AT_CMD_QMTSUB(TOPIC1, TOPIC2) \
  54. do { \
  55. "AT+QMTSUB=0,1,\"TOPIC1\",0,\"TOPIC2\",0\r\n" \
  56. } while (0) // 连接到mqtt服务器 模块返回:+QMTCONN: 0,0,0
  57. #define STR_TOPIC "" // 访问的主题
  58. #define AT_CMD_QMTPUBEX(STR_TOPIC, len) \
  59. do { \
  60. " AT+QMTPUBEX=0,0,0,0,\"STR_TOPIC\",len\r\n" \
  61. } while (0) // 连接到mqtt服务器 模块返回:+QMTCONN: 0,0,0
  62. //--------AT指令的响应
  63. #define AT_RESP_OK "OK\r\n"
  64. #define AT_RESP_ERROR "ERROR\r\n"
  65. #define AT_RESP_CPIN_READY "+CPIN: READY\r\n\r\nOK\r\n"
  66. #define AT_RESP_CSQ "+CSQ: \r\n"
  67. #define AT_RESP_QMTOPEN "+QMTOPEN: 0,0"
  68. #define AT_RESP_QMTCONN "+QMTCONN: 0,0,0"
  69. #define AT_RESP_QMTSUB "+QMTSUB: 0,1,0,0"
  70. #define AT_RESP_QMTPUBEX_RE "> \r\n"
  71. #define AT_RESP_QMTPUBEX "+QMTPUBEX: 0,0,0"
  72. //--------GNSS的配置
  73. #define AT_QGPS_1 "AT+QGPS=1\r\n" // 打开 GNSS 模块返回:OK
  74. #define AT_QGPS_0 "AT+QGPS=0\r\n" // 关闭 GNSS 模块返回:OK
  75. #define AT_QGPSCFG_out_port "AT+QGPSCFG=\"outport\",\"uartdebug\"\r\n" // 通过调试串口输出NMEA语句 模块返回:OK
  76. #define AT_QGPSCFG_nmeasrc "AT+QGPSCFG=\"nmeasrc\",1\r\n" // 启用/禁用通过 AT+QGPSGNMEA 获取 NMEA 语句。
  77. // 使能后,执行AT+QGPSGNMEA, NMEA 语句将以命令返回值的形式通过 AT 口输出。 模块返回:OK
  78. #define AT_QGPSCFG_gpsnmeatype "AT+QGPSCFG=\"gpsnmeatype\",63\r\n" // 配置 NMEA 语句的输出类型 为 所有 格式 模块返回:OK
  79. #define AT_QGPSCFG_gnssconfig "AT+QGPSCFG=\"gnssconfig\",1\r\n" // 配置支持的 GNSS 卫星导航系统为 GPS + BeiDou 模块返回:OK
  80. #define AT_QGPSCFG_autogps "AT+QGPSCFG=\"autogps\",0\r\n" // 禁用 GNSS 自启动 模块返回:OK
  81. #define AT_QGPSCFG_apflash "AT+QGPSCFG=\"apflash\",0\r\n" // 启用 AP-Flash 快速热启动功能。 模块返回:OK
  82. #define AT_QGPSLOC "AT+QGPSLOC=0\r\n" // 获取定位信息 纬度和经度显示格式<latitude>,<longitude>格式: ddmm.mmmmN/S,dddmm.mmmmE/W
  83. #define AT_QGPSGNMEA_GGA "AT+QGPSGNMEA=\"GGA\"\r\n" // 查询 GGA 语句
  84. #define AT_QGPSGNMEA_GSA "AT+QGPSGNMEA=\"GSA\"\r\n" // 查询 GSA 语句
  85. #define AT_QGPSGNMEA_RMC "AT+QGPSGNMEA=\"RMC\"\r\n" // 查询 RMC 语句
  86. #define AT_QGPSDEL_1 "AT+QGPSDEL=1\r\n" // 1 不删除数据。开启 GNSS 后,条件允许时进行热启动。
  87. //---------------------函数声明
  88. // @brief 发送指令函数
  89. void EC800M_SendCommand(const char* command);
  90. // @brief 接收指令回复函数
  91. char* EC800M_RecRespond(char *haystack, const char *needle );
  92. // @brief 接收使能函数
  93. void EC800_recEnable(void);
  94. // @brief EC800M状态转换与使用
  95. extern void EC800_stateTransition_use(void);
  96. // 接收并比较响应字符串
  97. uint8_t Accept_and_Compare_Str(const char* needle);
  98. // 自定义的搜索函数
  99. void* search_sequence(const void* haystack, size_t haystack_len, const void* needle, size_t needle_len);
  100. // @brief 故障数据上传
  101. extern uint8_t EC800_uploadFaultReport(uint32_t fault_time_stamp, uint32_t fault_Code);
  102. // @brief MQTT服务器数据接收处理
  103. extern void handleReceive(void);
  104. // @brief 判断是否执行重连MQTT服务器
  105. void reconnect_mqtt_server(void);
  106. //---------------------参数声明
  107. typedef struct{
  108. // 为模块打开一个网络中
  109. char ip[20]; // IP
  110. uint16_t port; // port
  111. // 连接到mqtt服务器
  112. char clientid[20]; // clientid
  113. char username[20]; // username
  114. char password[20]; // password
  115. // 外部使用
  116. uint8_t ec800InitFlag; // ec800模块初始化标志 0:未初始化完成 1;初始化完成
  117. uint8_t hardwareUpdate; // 固件更新标志 1为更新 0为不更新
  118. uint8_t fenceRecSuccess; // 围栏数据接收成功标志 1;接收成功 0;未接收
  119. uint8_t vehSpeed; // vehicle speed 服务器下发的限制车速
  120. }ec800Date;
  121. extern ec800Date s_ec800Date;
  122. typedef struct{
  123. short drivDirection; // 行驶方向 单位 度 short类型
  124. short vehicleStatus; // 车辆状态 停驶:0 运行中:1 充电中:2 电池离仓:3 故障:4 离线:5
  125. uint8_t nshemi; //北纬/南纬,N:北纬;S:南纬
  126. uint8_t ewhemi; //东经/西经,E:东经;W:西经
  127. uint32_t latitude; //纬度 分扩大100000倍,实际要除以100000
  128. uint32_t longitude; //经度 分扩大100000倍,实际要除以100000
  129. uint32_t Timestamp; // 时间戳
  130. char lat_long_data[40]; // 经纬度数据
  131. // char uploadTime[20]; // 上传时间
  132. char imsi[20]; // SIM卡的IMSI信息
  133. uint16_t vehicleSpeed; // 实时车速
  134. uint16_t dailyDrivTime; // 当日行驶时长 高字节用来表示小时,低字节用来表示分钟 服务器单位为 小时
  135. uint16_t dailyDrivMileage; // 当日行驶里程 0.1km 服务器单位为 km 需要除个10
  136. uint16_t accTotalDrivTime_day; // 累积行驶总时长 天 服务器单位为 小时
  137. uint16_t accTotalDrivTime_h_min; // 累积行驶总时长 小时 分钟 高字节用来表示小时,低字节用来表示分钟
  138. uint16_t accTotalMileage_h; // 累积行驶总里程 高16字节 服务器单位为 km
  139. uint16_t accTotalMileage_l; // 累积行驶总里程 低16字节
  140. uint16_t runTime; // 单次运行时长 高字节用来表示小时,低字节用来表示分钟 服务器单位为分钟
  141. uint16_t batCompartmentTemp; // 电池仓温度
  142. uint16_t demandCur; // 需求电流 0.1A 上传为float类型 需要除个10
  143. uint16_t demandVol; // 需求电压 0.1V 上传为float类型 需要除个10
  144. uint16_t alarmLevel; // 告警等级
  145. uint16_t alarmType; // 告警类型
  146. uint8_t batSn[40]; // 电池编码ASCII码
  147. uint8_t Vehicle_Num[20]; // 车辆编号
  148. uint8_t VIN[26]; // 车架号
  149. // 设备的唯一ID
  150. uint32_t devId[3]; // mcu的唯一性ID
  151. // 登录响应数据
  152. uint8_t loginResult; // 登录服务器结果 1: 登录成功 0:登录失败
  153. // 中控板故障数据
  154. uint8_t malfunction; // 故障 定义
  155. // bit0:超出围栏故障 bit1:485通信故障 bit2:升级故障 bit3:MQTT故障
  156. // bit4:陀螺仪故障 bit5:电池故障 bit6:4G模块初始化失败
  157. }messageDate;
  158. extern messageDate s_messageDate;
  159. extern nmea_utc_time s_nmea_utc_time;
  160. // 常用时间格式转时间戳
  161. uint32_t EC800_mktime (unsigned int year, unsigned int mon,
  162. unsigned int day, unsigned int hour,
  163. unsigned int min, unsigned int sec);
  164. #endif