怎样解决W5200W5500在TCP通信过程中意外断开

怎样解决W5200W5500在TCP通信过程中意外断开,第1张

使用W5200和W5500的TCP通信过程中,有一个非常容易被问到的问题:

(这里以W5200为例)

W5200作为服务器,假如客户端的网线断开 或 瞬间停电,服务器该怎样判断?

那么当客户端由于这些原因忽然断开,该怎样解决?

今天给大家介绍解决以上问题的办法,即如何使用Keepalive。

什么是Keepalive?

Keepalive即心跳检测,以下简称KA,之所以称之为心跳检测是因为它像心跳一样每隔一段时间发一次,以此来告诉对方自己是否存活。心跳检测用于TCP通讯过程中服务器检测客户端是处于长时间空闲(在线)还是已经断开,一般采用客户端定时发送简单的通讯包,一般是很小的包或者空包给服务器(W5200的心跳包为1字节),如果在指定时间内没有收到该心跳包,则服务器会判断客户端已经断开,此时程序中的Socket状态机会转到SOCKET_CLOSED并重新打开Socket去连接服务器/监听客户端。

KeepAlive怎么分类?

KA根据发出方不同可以分为两种,一种是由客户端发给服务器的心跳包,一种是服务器发给客户端的心跳包,选择哪一种方式需要看哪一方实现起来方便合理。需要注意的是,W5200根据合理的设计,其心跳包需要在Socket TCP连接建立之后,服务器和客户端至少进行一次数据交互,且在设定的时间内没有数据交互时发出。

W5200 KA程序说明

下面我以W5200的TCP Server官方例程为例,用PC建立TCP客户端来连接W5200,说明KA的实现方法。

定义和初始化部分:

程序中用到了定时器和中断函数,在w5200_config.c中做了定义:

void Timer_Configuration(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE)

TIM_TimeBaseStructure.TIM_Period = 1000

TIM_TimeBaseStructure.TIM_Prescaler = 0

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up

TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure)

TIM_PrescalerConfig(TIM2, 71, TIM_PSCReloadMode_Immediate)

TIM_Cmd(TIM2, ENABLE)

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE)

void Timer2_ISR(void)

{

ms++// 等待时间自增,单位为ms

if((ms % 1000)==0) // 当等待时间增加到某一秒

{

if(ka_tick_flag==1)ka_no_data_tick++// 若KA定时器标志位为1,无数据传输时间计时器自增

if(ka_no_data_tick>=NO_DATA_PERIOD)

{

ka_send_tick++ // 当无数据传输时间计时器值大于NO_DATA_PERIOD,KA发送定时器开始自增

if(ka_send_tick>=KA_SEND_PERIOD)

{

ka_sen d_flag=1 // 当KA发送定时器的大于KA_SEND_PERIOD,KA发送标志位置1,发送一个KA包

}

}

printf(".") // 当时间没到整秒,发一个“.”

}

}

在主程序中进行初始化:

Timer_Configuration() // 定时器初始化

NVIC_Configuration() // 中断函数初始化

程序中定义了ka_tick_flag(KA定时器开始计时标志位)、ka_send_flag(KA发送标志位)、ka_no_data_tick(KA无数据传输时间计时器)以及ka_send_tick(KA发送定时器)。在w5200_config.c中对以上定义进行了初始化:

uint32 ka_no_data_tick=0 // 定义无数据传输时间计时器

uint8 ka_tick_flag=0 // 定义KA定时器开始计时标志位

uint32 ka_send_tick=0 // 定义KA发送定时器

uint8 ka_send_flag=0// 定义KA发送标志位

主循环部分:

当程序烧录后,按Reset键重启W5200后服务器打开一个Socket,此时Socket由SOCK_CLOSED变为SOCK_INIT并处于监听状态。PC建立客户端成功连接W5200后,Socket处于SOCK_ESTABLISHED,下面是程序具体的 *** 作过程:

case SOCK_ESTABLISHED: // Socket处于连接建立状态

if(getSn_IR(0) Sn_IR_CON)

{

setSn_IR(0, Sn_IR_CON) // Sn_IR的第0位置1

ka_tick_flag=0 // KA定时器开始计时标志位清零

ka_no_data_tick=0 // 无数据传输时间计时器

ka_send_flag=0 // KA发送标志位清零

ka_send_tick=0 // KA发送定时器清零

}

if ((len = getSn_RX_RSR(0)) >0)

