【翻译教程】enc28J60 和 Arduino (2)——自动获取IP地址

2013年5月15日,更改mac地址,原mac地址有些交换机会过滤掉。

发觉郝老板酷爱详细教程。。越详细越好。。<img class="s" old="http://imgstore01.cdn.sogou.com/app/a/100520032/e120" smilieid="soso_e120" border="




第二篇文章,我将向您展示如何使用DHCP服务器自动配置网络参数。

在我的第一篇文章的结尾,写了一个简单的例子,所有的网络参数被定义为常量,如果需要更改网络参数,你必须重新编译和重新加载。

通常情况下,在本地网络中,你可以找到一个DHCP(Dynamic Host Configuration Protoco,动态主机配置协议,是一个局域网的网络协议,使用UDP协议工作)服务器,作用是给一个内部网络设备自动分配网络参数(IP地址、掩码、网关及DNS)。

简单意义上讲,它的工作原理是这样的:

需要一个IP地址的设备(客户端),发送一个DISCOVERY广播数据包(这个数据包将到达设备所在的整个网络),“发现”可用的DHCP服务器;
如果一个或多个DHCP服务器可用,它们应答一个OFFER包,“建议”发出请求的客户端设置可用的IP地址;
客户选择所提供的IP地址,并向对应服务器发送一个REQUEST数据包,要求允许使用该地址;
建议设置这个ip地址的服务器,发回一个ACK包来确认IP地址关联。

dhcp_steps-300x232.jpg

2012-9-28 16:01 上传
(48.45 KB)



如果要深入了解dhcp,请百度。



幸运的是我上面所说的获取IP地址的过程已经在dhcp.cpp 库文件为我们实现:在接下来的页面中,我要编写一个简单的例子来使用DHCP服务。

以下是arduino代码

ARDUINO 代码复制打印下载

#include <EtherCard.h>static byte mymac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};byte Ethernet::buffer[700];void setup () {Serial.begin(57600);Serial.println("DHCP Demo");if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))  Serial.println( "Failed to access Ethernet controller"); else Serial.println("Ethernet controller initialized");if (!ether.dhcpSetup())  Serial.println("Failed to get configuration from DHCP");else  Serial.println("DHCP configuration done");ether.printIp("IP Address:\t", ether.myip);ether.printIp("Netmask:\t", ether.mymask);ether.printIp("Gateway:\t", ether.gwip);}void loop() {ether.packetLoop(ether.packetReceive());}
#include <EtherCard.h>

static byte mymac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};

byte Ethernet::buffer[700];



void setup () {



Serial.begin(57600);

Serial.println("DHCP Demo");



if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))

Serial.println( "Failed to access Ethernet controller");

else

Serial.println("Ethernet controller initialized");



if (!ether.dhcpSetup())

Serial.println("Failed to get configuration from DHCP");

else

Serial.println("DHCP configuration done");



ether.printIp("IP Address:\t", ether.myip);

ether.printIp("Netmask:\t", ether.mymask);

ether.printIp("Gateway:\t", ether.gwip);

}



void loop() {



ether.packetLoop(ether.packetReceive());

}


首先我只定义一个MAC地址和输入输出缓存,不再定义一个固定的IP地址,仍需用begin()方法进行网络控制器的初始化。ether.dhcpSetup()复制代码dhcpSetup()方法执行上述所有的详细步骤:寻找一个DHCP服务器,检查的答复,选择一个IP地址,并要求使用权限。如果成功将返回1,这种方法等待30秒后,如果还没获得IP地址,它将返回0。ether.printIp()复制代码printIp()方法是一个简单的方法在串口上打印一个“点分十进制表示法”的IP地址(它是以uint8_t数组的形式存储在以太网缓冲区中)。

如果没其他问题的话,你应该可以ping通你的arduino:

dhcp_working-300x78.jpg

2012-9-28 16:01 上传
(58.09 KB)



如果你可以查看你的DHCP服务器,你将看到连接了一个新的设备(EtherCard库选择的“Arduino-XX”,XX为MAC地址的最后一个字节)。

dhcp_router.jpg

2012-9-28 15:59 上传
(4.25 KB)





返回目录
via - 极客工坊

标签: Arduino教程