请教UIP协议栈在TCP为什么wifi连接上却不能上网断开的问题

uip中文说明详细讲述了uip协议的使用还有些应用里程,希望对大家有帮助

}

uIP协议栈往掉了完整的TCP/IP中不常用的功能简化了通讯流程,但保存了网络通讯必须使用的协议设计重点放在了IP/TCP/ICMP/UDP/ARP这些网络层和传输层协议上,保证了其代码的通用性和结构嘚稳定性

由于uIP协议栈专门为嵌进式系统而设计,因此还具有如下优越功能:

(3)    其硬件处理层、协议栈层和应用层共用一个全局缓存区不存在数据的拷贝,且发送和接收都是依靠这个缓存区极大的节省空间和时间。

(5)    其源代码中提供一套实例程序:web服务器web客户端,电子邮件发送程序(SMTP客户端)Telnet服务器, DNS主机名解析程序等通用性强,移植起来基本不用修改就可以通过

(6)    对数据的处理采用轮循机淛,不需要操纵系统的支持

由于uIP对资源的需求少和移植轻易,大部分的8位微控制器都使用过uIP协议栈, 而且很多的著名的嵌进式产品和项目(洳卫星Cisco路由器,无线传感器网络)中都在使用uIP协议栈

uIP相当于一个代码库,通过一系列的函数实现与底层硬件和高层应用程序的通讯对於整个系统来说它内部的协议组是透明的,从而增加了协议的通用性uIP协议栈与系统底层和高层应用之间的关系如图2-1所示。

uip_init()是系统初始囮时调用的主要初始化协议栈的侦听端口和默认所有为什么wifi连接上却不能上网是封闭的。

当网卡驱动收到一个输进包时将放进全局缓沖区uip_buf中,包的大小由全局变量uip_len约束同时将调用uip_input()函数,这个函数将会根据包首部的协议处理这个包和需要时调用应用程序当uip_input()返回时,一個输出包同样放在全局缓冲区uip_buf里大小赋给uip_len。假如uip_len是0则说明没有包要发送。否则调用底层系统的发包函数将包发送到网络上

uIP周期计时昰用于驱动所有的uIP内部时钟事件。当周期计时激发每一个TCP为什么wifi连接上却不能上网都会调用uIP函数uip_periodic()。类似于uip_input()函数uip_periodic()函数返回时,输出的IP包偠放到uip_buf中供底层系统查询uip_len的大小发送。

由于使用TCP/IP的应用场景很多因此应用程序作为单独的模块由用户实现。uIP协议栈提供一系列接口函數供用户程序调用其中大部分函数是作为C的宏命令实现的,主要是为了速度、代码大小、效率和堆栈的使用用户需要将应用层进口程序作为接口提供给uIP协议栈,并将这个函数定义为宏UIP_APPCALL()这样,uIP在接受到底层传来的数据包后在需要送到上层应用程序处理的地方,调用UIP_APPCALL( )茬不用修改协议栈的情况下可以适配不同的应用程序。

1.为此项目建立一个keil C工程建立src目录存放源文件。

3.仿照uip-1.0\unix\tapdev.c写网卡驱动程序与具体硬件相关。这一步比较费点时间不过好在大部分网卡芯片的驱动程序都有代码鉴戒或移植。驱动需要提供三个函数以RTL9019AS驱动为例。

etherdev_init():网卡初始化函数初始化网卡的工作模式。

所以收包和发包主要是操纵uip_buf和uip_len。具体驱动分析可参考《第三章  网络芯片的驱动》

4.由于uIP協议栈需要使用时钟,为TCP和ARP的定时器服务因此使用单片机的定时器0用作时钟,每20ms让计数TIck_cnt加1这样,25次计数(0.5S)满了后可以调用TCP的定时处悝程序10S后可以调用ARP老化程序。对uIP1.0版本增加了timer.c/timer.h,专门用来治理时钟都放到src下。

6.uipopt.h/uip-cONf.h是配置文件用来设置本地的IP地址、网关地址、MAC地址、全局缓冲区的大小、支持的最大为什么wifi连接上却不能上网数、侦听数、ARP表大小等。需要放在src下并且根据需要配置。在V1.00版本中对配置做叻如下修改:

(1)配置IP地址默认先关IP,在初始化中再设定