{

len = recv(0, RX_BUF, len) // W5200收到数据并保存到len

send(0,RX_BUF,len,(bool)0)// W5200将收到的数据发回客户端

if(ka_tick_flag==0)

{

ka_tick_flag=1// W5200同客户端进行了一次通信后,将KA定时器开始计时标志位置1,进入定时器中断函数,只要接下来在NO_DATA_PERIOD内没有数据通信,就开始发KA包

}

ka_no_data_tick=0 // 无数据传输时间计时器清零

ka_send_tick=0 // KA发送定时器清零

}

// KA发送过程

if(ka_send_flag)

{

ka_send_flag=0 // KA发送标志位清零

ka_send_tick=0 // KA发送定时器清零

send_keepalive(0)// W5200发KA包给客户端

printf("*") // KA以”*”为标志在串口打印出来

}

break

让单片机嵌入HTTP(超级文本传输协议)客户端是一个很好的添加功能,HTTP客户端可以让嵌入式设备从HTTP服务器获取数据。今天给大家介绍的W5200E01-M3评估板是基于WIZnet W5200,可以作为HTTP客户端使用,能够集成到STM32 Cortex M3单片机产品的几乎所有应用中。具体内容如下:

1 简介

嵌入式HTTP(超级文本传输协议)客户端对所有支持网络功能的设备来说是一个很好的添加功能。HTTP客户端可以让嵌入式设备从HTTP服务器获取数据。

该WIZnet W5200 HTTP客户端应用笔记中所介绍的并使用的W5200E01-M3评估板,可以在STM32 Cortex M3系列单片机几乎所有的应用中使用。

IAR 5.41用来编译该HTTP客户端应用程序。W5200E01-M3板子用来运行该HTTP客户端应用。

该文档中提到的所有的代码和文件可以从下面的链接下载 www.wiznet.co.kr/w5200/download。

1.1 假设

假设读者对WIZnet W5200驱动是熟悉的。当然读者也需要熟悉C语言编程和HTTP客户端的概念。上述这些技术的术语将在这篇文章中用到,并且只提供简短的概述。鼓励一些高级用户去阅读相关的规范。

1.2 特点

该HTTP客户端不具有完整的HTTP客户端功能;本文的HTTP客户端是针对嵌入式系统的小型客户端。

这里提供的HTTP客户端具有以下特点:

• 可移植到STM32 Cortex M3系列32位单片机平台

• 支持内容解析

• 支持串口打印信息

具体方法如下:

1. 路由器线路连接手机连接路由器信号手机设置路由器上网:检查设置是否成功

2.第一步路由器线路连接:华为W55200路由器上有5个网线接口,1个WAN口, 4个LANQ(LAN1、 LAN2、LAN3. LAN4), 请按照下面的方式,进行正确的线路连接。

3.准备根网线, 一头插在路由器的WAN口, 另头播在猫的LAN口(网口)。 如果宽带没有用到猫,则需要把入户的宽带网线,插在路由器的WAN口.

4.如果家里面有电脑,需要再准备根网线,一头连接到电脑的网口, 另一头连接到LAN2. LAN2.LAN3. LAN4中任意个接口。

5.第二步手机连接路由器信号:手机设置路由器上网时,最重要的一个步骤是: 手机需要连接到待设置路分手了怎么由器的无线Wi-F)信号。

6.新买的,恢复出厂设置后的华为W5200路由器,在接通电源后,会发射一一个默认的W-F信号:此本文明时, 让手机,连接到这个默认的Wi Fi信号即可

7.第三步手机设置路由器上网:当手机连4接华5为52009W-F信号后,系统会自动启动浏览器,并在浏览器中打开设置页面一>此时,只需要点击页面中的:马上体验就可以了.如果系统没有自动打开设置页面, 这时候需要在浏览器中输入: 192.168.3.1手动打开设置页面,然后点击页面中的马上体验。

8.接着,路由器会自动检测上网方式,请根据检测的结果,来设置上网参数。

9.第四步检查设置是否成功测试路由器设置是否成功最简单的一个办法是, 当手机连接W.F信号后,在手机上登录QQ.微信等软件,看是否可以正常登录。或者在手机浏览器中,打开任意个网页,看能否打开.如果可以登录QQ.微信等软件,或者可以正常浏览网页,很明显路由器设置成功。如果不能登录QQ.微信等软件,或者无法浏览网页,这就说明路由器设置有问题,现在不能上网。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7782206.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存