net_proc.h 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. #ifndef _NET_PROC_H_
  2. #define _NET_PROC_H_
  3. #include "stm32f10x.h"
  4. //#include "os.h"
  5. #include "includes.h"
  6. #include "device.h"
  7. #include "gateway.h"
  8. //#include "net_proc.h"
  9. #include "../dev_mgr/taxctrl/tax_ctrl.h"
  10. //#include "oiltank.h"
  11. //#include "net_ctrl.h"
  12. #include "../network/downlink.h"
  13. #include "../network/uplink.h"
  14. #include "net_ctrl.h"
  15. #include "../gateway_collect/gateway_collect.h"
  16. #define UPDATE_TOTAL_PERIOD (10*60)//(5*60) //(500*10)//*60) // 1为1S, 5为5S 5*60:5分钟
  17. #define UPDATE_EACH_TIME 300
  18. extern uint8_t RadioRxPayload[255];
  19. enum {
  20. UP_PROG_FROM_NET = 0x22, // 来源来网络
  21. UP_PROG_FROM_GAT = 0x44, //来源来网关
  22. };
  23. enum { // 升级结果类型
  24. UPDATE_RECEIVE_UPDATEFLAG = 0x11, // URL的地址与长度不匹配
  25. UPDATE_SAMEVERSION, // 和当前版本相同
  26. UPDATE_FAILE_NOCOLLECT, // 此采集器不在本网关下
  27. UPDATE_DOWNLOADFILE_FAILED, //文件下载失败,即文件大小小于2个字节
  28. UPDATE_HTTP_ERROR, //HTTP返回错误码
  29. UPDATE_DOWNLOADFILE_SUCCESS, // 文件下载成功
  30. UPDATE_CRCERROR, // 文件包中的CRC与实际不符
  31. UPDATE_URL_FILE_TYPE_ERROR, // URL中的文件信息与文件包中的信息不一致
  32. UPDATE_DEVICETYPEERROR, // 升级设备类型不匹配
  33. UPdATE_FILE_LEN_ERROR, // 升级文件长度超过128个字节
  34. UPDATE_SUCCESS, // 升级成功
  35. UPDATE_RETURN_SUCESS, // 回退
  36. // UPDATE_SUCESS, // 升级程序成功
  37. // UPDATE_TYPEERROR, // 升级类型不匹配 当前升级文件不是网关的,或不是本采集器的
  38. // UPDATE_FIXCHARERROR, // 文件包中的固定字符错误
  39. // UPDATE_TOTALLENERROR, // 文件包中的长度与实际长度不对应该
  40. // UPDATE_FILEVERSION, // 文件包中的版本和当前文件名中的版本不一致
  41. // UPDATE_FAILED , // 升级失败
  42. // UPDATE_UPDATEING, // 升级中
  43. // UPDATE_FINISH, // 升级完成
  44. };
  45. typedef enum net_msg_type {
  46. /* 以下为外部交互信息 */
  47. /* uplink, 设备侧 ---> 后端服务器 */
  48. net_msg_type_none,
  49. net_msg_type_lot = 1,
  50. net_msg_type_trans = 2,
  51. net_msg_type_oiltank = 3,
  52. net_msg_type_gps = 4,
  53. net_msg_type_gateway = 5,
  54. net_msg_type_log = 6,
  55. net_msg_type_debug = 7,
  56. /* downlink 后端服务器 ----> 设备侧 */
  57. net_msg_type_rsv = 0x80,
  58. net_msg_type_config = 0x81,
  59. net_msg_type_update = 0x82,
  60. net_msg_type_chnbind = 0x83,
  61. net_msg_type_commnd = 0x84,
  62. net_msg_type_reboot = 0x85,
  63. /* 以下为内部交互信息,通过内部lora局域网交互升级包 */
  64. net_msg_type_timer,
  65. /* Gateway ----> Node */
  66. net_msg_type_update_start = 0x13,
  67. net_msg_type_update_continues = 0x14,
  68. net_msg_type_update_retransmit_rsp = 0x15,
  69. net_msg_type_update_ack_status = 0x16,
  70. /* Node ----> Gateway */
  71. net_msg_type_update_retransmit_req = 0x22,
  72. net_msg_type_update_status = 0x21,
  73. /* 网关绑定相关 */
  74. net_msg_type_bind_req = 0x40,
  75. net_msg_type_bind_rsp = 0x41,
  76. net_msg_type_node_echo = 0x42,
  77. net_msg_type_gw_echo = 0x43,
  78. } net_msg_type;
  79. typedef struct _update_msg_format {
  80. uint16_t rcv_device_type; // 接收设备的类型
  81. uint32_t rcv_device_id; //接收设备的SN
  82. uint16_t des_device_type;//升级设备的类型
  83. uint32_t des_device_id;//升级设备的SN
  84. uint32_t update_version; //升级版本
  85. char url[128];
  86. }__attribute__((packed)) update_msg_format;
  87. // 0x13指令 下行,启动升级指令
  88. typedef struct _ota_start_info {
  89. uint16_t rcv_device_type;// 接收设备的类型 和SN
  90. uint32_t rcv_device_id;
  91. uint16_t des_device_type;//被升级设备的设备类型和id
  92. uint32_t des_device_id;
  93. uint32_t update_version;//升级包类型和版本;
  94. uint32_t total_bytes;//升级包总长度和校验码
  95. uint16_t time; // 每包间隔时常
  96. }__attribute__((packed)) ota_start_info_t;
  97. // 0x14 0x15 指令 连续包 和重传包指令
  98. typedef struct _ota_continues_info {
  99. uint16_t rcv_device_type;// 接收设备的类型 和SN
  100. uint32_t rcv_device_id;
  101. uint16_t des_device_type;//被升级设备的设备类型和id
  102. uint32_t des_device_id;
  103. uint16_t total_pkgs; // 升级包的总个数
  104. uint16_t sub_pkg_id; //升级包的编号
  105. uint8_t sub_pkg_len; //每包的长度
  106. // uint32_t *pkg_content;
  107. }__attribute__((packed)) ota_continues_info_t;
  108. // 0x22指令 请求重传包指令
  109. typedef struct _ota_retransmit_req {//重传请求
  110. uint16_t rcv_devict_type; //接收设备
  111. uint32_t rcv_device_id; //接收设备
  112. uint16_t repeat_sub_pkg_id;
  113. }__attribute__((packed)) ota_retransmit_req_t;
  114. // 0x16指令 网关通知采集器去升级采集器
  115. typedef struct _ota_lineoffupdate_collect {
  116. uint16_t master_device_type; // 主设备类型
  117. uint32_t master_device_sn; // 主设备SN
  118. uint16_t slave_device_type; // 从设备类型
  119. uint32_t slave_device_sn; // 从设备 SN
  120. uint16_t des_device_type; // 升级目标设备类型
  121. uint32_t des_device_sn; // 升级目标设备SN
  122. uint32_t reserve; // 预留
  123. }__attribute__((packed)) ota_lineoffupdate_coll_t;
  124. // 0x23 指令,
  125. typedef struct _ota_updatestatus_up { // 升级状态上报
  126. uint16_t rcv_device_type;// 接收设备的类型 和SN
  127. uint32_t rcv_device_id;
  128. uint16_t des_device_type;//被升级设备的设备类型和id
  129. uint32_t des_device_id;
  130. uint32_t des_device_bootVr; //被升级设备的bootloader版本
  131. uint32_t des_device_appVr; // 被升级设备的APP版本
  132. uint8_t status; // 升级状态码
  133. uint32_t reserve; // 预留
  134. }__attribute__((packed)) ota_updatestatus_up_t;
  135. typedef struct _inner_msg_format {
  136. uint16_t frame_header; //帧头
  137. uint16_t fcs; //帧校验
  138. uint32_t seq_no; //消息序列号
  139. uint8_t proto_ver; //协议版本
  140. uint8_t type; //消息类型
  141. uint16_t len; //消息长度
  142. char info[160];
  143. } inner_msg_format_t;
  144. typedef struct _server_msg_header {
  145. uint16_t frame_header; //帧头
  146. uint8_t proto_ver; //协议版本 0x01
  147. uint32_t seq_no; //消息序列号
  148. uint8_t msgtypeFirst; //一级消息类型 0x01:系统类 0x02:状态类 0x03:数据类 0x04:产测类
  149. uint16_t msgtypeSecd; // 二级消息类型
  150. uint16_t len; //消息长度
  151. char info[1024];
  152. }__attribute__((packed)) sverMsgHeader;
  153. #define FRAME_HEADER_LEN 12
  154. #if 1
  155. //#define MQTT_SERVER_IP "8.142.80.166"
  156. #define MQTT_SERVER_IP "test-mqtt.cpyypt.cn"
  157. #else
  158. #define MQTT_SERVER_IP "39.100.96.218"
  159. #endif
  160. //#define MQTT_SERVER_PORT "1883"
  161. #define MQTT_SERVER_PORT "9000"
  162. //#define MQTT_UPLINK_LOT_TOPIC "LotDeviceInfo" //LotDeviceInfo
  163. #define MQTT_UPLINK_LOT_TOPIC "cpyypt/up/"//"/mqtt/topic" //LotDeviceInfo //"/mqtt/downlink"
  164. #define MQTT_UPLINK_TRANS_TOPIC "Transaction"
  165. #define MQTT_UPLINK_TANK_TOPIC "OilTankLevel"
  166. #define MQTT_UPLINK_GPS_TOPIC "GPSLocation"
  167. #define MQTT_UPLINK_GATEWAY_TOPIC "GWDeviceInfo" //
  168. #define MQTT_UPLINK_LOG_TOPIC "LogInfo"
  169. #define MQTT_UPLINK_DEBUG_TOPIC "DebugInfo"
  170. #define MQTT_UPLINK_TOPIC "cpyypt/up/"
  171. #define MQTT_DNLINK_TOPIC "cpyypt/down/"
  172. #define MQTT_DNLINK_TOPIC_CASE "cpyypt/down/"
  173. #define TOPIC_GET_BY_MSGTYPE(msg_type) ((msg_type == net_msg_type_lot)?(MQTT_UPLINK_LOT_TOPIC):\
  174. ((msg_type == net_msg_type_trans)?(MQTT_UPLINK_TRANS_TOPIC): \
  175. ((msg_type == net_msg_type_oiltank)?(MQTT_UPLINK_TANK_TOPIC): \
  176. ((msg_type == net_msg_type_gps)?(MQTT_UPLINK_GPS_TOPIC):(MQTT_UPLINK_GATEWAY_TOPIC)))))
  177. typedef void (*net_init)(char *device_id);
  178. typedef void (*net_send)(char *buffer, uint32_t len);
  179. typedef uint32_t (*net_recv)(char *buffer, uint32_t *len);
  180. typedef struct _net_drv {
  181. net_init init;
  182. net_send send;
  183. net_recv recv;
  184. } net_drv_t;
  185. typedef enum DEV_WORK_STATE
  186. {
  187. DEV_WORK_STATE_NORMAL,
  188. DEV_WORK_STATE_UPDATING,
  189. DEV_WORK_STATE_UPDATE_RETRANSMIT,
  190. DEV_WORK_STATE_ONLOOKER, //旁观者模式
  191. DEV_WORK_STATE_OTA_BEGIN, //开始升级模式
  192. DEV_WORK_STATE_OTA_CONTINUOUS, //升级中连续收包模式
  193. DEV_WORK_STATE_OTA_RETRANSMIT, //升级中重传模式
  194. DEV_WORK_STATE_OTA_UPGRADE_RCV_END, //升级中升级包接收完成模式
  195. DEV_WORK_STATE_PT, //产测模式
  196. DEV_WORK_STATE_UNINIT, //出厂信息未初始化模式
  197. DEV_WORK_STATE_MAX
  198. }DEV_WORK_STATE_T;
  199. typedef struct _system_network {
  200. uint8_t memory[4][1024]; //必须4字节对齐
  201. uint8_t dev_type;
  202. uint8_t workstate;
  203. OS_Q net_q;
  204. OS_SEM sem;
  205. OS_MEM net_m;
  206. OS_TMR net_tmr;
  207. void * net_hdl; // mqtt是否初始化
  208. net_send uplink_send; //4G 上传数据的函数指针
  209. net_send downlink_send; //4G 下载数据的函数指针
  210. uint32_t seq_no;
  211. char str[1024];
  212. }system_network_t;
  213. extern system_network_t sys_net;
  214. void NET_IMEI_ICCID_INFO_GET(char *imei, char *iccid);
  215. void net_queue_insert(char *p_msg, uint32_t msg_len);
  216. void * net_queue_mem_calloc(void);
  217. int net_queue_mem_free(void * p_msg);
  218. //void net_msg_frame_fill(gateway_collect_com_t *p_msg, uint8_t msg_type, uint16_t len);
  219. extern void close_tcp_mqtt(void);
  220. void svc_proc(uint32_t dev_type, uint32_t dev_id);
  221. void * net_queue_mem_calloc_must(void);
  222. //extern void collect_msg_frame_fill(gateway_collect_com_t *p_msg,uint8_t msg_type,uint16_t len);
  223. extern void gateway_update_proc(uint8_t *data,uint8_t msg_len);
  224. extern void gateway_update_collect_status(void);
  225. extern void gateway_reset_send_update_status(void);
  226. extern void uplink_net_send(char *buffer, uint32_t len);
  227. extern void * uplink_net_init(char *device_id) ;
  228. extern void gateway_update_gateway_proc(void);
  229. extern void gateway_update_gateway_status(void);
  230. #endif