从网络得到数据--Arduino+以太网
昨天我们讨论了如何使用Arduino以太网插板建立服务器,并通过网络控制Arduino的引脚。今天我们来看看用插板做为客户端来从一个网页上得到信息并返回报告。我几个月前用的这个方法,当时我做了一个Nixie Twitter follower的计数器被称为Twixie。
以太网插板可用来访问任何非密码保护的网站,但你要得到信息返回是比较难的一部分。对于Twixie,我创建了一个特殊的php页面,查询twitter API和显示twiter的计数。这让我不必要去告诉Arduino去查找什么,查无数行的HTML寻找一个数字。在我们的示例中会变得更加简单。我创建了一个PHP文件,仅输出一个随机字符串。我这样做是因为要让每个人都设置一个API账户,不需要证明这个概念就可以开始。但是这个想法是,你可以将PHP文件(任何网络可访问文件)编写并显示出你所需要的东西。
在客户端模式中,以太网插板可以访问网页并将它所读到的信息返回。但是每一次读取一个字节读完整个网页内容。所以它就像大海捞针在大页面上。即使我们正在阅读的页面只包含我们需要的信息,有额外的信息在一开始就被送到arduino。你永远不会看到它,实际上是一个web服务器发送额外的信息作为一个“头”,告诉浏览器有关页面的各种信息(这是不同于HTML标签的)。
如此,我们需要一种方式来告诉Arduino什么是垃圾,什么是有用的东西。我们可以用<>来包括信息。当Arduino开始读取网页的时候,我们会告诉它忽略所有指导看到"<"。从这点上我们告诉Arduino记录每个下面的字符知道我们看到了结束字符">"。此时,Arduino有所需的一切,断开服务器然后返回报告找到的数据。
以太网插板库不支持DNS这意味着我们不能直接访问网页,我们需要通过一个IP地址来访问网页。例如,bildr的IP地址是174.123.231.247,你可以访问bildr比如http://174.123.231.247/ ~ bildr / -不是每个服务器允许你这样做,但是通常可以IPADDRESS/~ACCOUNT_USERNAME – 所以你可以看到我在这创建的PHP文件 http://174.123.231.247/~bildr/examples/ethernet/
代码
直至Arduino1.0,都支持DHCP,所以可以插入大多数的网络让它工作。
NOW 1.0 COMPATIBLE
//ARDUINO 1.0+ ONLY
//ARDUINO 1.0+ ONLY
#include <Ethernet.h>
#include <SPI.h>
////////////////////////////////////////////////////////////////////////
//CONFIGURE
////////////////////////////////////////////////////////////////////////
byte server[] = { 174,123,231,247 }; //ip Address of the server you will connect to
//The location to go to on the server
//make sure to keep HTTP/1.0 at the end, this is telling it what type of file it is
String location = "/~bildr/examples/ethernet/ HTTP/1.0";
// if need to change the MAC address (Very Rare)
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
////////////////////////////////////////////////////////////////////////
EthernetClient client;
char inString[32]; // string for incoming serial data
int stringPos = 0; // string index counter
boolean startRead = false; // is reading?
void setup(){
Ethernet.begin(mac);
Serial.begin(9600);
}
void loop(){
String pageValue = connectAndRead(); //connect to the server and read the output
Serial.println(pageValue); //print out the findings.
delay(5000); //wait 5 seconds before connecting again
}
String connectAndRead(){
//connect to the server
Serial.println("connecting...");
//port 80 is typical of a www page
if (client.connect(server, 80)) {
Serial.println("connected");
client.print("GET ");
client.println(location);
client.println();
//Connected - Read the page
return readPage(); //go and read the output
}else{
return "connection failed";
}
}
String readPage(){
//read the page, and capture & return everything between '<' and '>'
stringPos = 0;
memset( &inString, 0, 32 ); //clear inString memory
while(true){
if (client.available()) {
char c = client.read();
if (c == '<' ) { //'<' is our begining character
startRead = true; //Ready to start reading the part
}else if(startRead){
if(c != '>'){ //'>' is our ending character
inString[stringPos] = c;
stringPos ++;
}else{
//got what we need here! We can disconnect now
startRead = false;
client.stop();
client.flush();
Serial.println("disconnecting.");
return inString;
}
}
}
}
}
PHP例程文件。创建一个随机的字符串比如<1Hc2f>
<?php
//the arduino will store anything between '<' and '>'
//So if the output was <1kjhghk5> - the arduino would read 1kjhghk5
//Just generates a random alphanumeric string
$what_the_arduino_reads = '1'.base_convert(rand(10000,9999999), 10, 36);
echo '<'.$what_the_arduino_reads.'>';
?>
翻译自:http://bildr.org/2011/06/arduino-ethernet-client/
感谢阅读!
更多与我们联系:
WIZnet邮箱:wiznetbj@wiznet.co.kr
从网络得到数据--Arduino+以太网的更多相关文章
- iOS开发网络篇—数据缓存
iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...
- Android网络之数据解析----使用Google Gson解析Json数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Android网络之数据解析----SAX方式解析XML数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据
http://www.jb51.net/os/windows/189090.html 今天给大家介绍一种如何在Windows操作系统上使用著名的抓包工具软件Wireshark来截获iPhone.iPa ...
- jcifs 具体解释读取网络共享文件数据
时隔1年半,没有发过新的帖子了,也没怎么来过CSDN逛逛了,人也懒散了. 今天收到网友的提问,才回来看看.认为应该再写点什么出来.只是.发现自己研究是不是太深入,写不出那么高深的东西.那就写点肤浅的东 ...
- PIE SDK打开网络地图数据
1. 数据介绍 网络地图数据是在线地图服务发布出来的数据,其支持数据的网络查看和传输,极大的促进了GIS的发展. 目前PIE SDK支持百度地图.谷歌地图.高德地图.天地图.Bing地图.ArcGIS ...
- [Swift通天遁地]四、网络和线程-(5)解析网络请求数据:String(字符串)、Data(二进制数据)和JSON数据
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Wireshark 如何捕获网络流量数据包
转自:http://www.4hou.com/web/7465.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutia ...
- sar网络统计数据
sar是一个研究磁盘I/O的优秀工具.以下是sar磁盘I/O输出的一个示例. 第一行-d显示磁盘I/O信息,5 2选项是间隔和迭代,就像sar数据收集器那样.表3-3列出了字段和说明. 表3-3 ...
随机推荐
- MySQL指定使用某个索引查询语句
查询语句查询emp_no,所以先查询emp_no的索引使用primary select emp_no,salary from salaries use index(s_f_t) where emp_n ...
- Python 类的名称空间和组合
一.Python类的名称空间 class Student(object): School = '北京大学' def __init__(self): pass stu1 = Student() stu1 ...
- 正则表达式对IP地址的限制
正则表达式 ^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[ ...
- spring mvc整合mybaitis和log4j
在上一篇博客中,我介绍了在mac os上用idea搭建spring mvc的maven工程,但是一个完整的项目肯定需要数据库和日志管理,下面我就介绍下spring mvc整合mybatis和log4j ...
- DB2和Oracle中Date比较
- rmdir命令
rmdir命令用来删除空目录.当目录不再被使用时,或者磁盘空间已到达使用限定值,就需要删除失去使用价值的目录.利用rmdir命令可以从一个目录中删除一个或多个空的子目录.该命令从一个目录中删除一个或多 ...
- 小甲鱼Python笔记(上)
基于Python 3.4.3 一 二 三 四 基础 print 三版必须加括号,二版不用加 alt + n :上一条语句 alt + p :下一条语句 打印三条hello 没有大括号,用缩进来表示 ...
- 【LOJ】#2129. 「NOI2015」程序自动分析
题解 开始是想两个并查集的 和A相等,和A不相等 如果AB相等就连 A 相等,B相等 B不相等 A不相等 如果AB不相等就连 A不相等,B相等 B相等,A不相等 但是显然不对,因为和A不相等的不一定和 ...
- ELK系列--问题汇总(二)
1.Kibana4 dashboard无法保存拖动的visualization位置 原因: 程序bug,json部分未能及时保存拖动的情况 解决方法: 手动在设置中,手动编辑dashboard的jso ...
- lr关联需要转义的常见字符
转义字符总结 在做手动关联时,取边界值的时候,会经常用到转义字符,现将转义字符整理如下: \b 退格 \f 换页 \n 换行 ...