打印
[ZLG-ARM]

转:嵌入式网关的IP地址远程设置方法

[复制链接]
2351|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
金鱼木鱼|  楼主 | 2011-3-27 17:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通用计算机数据链路层自定义帧的实现,可应用于解决嵌入式网络设备的远程设置问题,改进了过去嵌入式网络设备IP地址使用直接烧写或串口本地配置等方法。该方案的特点是绕开了套接字编程,直接将上位机与下位机的通信建立在数据链路层的基础之上。相对于依靠上层协议通信,在数据链路层直接通信,可以避开上层协议的约束,从而达到对网络数据更直接和灵活处理的目的。
一、帧格式的定义
通过对数据链路层帧格式的分析,不难发现在数据链路层包含了能惟一标识一台主机的MAC地址。不需要ARP协议做IP和MAC地址映射,进而实现未知目的IP的链路层通信。为了满足实现对嵌人式网关的远程设置要求,可根据Ethernet协议标准定义帧格式,且命名为RSF帧:
目的MAC地址,6字节;
源MAC地址,6字节;
帧类型(RSF=0801 IP=0800 ARP=0806 RARF=8035),2字节;
OP操作选项(RSF query=01,RSF setIp=02,RSFreplyr=03),2字节;
目的port,2字节;
发送端MAC地址,6字节;
发送端IP地址,4字节;
目的MAC地址,6字节;
目的IP地址,4字节;
设置结果,1字节。
该帧格式的定义类似于TCP/IP协议栈中的ARP协议帧,包含了以太网头14个字节。帧类型,在该字段802项目定义的有效长的值与以太网的有效类型值无一相同,这样可以区分这两种帧的格式,这里设定该帧类型为0801,以区别于已定义的帧类型;OP操作码,RSF query=01表示服务器发送的数据包用于查询网络中的嵌入式网络设备的MAc地址,RsF setlp=02表示服务器发送的数据包用于设置嵌入式网络设备的IP地址,RsF reply=03用于设置信息的返回;端口号是目的端预设置的端口号:剩下的20字节为发送端和目的端的IP和MAC地址。
二、上位机部分
由于该方案旨在利用数据链路层协议来解决对嵌入式网关的IP远程设置问题,就必然要求上位机编程要绕过位于第4层与第5层问的套接字编程接口(socket)。幸运的是,位于第2与第3层间的NDIs(网络驱动器接口)提供了访问网络底层的能力。其优点在于屏蔽了下层各种网卡的差别,为上层提供了一个完备NDIS库,可以完成原始数据包的捕获,数据包的过滤,以及原始数据包的发送等强大的功能。另外,意大利的Fulvio Riss0、LorisDegioanni等专家开发了一个Windows平台下免费公共的网络访问系统,并提供Winpcap开发包,方便地提供了一个访问网络底层的接口。寻找到访问网络底层的编程接口后,只需要定义相应的数据包结构,并调用库中发包函数就能完成原始数据包的接收和发送功能。这里只给出关键的数据结构的定义代码。
以太网头的数据结构:
Typedef structtag DLCHeader {
unsigned char DesMAC[6]; //以太网目的地址
unsigned char srcMAC[6]; //以太网源地址
unsigned short Etherype; //帧类型
);
RSF帧结构:
typedef struct tagRSFFrame
{unsigned short opcode; //操作码
unsigned short Prot //目标端口号
unsigned char Send_HW_Addr[6];//发送端以太网地址
unsigned long Send_Prot_Addr; //发送端IP地址
unsigned char Targ_HW_Addr[6];//目的以太网地址
unsigned long Targ_Prot_Addr; //目的lP地址
unsigned char ReturnValue //设置结果
};
RSF包结构:
typedef struct tagRSFPacket{
DLCHEADER dlcHeader;
RSFFRAME rsfFrame;
};
三、下位机部分
[url=]嵌入式[/url]网关的实现关键在于TCP/IP协议栈的实现。目前主要有TCP/IP的软移植(如ulP TCP/IP的移植)、硬移植(主要由专业芯片实现)和嵌入式系统自带TCP/IP协议栈。如果是利用嵌入式系统来实现嵌人式网关,就必须对操作系统内核驱动作相应的改动。这里只重点介绍TCP/IP在微处理器上软移植的情况。在这种情况,只要在数据链路层模块中添加帧的识别和处理功能模块,就可以获得数据帧中的IP地址等数据,并对本地IP进行设置。具体设置是调用对EEPROM的读写程序模块来完成的,关键代码如下:
void eth_rcve(UCHAR xdata*inbuf)//数据链路层接收模块
{ ……
switch(etb->frame-type)
{ ……
CASE RSF_PACKET://在原协议栈中添加自定义协议调用修改本地IP模块; break;
CASE ARP_PACKET:调用ARP处理模块; break;
……
}
}
void eth_send(UCHAR xdata*outbuf,UCHAR*hwaddr,UINT ptype,UINT Ien)//数据链路层发送模块
{……}

相关帖子

沙发
思行合一| | 2011-3-27 17:31 | 只看该作者
完全看不懂啊!

使用特权

评论回复
板凳
黑发尤物| | 2011-3-27 18:37 | 只看该作者
长见识了

使用特权

评论回复
地板
zsy020| | 2011-3-27 18:50 | 只看该作者
沃野是 完全看不懂 求解

使用特权

评论回复
5
快乐出发| | 2011-3-27 20:04 | 只看该作者
:$

使用特权

评论回复
6
FVJFIFE| | 2011-4-3 20:36 | 只看该作者
这个有什么用吗?

使用特权

评论回复
7
即时生效| | 2011-4-5 16:45 | 只看该作者
mark

使用特权

评论回复
8
米其林r| | 2011-4-9 23:37 | 只看该作者
有用!

使用特权

评论回复
9
游子e家| | 2011-11-17 10:08 | 只看该作者
:)mark

使用特权

评论回复
10
黑发尤物| | 2011-11-20 21:00 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

346

主题

1551

帖子

2

粉丝