#include "proto_HSMS.h" #include "string.h" #include "stdio.h" #include "bsp_print.h" #include "bsp_W5500.h" #include "proto_SECS2.h" static void proto_HSMS_Init(void); static void proto_W5500_DataAnalysis(bsp_W5500_Class_t *pW5500_Class,u8 *pData,u16 Len); static void proto_HSMS_Rx_DataAnalysis(u8 *pData,u16 Len); static void proto_HSMS_Tx_Rsq(proto_HSMS_Header_Data_t *pHeader_Data,u8 *Tx_Data,u16 Tx_Data_Len,void *OtherData); u8 proto_HSMS_Tx_Buffer[1024]; proto_HSMS_t HSMS = { .Init = proto_HSMS_Init, .Tx_RsqData = proto_HSMS_Tx_Rsq, }; proto_HSMS_t *pHSMS = &HSMS; static void proto_HSMS_Init(void) { W5500.W5500_Class[0].Rx_DataAnalysis = proto_W5500_DataAnalysis; } static void proto_HSMS_Send(u8 *pData,u16 Len) { Debug_UartSend(pData, Len); W5500.Socket_Send(&W5500.W5500_Class[0],pData,Len); } static void proto_W5500_DataAnalysis(bsp_W5500_Class_t *pW5500_Class,u8 *pData,u16 Len) { proto_HSMS_Rx_DataAnalysis(pData,Len); } /*响应请求*/ static void proto_HSMS_Tx_Rsq(proto_HSMS_Header_Data_t *pHeader_Data,u8 *Tx_Data,u16 Tx_Data_Len,void *OtherData) { u8 *Tx = proto_HSMS_Tx_Buffer; u16 Len; pHeader_Data->Data_Len = 10 + Tx_Data_Len; u32TOu8(pHeader_Data->Data_Len,Tx,PROTO_HSMS_ENDIAN); u16TOu8(pHeader_Data->Device_Id,&Tx[4],PROTO_HSMS_ENDIAN); Tx[6] = pHeader_Data->Header_Byte2.ALL_Data; Tx[7] = pHeader_Data->Header_Byte3; Tx[8] = pHeader_Data->PType; Tx[9] = pHeader_Data->SType; u32TOu8(pHeader_Data->Sys_Byte,&Tx[10],PROTO_HSMS_ENDIAN); Len = 14; if(NULL != Tx_Data && 0 != Tx_Data_Len) { memcpy(&Tx[Len],Tx_Data,Tx_Data_Len); Len += Tx_Data_Len; } proto_HSMS_Send(Tx,Len); Debug_UartSend(Tx,Len); } void proto_HSMS_Header_DataAnalysis(proto_HSMS_Header_Data_t *pHeader_Data,u8 *pData) { /*拷贝数据进行解析*/ pHeader_Data->Data_Len = u8TOu32(&pData[0],PROTO_HSMS_ENDIAN); pHeader_Data->Device_Id = u8TOu16(&pData[4],PROTO_HSMS_ENDIAN); pHeader_Data->Header_Byte2.ALL_Data = pData[6]; pHeader_Data->Header_Byte3 = pData[7]; pHeader_Data->PType = pData[8]; pHeader_Data->SType = pData[9]; pHeader_Data->Sys_Byte = u8TOu32(&pData[10],PROTO_HSMS_ENDIAN); } void proto_HSMS_Rx_DataAnalysis(u8 *pData,u16 Len) { if(Len < 14)/*不满足最低长度*/ return ; proto_HSMS_Header_DataAnalysis(&pHSMS->Rx_Header_Data,pData); /*长度判断*/ if((pHSMS->Rx_Header_Data.Data_Len + 4) != Len) { return ; } /*不是SECS2编码格式*/ if(proto_HSMS_PTYPE_SECS2 != pHSMS->Rx_Header_Data.PType) { return ; } switch(pHSMS->Rx_Header_Data.SType) { /*数据消息*/ case PROTO_HSMS_STYPE_Data_Message : { /*匹配设备ID*/ if(pHSMS->Flash_ConfigData.Device_Id != pHSMS->Rx_Header_Data.Device_Id) { return; } memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t)); /*去除HSMS头部数据*/ SECS2.Rx_DataAnalysis(&pHSMS->Tx_Header_Data,&pData[14],Len-14); }break; /*选择请求*/ case PROTO_HSMS_STYPE_Select_Req : { memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t)); pHSMS->Tx_Header_Data.SType = PROTO_HSMS_STYPE_Select_Rsq; proto_HSMS_Tx_Rsq(&pHSMS->Tx_Header_Data,NULL,0,NULL); }break; /*选择响应*/ case PROTO_HSMS_STYPE_Select_Rsq : { }break; /*取消选择请求*/ case PROTO_HSMS_STYPE_Deselect_Req : { memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t)); pHSMS->Tx_Header_Data.SType = PROTO_HSMS_STYPE_Deselect_Rsq; proto_HSMS_Tx_Rsq(&pHSMS->Tx_Header_Data,NULL,0,NULL); }break; /*取消选择响应*/ case PROTO_HSMS_STYPE_Deselect_Rsq : { }break; /*连接测试请求*/ case PROTO_HSMS_STYPE_Linktest_Req : { memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t)); pHSMS->Tx_Header_Data.SType = PROTO_HSMS_STYPE_Linktest_Rsp; proto_HSMS_Tx_Rsq(&pHSMS->Tx_Header_Data,NULL,0,NULL); }break; /*连接测试响应*/ case PROTO_HSMS_STYPE_Linktest_Rsp : { }break; /*拒绝请求*/ case PROTO_HSMS_STYPE_Reject_Req : { }break; /*断开请求*/ case PROTO_HSMS_STYPE_Separate_Req : { }break; default: break; } }