(3)使能ping功能

(4)封闭主动请求为什么wifi连接上却不能上网的功能

(6)由于单爿机是大端结构,因此宏定义需要修改

(7)暂时不移植打印信息先封闭

(8)定义数据结构类型

7. 假如使用keil C的小模式编译,需要在大部分嘚RAM的变量前增加xdata

8.data为keil C的关键词,代码中所有出现data的地方(主要是参数、局部变量、结构体成员)改为pucdata或ucdata

9.解决编译过程中的错误。uIP协議栈为C语言编写编译过程中的题目比较少,并且轻易解决 

uIP协议栈提供的主要接口

提供的接口在uip.h中,为了减少函数调用造成的额外支出大部分接口函数以宏命令实现的。

}

  【IT168评论】在物联网设备中TCP/IP網络协议栈是一个非常重要的软件组成部分,没有TCP/IP网络协议栈物联网设备就无法为什么wifi连接上却不能上网到互联网中。TCP/IP网络协议协议本身比较复杂物联网出现之前的TCP/IP实现代码量都非常的庞大。但对于物联网设备来说内存非常有限,处理器的性能也非常有限这就需要┅个轻量级的TCP/IP网络协议栈来运行,使用非常小的内存把一些不必要的功能舍弃掉,保留主要的功能由于这些需求,产生了几种嵌入式嘚TCP/IP的协议栈常见的有以下几种:μC/

  常见的嵌入式TCP/IP协议栈

  μC/ TCP-IP是Micrium公司自己的操作系统UC/OS的一个组件,同时支持IPv4和IPv6支持BSD套接字API,具有朂流行的套接字选项这个协议栈是紧凑,可靠高性能的TCP / IP协议栈,针对嵌入式系统进行了优化μC/ TCP-IP完全自主编码,具有高质量可扩展性和可靠性,可快速配置所需的网络选项从而最大限度地缩短产品上市时间,MicriumμC/ TCP-IP嵌入式协议栈允许根据设计要求调整内存占用μC/ TCP-IP可以配置为仅包括系统所需的那些网络组件。未使用组件时它可以不包含在协议栈中,从而节省宝贵的内存空间

  2. LwIp网络协议栈:

  LwIP是甴瑞典科学研究院的Adam Dunkels开发的一套小型的TCP / IP协议组件,实现的主要目标是减少资源使用同时仍然具有全面的TCP功能。这使得lwIP适用于具有10Kb字节空閑RAM的嵌入式系统并且可以容纳大约40Kb的代码ROM。从开始发展到现在LwIP被移植到多个嵌入式操作系统包括流行的FreeRTOS,还有阿里云的物联网操作系統AliOS Things华为的物联网操作系统LiteOS等等。

  3. uIP网络协议栈:

  uIP主要用于8位和16位微控制器的小型嵌入式网络协议栈最初,uIP 网络协议栈由瑞典计算机科学院的Adam Dunkels 开发其源代码由C 语言编写,并完全开源uIP协议栈最大的优势就是短小精悍,Flash和RAM需求小去掉了完整的TCP/IP 中不常用的功能,简囮了通讯流程但保留了网络通信必须使用的协议,重点放在了IP/TCP/ICMP/UDP/ARP 这些网络层和传输层协议上保证了其代码的通用性和结构的稳定性。

  LwIP协议栈功能

  ●IP协议(Internet协议支持IPv4和IPv6),并且支持多个网络接口的数据包转发

  ●支持ICMP(Internet控制消息协议),用于网络维护和调试

  ●支持IGMP(因特网组管理协议),用于多播流量管理的

  ●支持 MLD(IPv6的多播侦听器发现)。参考RFC 2710标准但不支持MLDv2。

  ●支持IPv6的邻居发现协议(ND)和无状態地址自动配置参考标准RFC4861(邻居发现)和RFC 4862(地址自动配置)。

  ●支持UDP(用户数据报协议)包括最新的UDP-lite扩展协议(差错不敏感UDP)

  ●支持包括拥塞控制,RTT估算和快速恢复和快速转发的TCP协议

  ●提供性能较高的原始API,当用户需要较高性能时候使用这个接口

  ●PPPoS和PPPoE(串口/以太网上嘚点对点协议)。

  ●支持DNS(域名解析器)包括mDNS(组播DNS)。

  从这部分看LwIP支持的功能是非常多的,除了传统的TCPIP还支持了很多最新的协议(如mDNS,UDP-lite6LoWPAN等)

  从上图看到,IwIP按照TCP/IP的分层分为4层分别是链路层,网络层传输层和应用层。

  协议栈的数据处理流程主要有以下三种:

  ●每个层是一个独立的进程链路层是一个进程,IP层也是一个进程传输层是一个进程,这样设计的好处是每一层都非常清楚代码容噫理解,调试也较方便但这种处理的方法的缺点是当层和层之间传递数据的时候,需要进行上下文的切换和内存拷贝对于操作系统来說,进程之间的切换和内存拷贝都需要耗费时间当出现大量的报文进行传输的时候,会导致频繁的切换和内存拷贝从而转发的效率较低。

  ●TCP IP协议栈在操作系统的内核当中应用程序通过系统调用来和协议栈进行通讯,这种方式必须实现各个功能的系统调用相对也仳较复杂。

  ●所有的TCP/IP协议的处理都在一个进程之中每一层之间没有明显的界限,各层都可以访问共享的内存空间因为各层都可以訪问共享内存,就避免了每层之间的内存拷贝带来的性能损失lwIP协议就是这种实现,为的就是提高传输速度和资源利用率

  数据包的收发需要基于邮箱和信号量的支持,如果基于操作系统这些机制操作系统都可以提供,移植起来只需要把基于邮箱和信号的函数加以封裝即可如果是没有操作系统的裸机移植则需要使用中断或者轮询方式实现收发数据,工作量相对要比没有操作系统要大

  LwIP协议栈主目录

  我们用最新的2.1 版本为例,LwIP的文件夹主要有三个doc,src和test三个目录

  Doc是存储的帮助文档,和之前的1.4版本的帮助文档的文本文件不哃它使用了doxygen工具根据源代码的注释生成HTML格式的帮助文档。src是LwIP的主要源代码目录test目录是测试脚本和一些测试协议栈的程序。

  LwIP协议栈嘚src目录

  src目录是协议栈的源码目录包括api、 core、include、netif四个文件夹,其中core是协议栈的核心include是头文件目录,netif提供了网络接口层的驱动代码api目錄提供了socket、tcp、内存管理的API接口。

  LwIp的源码源文件多达几百个我们去读源码的时候不能一下子全部读完,我们在读源码时候需要有所重點的去读才能快速的把握LwIp的精髓。

  core目录则是协议栈的核心其中tcp.c ip.c,udp.c 则是整个tcp/ip协议栈的核心实现,ip层还分为ipv4和ipv6两个目录里面有ipv4 ipv6层的的具体实现。mem.c 和memp.c是内存管理的核心实现

  netif目录是接口部分,最新的2.0版本和原来的1.4版本对以太网部分做了较大改动ethernetif.c是以太网驱动文件,需要根据具体硬件来进行移植ethernetif.c文件在1.4版本的是在本目录下,2.0版本则放到用户的目录下本目录还有其他的接口文件如ppp协议的等。ethernet.c是对以呔网报文的抽象出入口函数接口

  无操作系统移植和初始化

  把LwIp移植到具体的网卡上和操作系统上需要一定的工作量,移植LwIp分操作系统移植和非操作系统移植操作系统移植较为繁琐,我们先讨论非操作系统移植

  非操作系统移植主要是需要移植ethernetif.c文件。网卡的初始化要放在low_level_init函数内执行low_level_init函数是配置MAC地址,物理网卡的初始化函数调用流程如下

  low_level_init设置好物理网卡芯片的参数(mac地址,phy型号mac接口类型,接收模式自协商等等),把这些参数写入到网卡芯片的寄存器中

  物理网卡芯片初始化

  物理芯片设置好了后就可以接收和发送數据了,但接收和发送数据函数需要由LwIp的函数来进行封装否则无法被LwIp处理。

  无操作系统和有操作系统的数据接收方式有所不同无操作系统的接收入口函数是ethernetif_input,把网卡接收到数据送到LwIp协议栈

  在low_level_output函数内要实现自己的网卡发送功能

}

我要回帖

更多关于 为什么wifi连接上却不能上网 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信