博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从网络得到数据--Arduino+以太网
阅读量:5039 次
发布时间:2019-06-12

本文共 3259 字,大约阅读时间需要 10 分钟。

昨天我们讨论了如何使用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.'>';
?>

翻译自:

感谢阅读!

更多与我们联系:

WIZnet邮箱:wiznetbj@wiznet.co.kr

 

转载于:https://www.cnblogs.com/dyllove98/p/3243661.html

你可能感兴趣的文章
JAVA通信系列一:Java Socket技术总结
查看>>
VS 2010打开设计器出现错误
查看>>
SQLServer 镜像功能完全实现
查看>>
Vue-详解设置路由导航的两种方法
查看>>
一个mysql主从复制的配置案例
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
dvwa网络渗透测试环境的搭建
查看>>
Win8 安装VS2012 和 Sql Server失败问题
查看>>
过点(2,4)作一直线在第一象限与两轴围成三角形,问三角形面积的最小值?...
查看>>
java aes CBC的填充方式发现
查看>>
使用ionic cordova build android --release --prod命令打包报有如下错误及解决方法
查看>>
BZOJ 2338 HNOI2011 数矩形 计算几何
查看>>
关于页面<!DOCTYPE>声明
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
C++标准库vector使用(更新中...)
查看>>
cocos2d-x 2.2.6 之 .xml文件数据读取
查看>>
枚举的使用
查看>>
BZOJ 1531 二进制优化多重背包
查看>>
BZOJ 2324 (有上下界的)费用流
查看>>
jemter传参数为json格式
查看>>