针对网关后台通信的概念理解

网关程序流程
1.通信模块:网关与后台通信采用的是RM-10模块wifi传输数据,STM32单片机用串口与RM-10连接,串口给模块发送数据,模块无线连接路由器,连至后台。网关与各个节 点连接通过的是HC-12无线模块,STM32单片机用串口与HC-12连接,串口给模块发送数据,通过无线传输。其中串口2进行用于跟RM10通讯,即后台与网关RM10进行通讯;串口3进行用于跟HC-12通讯,即网关与节点之间进行通讯。
2.协议内容:
合成节点消息头
void Make_Node_Header(u32 GW_ID,u16 Length,u8 Command,u16 Sequence)
合成广播给节点的数据包
void Make_Measuring_average()
合成网关消息头
void Make_GW_Header(u32 GW_ID,u16 Length,u8 Command,u16 Sequence)4
合成网关消息脖子
void Make_GW_Neck(u8 Result,u8 GWSTA,u16 Nodecount)
合成CRC校验组
void Make_CRC_data(u8 command)
3.数据传输的打包与解包:后台到网关,网关到节点,数据包大致相同。分为消息头+消息体。
打包具有一定的格式:合成消息头、消息体、CRC校验数组
示例:网关初始化
void Writer_Back_data(u8 command)
{
u8 count;
switch (command)
{ case gw_Command_init: (打包)
Make_GW_Header(Message_Header_data.GWID,
(GW_Header_len+CRC_len),
gw_Command_init,
Message_Header_data.Sequence_Id);
Make_CRC_data(command);
(发包)
usart2_sendstring(B2G_GWsta_send_msghead,GW_Header_len);
usart2_sendstring(CRC_Out,CRC_len);
解包代码:
接受中断
void USART2_IRQHandler(void)
{
if(USART2->SR&(1<<5))
{
COM_RM10_data[COM_RM10_data_cp] = USART2->DR;
if(++COM_RM10_data_cp>=U2bufsize)
{
COM_RM10_data_cp=0;
}
}
}
解包:
解析消息头
u8 receive_check_Header(u8 temp)
解析消息体前四个 (Neck部分)
u8 receive_check_Neck(u8 temp)
解析消息体 (节点配置)
u8 receive_check_Memory_Body(u8 temp,u16 len)
3.进行CRC校验
u8 CRC_Rcecive_Check(u8 data,u16 len)
{
u32 CRC_Out;
u32 CRC_Out_Receive;
static u8 CRC_Check[800];
static u16 count=0;

CRC_Check[count++]=data;

if(count==len)
 {
	 count=0;
	 
 CRC_Out=CRC32_ForBytes(CRC_Check,len-4);
 CRC_Out_Receive=(((CRC_Check[len-4]*256)+CRC_Check[len-3])*256+CRC_Check[len-2])*256+CRC_Check[len-1];
 
	 if(CRC_Out==CRC_Out_Receive)
	  {
			 memset(CRC_Check,0,800);
     return 1; 
  }			

}

 if(read_COM_RM10_data_cp==(Temporary_First_read_COM_RM10_data_cp+Message_Header_data.Total_Length))
  {
   count=0;
		 memset(CRC_Check,0,800);
}
 return NULL;

}
CRC校验:CRC校验是一种数据算法,是用来校验数据对错的。CRC校验函数把一帧数据除最后两个字节外,前边所有的字节进行特定的算法计算,计算完后生成了一个16bit的数据,作为CRC校验码,添加在一帧数据的最后。接收方接收到数据后,同样会把前边的字节进行CRC计算,计算完了再和发过来的CRC的16bit的数据进行比较,如果相同则认为数据正常,没有出错,如果比较不相同,则说明数据在传输中发生了错误,这帧数据将被丢弃,就像没收到一样,而发送方会在得不到回应后做相应的处理错误处理。

你可能感兴趣的:(针对网关后台通信的概念理解)