Files
BLV_C1F_Module/BasicCode/Drive/NET/net.h
caocong 95916b9995 fix:修改UDP通讯中,取电变化上报机制
1、问题点:当RCU网络状态异常的情况下,网络还处于协商状态下,还未进入正常通讯环节时,取电变化不会进行判断。这会导致取电变化上报与实际产生取电状态时间点对不上。
2、将BLV_C1F_Module代码上传至Gitea,之前代码修改记录请查看 .\BasicCode\Readme.txt
2026-01-23 09:23:12 +08:00

220 lines
7.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef _DHCP_H_
#define _DHCP_H_
#include <stdio.h>
#include <string.h>
#include "CH57x_common.h"
#include "CH57xNET.H"
#include "DNS.h"
#include "BLV_NET_Function.h"
#define KEEPLIVE_ENABLE 1 /* 开启KEEPLIVE功能 */
#define RECE_BUF_LEN 536 /* 接收缓冲区的大小 */
#define Net_NO_SERVER 0x00 //无服务器
#define Net_LOCAL_SERVER 0x01 //本地服务器
#define Net_CLOUD_SERVER 0x02 //云端服务器
#define INTERRUPT_RECV_EN 0 //禁用中断方式接收
#define APPCALLBACK_RECV_EN 1 //使能回调方式接收
#define USE_AUTO_OBTAIN_IP 0 //DHCP自动获取ip 0DHCP自动获取; 1手动修改
#define USE_BLE_OBTAIN_IP 1 //蓝牙获取ip
#define User_NET_DNS_EN 1 //NET DNS使能
#define SOCKET_TYPE_TCP 1 //发送TCP的套接字
#define SOCKET_TYPE_MQTT 2 //发送MQTT的套接字
#define SOCKET_TYPE_UDP 3 //发送UDP的套接字
#define NET_RESEND_TIMES 3 /*重发次数最大值7实际重发次数+1 */
#define USER_NET_Register_Timeout 30 //向服务器注册命令发送超时,单位S
#define USER_NET_Send_Timeout 20 //发送数据等待回复时间,单位S
#define USER_NET_Register_Times 10 //向服务器注册命令发送次数
#define USER_NET_Send_Times 10 //发送数据重发次数
typedef void (*AppCallBack)(struct _SCOK_INF *,UINT32 ,UINT16 ,UINT8 *,UINT32 ); /* 接收回调函数*/
typedef enum
{
NET_INIT = 0,
NET_PHY_WAIT,
NET_DHCP,
NET_DHCP_WAIT,
NET_TFTP,
NET_DNS,
NET_DNS2,
NET_WAIT,
NET_COMPLETE,
NET_MQTT_DNS,
NET_MQTT_INIT,
NET_MQTT_WAIT,
NET_WAIT_MAC_RESTART,
NET_START_TO_INIT,
NET_CON_WAIT,
NET_SOCKET_WAIT,
}NET_STA;
typedef enum
{
MQTT_DNS = 0,
MQTT_INIT,
MQTT_WAIT,
MQTT_COMPLETE,
MQTT_RCON,
MQTT_FAIL,
}MQTT_STA; //2023-03-17
typedef enum
{
SOCKET_SEND,
SOCKET_RESEND,
SOCKET_COMPLETE,
}SOCKET_STA;
typedef enum
{
NET_STATUS_INIT = 0, //未初始化完成
NET_STATUS_PHY_DISCONN, //网线未插入 或 PHY协商失败
NET_STATUS_IP_CONFLI, //IP冲突
NET_STATUS_UNREACH, //不可达错误
NET_STATUS_NORMAL, //网络正常
}NET_STATUS;
#pragma pack(1)
typedef struct
{
UINT8 local_ip[4]; //本地ip地址
UINT8 gwip_addr[4]; //网关
UINT8 mask[4]; //子网掩码
UINT8 SocketId[4]; //存放创建的套接字索引
UINT8 ServerDename[64]; //服务器域名 2025-10-11
}NET_INFO;
typedef struct
{
uint8_t init_flag:1; //初始化完成标志位
uint8_t register_flag:1; //注册标志位
uint8_t search_ack_flag:1; //发送标志位
uint8_t dhcp_en:1; //DHCP是否启用
uint8_t dns_sta:4; //DNS状态
uint8_t dhcp_flg:1; //DHCP分配ip成功标志
uint8_t dns_flg:1; //DNS获取ip成功标志
uint8_t Udp_Internal_sta:4; //UDP状态机状态
uint8_t PHY_State:2; //NET PHY状态 0x00:当前网络未连接0x01:当前网络已连接DNS状态
uint8_t register_num:4; //注册计数
uint8_t dns_fail:4; //DNS失败计数用于切换DNS服务器使用
uint8_t server_dns_flag:1; //DNS成功解析服务器域名
uint8_t tftp_dns_flag:1; //DNS成功解析tftp服务器域名
uint8_t mqtt_dns_flag:1; //MQTT成功解析域名标志位
uint8_t online_state:3; //网络连接状态 0:离线 1:局域网在线 2:本地服务器在线 3:云端服务器在线
uint8_t sync_tick:2; //同步时间标记
uint8_t udp_dns_flag:1; //udp服务器解析域名标志位
uint8_t server_select:1; //服务器选择 0x00:默认云端服务器,0x01:本地服务器
uint8_t net_retry_flag:1; //网络重试标志位 -
uint8_t net_retry_num:5; //网络重试次数 - 比如DHCP重试次数DNS重试次数
uint8_t con_flag:1; //直连标记
uint8_t rcu_reboot_flag:1; //RCU重启标志位
uint8_t udp_scan_cnt:6; //udp扫描计数
uint8_t active_cmd_flag; //主动发送命令标志位
uint8_t net_sta; //网络状态机当前状态
uint8_t dis_ip[4]; //云端服务器ip地址
uint8_t tftp_ip[4]; //TFTP服务器
uint8_t udp_ip[4]; //额外的UDP服务器
uint8_t goal_ip[4]; //目标ip,
uint16_t local_port; //本地端口
uint16_t goal_port; //目标port
uint16_t dis_port; //云端服务器端口
uint16_t frame_no; //发送的帧号
uint32_t wait_cot; //等待计数
uint32_t register_tick; //注册计时
uint32_t search_ack_tick; //发送计时
uint8_t udp_sta; //UDP任务状态机
uint8_t udp_send_flag; //发送标记
uint8_t udp_retry_cnt; //重发次数
uint8_t udp_retry_num; //重发次数
uint16_t ack_frame; //ACK帧号
uint16_t udp_timesync_cnt; //时间同步次数 - 1s一次
uint16_t udp_periodic_cnt; //定期上报次数 - 1s一次
uint16_t udp_periodic_time; //定期上报时间间隔 - 单位:S
uint32_t udp_retry_tick; //重发超时时间戳
uint32_t udp_retry_time; //重发超时时间
uint32_t con_tick; //直连时间戳 2023-05-27
#if TFTP_GET_IP
uint8_t tftpip_gflag; //TFTP_IP下发标记
#endif
uint32_t udp_idle_tick; //UDP空闲时间戳
uint32_t udp_online_tick; //UDP离线时间戳
uint32_t udp_online_time; //UDP离线判定时间
}__attribute__ ((__packed__)) NET_SERVER_INFO;
#pragma pack()
extern uint32_t SysTick_10ms;
extern NET_INFO net_info;
extern NET_SERVER_INFO server_info;
extern UINT8 MACAddr[6]; /* CH579MAC地址 */
extern UINT8 SocketRecvBuf[RECE_BUF_LEN];
extern TFTP_LOG tftp_log;
extern uint8_t Global_Large_Buff[1100];
#if USE_INTERRUPT_RECV
extern UINT8 MyBuf[RECE_BUF_LEN];
#endif
void mStopIfError(UINT8 iError);
void CH57xNET_CreatTcpSocket(void);
void CH57xNET_CreatTcpSocket_2(UINT8* S);
UINT8 CH57xNET_LibInit(/*const*/ UINT8 *ip,/*const*/ UINT8 *gwip,/*const*/ UINT8 *mask,/*const*/ UINT8 *macaddr);
void CH57xNET_HandleSockInt(UINT8 sockeid,UINT8 initstat);
void CH57xNET_HandleGlobalInt(void);
//void UDPSocketParamInit(UINT8 S,UINT8 *addr,UINT16 SourPort,UINT16 DesPort );
//void UDPSocketParamInit1(UINT8 S,UINT8 *addr,UINT16 SourPort,UINT16 DesPort );
//void UDPSocketParamInit2(UINT8* S,UINT8 *addr,UINT16 SourPort,UINT16 DesPort );
void UDPSocketParamInit2(UINT8* S, UINT16 SourPort, AppCallBack cb);
UINT8 DNS_SocketParamInit(UINT8* S,UINT8 *addr,UINT16 SourPort,UINT16 DesPort );
void Timer0Init(UINT32 time);
UINT8 CH57xNET_DHCPCallBack(UINT8 status,void *arg);
void SystemClock_UART1_init(void);
void GetMacAddr(UINT8 *pMAC);
UINT8 Ethernet_Send_Start(UINT8 socketid, UINT8* buff, UINT16 len, UINT8* ip, UINT16 port); //启动指定套接字发送数据
UINT8 DNS_Restart(void); //DNS失败时重启DNS
UINT8 UDP_Socket_Creat(void); //创建一个UDP套接字详细属性需要到NetWork_Task状态机的NET_SOCKET设置
void NetWork_Parameter_Get(void);
void NetWork_Task(void); //网络任务状态机,主循环调用
uint16_t Data_Conver_To_Uint16(uint8_t *data);
void UDPSocket1_AppCallBack(struct _SCOK_INF * SocketInf,UINT32 ipaddr,UINT16 port,UINT8 *buff,UINT32 len);
void UDPSocket2_AppCallBack(struct _SCOK_INF * SocketInf,UINT32 ipaddr,UINT16 port,UINT8 *buff,UINT32 len);
void UDPSocket3_AppCallBack(struct _SCOK_INF * SocketInf,UINT32 ipaddr,UINT16 port,UINT8 *buff,UINT32 len);
void UDPSocket4_AppCallBack(struct _SCOK_INF * SocketInf,UINT32 ipaddr,UINT16 port,UINT8 *buff,UINT32 len);
#endif