FuIP(Fuhome Micro Interface Process)是fuhome未来之家实验室社区开发的为单片微型计算机开发的TCP/IP协定栈,它是开源的。目前最新版本为3.0 包括 ARP,IP,TCP/UDP,DHCP,ICMP,HTTP协定。
协定栈
FuIP由fuhome(未来之家实验室)的龙剑奋斗开发,第一个中文版本的TCP/IP开源协定栈,专用于单片机进行联网而编写。其原始码由C 语言编写,项目採用keil 4进行调试编译并完全公开。
FuIP 协定栈去掉了完整的 TCP/IP 中不常用的功能,简化了通讯流程,但保留了网路通信必须使用的协定,设计重点放在了 IP/TCP/ICMP/UDP/ARP 这些网路层和传输层协定上,保证了其代码的通用性和结构的稳定性。
由于FuIP 协定栈专门为微型单片计算机而设计,充分考虑了8位 16位 32位单片机平台特性,採用最易移植写法,因此特别适合任何有单片机基础的网友轻鬆控制家用电器等。
因此还具有如下优越功能:
1) 代码非常少,其协定栈核心代码不到 6K,中文注释详细,很方便阅读和移植,採用STC12系列单片机,适合初学者和老鸟。
2) 占用的记忆体数非常少,RAM 占用仅500B(快取占255B),3.0版本RAM自行调整根据需要。
3) 其硬体处理层、协定栈层和套用层共用一个全局快取区,不存在数据的拷贝,且传送和接收都是依靠这个快取区,极大的节省空间和时间。
4) 支持多个主动连线和被动连线并发。
5) 其原始码中提供一套实例程式: web 伺服器, web 客户端,TCP服务端,客户端,UDP服务端,UDP客户端。通用性强,移植起来基本不用修改就可以通过。
6) 对数据的处理採用轮循机制,不需要作业系统的支持。
由于FuIP 对资源的需求少和移植容易,已经有网友移植于 STM32,STM8系列单片机。
提供的接口在fu_send.h/fu_app.h中,为了减少函式调用造成的额外支出,大部分接口函式以宏命令实现的。
fu_send.h
//设定连线状态,
//设定连线状态,
Set_Re_HOST(1,TCP_CLIENT,192,168,0,123,8080);//TCP客户端
Set_Re_HOST(2,TCP_SERVER,0,0,0,0,8080);//TCP服务端
Set_Re_HOST(4,UDP_CLIENT,192,168,0,123,8080);//UDP客户端
Set_Re_HOST(5,UDP_SERVER,0,0,0,0,8080);//UDP服务端
1、if(ReHost[n].Stat==CONNECTED)//这一个用来判断当前连线与否,TCP服务和客户端均可,UDP没有连线一说,所以只能判断首次被连线否。
2、下线:CloseTCP(n);//主动断开TCP连线,用于对方没有正常断开就断电,掉线的情况,自己可以根据情况下线。
3、传送数据: Send_Data(n,len);//n连线的标号1-5,len有效数据长度
fu_app.h
功能:处理数据包 :包括TCP UDP
fu_app.c档案内 App_Bag(U8 p[],U16 len),p[]是快取区指针,len长度
移植说明
1、例程使用的是STC12C5A60S2+ENC28J60乙太网晶片,
需要修改的部分在于档案 mcuinit.c,mcuinit.h,
2、涉及晶振频率,LED接口定义,串口波特率,定时器
网卡驱动部分根据对应网卡写,留下,初始化,读/写接口函式即可。
3、fu_config.h fu_config.c 涉及本机MAC IP,路由器网关IP需要根据实际进行修改。
/* 相关参数设定 */
U8 code FU_LoaclIP[4]={192,168,1,150};//本地IP位址
U8 code FU_MAC[6]={0x00,0x12,0X34,0X56,0X78,0X90};//MAC
U8 code FU_SubnetMask[4]={255,255,255,0};//子网掩码
U8 code FU_GateWay[4]={192,168,1,1}; //默认网关
如下缓冲区需要根据实际进行缩放,自己修改即可。
U8 xdata DATA[FU_LEN]={0};//收发数据缓冲区
版本更新
V1.2版本支持与特性:
1,支持ARP请求、应答(获取目的IP的MAC)
2,支持ICMP_Ping请求,应答(ping命令)
3,支持TCP主动连线,断开,被动连线,断开,数据传送
4,支持UDP传送,接收数据
V1.3 版本
1、改写了命令识别写法,使用更加简单,效率提高了。(网友yht7891984提出 )
v2.0 更新提示
1、由于单片机RAM完全够用,为了用来方便接入网际网路,接收缓冲不再与传送缓冲公用
2、修复TCP连线过程的一些问题,更加兼容不同主机的数据格式。
3、增加了访问外网主机的功能,完善了TCP连线协定,这一点是重大改变。
4、命令识别,传送採用特殊函式,提升了执行效率。
(本demo直接下载到单片机,默认访问百度首页,可以从串口看到数据。
2、修复TCP连线过程的一些问题,更加兼容不同主机的数据格式。
3、增加了访问外网主机的功能,完善了TCP连线协定,这一点是重大改变。
4、命令识别,传送採用特殊函式,提升了执行效率。
(本demo直接下载到单片机,默认访问百度首页,可以从串口看到数据。
v2.1 更新日誌
1、修复了ARP回应bug(网友林海雪原提出)
2、对于TCP/UDP数据不再限制于偶数长度了,奇数偶数均可。
2、对于TCP/UDP数据不再限制于偶数长度了,奇数偶数均可。
v2.2 更新日誌
1、修复了TCP传送检验bug,数据传输bug
2、结合实用,及网友建议,特此做了调整。TCP仅支持被动连线,若需要单片机主动连线(见2.1版本可以访问百度网页)
3、增加了web服务功能,可以实现用网页传送讯息给单片机
4、UDP仍然支持主动,被动模式。
5、合併传送接收缓冲区,统一DATA[ ]数组。默认长度为255位元组。
2、结合实用,及网友建议,特此做了调整。TCP仅支持被动连线,若需要单片机主动连线(见2.1版本可以访问百度网页)
3、增加了web服务功能,可以实现用网页传送讯息给单片机
4、UDP仍然支持主动,被动模式。
5、合併传送接收缓冲区,统一DATA[ ]数组。默认长度为255位元组。
v2.3 更新日誌(20150112)
1、增加DHCP协定,可以自动获取IP,以补充固定IP的不足之处(如不需要请用 v2.2版本其採用固定IP,视个人情况而定)。
2、改善数据报长度只能在255以内的限制,可以扩大到TCP/IP规定的最大数据报。
2、改善数据报长度只能在255以内的限制,可以扩大到TCP/IP规定的最大数据报。
v3.0更新日誌(20170106)
1、整合2.2与2.3,用参数来设定是固定IP还是动态获取IP
2、修改一个BUG,当UDP包大于FU_LEN时,截断为多个UDP包处理数据
3、重建工程,不用手工添加STC资料库也可以进行编译
4、修改两个enc28j60模组互相通讯时,arp不成功的一个BUG
5、修改子网掩码算法,在ARP时不会出错
6、增加多路通讯,多个TCP(服务端,客户端),多个UDP(服务端,客户端)同时通信,之前是只支持1路通讯,切多路连线可以工作在不同状态角色。
V3.1版本更新日誌(20180723)
1.解决多个enc28j60相互通讯时,arp应响包出错问题。
2.解决多个enc28j60模组在同一域网时,DHCP相互冲突的问题。
3.修改DHCP处的一个BUG,以兼容更多路由器。
4.增加DNS功能,fuip 3.0与之前只能使用IP位址访问外网。
5.解决多路TCP通讯时,TCP_Mark互相冲突的问题。
6.解决对方主动断开TCP连线,回响慢的问题。
7.增加DHCP指定时间自动重新获取IP位址的功能。(重新申请IP的时间由宏指定单位为秒 #define DHCP_TIME 1800)
2.解决多个enc28j60模组在同一域网时,DHCP相互冲突的问题。
3.修改DHCP处的一个BUG,以兼容更多路由器。
4.增加DNS功能,fuip 3.0与之前只能使用IP位址访问外网。
5.解决多路TCP通讯时,TCP_Mark互相冲突的问题。
6.解决对方主动断开TCP连线,回响慢的问题。
7.增加DHCP指定时间自动重新获取IP位址的功能。(重新申请IP的时间由宏指定单位为秒 #define DHCP_TIME 1800)