1.使用 Contiki 快速构建 IoT 设备
2.Light weight IP(LWIP)轻量化的源码 TCP/IP 协议
3.正点原子lwIP学习笔记——ICMP协议
4.正点原子lwIP学习笔记——网络数据包管理
5.嵌入式网络那些事内容简介
6.LWIP分析(三)——启动流程
使用 Contiki 快速构建 IoT 设备
Contiki操作系统,从其诞生至今,下载已经成为了物联网(IoT)开发领域中不可或缺的源码一部分。始于年,下载其源头可追溯到梅拉达伦大学计算机科学学生Dunkels的源码毕业项目,旨在使用无线传感器追踪曲棍球运动员的下载飙升股票公式源码关键信号。在为项目实现中,源码他不得不编写了用于与计算机网络交互的下载代码,即后来的源码LwIp(轻量级互联网协议),尽管LwIp今天在许多微控制器和其他产品中仍有应用,下载但Dunkels认为它仍不够轻量。源码因此,下载他创建了microIP,源码最终演化成了Contiki操作系统。下载
Contiki的源码诞生和发展引起了研究人员和爱好者的广泛关注,并在近几年吸引了商业用户,如Rad-DX的发射物检测设备和Zolertia的噪音监测系统。为了支持Contiki在商业应用中的快速成长,Dunkels离开了瑞典计算机科学院的教授职位,创立了Thingsquare公司,致力于为Contiki设备提供基于云的后端服务,简化了开发者将硬件设备与智能手机、网络连接在一起的过程。
Contiki的开发体验被设计得非常友好。官方提供了包含所有工具和源码的Ubuntu镜像,用户可以通过虚拟机的方式运行,也可以在自己的操作系统上搭建原生开发环境。开发者只需克隆Contiki的最新源码,并设置编译工具,如GCC-ARM编译工具和SDCC工具(用于架构的MCU)。此外,通过SRecord工具生成可用于烧录的hex文件,用户可以选择使用SmartRF Flash Programmer 2进行下载,或者在MacOSX上直接下载固件。
以TI的SimpleLink™ CC Wireless MCU LaunchPad™ Kit为例,开发者需要在Contiki目录下运行特定命令确保使用最新版本的ccxxware。接着,用户可以编译示例代码,如ccxx-demo,并下载运行。在这一过程中,Contiki内置的vue特效源码UART下载固件功能为开发者提供了便捷的下载方式,特别是通过MacOSX上的python脚本和pyserial工具,无需依赖Windows环境。
Contiki的发展历程和其在物联网领域中的应用,展示了其在快速构建原型、轻松在不同硬件平台之间切换方面的强大优势。随着物联网技术的不断演进,Contiki将继续为开发者提供更加高效、灵活的解决方案,推动物联网领域的创新与发展。
Light weight IP(LWIP)轻量化的 TCP/IP 协议
Light weight IP(LWIP)轻量化的 TCP/IP 协议,由Adam Dunkels开发的开源协议栈,旨在用少量资源消耗实现完整TCP/IP功能,适合嵌入式系统。
LWIP支持多种协议,如ARP、ICMP、IGMP、UDP、TCP、PPP、DNS、DHCP、IP、SNMP和AUTOIP等,适用于无操作系统环境,仅需少量RAM和ROM即可运行,适合资源受限的嵌入式设备。
LWIP具有多种API,包括RAW API、LWIP API和SOCKET API,提供不同性能和易用性,适应多种网络应用程序需求。
LWIP在嵌入式领域有显著优势:资源开销低、支持完整协议、实现常见应用、高度可移植、开源免费且得到广泛验证。
LWIP提供三种模式:RAW API、LWIP API和SOCKET API,其中RAW API将协议栈与应用置于同一进程,RAW API和LWIP API支持多线程,Prometheus监控源码SOCKET API提供UNIX标准API。
LWIP源码结构清晰,包含核心文件、基础类函数、域名解析、校验和、初始化、IP协议、内存管理、网卡操作、网络数据包管理、TCP协议、超时处理和UDP协议等模块。
在STMF微控制器中,LWIP提供网络层、传输层功能,MAC层和PHY层由硬件实现。SMI接口允许访问PHY寄存器,MII和RMII用于MAC与外接PHY的互联,支持/Mbit/s数据传输。
LWIP数据包和网络接口管理通过netif结构体实现,协议栈API包括用户编程接口和内核进程通信机制,支持数据包处理、连接管理和内核回调接口。
编程实例展示了如何创建UDP和TCP线程,以实现网络应用程序的开发。
正点原子lwIP学习笔记——ICMP协议
ICMP协议是一个网络层协议。一个新搭建好的网络,通常需要先进行一个基本的测试,以验证网络是否畅通;但IP协议并不提供可靠传输。如果数据包丢失了,IP协议并不能通知传输层是否丢失以及丢失的原因。因此,我们需要ICMP协议来完成这样的功能。
总结来说,为了更有效地转发IP数据报和提高交付成功机会。
ICMP协议类型与结构:对于ICMP协议中的差错报告报文,在lwIP中实现的是目的不可达以及超时的报文;对于超时报文,又分为两种,一种是生存时间TTL(在IP首部中),另一种是vault源码解析分片传输中,接收到一个分片后的超时等待时间超时;ICMP协议中的询问报文,lwIP实现的则是回送请求/应答报文。
无论是差错还是询问报文,前4个字节是一样的:第一个是类型,第二个是代码,例如超时就是0/1,0代表生存时间为0、1则是超时等待时间为0;后两个是校验和;之后的4个字节则是取决于ICMP报文的类型;整个ICMP的数据部分,长度取决于类型;整个ICMP报文是在网络层,可以说IP数据包包含了IP首部以及ICMP报文。
ICMP差错报文用于检测IP数据报在传输过程中的异常信息(目的不可达、源站抑制、重定向、超时、参数错误)。
ICMP类型为3,则代表了是目的不可达;lwIP实现了代码值2、3、4的差错;ICMP类型为则代表了是超时错误;代码值0代表传输期间生存时间为0,1代表数据报组装期间生存时间为0。
ICMP查询报文用于诊断两个网络设备之间是否能够通信。
lwIP只处理ICMP类型0/8,代表了回显请求/应答;目的主机收到ICMP回送请求报文后立即回送应答报文,若源主机能收到ICMP回送应答报文,则说明到达该主机的网络正常(PING)。
ICMP报文数据结构:以上结构体位于icmp.h中;包括有ICMP的类型、代码、校验和、标志符以及序号五个变量。
差错报文中,前4个字节是类型、代码和校验后;后4个字节全为0;然后传输的数据就是因其差错的IP首部以及他的pbuf的前8个字节的数据;查询报文的前4个字节与差错报文一样;后4个字节中,2格式标识符,2个事序号;数据部分则是请求报文发送和应答报文重复(就是类型为8,就是回送请求,直接把类型改为0,变成回送应答)。
lwIP只实现目的不可达、超时差错报文,它们分别为icmp_dest_unreach和icmp_time_exceeded函数;这两种差错报文都是调用icmp_send_response发送;其源码和注释如下:
以上源码的逻辑,就是根据当前的type和code判断处理方式,判断得到是黄山直播源码差错报文,就把被丢弃数据包的pbuf中的IP首部和前8个字节数据拷贝到差错报文中(同样也是一个pbuf)。
请求报文发送,应答报文重复。简单来讲,应答包是在请求包的基础上修改得来;查询报文的源码和注释如下:
总结来说,ICMP的回送请求,把ICMP结构体的type从8改成0,然后把pbuf的payload上移个字节,添加IP首部,就变成了回送应答包。
这一篇的源码还是比较简单易懂的,没有太多要F跳转的内容,总的原理也比较清晰。
至此,lwIP的大部分协议都学完了,还剩下TCP和UDP协议,现在的lwIP框架如下:
正点原子lwIP学习笔记——网络数据包管理
TCP/IP作为一种数据通信机制,其协议栈的实现本质上是对数据包的处理。为了实现高效率的处理,lwIP数据包管理提供了一种高效的机制。协议栈各层能够灵活处理数据包,同时减少数据在各层间传递时的时间和空间开销,这是提高协议栈工作效率的关键。在lwIP中,这种机制被称为pbuf。
用户的数据经过申请pbuf,拷贝到pbuf结构的内存堆中。在应用层,数据的前面加上应用层首部,在传输层加上传输层首部,最后在网络层加上网络层首部。
pbuf用于lwIP各层间数据传递,避免各层拷贝数据!
lwIP与标准TCP/IP协议栈的区别在于,lwIP是一种模糊分层的TCP/IP协议,大大提高了数据传输效率!
这是定义在pbuf.h中的关键结构体pbuf。通过指针next构建出了一个数据包的单向链表;payload指向的是现在这个结构体所存储的数据区域;tot_len是所有的数据长度,包括当前pbuf和后续所有pbuf;而len就是指当前pbuf的长度;type_internal有四种类型;ref代表当前pbuf被引用的次数。
右边展示的pbuf_layer就是用来首部地址偏移,用来对应相应的结构体。
PBUF_RAM采用内存堆,长度不定,一般用在传输数据;PBUF_POOL采用内存池,固定大小的内存块,所以分配速度快(一般字节,就是分配3个PBUF_POOL的内存池),一般用在中断服务中;PBUF_ROM和PBUF_REF都是内存池形式,而且只有pbuf没有数据区域,数据都是直接指向了内存区(PBUF_ROM指向ROM中,PBUF_REF指向RAM中)。
左边第一幅对应PBUF_RAM;中间两幅对应PBUF_POOL;最后一幅对应PBUF_ROM和PBUF_REF。
其中PBUF_RAM和PBUF_POOL相对更为常用。
更多的函数,都可以在pbuf.c和.h中找到。pbuf_alloc()如果是PBUF_REF或者是PBUF_ROM,就会如上图所示,创建一个结构体指针p,然后会进入pbuf_alloc_reference;该函数中,会申请一个pbuf结构体大小的内存;然后调用pbuf_init_alloced_pbuf进行初始化,初始化可以如上图所示。
如果是PBUF_POOL,会定义q和last两个pbuf结构体指针,q和last都初始化为NULL,rem_len(剩余长度)初始化为(用户指定需要构建的长度);然后q会经过内存申请,qlen则是去rem_len和当前可申请的数据大小(PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset))取小值,然后同样经过pbuf_init_alloced_pbuf初始化q中的pbuf结构体;然后会把offset清零,就是说之后的pbuf都没有offset了,只有第一个链表的元素有offset;经过if判断并判断rem_len的大小,只要还有剩余就会回去循环继续执行上述操作,直到完成3个内存块的初始化。
首先会计算payload_len和alloc_len,如果是传输数据,那么LWIP_MEM_ALIGN_SIZE(offset)就是,计算得到payload_len=,alloc_len=;然后进入判断payload和alloc的长度是否
进入判断p是否为空,不为空证明还没有释放;进入while语句,每一次都--ref(引用次数);然后类似链表删除,调用相应的pbuf类型的内存释放(内存堆或者内存池),直到p全部被释放。源码如下:
这个就要看你使用的是什么类型,然后会根据类型来决定payload_len的大小,进行相应的payload指针指向数据区前的首部字段。
这一章主要讲述了lwIP中重要的pbuf缓冲,具体有哪些数据构成,为之后的学习奠定基础,确定了pbuf除了所需传输的数据,还有哪些变量需要添加,如何申请对应的pbuf内存大小,以及对应的内存堆和内存池。
嵌入式网络那些事内容简介
本文将深入探讨嵌入式网络领域中的关键协议栈LwIP,专为网络TCP/IP协议的初学者和嵌入式网络开发人员设计。从LwIP源代码的解析开始,我们将逐一揭示TCP/IP协议各层的机制和其实现原理,帮助读者理解其内在运作。
通过构建简易实验环境,本书详细讲解了LwIP在嵌入式设备组网中的移植过程,包括实际操作和注意事项。此外,书中还提供了丰富的编程案例,让学习者能在实践中掌握LIP的运用,并实现理论知识与实践的结合。
对于TCP/IP学习者而言,本书是一本理想的入门和精通指南,配套的实验平台和实例让学习过程更为直观和高效。对于初入嵌入式领域的人员,实验平台的设计使得入门变得简单,通过实践操作,他们能更快地熟悉嵌入式开发。
最后,无论你是经验丰富的嵌入式网络开发者还是新手,本书都可作为你的实用参考手册,提供丰富的实战指导和深入理解LwIP协议的途径。
LWIP分析(三)——启动流程
LWIP分析(三)——启动流程
深入分析LWIP启动流程之前,需回顾前文对物理层结构与内存管理底层原理的铺垫。LWIP协议栈在设计上不仅涵盖多种网络硬件接口,如以太网、WiFi和NBIOT等,以实现对多样化联网硬件的支持。为了统一管理多接口,引入了“虚拟网卡”的概念。虚拟网卡实通过操作系统的网络驱动程序或LWIP自身驱动程序实现,与LWIP协议栈交互。
虚拟网卡的主要功能包括建立链表管理多个网卡、配置输出和输入回调函数接口,并能在链表中增删网卡。每张网卡由netif结构体抽象,多网卡链接形成单向链表,此源码关键参数有指针next用于链表连接、output和input函数作为物理层与IP层间数据交换的回调指针。
在虚拟网卡管理中,可实现网卡动态增减、配置及数据处理。网络数据包作为TCP/IP协议的基础处理对象,LWIP高效管理机制通过pbuf结构实现。pbuf管理多样化的数据包,从几百到几千字节不等,且支持在RAM或ROM中存储。
pbuf结构体如下,基于单链表设计,type字段决定不同pbuf结构。
包括PBUF_RAM、PBUF_POOL、PBUF_ROM和PBUF_REF等类型,提供高效数据包管理,适配数据传输需求。
硬件接口初始化,实现LWIP协议栈启动的关键步骤。初始化以太网硬件接口,需配置系统时钟、工作模式和速度,通过MDIO接口管理PHY寄存器实现。接着初始化引脚并记录TX/RX FIFO位置,此流程贯穿硬件配置、驱动实现与数据传输的初始化阶段。
Keil介绍_Keil是什么
本文将详细介绍Keil uVision5这款专业的C语言软件开发工具,它以其功能齐全和破解版本的便捷性受到开发者关注。Keil uVision5 v5.中文纪念版提供了工程管理、源代码编辑、下载调试等全方位服务,特别适合Cortex-M、Cortex-R4、ARM7等产品的开发。 作为一款编程开发工具,它支持C和汇编源文件的编辑,且内置的LWIP和SWD下载功能在速度和管理上都有显著提升。Keil uVision5的特点包括丰富的库功能,如标准文件系统支持、灵活的图形界面、网络开发组件以及USB设备开发支持,极大地提高了开发效率。 新版本还提供了文档资源方便查阅,多种代码模板例程帮助开发者快速上手,简化项目维护,使得代码重用变得更加简单。其驱动程序支持的灵活性使得更换新设备时无需重写大量代码,只需简单配置即可,进一步增强了代码的可重用性。 此外,Keil uVision5软件包不断更新,兼容性优化,并且开源,支持第三方组件的添加,为开发者提供了更大的灵活性。如果你对这款强大的开发工具感兴趣,可以点击以下链接下载其v5.中文纪念版: 点击下载:Keil uVision5完美破解版(附注册机)v5.中文纪念版下载正点原子lwIP学习笔记——IP协议
IP协议,作为TCP/IP协议族的核心,负责TCP、UDP、ICMP、IGMP等数据的传输(IPv4和IPv6)。它提供了无连接、不可靠的服务,这意味着数据传输不需维持对方信息,每次发送数据都需要明确目标IP地址,且不能保证数据包准确到达,只尽力而为,如发送失败会通知上层协议但不重传。
IP协议的功能包括:寻址,当主机间跨网段通信时,数据通过主机发送到路由器,路由器根据IP地址的网络号和主机号进行转发;利用路由表决定数据包的传输路径,目标网络、下一跳地址和子网掩码是关键信息;当数据包大小超过MTU(通常字节),则需要进行分片和重组。
IP协议与ARP、ICMP和IGMP等配合工作。与MAC地址(物理地址)不同,IP地址是网络层以上的标识,分为五类。理解IP协议内容,IPv4的首部结构包含字节的固定部分,如差分服务区域、总长度、标识符、标志等,以及源和目标IP地址等信息。
IP分片原理涉及MTU限制,当数据包超过MTU,就需要进行分片操作,比如字节的数据可能被分为多个片段,每个片段包含偏移量、标志等字段。pbuf内存分配和重组过程是关键,例如,使用pbuf结构存储和传递数据,TCP和IP头部会插入pbuf,通过ip_reassdata结构连接分片,直到所有分片接收完整后进行重组。
IP重组是根据到达顺序重新组合分片,lwIP处理分片时,ip_reassdata链表用于存储和管理未完整接收的数据包。源码中的函数如ip4_reass()和ip_reass_chain_frag_into_datagram_and_validate()处理了这些逻辑,确保数据包在到达目的地后正确组合。
总的来说,理解lwIP协议的这部分内容,关注核心原理和源码示例,把握数据传输的完整逻辑,包括IP首部字段、分片与重组,以及与MAC地址、TCP/IP协议的交互,是十分重要的。
2024-12-27 18:27
2024-12-27 18:17
2024-12-27 17:58
2024-12-27 17:39
2024-12-27 16:21
2024-12-27 16:14