第三篇文章,我会介绍如何连接一个网站并获取返回的信息。
当你学会了如何(使用静态ip地址或者通过DHCP服务器自动获取ip地址)把你的Arduino连接到网络后,你需要学习如何向一个网站发送数据和接收该网站的返回数据。
为了使下面的例子更实际,我编写了一个简单的php网页,每次连接将随机返回一句格言,地址如下
http://www.lucadentella.it/demo/aphorisms.php。
我们来编写一个Arduino代码来获得这些格言并输出到串口。
DNS
通常我们连接一个网站是键入他的域名(如
www.sina.com.cn),我们的电脑,会通过一个dns服务器将他的域名解析为相应ip来进行连接。
在arduino中配置你网络对应的dns服务器地址是非常重要的:
如果你的arduino是采用DHCP服务器来进行配置,通常DNS服务器地址也是自动获取的。
如果是静态配置,那么你调用 sta
ticSetup()方法时需要包含DNS服务器地址。
- #include
- static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x00,0x01};
- static byte myip[] = {192,168,1,10};
- static byte gatewayip[] = {192,168,1,1};
- static byte dnsip[] = {151,99,125,2};
- ...
- ether.staticSetup(myip, gatewayip, dnsip);
[color=rgb(51, 102, 153) !important]复制代码
你可以用dnsLookup()方法验证域名服务器是否正常。
- char website[] PROGMEM = "www.lucadentella.it";
- ...
- if (!ether.dnsLookup(website))
- Serial.println("DNS failed");
- else
- Serial.println("DNS resolution done");
- ether.printIp("SRV IP:t", ether.hisip);
[color=rgb(51, 102, 153) !important]复制代码
连接
EtherCard库提供了一个非常方便的方法browseUrl()来连接一个网站,This method prepares the connection; which is completed in following steps performed(不知道咋个翻译) – during the loop - 通过我们已经学了的2个指令:
- ether.packetLoop(ether.packetReceive());
[color=rgb(51, 102, 153) !important]复制代码
非常重要的是需要保持这两个指令运行,才能使代码正常工作。
browseUrl()方法需要一些参数:
prog_char urlbuf,地址的 固定部分;
const char * urlbuf_varpart,地址的变量部分;
prog_char hoststr,网站的名称;
void (*callback)(byte,word,word)),这是一个回调函数名称,连接结束时调用的函数。
地址分为两部分,以优化内存的利用率:静态部分存储在flash中(PSTR()命令),以节省RAM空间。
回调函数
回调函数包含连接结束时执行的一个动作,在这个例子,是在串口打印出网站返回的格言。
你可以选择任意的函数名称,但必须声明如下的参数:
- static void response_callback (byte status, word off, word len)
[color=rgb(51, 102, 153) !important]复制代码
第一个参数为连接的状态,第二个参数为响应存储在buffer中的偏移量,第三个参数为响应的长度。
要理解偏移量(OFF)参数的含义,你必须要注意的以太网连接发送和接收的所有数据存储在我们定义的缓冲区中:
- byte Ethernet::buffer[700];
[color=rgb(51, 102, 153) !important]复制代码
你收到数据,整个数据包(包含头文件及校验字段等),都存储在这个缓冲区中,偏移量值告诉我们从那个字段开始存储这个数据包,及哪儿是我们收到的网页响应。
下面是一个回调函数在串口打印网页的响应:
- static void response_callback (byte status, word off, word len) {
- Serial.print((const char*) Ethernet::buffer + off);
- }
[color=rgb(51, 102, 153) !important]复制代码
如果你运行这个代码(你可以在这个
链接找到)(注意要把回调函数改成以上回调函数),你就可以看到如下信息:
arduino正确配置了DHCP,它解析“
www.lucadentella.it”这个域名,连接网站,打印网站响应。
响应不仅包含格言,还包含了HTTP头文件。你需要打印所有的响应,然后通过文本编辑器(推荐notepad++),找到它们有多少个字符:
这些行位于接收缓冲器中的格言之前。所以我们需要改变回调函数,打印207个字符之后的缓冲区的内容:
- static void response_callback (byte status, word off, word len) {
- Serial.print((const char*) Ethernet::buffer + off + 207);
- }
[color=rgb(51, 102, 153) !important]复制代码
经过以上更改,你就可以接收到正确的数据: