极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 32292|回复: 52

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

[复制链接]
发表于 2012-9-28 16:02:15 | 显示全部楼层 |阅读模式
本帖最后由 zcbzjx 于 2013-5-15 15:32 编辑

    2013年5月15日,更改mac地址,原mac地址有些交换机会过滤掉。
    发觉郝老板酷爱详细教程。。越详细越好。。{:soso_e120:}



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

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

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

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

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

    幸运的是我上面所说的获取IP地址的过程已经在dhcp.cpp 库文件为我们实现:在接下来的页面中,我要编写一个简单的例子来使用DHCP服务。
    以下是arduino代码
[pre lang="arduino" line="1" file="dhcp.ino"]#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());
}[/code]
    首先我只定义一个MAC地址和输入输出缓存,不再定义一个固定的IP地址,仍需用begin()方法进行网络控制器的初始化。
  1. ether.dhcpSetup()
复制代码
dhcpSetup()方法执行上述所有的详细步骤:寻找一个DHCP服务器,检查的答复,选择一个IP地址,并要求使用权限。如果成功将返回1,这种方法等待30秒后,如果还没获得IP地址,它将返回0。
  1. ether.printIp()
复制代码
printIp()方法是一个简单的方法在串口上打印一个“点分十进制表示法”的IP地址(它是以uint8_t数组的形式存储在以太网缓冲区中)。

    如果没其他问题的话,你应该可以ping通你的arduino:
dhcp_working-300x78.jpg
    如果你可以查看你的DHCP服务器,你将看到连接了一个新的设备(EtherCard库选择的“Arduino-XX”  ,XX为MAC地址的最后一个字节)。
dhcp_router.jpg

返回目录

评分

参与人数 1 +1 收起 理由
幻生幻灭 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2012-9-28 16:31:12 | 显示全部楼层
强力支持!!
回复 支持 反对

使用道具 举报

发表于 2012-9-29 18:11:06 | 显示全部楼层
谢谢老师的教程~!又学习了~!
回复 支持 反对

使用道具 举报

发表于 2012-9-29 23:23:03 | 显示全部楼层
好东西 呵呵 以前用28j60都是指定IP的 很傻的样子,现在好多了~~
回复 支持 反对

使用道具 举报

发表于 2012-10-7 08:20:04 | 显示全部楼层
我用2560自动获取ip的话 ,再路由器上看,就是老是过期了,无法获取IP地址。
必须静态的设置ip。
不知道哪位碰到过这个问题。
而且说ec库里面没有 ether.dhcpExpired() 这个函数
回复 支持 反对

使用道具 举报

发表于 2012-10-7 09:12:53 | 显示全部楼层
顶张老师
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-8 07:44:38 | 显示全部楼层
本帖最后由 zcbzjx 于 2012-10-8 07:45 编辑
Pizzro 发表于 2012-10-7 08:20
我用2560自动获取ip的话 ,再路由器上看,就是老是过期了,无法获取IP地址。
必须静态的设置ip。
不知道哪 ...


根据第一个教程,获得最新的EtherCard库,如果还是这个问题,请把代码和连线还有串口切图发上来,你这样问问题,没法分析啊。
回复 支持 反对

使用道具 举报

发表于 2012-10-8 09:22:55 | 显示全部楼层
代码就是 你这个。并且没有设置你begin里面那个cspin的参数。

连线没有问题。 50-53 分别连接  so,si, sck,cs


这是系统里pin_arduino.h 对2560的引脚的定义

const static uint8_t SS   = 53;
const static uint8_t MOSI = 51;
const static uint8_t MISO = 50;
const static uint8_t SCK  = 52;
回复 支持 反对

使用道具 举报

发表于 2012-10-8 09:24:40 | 显示全部楼层
还有我就是想请教一下。 如何处理 作为webclient应用里面获取网页返回数据。
比如我要如何除去头数据,只要内容数据。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-8 15:46:51 | 显示全部楼层
Pizzro 发表于 2012-10-8 09:24
还有我就是想请教一下。 如何处理 作为webclient应用里面获取网页返回数据。
比如我要如何除去头数据,只要 ...

稍等,下一个教程就有了
回复 支持 反对

使用道具 举报

发表于 2012-10-22 07:30:47 | 显示全部楼层
能给下芯片的电路吗???
回复 支持 反对

使用道具 举报

发表于 2012-10-27 14:24:23 | 显示全部楼层
我用的TP-LINK 貌似会过滤一些奇怪的MAC地址,例如这个DD-DD-DD-xx-xx-xx的开头,之后发现换一个和自己电脑相像的就好了,  调不好的可以试试是不是这个问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-27 15:04:22 | 显示全部楼层
你这么一说,我好似也遇到过这样的问题。
回复 支持 反对

使用道具 举报

发表于 2012-12-8 11:35:24 | 显示全部楼层
DHCP Demo
Ethernet controller initialized
  一直停在这里,不动了。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-9 07:18:20 | 显示全部楼层
...使劲使劲。。先看看固定ip有问题不。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-1-22 02:42 , Processed in 0.050433 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表