diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml
index 5446086..ac427ad 100644
--- a/.settings/language.settings.xml
+++ b/.settings/language.settings.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/BLV_485_Driver/blv_re485_dev_energymonitor.c b/BLV_485_Driver/blv_re485_dev_energymonitor.c
new file mode 100644
index 0000000..4164989
--- /dev/null
+++ b/BLV_485_Driver/blv_re485_dev_energymonitor.c
@@ -0,0 +1,10 @@
+/*
+ * blv_re485_dev_energymonitor.c
+ *
+ * Created on: Dec 20, 2025
+ * Author: cc
+ */
+
+
+
+
diff --git a/BLV_485_Driver/inc/blv_nor_dev_serviceinfo.h b/BLV_485_Driver/inc/blv_nor_dev_serviceinfo.h
new file mode 100644
index 0000000..e7072b6
--- /dev/null
+++ b/BLV_485_Driver/inc/blv_nor_dev_serviceinfo.h
@@ -0,0 +1,102 @@
+/*
+ * blv_nor_dev_serviceinfo.h
+ *
+ * Created on: Dec 20, 2025
+ * Author: cc
+ */
+
+#ifndef BLV_485_DRIVER_INC_BLV_NOR_DEV_SERVICEINFO_H_
+#define BLV_485_DRIVER_INC_BLV_NOR_DEV_SERVICEINFO_H_
+
+#include
+#include "blv_rs485_protocol.h"
+#include "logic_file_function.h"
+
+#define ServiceNumMAX 64 //服务信息个数限制
+
+typedef enum //服务下标
+{
+ Service_Ele = 0, //0 LOOPCH01 取电
+ Service_Dnd, //1 LOOPCH02 勿扰
+ Service_Clean, //2 LOOPCH03 清理
+ Service_Call, //3 LOOPCH04 呼叫
+ Service_Wash, //4 LOOPCH05 洗衣
+ Service_CheckOut, //5 LOOPCH06 退房
+ Service_Wait, //6 LOOPCH07 稍后
+ Service_Sos, //7 LOOPCH08 SOS
+ Service_Meals, //8 LOOPCH09 预约待租
+ Service_Food_Plate, //9 LOOPCH10 开锁
+ Service_Luggage, //10 LOOPCH11 行李
+ Service_Strong, //11 LOOPCH12 保险箱 用于无卡取电门口红外使能
+ Service_Door, //12 LOOPCH13 门磁
+ Service_Warning, //13 LOOPCH14 提示音 用于静音开启和关闭
+ Service_15, //14 LOOPCH15 服务15 用于背光开启和关闭
+ Service_16,
+
+ Service_17,
+ Service_18,
+ Service_19,
+ Service_20,
+ Service_21,
+ Service_22,
+ Service_23,
+
+ Service_24,
+
+ Service_PMS_Rented, //房态 - 出租
+ Service_PMS_CheckOut, //房态 - 退房
+ Service_PMS_Waiting, //房态 - 待租
+ Service_PMS_Vacant, //房态 - 空房
+ Service_29,
+ Service_30,
+ Service_31,
+ Service_32,
+ Service_33,
+ Service_34,
+ Service_35,
+ Service_36,
+ Service_37,
+ Service_38,
+ Service_39,
+ Service_40,
+ Service_41,
+ Service_42,
+ Service_43,
+ Service_44,
+ Service_45,
+ Service_46,
+ Service_47,
+ Service_48,
+ Service_49,
+ Service_50,
+ Service_51,
+ Service_52,
+ Service_53,
+ Service_54,
+ Service_55,
+ Service_56,
+ Service_57,
+ Service_58,
+ Service_59,
+ Service_60,
+ Service_61,
+ Service_62,
+ Service_63,
+ Service_64,
+
+ Service_Num_MAX, //本地自定义服务信息个数上限
+}Enum_Dev_Service; //设备服务信息集合
+
+typedef struct
+{
+ uint8_t DevChangeFlag[ServiceNumMAX]; //设备变化标志 1打开 2关闭 读完标志后,需要清空
+ uint8_t DevServiceState[ServiceNumMAX]; //当前服务信息的状态 结合设备状态变化标志,可以判断当前服务信息是打开还是关闭
+ uint8_t DevServiceStateLast[ServiceNumMAX]; //当前服务信息的上一个状态
+ uint8_t ServiceLoopValidNum; //服务信息有效回路数
+ uint8_t is_first_power_on; //首次取电标志位
+}NOR_SERVICE_INFO; //服务信息的结构体参数
+
+
+
+
+#endif /* BLV_485_DRIVER_INC_BLV_NOR_DEV_SERVICEINFO_H_ */
diff --git a/BLV_485_Driver/inc/blv_rs485_dev_energymonitor.h b/BLV_485_Driver/inc/blv_rs485_dev_energymonitor.h
new file mode 100644
index 0000000..e043747
--- /dev/null
+++ b/BLV_485_Driver/inc/blv_rs485_dev_energymonitor.h
@@ -0,0 +1,65 @@
+/*
+ * blv_rs485_dev_energymonitor.h
+ *
+ * Created on: Dec 20, 2025
+ * Author: cc
+ */
+
+#ifndef BLV_485_DRIVER_INC_BLV_RS485_DEV_ENERGYMONITOR_H_
+#define BLV_485_DRIVER_INC_BLV_RS485_DEV_ENERGYMONITOR_H_
+
+#include
+#include "blv_rs485_protocol.h"
+#include "logic_file_function.h"
+
+#define BLV_Energy_Bus_Type 0xF4
+
+#define BLV_Energy_RecvData_LenMax 30
+#define BLV_Energy_RecvData_LenMin 8
+
+#define BLV_Energy_DataHeard 0x8A
+#define BLV_Energy_DataEnd 0xA8
+
+#define BLV_Energy_PeriodicReport_CMD 0x01 //定期上报命令
+#define BLV_Energy_Inquire_CMD 0x02 //查询命令
+#define BLV_Energy_SetInfo_CMD 0x03 //设置参数信息
+#define BLV_Energy_ReadVer_CMD 0x04 //设置参数信息
+#define BLV_Energy_ClearStat_CMD 0x13 //清除定期能耗统计
+
+#define BLV_Energy_Send_Flag_Max 4
+#define BLV_Energy_SetInfo_Flag 0x0001
+#define BLV_Energy_ClearStat_Flag 0x0002
+#define BLV_Energy_ReadVer_Flag 0x0004
+#define BLV_Energy_Inquire_Flag 0x0008
+
+typedef struct
+{
+ BLV_COMM_RECORD_G comm_record; //通讯记录
+
+ uint8_t DevSendCnt; //设备发送计数 计数达到重发次数都没有回复,判为离线
+ uint8_t DevOffline; //设备离线标志 1,设备离线 0,设备在线
+ uint8_t DevOfflineLast; //设备离线标志 1,设备离线 0,设备在线
+
+ uint8_t DevSendSN; //设备通讯 SN
+ uint8_t periodic_enable; //定期上报使能状态
+
+ uint16_t voltage; //电压
+ uint16_t current; //电流
+ uint32_t active_power; //有功功率
+ uint32_t phase_energy; //阶段能耗
+ uint32_t total_energy; //总能耗
+
+ uint32_t send_flag; //发生标志位
+ uint32_t periodic_time; //定期上报时间间隔,单位:mS
+
+ uint32_t inquire_tick; //询问时间戳
+
+}RS485_ENERGYMONITOR_INFO;
+
+
+
+
+
+
+
+#endif /* BLV_485_DRIVER_INC_BLV_RS485_DEV_ENERGYMONITOR_H_ */
diff --git a/Ld/Link.ld b/Ld/Link.ld
index 23d2f97..9d3c110 100644
--- a/Ld/Link.ld
+++ b/Ld/Link.ld
@@ -75,8 +75,7 @@ SECTIONS
ASSERT(_endof_Flashlib < ORIGIN(FLASH1), "The Flash lib must maintain in 0-wait zone");
*(.text)
*(.text.*)
- *(.rodata)
- *(.rodata*)
+
*(.gnu.linkonce.t.*)
. = ALIGN(4);
} >FLASH AT>FLASH
@@ -91,6 +90,9 @@ SECTIONS
*(.non_0_wait);
*(.non_0_wait.*);
+ *(.rodata)
+ *(.rodata*)
+
. = ALIGN(4);
} >FLASH1 AT>FLASH1
diff --git a/MCU_Driver/blv_netcomm_function.c b/MCU_Driver/blv_netcomm_function.c
index a44d4f7..36787e7 100644
--- a/MCU_Driver/blv_netcomm_function.c
+++ b/MCU_Driver/blv_netcomm_function.c
@@ -52,11 +52,12 @@ __attribute__((section(".non_0_wait"))) uint8_t UDP_Add_Header(uint8_t *data,uin
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint8_t UDP_ADD_SoftwareVer(uint8_t *data)
{
+ //软件版本号长度为20Byte
uint8_t len = strlen(SoftwareVer);
if(len > RCU_SoftwareVer) len = RCU_SoftwareVer; //防止版本号溢出死机
memcpy(data,SoftwareVer,len); //RCU_SoftwareVer
- return len;
+ return RCU_SoftwareVer; //固定20Byte
}
/*******************************************************************************
@@ -104,6 +105,10 @@ __attribute__((section(".non_0_wait"))) uint8_t UDP_Add_ServerPort(uint8_t *data
data[0] = server_info.dis_port & 0xFF;
data[1] = (server_info.dis_port >> 8) & 0xFF;
+ //之前C1F中这个服务端口,是固定的3341,而网络配置工具使用的是这个端口,进行升级使用
+ data[0] = 0x0D;
+ data[1] = 0x0D;
+
return 0x02;
}
@@ -160,6 +165,37 @@ __attribute__((section(".non_0_wait"))) uint8_t UDP_Add_Mac(uint8_t *data)
return 0x06;
}
+/*******************************************************************************
+* Function Name : UDP_Add_Port
+* Description : 添加端口号
+* Input :
+* data - 需要添加的数组
+*******************************************************************************/
+__attribute__((section(".non_0_wait"))) uint8_t UDP_Add_Port(uint8_t *data)
+{
+ data[0] = 0x0D;
+ data[1] = 0x0D;
+ return 0x02;
+}
+
+/*******************************************************************************
+* Function Name : UDP_Get_FrameNum
+* Description : 获取数据包中的帧号
+* Input :
+* buff - 数据包
+* Return :返回数据包中的帧号
+*******************************************************************************/
+uint16_t UDP_Get_FrameNum(uint8_t *buff)
+{
+ uint16_t frame_id = 0;
+
+ frame_id = buff[FRAME_NO_OFFSET + 1];
+ frame_id <<= 0x08;
+ frame_id |= buff[FRAME_NO_OFFSET];
+
+ return frame_id;
+}
+
/*******************************************************************************
* Function Name : UDP_Search_Ack
* Description : 主机向服务器发送注册函数
@@ -194,7 +230,7 @@ __attribute__((section(".non_0_wait"))) uint8_t UDP_Search_Ack(void)
sendlen += 4;
sendlen += 2; //先添加CRC16 数据长度2Byte
- UDP_Add_Header(Global_Large_Buff,Search_Cmd,sendlen,0xffff); //添加头部
+ UDP_Add_Header(Global_Large_Buff,In_Search_Cmd,sendlen,0xffff); //添加头部
NetCRC16(&Global_Large_Buff[0],sendlen);
Dbg_Println(DBG_BIT_NET_STATUS_bit,"SocketId:%d , IP:%d.%d.%d.%d , port:%d",g_netinfo.SocketId[SocketIdnex_BLVSeriver],server_info.dis_ip[0],server_info.dis_ip[1],server_info.dis_ip[2],server_info.dis_ip[3],server_info.dis_port);
@@ -208,6 +244,372 @@ __attribute__((section(".non_0_wait"))) uint8_t UDP_Search_Ack(void)
return rev;
}
+/*******************************************************************************
+* Function Name : UDP_Subgroup_Cmd_Processing
+* Description : BLV通讯协议 - 子群发布命令 处理函数
+* - 用于升级配置
+*******************************************************************************/
+uint8_t UDP_Subgroup_Cmd_Processing(uint8_t* data, uint16_t DataLen, uint8_t*ip, uint16_t port)
+{
+ uint8_t state = 0x00;
+ uint8_t Ret = 0x02;
+ uint8_t buff[6];
+ uint32_t sendlen = 0;
+ //校验长度
+ //if(DataLen != CONFIG_Cmd_Rev_Len) return Ret;
+
+ memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
+
+ server_info.goal_port = port;
+ memcpy(server_info.goal_ip, ip, 4);
+ memcpy(buff, ip, 4);
+ buff[4] = port;
+ buff[5] = port >> 8;
+
+ SRAM_DMA_Write_Buff(buff, 6, SRAM_IAP_IP_ADDRESS); //将配置工具的ip和port存入SRAM,回复升级结果时使用这个端口,而不是TFTP服务及文件传输的套接字
+
+ memset(&IAPVarTypeStruct_Ptr, 0, sizeof(IAPVarTypeStruct)); //清楚IAP升级结构体
+
+ IAPVarTypeStruct_Ptr.Md5[0] = data[BLV_UDP_HEAD_LEN+3];
+ IAPVarTypeStruct_Ptr.Md5[1] = data[BLV_UDP_HEAD_LEN+2];
+ IAPVarTypeStruct_Ptr.Md5[2] = data[BLV_UDP_HEAD_LEN+1];
+ IAPVarTypeStruct_Ptr.Md5[3] = data[BLV_UDP_HEAD_LEN+0];
+
+ IAPVarTypeStruct_Ptr.Md5[4] = data[BLV_UDP_HEAD_LEN+7];
+ IAPVarTypeStruct_Ptr.Md5[5] = data[BLV_UDP_HEAD_LEN+6];
+ IAPVarTypeStruct_Ptr.Md5[6] = data[BLV_UDP_HEAD_LEN+5];
+ IAPVarTypeStruct_Ptr.Md5[7] = data[BLV_UDP_HEAD_LEN+4];
+
+ IAPVarTypeStruct_Ptr.Md5[8] = data[BLV_UDP_HEAD_LEN+11];
+ IAPVarTypeStruct_Ptr.Md5[9] = data[BLV_UDP_HEAD_LEN+10];
+ IAPVarTypeStruct_Ptr.Md5[10] = data[BLV_UDP_HEAD_LEN+9];
+ IAPVarTypeStruct_Ptr.Md5[11] = data[BLV_UDP_HEAD_LEN+8];
+
+ IAPVarTypeStruct_Ptr.Md5[12] = data[BLV_UDP_HEAD_LEN+15];
+ IAPVarTypeStruct_Ptr.Md5[13] = data[BLV_UDP_HEAD_LEN+14];
+ IAPVarTypeStruct_Ptr.Md5[14] = data[BLV_UDP_HEAD_LEN+13];
+ IAPVarTypeStruct_Ptr.Md5[15] = data[BLV_UDP_HEAD_LEN+12];
+
+ IAPVarTypeStruct_Ptr.BlockSize = data[BLV_UDP_HEAD_LEN+16] + (data[BLV_UDP_HEAD_LEN+17]<<8);
+ IAPVarTypeStruct_Ptr.IapFileType = TFTP_IAP_DataType_CONFIG;
+
+ if( (0 < IAPVarTypeStruct_Ptr.BlockSize) && ( IAPVarTypeStruct_Ptr.BlockSize <= CONFIG_BLOCK_MAX ))
+ {
+ Ret = 0x01;
+ state = TFTP_IAP_Status_Ready; //发布就绪
+ IAPVarTypeStruct_Ptr.enable = 0x01; //TFTP IAP升级开始
+ }else{
+ Ret = 0x02;
+ state = TFTP_IAP_Status_Error_Block;
+ }
+
+ sendlen = BLV_UDP_HEAD_LEN;
+ Global_Large_Buff[sendlen++] = state;
+ sendlen += 0x02;
+ UDP_Add_Header(Global_Large_Buff, In_Subgroup_Cmd, sendlen, 0xffff);
+ NetCRC16(&Global_Large_Buff[0], sendlen);
+
+ WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], Global_Large_Buff, &sendlen, ip, port);
+
+ return Ret;
+}
+
+/*******************************************************************************
+* Function Name : UDP_IAP_CMD_Processing
+* Description : BLV通讯协议 - IAP APP命令接收处理函数
+*******************************************************************************/
+uint8_t Udp_Internal_BLVIAP_Logic(uint8_t* data,uint16_t DataLen, uint8_t *ip,uint16_t port)
+{
+ uint8_t offset = 0x00;
+ uint8_t Ret = 0x02;
+ uint8_t buff[6];
+ uint16_t frame_num = 0;
+ uint32_t sendlen = 0;
+ //校验长度
+ //if(DataLen != CONFIG_Cmd_Rev_Len) return Ret;
+
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s",__func__);
+
+ memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
+
+ frame_num = UDP_Get_FrameNum(data);
+
+ server_info.goal_port = port;
+ memcpy(server_info.goal_ip, ip, 4);
+ memcpy(buff, ip, 4);
+ buff[4] = port;
+ buff[5] = port >> 8;
+
+ SRAM_DMA_Write_Buff(buff, 6, SRAM_IAP_IP_ADDRESS); //将配置工具的ip和port存入SRAM,回复升级结果时使用这个端口,而不是TFTP服务及文件传输的套接字
+
+ memset(&IAPVarTypeStruct_Ptr, 0, sizeof(IAPVarTypeStruct)); //清楚IAP升级结构体
+
+ /*数据包中字段解析 -
+ * IP:4Byte
+ * Port: 2Byte
+ * MD5:16Byte
+ * File Block:2Byte
+ * */
+ offset = BLV_UDP_HEAD_LEN + 6;
+ IAPVarTypeStruct_Ptr.Md5[0] = data[offset+3];
+ IAPVarTypeStruct_Ptr.Md5[1] = data[offset+2];
+ IAPVarTypeStruct_Ptr.Md5[2] = data[offset+1];
+ IAPVarTypeStruct_Ptr.Md5[3] = data[offset+0];
+
+ IAPVarTypeStruct_Ptr.Md5[4] = data[offset+7];
+ IAPVarTypeStruct_Ptr.Md5[5] = data[offset+6];
+ IAPVarTypeStruct_Ptr.Md5[6] = data[offset+5];
+ IAPVarTypeStruct_Ptr.Md5[7] = data[offset+4];
+
+ IAPVarTypeStruct_Ptr.Md5[8] = data[offset+11];
+ IAPVarTypeStruct_Ptr.Md5[9] = data[offset+10];
+ IAPVarTypeStruct_Ptr.Md5[10] = data[offset+9];
+ IAPVarTypeStruct_Ptr.Md5[11] = data[offset+8];
+
+ IAPVarTypeStruct_Ptr.Md5[12] = data[offset+15];
+ IAPVarTypeStruct_Ptr.Md5[13] = data[offset+14];
+ IAPVarTypeStruct_Ptr.Md5[14] = data[offset+13];
+ IAPVarTypeStruct_Ptr.Md5[15] = data[offset+12];
+
+ offset += 16;
+ IAPVarTypeStruct_Ptr.BlockSize = data[offset + 1] << 8;
+ IAPVarTypeStruct_Ptr.BlockSize <<= 8;
+ IAPVarTypeStruct_Ptr.BlockSize |= data[offset];
+
+ IAPVarTypeStruct_Ptr.IapFileType = TFTP_IAP_DataType_CONFIG;
+
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"BlockSize:%d",IAPVarTypeStruct_Ptr.BlockSize);
+
+ sendlen = BLV_UDP_HEAD_LEN;
+ if( (0 < IAPVarTypeStruct_Ptr.BlockSize) && ( IAPVarTypeStruct_Ptr.BlockSize <= CONFIG_BLOCK_MAX ))
+ {
+ Ret = 0x01;
+ Global_Large_Buff[sendlen++] = TFTP_IAP_Status_Ready; //发布就绪
+ IAPVarTypeStruct_Ptr.enable = 0x01; //TFTP IAP升级开始
+
+ IAPVarTypeStruct_Ptr.FunType = TFTP_FUNTYPE_LocalIAP;
+ IAPVarTypeStruct_Ptr.Write_Block = 0x00;
+
+ }else{
+ Ret = 0x02;
+ Global_Large_Buff[sendlen++] = TFTP_IAP_Status_Error_Block;
+ }
+
+ sendlen += UDP_ADD_SoftwareVer(&Global_Large_Buff[sendlen]); //添加固件版本
+
+ sendlen += 0x02;
+ UDP_Add_Header(Global_Large_Buff, In_IAP_Cmd, sendlen, frame_num);
+ NetCRC16(&Global_Large_Buff[0], sendlen);
+
+ WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], Global_Large_Buff, &sendlen, ip, port);
+
+ return Ret;
+}
+
+/*******************************************************************************
+* Function Name : UDP_IAP_CMD_Processing
+* Description : BLV通讯协议 - IAP APP命令接收处理函数
+*******************************************************************************/
+uint8_t UDP_IAP_Cmd_Processing(uint8_t* data, uint16_t DataLen, uint8_t *ip,uint16_t port)
+{
+ uint16_t frameno = UDP_Get_FrameNum(data);
+ UINT32 sendlen = 0x00;
+ uint8_t buff[6];
+
+ //校验数据长度
+ //if(DataLen != IAP_Cmd_Rev_Len) return Ret;
+
+ memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
+
+ server_info.goal_port = port;
+ memcpy(server_info.goal_ip, ip, 4);
+ memcpy(buff, ip, 4);
+ buff[4] = port;
+ buff[5] = port >> 8;
+ SRAM_DMA_Write_Buff(buff, 6, SRAM_IAP_IP_ADDRESS);
+
+ memset(&IAPVarTypeStruct_Ptr, 0, sizeof(IAPVarTypeStruct));
+
+ IAPVarTypeStruct_Ptr.IapFileType = TFTP_IAP_DataType_APP; //文件类型
+
+ //IAP 升级APP对应的MD5 校验
+ IAPVarTypeStruct_Ptr.Md5[0] = data[24];
+ IAPVarTypeStruct_Ptr.Md5[1] = data[23];
+ IAPVarTypeStruct_Ptr.Md5[2] = data[22];
+ IAPVarTypeStruct_Ptr.Md5[3] = data[21];
+
+ IAPVarTypeStruct_Ptr.Md5[4] = data[28];
+ IAPVarTypeStruct_Ptr.Md5[5] = data[27];
+ IAPVarTypeStruct_Ptr.Md5[6] = data[26];
+ IAPVarTypeStruct_Ptr.Md5[7] = data[25];
+
+ IAPVarTypeStruct_Ptr.Md5[8] = data[32];
+ IAPVarTypeStruct_Ptr.Md5[9] = data[31];
+ IAPVarTypeStruct_Ptr.Md5[10] = data[30];
+ IAPVarTypeStruct_Ptr.Md5[11] = data[29];
+
+ IAPVarTypeStruct_Ptr.Md5[12] = data[36];
+ IAPVarTypeStruct_Ptr.Md5[13] = data[35];
+ IAPVarTypeStruct_Ptr.Md5[14] = data[34];
+ IAPVarTypeStruct_Ptr.Md5[15] = data[33];
+
+ IAPVarTypeStruct_Ptr.BlockSize = data[38];
+ IAPVarTypeStruct_Ptr.BlockSize <<= 0x08;
+ IAPVarTypeStruct_Ptr.BlockSize |= data[37];
+
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"UDP Md5:%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X",\
+ IAPVarTypeStruct_Ptr.Md5[0],IAPVarTypeStruct_Ptr.Md5[1],\
+ IAPVarTypeStruct_Ptr.Md5[2],IAPVarTypeStruct_Ptr.Md5[3],\
+ IAPVarTypeStruct_Ptr.Md5[4],IAPVarTypeStruct_Ptr.Md5[5],\
+ IAPVarTypeStruct_Ptr.Md5[6],IAPVarTypeStruct_Ptr.Md5[7],\
+ IAPVarTypeStruct_Ptr.Md5[8],IAPVarTypeStruct_Ptr.Md5[9],\
+ IAPVarTypeStruct_Ptr.Md5[10],IAPVarTypeStruct_Ptr.Md5[11],\
+ IAPVarTypeStruct_Ptr.Md5[12],IAPVarTypeStruct_Ptr.Md5[13],\
+ IAPVarTypeStruct_Ptr.Md5[14],IAPVarTypeStruct_Ptr.Md5[15]);
+
+ sendlen = BLV_UDP_HEAD_LEN;
+ if( (0 < IAPVarTypeStruct_Ptr.BlockSize) || (IAPVarTypeStruct_Ptr.BlockSize <= APP_BLOCK_MAX) )
+ {
+ Global_Large_Buff[sendlen++] = TFTP_IAP_Status_Ready;
+ IAPVarTypeStruct_Ptr.enable = 0x01;
+ }else {
+ Global_Large_Buff[sendlen++] = TFTP_IAP_Status_Error_Block;
+ }
+ sendlen += 2;
+ UDP_Add_Header(Global_Large_Buff, In_IAP_Cmd, sendlen, frameno);
+ NetCRC16(Global_Large_Buff,sendlen);
+
+ WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], Global_Large_Buff, &sendlen, ip, port);
+
+ return 0x00;
+}
+
+/*******************************************************************************
+* Function Name : UDP_Search_Cmd_Processing
+* Description : BLV通讯协议 - 搜索命令接收处理函数
+*******************************************************************************/
+uint8_t UDP_Search_Cmd_Processing(uint8_t* data, uint16_t DataLen, uint8_t *ip,uint16_t port)
+{
+ uint8_t Ret = 0x03;
+ uint16_t search_rxno = 0;
+ uint16_t src_port = 0;
+ uint32_t sendlen = 0;
+
+ memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
+
+ if( (DataLen != 17) && (DataLen != 28) ) return Ret;
+
+ search_rxno = UDP_Get_FrameNum(data);
+
+ if(DataLen == 17)
+ {
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"注册命令回复!");
+
+ server_info.udp_sta = 0x02;
+
+ server_info.active_cmd_flag |= UDP_ActSend_TimeSync_Flag; //注册成功后,向服务器获取时间
+ server_info.active_cmd_flag |= UDP_ActSend_RoomState_Flag; //注册成功后,向服务器获取房态
+
+ server_info.register_flag = 0x00;
+ server_info.register_num = 0x00;
+ server_info.register_tick = SysTick_1s;
+ server_info.udp_timesync_cnt = 0x00;
+ server_info.udp_periodic_cnt = 0x00;
+ server_info.udp_online_tick = SysTick_1ms;
+
+ if(0xffff == search_rxno) //云端服务器发过来的帧号
+ {
+ LOG_SYS_Server_Comm_State_Record(0x02); //RCU云端服务器
+ server_info.online_state = 3;
+ }else{
+ LOG_SYS_Server_Comm_State_Record(0x01); //RCU本地服务器
+ server_info.online_state = 2;
+ }
+ }else if(DataLen == 28)
+ {
+ //帧号或长度不对就返回
+ if(search_rxno >= 0x8000) return 0x02;
+
+ src_port = data[25];
+ src_port <<= 0x08;
+ src_port |= data[24];
+
+ if( data[19] == 0x01)
+ {
+ if((data[20] != server_info.dis_ip[0])
+ || (data[21] != server_info.dis_ip[1])
+ || (data[22] != server_info.dis_ip[2])
+ || (data[23] != server_info.dis_ip[3])
+ || (src_port != server_info.dis_port))
+ {
+ server_info.dis_port = src_port;
+ server_info.dis_ip[0] = data[20];
+ server_info.dis_ip[1] = data[21];
+ server_info.dis_ip[2] = data[22];
+ server_info.dis_ip[3] = data[23];
+ }
+ }
+
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"收到搜索命令!");
+
+ sendlen = BLV_UDP_HEAD_LEN;
+ sendlen += UDP_Add_ServerIp(&Global_Large_Buff[sendlen]); //将此四个字节的用户码改成服务器IP地址
+ sendlen += UDP_Add_Subnet(&Global_Large_Buff[sendlen]); //添加子网掩码
+ sendlen += UDP_Add_Gateway(&Global_Large_Buff[sendlen]); //添加网关
+ sendlen += UDP_Add_Port(&Global_Large_Buff[sendlen]); //添加RCU端口
+ sendlen += UDP_Add_Mac(&Global_Large_Buff[sendlen]); //添加Mac
+ sendlen += UDP_ADD_SoftwareVer(&Global_Large_Buff[sendlen]); //添加固件版本
+ sendlen += UDP_ADD_ConfigVer(&Global_Large_Buff[sendlen]); //添加配置版本
+ NetCRC16(&Global_Large_Buff[0],sendlen); //添加CRC16
+ sendlen += 0x02;
+ UDP_Add_Header(Global_Large_Buff,In_Search_Cmd,sendlen,0xffff); //添加头部
+
+ WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &Global_Large_Buff[0], &sendlen, ip, port);
+ }
+
+ return 0x00;
+}
+
+/*******************************************************************************
+* Function Name : UDP_Read_MCUSystem_Cmd_Processing
+* Description : 主机向服务器发送心跳包 函数
+*******************************************************************************/
+uint8_t UDP_Read_MCUSystem_Cmd_Processing(uint8_t* data, uint16_t DataLen, uint8_t *ip,uint16_t port)
+{
+ uint16_t pack_frame = UDP_Get_FrameNum(data);
+
+ if( data[15] == 0x01 )
+ {
+ WCHNET_DHCPStop();
+ server_info.register_tick = SysTick_1s;
+ server_info.register_num = 0x00;
+
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"搜索命令,init_flag:%d",server_info.init_flag);
+ if(server_info.init_flag ==0x00)
+ {
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"直连模式,跳过DHCP和DNS");
+ server_info.net_sta = NET_COMPLETE;
+ server_info.con_flag = 0x01;
+ }
+
+ server_info.con_tick = SysTick_1s;
+ }
+
+ //延时回复数据
+ server_info.ack_frame = pack_frame;
+ server_info.search_ack_flag = 0x01;
+ server_info.search_ack_tick = SysTick_1ms;
+
+ server_info.goal_ip[0] = ip[0];
+ server_info.goal_ip[1] = ip[1];
+ server_info.goal_ip[2] = ip[2];
+ server_info.goal_ip[3] = ip[3];
+
+ server_info.goal_port = port;
+
+ return 0x00;
+}
+
/*******************************************************************************
* Function Name : UDP_Heart_Send
* Description : 主机向服务器发送心跳包 函数
@@ -238,7 +640,7 @@ __attribute__((section(".non_0_wait"))) uint8_t UDP_Heart_Send(void)
sendlen += 0x06;
sendlen += 0x02; //添加CRC校验长度
- UDP_Add_Header(Global_Large_Buff,Heart_Cmd,sendlen,server_info.frame_no); //添加头部
+ UDP_Add_Header(Global_Large_Buff,In_Heart_Cmd,sendlen,server_info.frame_no); //添加头部
NetCRC16(&Global_Large_Buff[0],sendlen);
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s..",__func__);
@@ -281,6 +683,83 @@ __attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_GetTime_CMD(void)
return rev;
}
+/*******************************************************************************
+* Function Name : Udp_QueryTime_Cmd_Process
+* Description : 向服务器获取时间 - 回复数据处理函数
+*******************************************************************************/
+uint8_t Udp_QueryTime_Cmd_Process(uint8_t *data, uint16_t DataLen, uint8_t *ip,uint16_t port)
+{
+ uint16_t temp = 0;
+ S_RTC pro_rtc;
+ uint32_t temp_systick = 0;
+ uint16_t data_crc = 0x00;
+
+ data_crc = data[DataLen-1];
+ data_crc <<= 0x08;
+ data_crc |= data[DataLen-2];
+
+ if(NetCRC16_2(data,DataLen-2) != data_crc) return 0xF0;
+
+ //判断帧号是否一致
+ data_crc = data[FRAME_NO_OFFSET + 1];
+ data_crc <<= 0x08;
+ data_crc |= data[FRAME_NO_OFFSET];
+ if(data_crc != server_info.frame_no) return 0x01;
+
+ memset(&pro_rtc,0,sizeof(pro_rtc));
+
+ temp = data[BLV_UDP_HEAD_LEN+1];
+ temp <<= 8;
+ temp |= data[BLV_UDP_HEAD_LEN];
+
+ pro_rtc.year = temp - 2000;
+ pro_rtc.month = data[BLV_UDP_HEAD_LEN+2];
+ pro_rtc.day = data[BLV_UDP_HEAD_LEN+3];
+ pro_rtc.week = data[BLV_UDP_HEAD_LEN+4];
+ pro_rtc.hour = data[BLV_UDP_HEAD_LEN+5];
+ pro_rtc.minute = data[BLV_UDP_HEAD_LEN+6];
+ pro_rtc.second = data[BLV_UDP_HEAD_LEN+7];
+
+ if(DataLen >= 27)
+ {
+ DevActionGlobal.DayStart = data[BLV_UDP_HEAD_LEN+8]; //白天起始时间 2024-08-02
+ DevActionGlobal.DayEnd = data[BLV_UDP_HEAD_LEN+9]; //白天结束时间 2024-08-02
+ }
+
+ /*将格式转化为RTC数据格式*/
+ pro_rtc.year = DEV_Conversion_To_HEX(pro_rtc.year);
+ pro_rtc.month = DEV_Conversion_To_HEX(pro_rtc.month);
+ pro_rtc.day = DEV_Conversion_To_HEX(pro_rtc.day);
+ pro_rtc.week = DEV_Conversion_To_HEX(pro_rtc.week);
+ pro_rtc.hour = DEV_Conversion_To_HEX(pro_rtc.hour);
+ pro_rtc.minute = DEV_Conversion_To_HEX(pro_rtc.minute);
+ pro_rtc.second = DEV_Conversion_To_HEX(pro_rtc.second);
+
+ DevActionGlobal.TimeGetFlag++;
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"同步时间:20%X-%X-%X %X %X:%X:%X",pro_rtc.year,pro_rtc.month,pro_rtc.day,pro_rtc.week,pro_rtc.hour,pro_rtc.minute,pro_rtc.second);
+ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"白天时间:%d ~ %d 偏移:%d",DevActionGlobal.DayStart,DevActionGlobal.DayEnd,g_time_info.timezone);
+
+ //加上时区偏移量
+ if(g_time_info.timezone != 0x00){
+ temp_systick = RTC_Conversion_To_Unix(&pro_rtc);
+ temp_systick += (int)(g_time_info.timezone * 3600);
+ Unix_Conversion_To_RTC(&pro_rtc,temp_systick);
+
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"加上时区 时间:20%X-%X-%X %X %X:%X:%X",pro_rtc.year,pro_rtc.month,pro_rtc.day,pro_rtc.week,pro_rtc.hour,pro_rtc.minute,pro_rtc.second);
+ }
+
+ NetRTC_WriteDate(pro_rtc); //设置RTC时间
+
+ server_info.sync_tick = 0x01; //2023-10-08 用于同步LCD时间
+ DevActionGlobal.TimeSyncFlag = 0x03; //2024-08-02 用于白天黑夜时间判断和设置CSIO RTC
+
+ server_info.udp_send_flag = 0x00; //清楚发送标志位
+ server_info.active_cmd_flag &= ~UDP_ActSend_TimeSync_Flag; //清楚标志位
+ server_info.udp_online_tick = SysTick_1ms;
+
+ return 0;
+}
+
/*******************************************************************************
* Function Name : Udp_Internal_GetRoomRent_CMD
* Description : 向服务器获取房态
@@ -307,7 +786,7 @@ __attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_GetRoomRent_CMD(voi
UDP_Add_Header(Global_Large_Buff,In_Get_RoomRent_Cmd,sendlen,server_info.frame_no);
NetCRC16(&Global_Large_Buff[0],sendlen);
- //Dbg_Print_Buff(DBG_BIT_NET_STATUS_bit,"向服务器 获取房态请求",back_data,sendlen);
+ Dbg_Print_Buff(DBG_BIT_NET_STATUS_bit,"向服务器 获取房态请求",Global_Large_Buff,sendlen);
rev = WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &Global_Large_Buff[0], &sendlen, server_info.dis_ip, server_info.dis_port);
@@ -605,10 +1084,19 @@ __attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_Read_MCU_System_Sen
SRAM_DMA_Read_Buff(&Global_Large_Buff[BLV_UDP_HEAD_LEN+121],4,SRAM_Register_Start_ADDRESS + Register_MandateUTC_OFFSET);
SRAM_DMA_Read_Buff(&Global_Large_Buff[BLV_UDP_HEAD_LEN+125],4,SRAM_Register_Start_ADDRESS + Register_MandateExpiresTime_OFFSET);
SRAM_DMA_Read_Buff(&Global_Large_Buff[BLV_UDP_HEAD_LEN+129],128,SRAM_Register_Start_ADDRESS + Register_RoomNumNote_OFFSET);
- Flash_Read(&Global_Large_Buff[BLV_UDP_HEAD_LEN+257],64,SPIFLASH_MCU_Model_Revision_ADDRESS);
- Flash_Read(&Global_Large_Buff[BLV_UDP_HEAD_LEN+321],64,SPIFLASH_MCU_Control_Revision_ADDRESS);
- //temp_rev = Read_LogicFile_Information(0x04,(uint8_t *)&temp_data); //查询LOGIC文件中的酒店别名 - 32Byte
+ //临时测试使用
+ memset(temp_data,0,sizeof(temp_data));
+ snprintf((char *)temp_data,sizeof(temp_data),"BLV-C1");
+ memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN+257],temp_data,32);
+ memset(temp_data,0,sizeof(temp_data));
+ snprintf((char *)temp_data,sizeof(temp_data),"BLV-V9");
+ memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN+321],temp_data,32);
+ //读取Flash中的模块与模型
+ //Flash_Read(&Global_Large_Buff[BLV_UDP_HEAD_LEN+257],64,SPIFLASH_MCU_Model_Revision_ADDRESS);
+ //Flash_Read(&Global_Large_Buff[BLV_UDP_HEAD_LEN+321],64,SPIFLASH_MCU_Control_Revision_ADDRESS);
+
+ temp_rev = Read_LogicFile_Information(0x04,(uint8_t *)&temp_data); //查询LOGIC文件中的酒店别名 - 32Byte
if(temp_rev == 0x00)
{
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN+385],temp_data,32);
@@ -616,7 +1104,7 @@ __attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_Read_MCU_System_Sen
memset(temp_data,0,32);
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN+385],temp_data,32);
}
- //temp_rev = Read_LogicFile_Information(0x07,(uint8_t *)&temp_data); //查询LOGIC文件中的房型名称 - 32Byte
+ temp_rev = Read_LogicFile_Information(0x07,(uint8_t *)&temp_data); //查询LOGIC文件中的房型名称 - 32Byte
if(temp_rev == 0x00)
{
memcpy(&Global_Large_Buff[BLV_UDP_HEAD_LEN+417],temp_data,32);
@@ -626,9 +1114,12 @@ __attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_Read_MCU_System_Sen
}
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s ip:%d:%d:%d:%d Port:%d",__func__,ip[0],ip[1],ip[2],ip[3],port);
+ memcpy(server_info.goal_ip, ip, 4);
+ server_info.goal_port = port;
+ Dbg_Print_Buff(DBG_BIT_NET_STATUS_bit, "Send Buff", Global_Large_Buff, back_len);
//数据打包
- NetCRC16(&Global_Large_Buff[0],back_len);
+ NetCRC16(Global_Large_Buff,back_len);
rev = WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], Global_Large_Buff, &back_len, ip, port); //SOCK_UDPS,
LOG_NET_COMM_Send_Record(0x01,ip,port,&Global_Large_Buff[0],back_len);
@@ -1252,10 +1743,556 @@ __attribute__((section(".non_0_wait"))) uint8_t Udp_Internal_SeriaNet_Response_T
NetCRC16(&back_data[0],data_len);
WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &back_data[0], &data_len, pc_ip, pc_port);
+ return 0x00;
+}
+
+
+
+/*******************************************************************************
+* Function Name : Udp_Scan_Roomstate
+* Description : 扫描房间设备状态是否变化
+*******************************************************************************/
+void Udp_Scan_Roomstate(void)
+{
+ uint8_t temp1 = 0,temp2 = 0;
+ uint8_t back_data[20]; //一次发生最大长度
+
+ uint32_t write_addr = SRAM_Read_DW(SRAM_UDP_SendData_Writeaddr),read_addr = SRAM_Read_DW(SRAM_UDP_SendData_Readaddr);
+
+ memset(back_data,0,20);
+
+ //如果读取地址任何一个出错,读写地址直接复位
+ if( (write_addr < SRAM_UDP_SendData_Startaddr) || (write_addr > SRAM_UDP_SendData_Endaddr) \
+ || (read_addr < SRAM_UDP_SendData_Startaddr) || (read_addr > SRAM_UDP_SendData_Endaddr) )
+ {
+ write_addr = SRAM_UDP_SendData_Startaddr;
+ read_addr = SRAM_UDP_SendData_Startaddr;
+ SRAM_Write_DW(write_addr,SRAM_UDP_SendData_Writeaddr);
+ SRAM_Write_DW(read_addr,SRAM_UDP_SendData_Readaddr);
+ }
+
+ /*继电器变化标志位 - 3Byte*/
+ for(uint8_t i = 0;i<3;i++)
+ {
+ temp1 = SRAM_Read_Byte(SRAM_LOG_Device_C5IO_Relay_Status + i);
+ temp2 = SRAM_Read_Byte(SRAM_UDP_Device_C5IO_Relay_Status + i);
+
+ if(temp1 == temp2) continue;
+
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"LOG_C5IO:%d,UDP_C5IO:%d",temp1,temp2);
+ for(uint8_t j=0;j<8;j++)
+ {
+ if( (temp1 & (0x01<= SRAM_UDP_SendData_Endaddr)
+ {
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"SRAM_UDP_SendData_Writeaddr overstep_2 %08X!!!\r\n",write_addr);
+ write_addr = SRAM_UDP_SendData_Startaddr;
+ }
+ SRAM_Write_DW(write_addr,SRAM_UDP_SendData_Writeaddr);
+ }
+ }
+ /*比较完成后,保存变量状态*/
+ SRAM_Write_Byte(temp1,SRAM_UDP_Device_C5IO_Relay_Status + i);
+ }
+
+ if( write_addr != read_addr)
+ {
+ server_info.active_cmd_flag |= UDP_ActSend_DevState_Flag; //设置设备状态上报 标志位
+ return ;
+ }
+
+ /*设备故障上报 - */
+ write_addr = SRAM_Read_DW(SRAM_DEVICE_ONLINE_STATE_WRITE_ADDR);
+ read_addr = SRAM_Read_DW(SRAM_DEVICE_ONLINE_STATE_READ_ADDR);
+
+ if( (write_addr < SRAM_DEVICE_ONLINE_STATE_START_ADDR) || (write_addr > SRAM_DEVICE_ONLINE_STATE_END_ADDR) \
+ || (read_addr < SRAM_DEVICE_ONLINE_STATE_START_ADDR) || (read_addr > SRAM_DEVICE_ONLINE_STATE_END_ADDR) )
+ {
+ write_addr = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
+ read_addr = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
+ SRAM_Write_DW(write_addr,SRAM_DEVICE_ONLINE_STATE_WRITE_ADDR);
+ SRAM_Write_DW(read_addr,SRAM_DEVICE_ONLINE_STATE_READ_ADDR);
+ }
+
+ if( write_addr != read_addr)
+ {
+ server_info.active_cmd_flag |= UDP_ActSend_DevState_Flag; //设置设备状态上报 标志位
+ }
+
+}
+
+/*******************************************************************************
+* Function Name : Udp_Internal_RoomState
+* Description : 房间设备动作上报
+*******************************************************************************/
+void Udp_Internal_RoomState(void)
+{
+ uint32_t write_addr = 0x00,write_addr_2 = 0x00;
+ uint32_t read_addr = 0x00,read_addr_2 = 0x00;
+
+ uint16_t dev_state_len = 0,dev_online_len = 0,remaining_len = 0;
+ UINT32 len = 0;
+
+ if(server_info.udp_retry_cnt == 0x00)
+ {
+ //不是重发数据包
+ if((server_info.frame_no < 0xfffe) && (server_info.frame_no >= 0x8000))
+ {
+ server_info.frame_no++;
+ }else {
+ server_info.frame_no = 0x8000;
+ }
+
+ //读取设备状态 缓冲区读写地址
+ write_addr = SRAM_Read_DW(SRAM_UDP_SendData_Writeaddr);
+ read_addr = SRAM_Read_DW(SRAM_UDP_SendData_Readaddr);
+
+ //如果读取地址任何一个出错,读写地址直接复位
+ if( (write_addr < SRAM_UDP_SendData_Startaddr) || (write_addr > SRAM_UDP_SendData_Endaddr) \
+ || (read_addr < SRAM_UDP_SendData_Startaddr) || (read_addr > SRAM_UDP_SendData_Endaddr) )
+ {
+ write_addr = SRAM_UDP_SendData_Startaddr;
+ read_addr = SRAM_UDP_SendData_Startaddr;
+ SRAM_Write_DW(write_addr,SRAM_UDP_SendData_Writeaddr);
+ SRAM_Write_DW(read_addr,SRAM_UDP_SendData_Readaddr);
+ SRAM_Write_DW(read_addr,SRAM_UDP_SendData_Tempaddr);
+ }
+
+ //读取设备故障 缓冲区读写地址
+ write_addr_2 = SRAM_Read_DW(SRAM_DEVICE_ONLINE_STATE_WRITE_ADDR);
+ read_addr_2 = SRAM_Read_DW(SRAM_DEVICE_ONLINE_STATE_READ_ADDR);
+
+ //如果读取地址任何一个出错,读写地址直接复位
+ if( (write_addr_2 < SRAM_DEVICE_ONLINE_STATE_START_ADDR) || (write_addr_2 > SRAM_DEVICE_ONLINE_STATE_END_ADDR) \
+ || (read_addr_2 < SRAM_DEVICE_ONLINE_STATE_START_ADDR) || (read_addr_2 > SRAM_DEVICE_ONLINE_STATE_END_ADDR) )
+ {
+ write_addr_2 = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
+ read_addr_2 = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
+ SRAM_Write_DW(write_addr_2,SRAM_DEVICE_ONLINE_STATE_WRITE_ADDR);
+ SRAM_Write_DW(read_addr_2,SRAM_DEVICE_ONLINE_STATE_READ_ADDR);
+ SRAM_Write_DW(read_addr_2,SRAM_DEVICE_ONLINE_STATE_TEMP_ADDR);
+ }
+
+ }else {
+ //重发数据包 - 读取缓冲区读写地址
+
+ write_addr = SRAM_Read_DW(SRAM_UDP_SendData_Tempaddr); //读取上一次 读取数据数据的结束地址
+ read_addr = SRAM_Read_DW(SRAM_UDP_SendData_Readaddr);
+
+ //如果读取地址任何一个出错,读写地址直接复位
+ if( (write_addr < SRAM_UDP_SendData_Startaddr) || (write_addr > SRAM_UDP_SendData_Endaddr) \
+ || (read_addr < SRAM_UDP_SendData_Startaddr) || (read_addr > SRAM_UDP_SendData_Endaddr) )
+ {
+ write_addr = SRAM_UDP_SendData_Startaddr;
+ read_addr = SRAM_UDP_SendData_Startaddr;
+ SRAM_Write_DW(write_addr,SRAM_UDP_SendData_Writeaddr);
+ SRAM_Write_DW(read_addr,SRAM_UDP_SendData_Readaddr);
+ SRAM_Write_DW(read_addr,SRAM_UDP_SendData_Tempaddr);
+ }
+
+ //读取设备故障 缓冲区读写地址
+ write_addr_2 = SRAM_Read_DW(SRAM_DEVICE_ONLINE_STATE_TEMP_ADDR);
+ read_addr_2 = SRAM_Read_DW(SRAM_DEVICE_ONLINE_STATE_READ_ADDR);
+
+ //如果读取地址任何一个出错,读写地址直接复位
+ if( (write_addr_2 < SRAM_DEVICE_ONLINE_STATE_START_ADDR) || (write_addr_2 > SRAM_DEVICE_ONLINE_STATE_END_ADDR) \
+ || (read_addr_2 < SRAM_DEVICE_ONLINE_STATE_START_ADDR) || (read_addr_2 > SRAM_DEVICE_ONLINE_STATE_END_ADDR) )
+ {
+ write_addr_2 = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
+ read_addr_2 = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
+ SRAM_Write_DW(write_addr_2,SRAM_DEVICE_ONLINE_STATE_WRITE_ADDR);
+ SRAM_Write_DW(read_addr_2,SRAM_DEVICE_ONLINE_STATE_READ_ADDR);
+ SRAM_Write_DW(read_addr_2,SRAM_DEVICE_ONLINE_STATE_TEMP_ADDR);
+ }
+ }
+
+ if( (write_addr == read_addr) && (write_addr_2 == read_addr_2) ) return ;
+
+ memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
+
+ //判断设备状态数量长度是否超长
+ if(write_addr > read_addr)
+ {
+ dev_state_len = write_addr - read_addr;
+ if(dev_state_len > SRAM_UDP_SendData_Size) dev_state_len = SRAM_UDP_SendData_Size;
+ }
+ else if(write_addr < read_addr)
+ {
+ dev_state_len = SRAM_UDP_SendData_Endaddr - read_addr;
+ dev_state_len += write_addr - SRAM_UDP_SendData_Startaddr;
+
+ if(dev_state_len > SRAM_UDP_SendData_Size) dev_state_len = SRAM_UDP_SendData_Size;
+ }
+
+ //判断设备离线数量长度是否超长
+ if(write_addr_2 > read_addr_2)
+ {
+ dev_online_len = write_addr_2 - read_addr_2;
+ if(dev_online_len > SRAM_UDP_SendData_Size) dev_online_len = SRAM_UDP_SendData_Size;
+ }
+ else if(write_addr_2 < read_addr_2)
+ {
+ dev_online_len = SRAM_DEVICE_ONLINE_STATE_END_ADDR - read_addr_2;
+ dev_online_len += write_addr_2 - SRAM_DEVICE_ONLINE_STATE_START_ADDR;
+
+ if(dev_online_len > SRAM_UDP_SendData_Size) dev_online_len = SRAM_UDP_SendData_Size;
+ }
+
+ if( (dev_state_len == 0x00) && (dev_online_len == 0x00) ) return ; //无数据发送
+
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"设备状态变化上报 %d 帧号:%04x 写:%8X 读:%8X",server_info.udp_retry_cnt,server_info.frame_no,write_addr,read_addr);
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"设备故障上报 写:%8X 读:%8X",write_addr_2,read_addr_2);
+
+ len = BLV_UDP_HEAD_LEN;
+ Global_Large_Buff[len++] = Get_Authorize_Lock_Status(); //系统锁
+ Global_Large_Buff[len++] = 0x00; //保留
+ Global_Large_Buff[len++] = 0x00; //保留
+ Global_Large_Buff[len++] = 0x00; //保留
+ Global_Large_Buff[len++] = 0x00; //保留
+ Global_Large_Buff[len++] = 0x00; //保留
+ Global_Large_Buff[len++] = 0x00; //保留
+ Global_Large_Buff[len++] = (dev_state_len / 6); //RCU上报的设备数量
+
+ if(read_addr + dev_state_len > SRAM_UDP_SendData_Endaddr)
+ {
+ remaining_len = SRAM_UDP_SendData_Endaddr - read_addr;
+ SRAM_DMA_Read_Buff(&Global_Large_Buff[len],remaining_len,read_addr);
+ len += remaining_len;
+ remaining_len = dev_state_len - remaining_len;
+ read_addr = SRAM_UDP_SendData_Startaddr;
+ SRAM_DMA_Read_Buff(&Global_Large_Buff[len],remaining_len,read_addr);
+ read_addr += remaining_len;
+ len += remaining_len;
+ }else {
+ SRAM_DMA_Read_Buff(&Global_Large_Buff[len],dev_state_len,read_addr);
+ read_addr += dev_state_len;
+ len += dev_state_len;
+ if(read_addr > SRAM_UDP_SendData_Endaddr) read_addr = SRAM_UDP_SendData_Startaddr;
+ }
+
+ Global_Large_Buff[len++] = (dev_online_len / 6); //RCU上报的设备离线数量
+
+ if(read_addr_2 + dev_online_len > SRAM_DEVICE_ONLINE_STATE_END_ADDR)
+ {
+ remaining_len = SRAM_DEVICE_ONLINE_STATE_END_ADDR - read_addr_2;
+ SRAM_DMA_Read_Buff(&Global_Large_Buff[len],remaining_len,read_addr_2);
+ len += remaining_len;
+ remaining_len = dev_online_len - remaining_len;
+ read_addr_2 = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
+ SRAM_DMA_Read_Buff(&Global_Large_Buff[len],remaining_len,read_addr_2);
+ read_addr_2 += remaining_len;
+ len += remaining_len;
+ }else {
+ SRAM_DMA_Read_Buff(&Global_Large_Buff[len],dev_online_len,read_addr_2);
+ read_addr_2 += dev_online_len;
+ len += dev_online_len;
+ if(read_addr_2 > SRAM_DEVICE_ONLINE_STATE_END_ADDR) read_addr_2 = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
+ }
+
+ SRAM_Write_DW(read_addr,SRAM_UDP_SendData_Tempaddr); //先临时保存读取地址,当收到回复报文时才将读取地址复位
+ SRAM_Write_DW(read_addr_2,SRAM_DEVICE_ONLINE_STATE_TEMP_ADDR); //先临时保存读取地址,当收到回复报文时才将读取地址复位
+
+ len += 2;
+ UDP_Add_Header(Global_Large_Buff,In_DevState_Cmd,len,server_info.frame_no); //最后添加头部
+
+ NetCRC16(&Global_Large_Buff[0],len);
+ Dbg_Print_Buff(DBG_BIT_NET_STATUS_bit,"房间设备动作上报数据:",Global_Large_Buff,len);
+
+ WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &Global_Large_Buff[0], &len, server_info.dis_ip, server_info.dis_port);
+
+ LOG_NET_COMM_Send_Record(0x01,server_info.dis_ip,server_info.dis_port,&Global_Large_Buff[0],len);
+
+}
+
+/*******************************************************************************
+* Function Name : Udp_Internal_RoomState_Process
+* Description : 向服务器房间设备状态 回复数据
+*******************************************************************************/
+uint8_t Udp_Internal_RoomState_Process(uint8_t *data, uint16_t DataLen, uint8_t *ip,uint16_t port)
+{
+ /*CRC校验*/
+ uint16_t data_crc = 0x00;
+ uint32_t temp_val = 0x00;
+
+ data_crc = data[DataLen-1];
+ data_crc <<= 0x08;
+ data_crc |= data[DataLen-2];
+
+ if(NetCRC16_2(data,DataLen-2) != data_crc) return 0xF0;
+
+ //判断帧号是否一致
+ data_crc = data[FRAME_NO_OFFSET + 1];
+ data_crc <<= 0x08;
+ data_crc |= data[FRAME_NO_OFFSET];
+
+ if(data_crc != server_info.frame_no) return 0x01;
+
+ temp_val = SRAM_Read_DW(SRAM_UDP_SendData_Tempaddr);
+ SRAM_Write_DW(temp_val, SRAM_UDP_SendData_Readaddr); //读地址复位
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s Dev 读:%8X",__func__,temp_val);
+
+ temp_val = SRAM_Read_DW(SRAM_DEVICE_ONLINE_STATE_TEMP_ADDR); //读临时保存的故障读取地址
+ SRAM_Write_DW(temp_val, SRAM_DEVICE_ONLINE_STATE_READ_ADDR); //故障读地址重新赋值
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s Dev Err 读:%8X",__func__,temp_val);
+
+
+ //无数据处理上报成功,清楚一下标志位而已
+ server_info.udp_send_flag = 0x00; //清楚发送标志位
+ server_info.active_cmd_flag &= ~UDP_ActSend_DevState_Flag; //清楚标志位
+ server_info.udp_online_tick = SysTick_1ms;
+ return 0x00;
+}
+
+/*******************************************************************************
+* Function Name : ServiceInfo_Get_ALL_Loop_State
+* Description : 服务信息 - 获取全部回路的开关状态
+*******************************************************************************/
+uint8_t ServiceInfo_Get_ALL_Loop_State(uint8_t *read_buff)
+{
+ uint32_t dev_addr = Find_AllDevice_List_Information(Dev_Host_Service,0x00);
+ Device_Public_Information_G BUS_Public; //共用
+ NOR_SERVICE_INFO DevServiceInfo; //服务信息局部变量
+ uint8_t loop_offset = 0;
+ uint8_t loop_ide = 0;
+
+ if(dev_addr == 0x00) return 0x01; //未找到设备
+
+ SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),dev_addr); //拷贝所有共有数据
+ SRAM_DMA_Read_Buff((uint8_t *)&DevServiceInfo,sizeof(NOR_SERVICE_INFO),dev_addr+Dev_Privately);
+
+ if( DevServiceInfo.ServiceLoopValidNum >= ServiceNumMAX ) DevServiceInfo.ServiceLoopValidNum = ServiceNumMAX;
+
+ for(uint8_t i=0;i= 0x8000))
+ {
+ server_info.frame_no++;
+ }else{
+ server_info.frame_no = 0x8000;
+ }
+
+ memset(Global_Large_Buff,0,sizeof(Global_Large_Buff));
+
+ sendlen = BLV_UDP_HEAD_LEN;
+
+ Global_Large_Buff[sendlen++] = 0x01; //解析参数版本
+ Global_Large_Buff[sendlen++] = DevActionGlobal.DevActionU64Cond.EleState; //取电状态
+ Global_Large_Buff[sendlen++] = SRAM_Read_Byte(SRAM_UDP_ELEReport_CardType); //身份信息
+ Global_Large_Buff[sendlen++] = SRAM_Read_Byte(SRAM_UDP_ELEReport_VirtualCard); //无卡逻辑状态(对应事件状态)
+
+ ServiceInfo_Get_ALL_Loop_State(&Global_Large_Buff[sendlen]);
+ sendlen += 8;
+
+ Global_Large_Buff[sendlen++] = SRAM_Read_Byte( SRAM_Register_Start_ADDRESS + Register_RoomRent_OFFSET ); //PMS状态 - 0x01:入住,0x02:退房 服务器给RCU主机发送的
+ //Global_Large_Buff[sendlen++] = 0x01; //测试使用
+
+ Global_Large_Buff[sendlen++] = SRAM_Read_Byte(SRAM_UDP_Report_CarbonSatet); //碳达人状态 - 0x01:开,0x00:关
+
+ /*查找能耗监测设备 - 默认:1地址 - 回路 1*/
+ temp_dev = Find_AllDevice_List_Information(Dev_Energy_Monitor,0x01);
+
+ if(temp_dev != 0x00)
+ {
+ /*当前能耗设备已存在 */
+ RS485_ENERGYMONITOR_INFO Rs485EnergyInfo;
+ SRAM_DMA_Read_Buff((uint8_t *)&Rs485EnergyInfo,sizeof(RS485_ENERGYMONITOR_INFO),temp_dev+Dev_Privately);
+
+ Global_Large_Buff[sendlen++] = 0x01; //上报数据个数
+
+ Global_Large_Buff[sendlen++] = Dev_Energy_Monitor; //设备类型 - 能耗检测
+ Global_Large_Buff[sendlen++] = 0x01; //设备地址 - 能耗检测 设备默认0x01
+ Global_Large_Buff[sendlen++] = 0x01; //设备回路 - 能耗检测 设备默认0x01
+ Global_Large_Buff[sendlen++] = 0x00; //设备回路 - 能耗检测 设备默认0x01
+ Global_Large_Buff[sendlen++] = 0x10; //设备数据长度
+ //能耗检测 - 电压 单位:10mV
+ Global_Large_Buff[sendlen++] = Rs485EnergyInfo.voltage & 0xFF;
+ Global_Large_Buff[sendlen++] = (Rs485EnergyInfo.voltage >> 8) & 0xFF;
+ //能耗检测 - 电流 单位:10mA
+ Global_Large_Buff[sendlen++] = Rs485EnergyInfo.current & 0xFF;
+ Global_Large_Buff[sendlen++] = (Rs485EnergyInfo.current >> 8) & 0xFF;
+ //能耗检测 - 有功功率 单位:mW
+ Global_Large_Buff[sendlen++] = Rs485EnergyInfo.active_power & 0xFF;
+ Global_Large_Buff[sendlen++] = (Rs485EnergyInfo.active_power >> 8) & 0xFF;
+ Global_Large_Buff[sendlen++] = (Rs485EnergyInfo.active_power >> 16) & 0xFF;
+ Global_Large_Buff[sendlen++] = (Rs485EnergyInfo.active_power >> 24) & 0xFF;
+ //能耗检测 - 能耗 单位:Wh
+ Global_Large_Buff[sendlen++] = Rs485EnergyInfo.phase_energy & 0xFF;
+ Global_Large_Buff[sendlen++] = (Rs485EnergyInfo.phase_energy >> 8) & 0xFF;
+ Global_Large_Buff[sendlen++] = (Rs485EnergyInfo.phase_energy >> 16) & 0xFF;
+ Global_Large_Buff[sendlen++] = (Rs485EnergyInfo.phase_energy >> 24) & 0xFF;
+ //能耗检测 - 总能耗 单位:Wh
+ Global_Large_Buff[sendlen++] = Rs485EnergyInfo.total_energy & 0xFF;
+ Global_Large_Buff[sendlen++] = (Rs485EnergyInfo.total_energy >> 8) & 0xFF;
+ Global_Large_Buff[sendlen++] = (Rs485EnergyInfo.total_energy >> 16) & 0xFF;
+ Global_Large_Buff[sendlen++] = (Rs485EnergyInfo.total_energy >> 24) & 0xFF;
+ }else{
+ /*没找到能耗设备*/
+ Global_Large_Buff[sendlen++] = 0x00; //上报数据个数
+ }
+
+ /*添加空调设备状态 - 先要找到有几个空调,然后进行数据组包*/
+ temp_dev = Find_TempDevice_List_Information(&Global_Large_Buff[sendlen],0x05); //目前最多5个空调
+ sendlen = sendlen + (temp_dev * 0x07);
+
+ Global_Large_Buff[29] += temp_dev; //更新上报设备个数
+
+ sendlen += 0x02; //添加CRC校验长度
+ UDP_Add_Header(Global_Large_Buff,In_PeriodicReport_Cmd,sendlen,server_info.frame_no); //添加头部
+
+ NetCRC16(&Global_Large_Buff[0],sendlen);
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s Len:%d",__func__,sendlen);
+
+ Dbg_Print_Buff(DBG_BIT_NET_STATUS_bit,"定期上报: ",Global_Large_Buff,sendlen);
+
+ WCHNET_SocketUdpSendTo(g_netinfo.SocketId[SocketIdnex_BLVSeriver], &Global_Large_Buff[0], &sendlen, server_info.dis_ip, server_info.dis_port);
+ LOG_NET_COMM_Send_Record(0x01,server_info.dis_ip,server_info.dis_port,&Global_Large_Buff[0],sendlen);
+}
+
+/*******************************************************************************
+* Function Name : Udp_Internal_Periodic_Report_Process
+* Description : 向服务器定期上报 回复数据
+*******************************************************************************/
+uint8_t Udp_Internal_Periodic_Report_Process(uint8_t *data, uint16_t DataLen, uint8_t *ip,uint16_t port)
+{
+ /*CRC校验*/
+ uint16_t data_crc = 0x00;
+
+ data_crc = data[DataLen-1];
+ data_crc <<= 0x08;
+ data_crc |= data[DataLen-2];
+
+ if(NetCRC16_2(data,DataLen-2) != data_crc) return 0xF0;
+
+ //判断帧号是否一致
+ data_crc = data[FRAME_NO_OFFSET + 1];
+ data_crc <<= 0x08;
+ data_crc |= data[FRAME_NO_OFFSET];
+ if(data_crc != server_info.frame_no) return 0x01;
+
+ //无数据处理上报成功,清楚一下标志位而已
+ server_info.udp_send_flag = 0x00; //清楚发送标志位
+ server_info.active_cmd_flag &= ~UDP_ActSend_Periodic_Flag; //清楚标志位
+ server_info.udp_online_tick = SysTick_1ms;
+
+ return 0x00;
+}
+
+/*******************************************************************************
+* Function Name : Udp_Internal_Analysis
+* Description : BLV通讯协议 - 接收数据处理函数
+* Input :
+* data - 接收到的数据
+* len - 接收到的数据长度
+* ip - 数据的IP地址
+* port - 数据的Port端口
+*******************************************************************************/
+void Udp_Internal_Analysis(uint8_t *data, uint32_t len, uint8_t* ip, uint16_t port)
+{
+ //uint8_t rev = 0;
+ uint16_t temp_val = 0;
+
+ if( len < BLV_UDP_PACK_LEN ) return ; //长度不足,直接退出
+
+ /*BLV通讯协议 - 校验数据头 AA 55 */
+ if( (data[FRAME_HEAD_OFFSET] == 0xAA) && (data[FRAME_HEAD_OFFSET + 1] == 0x55) )
+ {
+ /*BLV通讯协议 - 校验特征 T3SA */
+ if( (data[SYSTEM_ID_OFFSET] == 'T')
+ && (data[SYSTEM_ID_OFFSET + 1] == '3')
+ && (data[SYSTEM_ID_OFFSET + 2] == 'S')
+ && (data[SYSTEM_ID_OFFSET + 3] == 'A') )
+ {
+ /*BLV通讯协议 - 校验数据接收长度 */
+ temp_val = data[FRAME_LEN_OFFSET +1];
+ temp_val <<= 8;
+ temp_val |= data[FRAME_LEN_OFFSET];
+ if( temp_val == len )
+ {
+ /*BLV通讯协议 - 校验CRC值 */
+ temp_val = data[len-1];
+ temp_val <<= 0x08;
+ temp_val |= data[len-2];
+ if(NetCRC16_2(data,len-2) != temp_val) return ; //CRC校验失败,直接退出
+
+ switch(data[CMD_OFFSET])
+ {
+ case In_Search_Cmd: //搜索命令
+ UDP_Search_Cmd_Processing(data, len, ip, port);
+ break;
+// case In_IAP_Cmd: //IAP APP升级命令
+// UDP_IAP_Cmd_Processing(data, len, ip, port);
+// break;
+// case In_Subgroup_Cmd: //IAP 固件升级命令 -- 取消没有使用
+// UDP_Subgroup_Cmd_Processing(data, len, ip, port);
+// break;
+ case In_Read_MCUSystem_Cmd: //读取MCU参数命令 - 也是搜索命令
+ UDP_Read_MCUSystem_Cmd_Processing(data, len, ip, port);
+ break;
+ case In_QueryTime_Cmd: //获取时间命令
+ Udp_QueryTime_Cmd_Process(data, len, ip, port);
+ break;
+ case In_DevState_Cmd: //上报设备状态命令
+ Udp_Internal_RoomState_Process(data, len, ip, port);
+ break;
+ case In_PeriodicReport_Cmd: //定期上报命令
+ Udp_Internal_Periodic_Report_Process(data, len, ip, port);
+ break;
+ case In_BLVIAPLogic_Cmd:
+ Udp_Internal_BLVIAP_Logic(data, len, ip, port);
+ break;
+ default:
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"UDP CMD %X",data[CMD_OFFSET]);
+ break;
+ }
+ }
+ }
+ }
+
+}
+
/*******************************************
* 函数名:BLV_UDP_Comm_Task
@@ -1388,7 +2425,7 @@ __attribute__((section(".non_0_wait"))) void BLV_UDP_Comm_Task(void)
server_info.udp_sta = 0x04; //进入发送等待
break;
case 0x02: //设备状态上报 -
- //Udp_Internal_RoomState();
+ Udp_Internal_RoomState();
server_info.udp_retry_num = 0x02; //一共发送3次
server_info.udp_retry_tick = SysTick_1ms;
@@ -1396,7 +2433,7 @@ __attribute__((section(".non_0_wait"))) void BLV_UDP_Comm_Task(void)
server_info.udp_sta = 0x04; //进入发送等待
break;
case 0x04: //定期上报 - 只发送一次
- //Udp_Internal_Periodic_Report_PackSend();
+ Udp_Internal_Periodic_Report_PackSend();
server_info.udp_idle_tick = SysTick_1ms;
server_info.udp_send_flag = 0x00;
@@ -1464,11 +2501,11 @@ __attribute__((section(".non_0_wait"))) void BLV_UDP_Comm_Task(void)
{
temp_val = SRAM_Read_DW(SRAM_UDP_SendData_Tempaddr);
SRAM_Write_DW(temp_val, SRAM_UDP_SendData_Readaddr); //读地址复位
- Dbg_Println(DBG_BIT_NET_STATUS_bit,"上报设备状态失败 读:%8X",temp_val);
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"上报设备状态失败 读:%X",temp_val);
temp_val = SRAM_Read_DW(SRAM_DEVICE_ONLINE_STATE_TEMP_ADDR); //读临时保存的故障读取地址
SRAM_Write_DW(temp_val, SRAM_DEVICE_ONLINE_STATE_READ_ADDR); //故障读地址重新赋值
- Dbg_Println(DBG_BIT_NET_STATUS_bit,"上报设备故障失败 读:%8X",temp_val);
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"上报设备故障失败 读:%X",temp_val);
}
server_info.active_cmd_flag &= ~server_info.udp_send_flag;
@@ -1478,7 +2515,7 @@ __attribute__((section(".non_0_wait"))) void BLV_UDP_Comm_Task(void)
server_info.udp_retry_time += 2000;
}
- Dbg_Println(DBG_BIT_NET_STATUS_bit,"udp_retry:%02x - %d - %d",server_info.udp_send_flag,server_info.udp_retry_cnt,server_info.udp_retry_time);
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"udp_retry:%x - %d - %d",server_info.udp_send_flag,server_info.udp_retry_cnt,server_info.udp_retry_time);
}
}else {
//数据重发已达上限,清楚发送标志位
@@ -1507,7 +2544,7 @@ __attribute__((section(".non_0_wait"))) void BLV_UDP_Comm_Task(void)
server_info.search_ack_tick = SysTick_1ms;
server_info.search_ack_flag = 0x00;
- //Udp_Internal_Read_MCU_System_SendAck(server_info.udp_ip,server_info.local_port,server_info.ack_frame);
+ Udp_Internal_Read_MCU_System_SendAck(server_info.goal_ip,server_info.goal_port,server_info.ack_frame);
}
}
diff --git a/MCU_Driver/inc/blv_netcomm_function.h b/MCU_Driver/inc/blv_netcomm_function.h
index cffee1d..21cb03d 100644
--- a/MCU_Driver/inc/blv_netcomm_function.h
+++ b/MCU_Driver/inc/blv_netcomm_function.h
@@ -19,9 +19,12 @@
#define SeriaNet_Cmd_Send_Len 19 //包头:15Byte+数据:2Byte+CRC:2Byte
-#define Search_Cmd 0x01 //搜索命令
-#define Heart_Cmd 0x02 //心跳包
+
+
+#define In_Search_Cmd 0x01 //搜索命令
+#define In_Heart_Cmd 0x02 //心跳包
#define In_QueryTime_Cmd 0x08 //向服务器请求时间
+#define In_IAP_Cmd 0x0A //IAP APP升级命令
#define In_RoomState_Cmd 0x0E //状态上报命令 2025-09-25 取消
#define In_DevCtr_Cmd 0x0F //设备控制命令,包括继电器控制和调光
#define In_SingleAirCtrl_Cmd 0x13 //温控器单控命令
@@ -40,6 +43,9 @@
#define In_SeriaNet_Cmd 0x70 //透传命令下发
#define In_SeriaNetReported_Cmd 0x71 //透传数据上报
+#define In_Subgroup_Cmd 0xA2 //子群发布 - 用于配置升级
+
+
#define In_Read_MCUSystem_Cmd 0xB1 //读取系统参数信息
#define In_BLVIAP_Cmd 0xB2 //BLV_Cx升级命令,用于区分A系列升级流程,定义的升级命令,通过该升级命令升级文件执行的BLV_Cx系列的升级流程
#define In_BLVIAPCheck_Cmd 0xB3 //BLV_Cx升级校验命令
@@ -90,6 +96,8 @@ uint8_t Udp_Internal_SeriaNet_Uploading(uint8_t port,uint32_t baud,uint32_t data
uint8_t Udp_Internal_SeriaNet_Uploading2(uint8_t port,uint32_t baud,uint8_t* data, uint16_t DataLen);
uint8_t Udp_Internal_SeriaNet_Response_Timeout(void);
+void Udp_Internal_Analysis(uint8_t *data, uint32_t len, uint8_t* ip, uint16_t port);
+
void BLV_UDP_Comm_Task(void);
#endif /* MCU_DRIVER_INC_BLV_NETCOMM_FUNCTION_H_ */
diff --git a/MCU_Driver/inc/rtc.h b/MCU_Driver/inc/rtc.h
index 14244a6..3650279 100644
--- a/MCU_Driver/inc/rtc.h
+++ b/MCU_Driver/inc/rtc.h
@@ -48,6 +48,7 @@ uint32_t RTC_Conversion_To_Unix(S_RTC *rtc_time);
void Unix_Conversion_To_RTC(S_RTC *rtc_time,uint32_t utc_tick);
uint8_t RTC_ReadDate(S_RTC *psRTC);
uint8_t RTC_WriteDate(S_RTC SetRTC);
+uint8_t NetRTC_WriteDate(S_RTC SetRTC);
void RTC_TASK(void);
uint8_t RTC_TimeDate_Correct_Figure(uint8_t data);
diff --git a/MCU_Driver/logic_file_function.c b/MCU_Driver/logic_file_function.c
index 54c2e2b..38ee9d5 100644
--- a/MCU_Driver/logic_file_function.c
+++ b/MCU_Driver/logic_file_function.c
@@ -1131,7 +1131,7 @@ __attribute__((section(".non_0_wait"))) uint8_t Read_LogicFile_Information(uint8
if(temp != LOGIC_DataFlag)
{
- Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"逻辑文件标志位不符,不作处理:%08X",temp);
+ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"逻辑文件标志位不符,不作处理:%X",temp);
return 0x01;
}
@@ -1145,7 +1145,7 @@ __attribute__((section(".non_0_wait"))) uint8_t Read_LogicFile_Information(uint8
if((file_len != 0x00) &&(file_len > 0x70000))
{
- Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"逻辑文件长度不对:%08X",file_len);
+ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"逻辑文件长度不对:%X",file_len);
return 0x01;
}
@@ -1155,9 +1155,9 @@ __attribute__((section(".non_0_wait"))) uint8_t Read_LogicFile_Information(uint8
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"MD5校验成功!");
}else {
- Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"MD5校验错误,不作处理 Len:%08X",file_len);
- Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"升级配置失败,Md5错误:%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X%02X,%02X,%02X,%02X,%02X,%02X",md5[0],md5[1],md5[2],md5[3],md5[4],md5[5],md5[6],md5[7],md5[8],md5[9],md5[10],md5[11],md5[12],md5[13],md5[14],md5[15]);
- Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"File Md5:%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X",\
+ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"MD5校验错误,不作处理 Len:%X",file_len);
+ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"升级配置失败,Md5错误:%X,%X,%X,%X,%X,%X,%X,%X,%X,%X%X,%X,%X,%X,%X,%X",md5[0],md5[1],md5[2],md5[3],md5[4],md5[5],md5[6],md5[7],md5[8],md5[9],md5[10],md5[11],md5[12],md5[13],md5[14],md5[15]);
+ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"File Md5:%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X",\
file_info[8],file_info[9],\
file_info[10],file_info[11],\
file_info[12],file_info[13],\
@@ -2968,20 +2968,20 @@ __attribute__((section(".non_0_wait"))) void LOGIC_FILE_Analysis(LOGICFILE_Conte
switch(Temp_Flash_Buff[Logic_D_FrameType])
{
case Logic_FrameType_LogicInfo:
- //Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic_FrameType_LogicInfo - 逻辑信息");
+ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic_FrameType_LogicInfo - 逻辑信息");
Logic_FrameType_LogicInfo_TempProcessing(&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
break;
case Logic_FrameType_Global:
- //Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic_FrameType_Global - 全局信息");
+ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic_FrameType_Global - 全局信息");
Logic_FrameType_Global_TempProcessing(&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
break;
case Logic_FrameType_DeviceExist:
- //Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic_FrameType_DeviceExist - 设备存在");
- Logic_FrameType_DeviceExist_TempProcessing(read_addr,Lfile_info,&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
+ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic_FrameType_DeviceExist - 设备存在");
+ //Logic_FrameType_DeviceExist_TempProcessing(read_addr,Lfile_info,&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
break;
case Logic_FrameType_DeviceAction:
- //Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic_FrameType_DeviceAction - 设备动作");
- Logic_FrameType_DeviceAction_TempProcessing(read_addr,Lfile_info,&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
+ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic_FrameType_DeviceAction - 设备动作");
+ //Logic_FrameType_DeviceAction_TempProcessing(read_addr,Lfile_info,&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
break;
#if RS485_MUSIC_BLW_Flag
case Logic_FrameType_VoiceMap:
@@ -3561,9 +3561,9 @@ __attribute__((section(".non_0_wait"))) uint8_t LOGIC_FILE_Check(void)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"MD5校验成功!");
}else {
- Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"MD5校验错误,不作处理 Len:%08X",file_len);
- Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"升级配置失败,Md5错误:%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X%02X,%02X,%02X,%02X,%02X,%02X",md5[0],md5[1],md5[2],md5[3],md5[4],md5[5],md5[6],md5[7],md5[8],md5[9],md5[10],md5[11],md5[12],md5[13],md5[14],md5[15]);
- Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"UDP Md5:%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X",\
+ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"MD5校验错误,不作处理 Len:%X",file_len);
+ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"升级配置失败,Md5错误:%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X",md5[0],md5[1],md5[2],md5[3],md5[4],md5[5],md5[6],md5[7],md5[8],md5[9],md5[10],md5[11],md5[12],md5[13],md5[14],md5[15]);
+ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"UDP Md5:%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X",\
file_info[8],file_info[9],\
file_info[10],file_info[11],\
file_info[12],file_info[13],\
diff --git a/MCU_Driver/rw_logging.c b/MCU_Driver/rw_logging.c
index e8a84e0..a41a4d3 100644
--- a/MCU_Driver/rw_logging.c
+++ b/MCU_Driver/rw_logging.c
@@ -151,7 +151,7 @@ __attribute__((section(".non_0_wait"))) uint8_t Log_write_sram(uint8_t data_type
/*第三:刷新日志写入地址*/
Last_add = Last_add + write_len;
Set_Log_Current_Address(Last_add);
- Dbg_Println(DBG_BIT_SYS_STATUS_bit,"SRAM LOG Addr : %08X",Last_add);
+ Dbg_Println(DBG_BIT_SYS_STATUS_bit,"SRAM LOG Addr : %X",Last_add);
return 0;
}
diff --git a/MCU_Driver/uart.c b/MCU_Driver/uart.c
index ebe59af..8c9b2d3 100644
--- a/MCU_Driver/uart.c
+++ b/MCU_Driver/uart.c
@@ -270,7 +270,13 @@ __attribute__((section(".non_0_wait"))) void UART1_RECEIVE(void)
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"UART_1 Len %d ",g_uart[UART_1].RecvLen);
Dbg_Print_Buff(DBG_BIT_SYS_STATUS_bit,"UART_1 Buff:", g_uart[UART_1].RecvBuffer,g_uart[UART_1].RecvLen);
+ //将数据存入SRAM数据处理缓冲区 - 数据接收完毕在数据头写入数据长度
+ SRAM_Write_Byte((uint8_t)(g_uart[UART_1].RecvLen & 0xFF),g_uart[UART_1].RX_Buffer_WriteAddr);
+ SRAM_Write_Byte((uint8_t)((g_uart[UART_1].RecvLen >> 8) & 0xFF),g_uart[UART_1].RX_Buffer_WriteAddr+1);
+ SRAM_DMA_Write_Buff(g_uart[UART_1].RecvBuffer,g_uart[UART_1].RecvLen,g_uart[UART_1].RX_Buffer_WriteAddr+2);
+ g_uart[UART_1].RX_Buffer_WriteAddr += SRAM_Uart_Buffer_Size;
+ if(g_uart[UART_1].RX_Buffer_WriteAddr > SRAM_UART1_RecvBuffer_End_Addr) g_uart[UART_1].RX_Buffer_WriteAddr = SRAM_UART1_RecvBuffer_Start_Addr;
g_uart[UART_1].RecvLen = 0;
g_uart[UART_1].Receiving = 0;
diff --git a/NetLib/net_config.h b/NetLib/net_config.h
index a65fce2..da906a1 100644
--- a/NetLib/net_config.h
+++ b/NetLib/net_config.h
@@ -31,7 +31,7 @@ extern "C" {
/* The number of sockets, the maximum is 31 */
#define WCHNET_MAX_SOCKET_NUM (WCHNET_NUM_IPRAW+WCHNET_NUM_UDP+WCHNET_NUM_TCP+WCHNET_NUM_TCP_LISTEN)
-#define WCHNET_TCP_MSS 768 /* Size of TCP MSS 默认:1460*/
+#define WCHNET_TCP_MSS 1460 /* Size of TCP MSS 默认:1460*/
#define WCHNET_NUM_POOL_BUF (WCHNET_NUM_TCP*2+2) /* The number of POOL BUFs, the number of receive queues */
diff --git a/NetLib/net_function.c b/NetLib/net_function.c
index 61eef31..d9fa58e 100644
--- a/NetLib/net_function.c
+++ b/NetLib/net_function.c
@@ -18,7 +18,7 @@ uint16_t srcport = 1000; //source port
uint8_t SocketId;
uint8_t socket[WCHNET_MAX_SOCKET_NUM]; //Save the currently connected socket
-uint8_t SocketRecvBuf[WCHNET_MAX_SOCKET_NUM][RECE_BUF_LEN]; //socket receive buffer
+uint8_t SocketRecvBuf[WCHNET_MAX_SOCKET_NUM][1472]; //socket receive buffer
//设备的网络信息
WCHNET_INFO_T g_netinfo = {
@@ -94,7 +94,7 @@ void TIM2_IRQHandler(void)
* cb - socket回调函数
* Return : None
*******************************************************************************/
-__attribute__((section(".non_0_wait"))) void WCHNET_CreateUdpSocket(uint8_t* S, uint16_t SourPort, pSockRecv cb)
+void WCHNET_CreateUdpSocket(uint8_t *S, uint16_t SourPort, pSockRecv cb)
{
uint8_t i;
SOCK_INF TmpSocketInf; /* 创建临时socket变量 */
@@ -112,7 +112,7 @@ __attribute__((section(".non_0_wait"))) void WCHNET_CreateUdpSocket(uint8_t* S,
i = WCHNET_SocketCreat(S, &TmpSocketInf); /* 创建socket,将返回的socket索引保存在SocketId中 */
mStopIfError(i);
- WCHNET_ModifyRecvBuf(SocketId, (uint32_t) SocketRecvBuf[SocketId], RECE_BUF_LEN);
+ WCHNET_ModifyRecvBuf(*S, (uint32_t) SocketRecvBuf[*S], RECE_BUF_LEN);
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s - %d",__func__, *S);
}
@@ -152,9 +152,9 @@ void UDPSocket1_AppCallBack( struct _SOCK_INF * SocketInf,uint32_t ipaddr,uint16
ip[3] = ipaddr>>24;
Dbg_Println(DBG_BIT_NET_STATUS_bit,"ip:%d.%d.%d.%d, port:%d",ip[0], ip[1], ip[2], ip[3], port);
- Dbg_Println(DBG_BIT_NET_STATUS_bit,"Socket1 len:%ld",len);
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"Socket1 len:%d",len);
+ Dbg_Print_Buff(DBG_BIT_NET_STATUS_bit,"Recv data:",buff,len);
- Dbg_Print_Buff(DBG_BIT_NET_STATUS_bit,"data :",buff,len);
//Udp_Internal_Analysis(buff, len, ip, port);
if(buff[0] == 0xAA)
@@ -162,7 +162,7 @@ void UDPSocket1_AppCallBack( struct _SOCK_INF * SocketInf,uint32_t ipaddr,uint16
switch(buff[1])
{
case 0x55: //旧的服务器协议
- //Udp_Internal_Analysis(buff, len, ip, port);
+ Udp_Internal_Analysis(buff, len, ip, port);
break;
case 0x66: //UDP服务协议 - 2022-05-31
//UDP_NetServer_Data_Analysis(buff, len, ip, port);
@@ -1055,13 +1055,6 @@ __attribute__((section(".non_0_wait"))) void NetWork_Task(void)
//Udp_Internal_Task(); //内网处理任务(升级,发布配置)
- if(SysTick_1s - server_info.con_tick > 10)
- {
- //测试使用
- server_info.con_tick = SysTick_1s;
- Dbg_Println(DBG_BIT_NET_STATUS_bit,"网络处理中...\n");
- }
-
/* -该用于网络直连超时后,重启网络
* -处于网络直连状态下,PC工具会向主机定期发送查询数据
* */
@@ -1087,7 +1080,6 @@ __attribute__((section(".non_0_wait"))) void NetWork_Task(void)
/*释放套接字*/
Dbg_Println(DBG_BIT_NET_STATUS_bit,"释放套接字");
WCHNET_SocketClose(g_netinfo.SocketId[SocketIdnex_BLVSeriver],0x00);
-
}
break;
diff --git a/NetLib/net_function.h b/NetLib/net_function.h
index bc0a132..acf8971 100644
--- a/NetLib/net_function.h
+++ b/NetLib/net_function.h
@@ -118,7 +118,8 @@ typedef struct
uint16_t goal_port; //目标port
uint16_t dis_port; //云端服务器端口
uint16_t frame_no; //发送的帧号
- uint16_t ack_frame; //ACK帧号
+ uint16_t ack_frame; //ACK帧号 - 搜索上报的帧号
+ uint16_t udp_frame; //UDP通讯接收的帧号
uint16_t udp_timesync_cnt; //时间同步次数 - 1s一次
uint16_t udp_periodic_cnt; //定期上报次数 - 1s一次
diff --git a/NetLib/tftp_function.c b/NetLib/tftp_function.c
index ef5d197..21ee476 100644
--- a/NetLib/tftp_function.c
+++ b/NetLib/tftp_function.c
@@ -53,9 +53,9 @@ __attribute__((section(".non_0_wait"))) uint16_t TFTP_Pack_Get_Block(uint8_t *bu
{
uint16_t temp = 0x00;
- temp = buf[3];
+ temp = buf[2];
temp <<= 8;
- temp |= buf[4];
+ temp |= buf[3];
return temp;
}
@@ -94,7 +94,7 @@ __attribute__((section(".non_0_wait"))) uint8_t TFTP_send_ack_packet(uint8_t s,
{
uint8_t err = 0;
uint32_t sendlen = TFTP_ACK_PKT_LEN;
- char packet[TFTP_ACK_PKT_LEN];
+ uint8_t packet[24];
/* define the first two bytes of the packet */
if(1 == IAPVarTypeStruct_Ptr.IapErrFlag) TFTP_Pack_Set_Opcode(packet,TFTP_ERROR);
@@ -102,8 +102,10 @@ __attribute__((section(".non_0_wait"))) uint8_t TFTP_send_ack_packet(uint8_t s,
TFTP_Pack_Set_Block(packet, block);
- Dbg_Println(DBG_BIT_NET_STATUS_bit,"TFTP ACK packet -- SocketId:%d , port:%d ,block:%ld len:%ld , IP:%d.%d.%d.%d",s,to_port,block,sendlen,to_ip[0],to_ip[1],to_ip[2],to_ip[3]);
- err = WCHNET_SocketUdpSendTo(s, (uint8_t *)&packet[0], &sendlen, to_ip, to_port);
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"TFTP ACK packet -- SocketId:%d , port:%d ,block:%d len:%d , IP:%d.%d.%d.%d",s,to_port,block,sendlen,to_ip[0],to_ip[1],to_ip[2],to_ip[3]);
+ Dbg_Print_Buff(DBG_BIT_NET_STATUS_bit, "Send Data: ", packet, sendlen);
+
+ err = WCHNET_SocketUdpSendTo(s, packet, &sendlen, to_ip, to_port);
return err;
}
@@ -128,7 +130,7 @@ __attribute__((section(".non_0_wait"))) uint8_t IAP_tftp_process_write(uint8_t s
IAPVarTypeStruct_Ptr.TotalCount =0;
IAPVarTypeStruct_Ptr.IapErrFlag = 0;
-
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"ip:%d.%d.%d.%d, port:%d",to_ip[0], to_ip[1], to_ip[2], to_ip[3], to_port);
/*BLV_C1 -- 擦除Flash数据,还是在验证完数据之后,再擦除同时将SRAM中的数据写入flash中*/
if(IAPVarTypeStruct_Ptr.IapFileType == TFTP_IAP_DataType_APP)
{
@@ -145,7 +147,7 @@ __attribute__((section(".non_0_wait"))) uint8_t IAP_tftp_process_write(uint8_t s
return 0x01;
}
- TFTP_send_ack_packet(s, to_ip, to_port, tftp_args.block);
+ TFTP_send_ack_packet(g_netinfo.SocketId[SocketIdnex_TFTPDATA], to_ip, to_port, tftp_args.block); //使用数据套接字
return 0x00;
}
@@ -167,7 +169,9 @@ __attribute__((section(".non_0_wait"))) void TFTP_IAP_Data_Processing(uint8_t s,
IAPVarTypeStruct_Ptr.IapPercent++;
IAPVarTypeStruct_Ptr.processing_tick = SysTick_1ms;
- if( (pkt_buf_len > TFTP_DATA_PKT_HDR_LEN) && (TFTP_Pack_Get_Block(pkt_buf) == (IAPVarTypeStruct_Ptr.Write_Block + 1) ) )
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s block:%d - %d",__func__,IAPVarTypeStruct_Ptr.Write_Block,TFTP_Pack_Get_Block(pkt_buf));
+
+ if( (pkt_buf_len > TFTP_DATA_PKT_HDR_LEN) && ( TFTP_Pack_Get_Block(pkt_buf) == (IAPVarTypeStruct_Ptr.Write_Block + 1) ) )
{
pkt_buf_len = pkt_buf_len - TFTP_DATA_PKT_HDR_LEN;
memset(data_buffer,0,TFTP_DATA_LEN_MAX);
@@ -368,9 +372,9 @@ __attribute__((section(".non_0_wait"))) void TFTP_IAP_Data_Processing(uint8_t s,
// }
IAPVarTypeStruct_Ptr.IapErrFlag = 1;
- Dbg_Println(DBG_BIT_NET_STATUS_bit,"升级失败,Md5错误:%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X%02X,%02X,%02X,%02X,%02X,%02X", \
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"升级失败,Md5错误:%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X", \
md5[0],md5[1],md5[2],md5[3],md5[4],md5[5],md5[6],md5[7],md5[8],md5[9],md5[10],md5[11],md5[12],md5[13],md5[14],md5[15]);
- Dbg_Println(DBG_BIT_NET_STATUS_bit,"UDP Md5:%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X", \
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"UDP Md5:%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X", \
IAPVarTypeStruct_Ptr.Md5[0],IAPVarTypeStruct_Ptr.Md5[1], \
IAPVarTypeStruct_Ptr.Md5[2],IAPVarTypeStruct_Ptr.Md5[3], \
IAPVarTypeStruct_Ptr.Md5[4],IAPVarTypeStruct_Ptr.Md5[5], \
@@ -422,8 +426,8 @@ __attribute__((section(".non_0_wait"))) void TFTP_IAP_Data_Processing(uint8_t s,
memcpy(&data_buffer[8],IAPVarTypeStruct_Ptr.Md5,16);
Flash_Write(data_buffer,24,SPIFLASH_LOGIC_DataFlag_ADDRESS);
- Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"配置网络升级完成");
- LOG_LogicInfo_DebugRecord("配置网络升级复位");
+ Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"配置文件 升级完成");
+ LOG_LogicInfo_DebugRecord("配置文件 升级复位");
}else{
// switch(IAPVarTypeStruct_Ptr->IapType)
// {
@@ -436,9 +440,9 @@ __attribute__((section(".non_0_wait"))) void TFTP_IAP_Data_Processing(uint8_t s,
// }
IAPVarTypeStruct_Ptr.IapErrFlag = 1;
- Dbg_Println(DBG_BIT_NET_STATUS_bit,"升级配置失败,Md5错误:%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X%02X,%02X,%02X,%02X,%02X,%02X",\
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"升级配置失败,Md5错误:%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X",\
md5[0],md5[1],md5[2],md5[3],md5[4],md5[5],md5[6],md5[7],md5[8],md5[9],md5[10],md5[11],md5[12],md5[13],md5[14],md5[15]);
- Dbg_Println(DBG_BIT_NET_STATUS_bit,"UDP Md5:%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X",\
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"UDP Md5:%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X,%X",\
IAPVarTypeStruct_Ptr.Md5[0],IAPVarTypeStruct_Ptr.Md5[1],\
IAPVarTypeStruct_Ptr.Md5[2],IAPVarTypeStruct_Ptr.Md5[3],\
IAPVarTypeStruct_Ptr.Md5[4],IAPVarTypeStruct_Ptr.Md5[5],\
@@ -461,7 +465,7 @@ __attribute__((section(".non_0_wait"))) void TFTP_IAP_Data_Processing(uint8_t s,
* Function Name : UDPSocket_TFTP_CMD_AppCallBack
* Description : TFTP命令套接字 - 数据处理回调函数
*******************************************************************************/
-__attribute__((section(".non_0_wait"))) void UDPSocket_TFTP_CMD_AppCallBack(struct _SOCK_INF * SocketInf,uint32_t ipaddr,uint16_t port,uint8_t *buff,uint32_t len)
+void UDPSocket_TFTP_CMD_AppCallBack(struct _SOCK_INF * SocketInf,uint32_t ipaddr,uint16_t port,uint8_t *buff,uint32_t len)
{
uint8_t ip_addr[4];
ip_addr[0] = ipaddr & 0xFF;
@@ -469,7 +473,7 @@ __attribute__((section(".non_0_wait"))) void UDPSocket_TFTP_CMD_AppCallBack(stru
ip_addr[2] = (ipaddr >> 16) & 0xFF ;
ip_addr[3] = (ipaddr >> 24) & 0xFF ;
- Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s len:%ld",__func__,len);
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s len:%d",__func__,len);
Dbg_Println(DBG_BIT_NET_STATUS_bit,"ip:%d.%d.%d.%d, port:%d",ip_addr[0], ip_addr[1], ip_addr[2], ip_addr[3], port);
/*TFTP 命令处理*/
@@ -483,7 +487,7 @@ __attribute__((section(".non_0_wait"))) void UDPSocket_TFTP_CMD_AppCallBack(stru
IAP_tftp_process_write(g_netinfo.SocketId[SocketIdnex_TFTPCMD], ip_addr, port); //回复升级 写文件指令
}else{
-
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"TFTP Type:%d",IAPVarTypeStruct_Ptr.FunType);
}
}else if( TFTP_Pack_Get_Opcode(buff) == TFTP_OPTION )
@@ -501,7 +505,7 @@ __attribute__((section(".non_0_wait"))) void UDPSocket_TFTP_CMD_AppCallBack(stru
* Function Name : UDPSocket_TFTP_DATA_AppCallBack
* Description : TFTP数据套接字 - 数据处理回调函数
*******************************************************************************/
-__attribute__((section(".non_0_wait"))) void UDPSocket_TFTP_DATA_AppCallBack(struct _SOCK_INF * SocketInf,uint32_t ipaddr,uint16_t port,uint8_t *buff,uint32_t len)
+void UDPSocket_TFTP_DATA_AppCallBack(struct _SOCK_INF * SocketInf,uint32_t ipaddr,uint16_t port,uint8_t *buff,uint32_t len)
{
uint8_t ip_addr[4];
ip_addr[0] = ipaddr & 0xFF;
@@ -509,7 +513,7 @@ __attribute__((section(".non_0_wait"))) void UDPSocket_TFTP_DATA_AppCallBack(str
ip_addr[2] = (ipaddr >> 16) & 0xFF ;
ip_addr[3] = (ipaddr >> 24) & 0xFF ;
- Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s len:%ld",__func__,len);
+ Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s len:%d",__func__,len);
Dbg_Println(DBG_BIT_NET_STATUS_bit,"ip:%d.%d.%d.%d, port:%d",ip_addr[0], ip_addr[1], ip_addr[2], ip_addr[3], port);
if( TFTP_Pack_Get_Opcode(buff) == TFTP_DATA ) //TFTP IAP文件数据
@@ -564,7 +568,7 @@ __attribute__((section(".non_0_wait"))) void Internal_TFTP_Task(void)
case STA_INIT_IDLE:
//向云端发送读取文件请求
- if( SysTick_1ms - IAPVarTypeStruct_Ptr.processing_tick > TFTP_IAP_Timeout) //升级超时,释放套接字
+ if( SysTick_1ms - IAPVarTypeStruct_Ptr.processing_tick > 30000) //升级超时,释放套接字
{
//Cloud_IAP_Plan_SendPack(tftp_args,IAPVarTypeStruct_Ptr,IAPPlan_State_IAPTimeout); //发送IAP升级结果 - 升级超时
@@ -587,7 +591,7 @@ __attribute__((section(".non_0_wait"))) void Internal_TFTP_Task(void)
IAPVarTypeStruct_Ptr.enable = 0x00;
break;
default:
- IAPVarTypeStruct_Ptr.status = STA_END; //释放套接字
+ IAPVarTypeStruct_Ptr.status = STA_INIT_WAIT; //释放套接字
break;
}
diff --git a/NetLib/tftp_function.h b/NetLib/tftp_function.h
index c7f170f..9cf53b3 100644
--- a/NetLib/tftp_function.h
+++ b/NetLib/tftp_function.h
@@ -38,6 +38,13 @@
#define TFTP_IAP_DataType_APP 0x01 //IAP升级 - APP固件
#define TFTP_IAP_DataType_CONFIG 0x02 //IAP升级 - 配置文件
+#define TFTP_IAP_Status_Ready 0x00 //发布就绪
+#define TFTP_IAP_Status_Finish 0x01 //发布完成
+#define TFTP_IAP_Status_Error 0x02 //发布错误
+#define TFTP_IAP_Status_Error_Block 0x03 //发布块错误
+#define TFTP_IAP_Status_Error_File 0x04 //发布文件错误
+#define TFTP_IAP_Status_Error_Md5 0x05 //发布MD5值错误
+
typedef enum {
TFTP_RRQ = 1,
@@ -97,6 +104,7 @@ typedef struct
uint32_t last_time;
}tftp_connection_args;
+extern IAPVarTypeStruct IAPVarTypeStruct_Ptr;
void Internal_TFTP_Task(void);
diff --git a/Readme.md b/Readme.md
index 58949f1..96e5761 100644
--- a/Readme.md
+++ b/Readme.md
@@ -1,3 +1,19 @@
+#### 2025-12-25
+
+鈥 1銆乀FTP鍗囩骇 - 閰嶇疆鏂囦欢鍒濇娴嬭瘯娌¢棶棰
+
+鈥 2銆侀厤缃枃浠跺唴瀹硅В鏋愮Щ妞嶅畬姣曪紝璋冭瘯涓
+
+鈥 3銆乀FTP鍗囩骇 - 鏄惁涓涓鎺ュ瓧鎼炲畾锛屼笉闇瑕佷娇鐢ㄤ袱涓鎺ュ瓧
+
+
+
+#### 2025-12-10
+
+鈥 1銆乀FTP IAP鍗囩骇鍔熻兘绉绘瀹屾瘯锛屽緟娴嬭瘯
+
+鈥 2銆佷紭鍖栦唬鐮佺紪璇戠殑绌洪棿闂锛岀洰鍓嶉浂绛夊緟鍖虹殑绌洪棿宸叉弧锛岄渶灏嗛櫎浜嗗簱鍑芥暟浠ュ鐨勪唬鐮佸強鐩稿叧鍙橀噺鍏ㄩ儴鏀剧疆闈為浂绛夊緟鍖轰腑锛屽惁鍒欓」鐩紪璇戜笉鎴愬姛
+
#### 2025-12-06
1. 鍔ㄤ綔鎵ц鍑芥暟鍒濇瀹炵幇瀹屾瘯 - 寰呮祴璇
diff --git a/User/includes.h b/User/includes.h
index 6066622..3530c12 100644
--- a/User/includes.h
+++ b/User/includes.h
@@ -49,6 +49,8 @@
#include "blv_nor_dec_virtualcard.h"
#include "blv_nor_dev_hvoutfun.h"
#include "blv_nor_dev_lvinput.h"
+#include "blv_nor_dev_serviceinfo.h"
+#include "blv_rs485_dev_energymonitor.h"
#include "blv_rs485_dev_switchctrl.h"
#include "blv_rs485_dev_tempctrl.h"
diff --git a/User/main.c b/User/main.c
index 698bee0..a6cd346 100644
--- a/User/main.c
+++ b/User/main.c
@@ -46,6 +46,8 @@ int main(void)
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"MCU Start!! 2025-11-03-10:42\r\n");
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"SystemClk:%d\r\n", SystemCoreClock);
+ BLV_DevAction_AllData_Init();
+
while (1)
{
SYS_LED_Task();
@@ -58,7 +60,7 @@ int main(void)
if(SysTick_1ms - test_tick >= 10000){
test_tick = SysTick_1ms;
- Dbg_Println(DBG_BIT_SYS_STATUS_bit,"RUN PYH:%x...\r\n",ETH_ReadPHYRegister(PHY_ADDRESS, PHY_BSR));
+ //Dbg_Println(DBG_BIT_SYS_STATUS_bit,"RUN PYH:%x...\r\n",ETH_ReadPHYRegister(PHY_ADDRESS, PHY_BSR));
}