標(biāo)題:
stm32+W5500 TCP Server自動發(fā)送keep-alive源碼
[打印本頁]
作者:
007沙漠之狐
時間:
2018-10-28 18:36
標(biāo)題:
stm32+W5500 TCP Server自動發(fā)送keep-alive源碼
Keepalive即心跳檢測,以下簡稱KA,之所以稱之為心跳檢測是因為它像心跳一樣每隔一段時間發(fā)一次,以此來告訴對方自己是否存活。心跳檢測用于TCP通訊過程中服務(wù)器檢測客戶端是處于長時間空閑(在線)還是已經(jīng)斷開,一般采用客戶端定時發(fā)送簡單的通訊包,一般是很小的包或者空包給服務(wù)器(W5200的心跳包為1字節(jié)),如果在指定時間內(nèi)沒有收到該心跳包,則服務(wù)器會判斷客戶端已經(jīng)斷開,此時程序中的Socket狀態(tài)機會轉(zhuǎn)到SOCKET_CLOSED并重新打開Socket去連接服務(wù)器/監(jiān)聽客戶端。
單片機源程序如下:
#include "mcu_init.h"
#include "config.h"
#include "device.h"
#include "spi2.h"
#include "socket.h"
#include "w5500.h"
#include "at24c16.h"
#include "util.h"
#include <stdio.h>
extern uint8 txsize[];
extern uint8 rxsize[];
uint8 buffer[2048];/*定義一個2KB的緩存*/
void main()
{
uint16 port=30000;/*定義一個端口并初始化*/
uint16 len=0;
uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11};/*定義Mac變量*/
uint8 lip[4]={192,168,11,114};/*定義lp變量*/
uint8 sub[4]={255,255,255,0};/*定義subnet變量*/
uint8 gw[4]={192,168,11,1};/*定義gateway變量*/
uint8 ip[4];
RCC_Configuration(); /* 配置單片機系統(tǒng)時鐘*/
GPIO_Configuration();/* 配置GPIO*/
NVIC_Configuration();/* 配置嵌套中斷向量*/
Systick_Init(72);/* 初始化Systick工作時鐘*/
USART1_Init(); /*初始化串口通信:115200@8-n-1*/
at24c16_init();/*初始化eeprom*/
printf("W5500 EVB initialization over.\r\n");
Reset_W5500();/*硬重啟W5500*/
WIZ_SPI_Init();/*初始化SPI接口*/
printf("W5500 initialized!\r\n");
setSHAR(mac);/*配置Mac地址*/
setSUBR(sub);/*配置子網(wǎng)掩碼*/
setGAR(gw);/*配置默認網(wǎng)關(guān)*/
setSIPR(lip);/*配置Ip地址*/
//Init. TX & RX Memory size of w5500
sysinit(txsize, rxsize); /*初始化8個socket*/
setRTR(2000);/*設(shè)置溢出時間值*/
setRCR(3);/*設(shè)置最大重新發(fā)送次數(shù)*/
getSIPR (ip);
printf("IP : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
getSUBR(ip);
printf("SN : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
getGAR(ip);
printf("GW : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
printf("Network is ready.\r\n");
setkeepalive(0);
while(1)
{
switch(getSn_SR(0))/*獲取socket0的狀態(tài)*/
{
case SOCK_INIT:/*socket初始化完成*/
listen(0);/*在TCP模式下向服務(wù)器發(fā)送連接請求*/
break;
case SOCK_ESTABLISHED:/*socket連接建立*/
if(getSn_IR(0) & Sn_IR_CON)
{
setSn_IR(0, Sn_IR_CON);/*Sn_IR的第0位置1*/
}
len=getSn_RX_RSR(0);/*len為已接收數(shù)據(jù)的大小*/
if(len>0)
{
recv(0,buffer,len);/*W5200接收來自Sever的數(shù)據(jù)*/
send(0,buffer,len);/*W5200向Server發(fā)送數(shù)據(jù)*/
}
printf("建立連接狀態(tài).\r\n");
// send_ka(0);
break;
case SOCK_CLOSE_WAIT:/*socket等待關(guān)閉狀態(tài)*/
break;
case SOCK_CLOSED:/*socket關(guān)閉*/
printf("closed 狀態(tài).\r\n");
socket(0,Sn_MR_TCP,port,Sn_MR_ND);/*打開socket0的一個端口*/
break;
}
}
}
復(fù)制代碼
所有資料51hei提供下載:
W5500 TCP Server自動發(fā)送keep-alive.rar
(3.74 MB, 下載次數(shù): 129)
2018-10-31 16:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1