2013-05-10 140 views
1

首先,对不起我的英语不好,我是法语。 :)使用Arduino以太网盾对webserveur的POST请求

好的,所以我的目标是定期向Web服务器发送温度数据。我在Raspberry Pi计算机上使用LAMP服务器,温度由连接到以太网屏蔽层的Arduino板进行测量。为此,我在Arduino端设置了一个POST请求,将变量“temp”的值发送给服务器。

这部分似乎正常工作,因为client.read()函数的结果很好,并且与我在Raspberry Pi上托管的页面test.php的结果相匹配。

在这里你可以看到我的Arduino脚本:

#include <Ethernet.h> 
#include <SPI.h> 

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0xF6, 0xFF }; 
byte ip[] = { 192, 168, 0, 9}; 
byte gateway[] = { x,x,x,x };   

EthernetClient client; 

String temp= "data=5"; 

void setup() 
{ 
Ethernet.begin(mac, ip, gateway); 
Serial.begin(9600); 
Serial.println(Ethernet.localIP()); 
delay(1000); 
delay(1000); 
Serial.println("connecting..."); 

if (client.connect("192.168.0.55",80)) 
{         
Serial.println("Sending to Server: ");      
client.println("POST /test.php HTTP/1.1");   
Serial.print("POST /test.php HTTP/1.1");   
client.println("Host: 192.168.0.55"); 
client.println("Content-Type: application/x-www-form-urlencoded"); 
client.println("Connection: close"); 
client.println("User-Agent: Arduino/1.0"); 
client.print("Content-Length: "); 
client.println(temp.length()); 
client.println(); 
client.print(temp); 
client.println();           
} 

else 
{ 
Serial.println("Cannot connect to Server");    
} 

} 

void loop()           
{   
if (client.available()) { 
char c = client.read(); 
Serial.print(c); 
} 

if (!client.connected()) 
{ 
Serial.println(); 
Serial.println("disconnecting."); 
client.stop(); 
for(;;) 
    ; 
}        

} 

这是我的文件test.php的:

<?php 
echo 'Temperature = ' . htmlspecialchars($_POST["data"]) . '!'; 
?> 

client.read(的结果)Arduino的串行终端上为5 ,这证明POST请求和PHP部分正在工作。 但是,如果我通过url:192.168.0.55/test.php访问浏览器,则只会显示“Temperature =”。值(5)缺失。 所以如果有人知道如何直接在我的浏览器上显示值,它可以帮助我很多。

问候 纪尧姆

+0

如果重新感兴趣,可能是更容易使用的数据库,你可能想看看谷歌App Engine的数据存储。 Google App Engine现在也支持PHP。 [谷歌应用程序引擎(https://developers.google.com/appengine/) [PHP入门(https://developers.google.com/appengine/docs/php/gettingstarted/introduction) – 2013-06-23 14:48:07

回答

1

好了,你不这样做是正确的,但它就是你不对变得如此这将是相当长的,详细解释了整个http请求的概念。简而言之:

你的arduino正在向你的服务器发送一个POST请求。由于你没有指定页面,它的目标是默认页面,最有可能的是index.php。你应该做的是捕获POST数据并将其存储在某个地方,最可能是数据库,但它也可以是文件。

当您显示test.php页面时,在该请求期间(并非由您的arduino控制器启动的)没有发布数据,所以没有任何可显示的内容。你应该做的有查询数据库显示存储在上一步中的数据

编辑:

这里是你应该做的几个步骤:

  1. 创建数据库表来存储数据。这将是很好的 店外温度,同时也成为存储时的日期,并 最终为未来
  2. 一些“备注”字段创建一个PHP脚本 ,处理发布的数据,并将其存储在数据库中
  3. 从非常基本的HTML表单向该脚本发出请求:1个texbox,其中 是您的arduino上的帖子变量的名称,1个用于 提交的按钮。这种形式可以让你测试你的PHP脚本
  4. 一旦你确定它,从你的Arduino提出同样的要求
  5. 从那里,如果一切顺利的话,你就可以存储数据从发送 你的arduino进入数据库。使用类似phpMyAdmin的 你应该能够看到的数据
  6. 写存储在数据库中的PHP脚本读取和 显示数据(也相当的基本操作, 你会发现很多的教程做)
+0

谢谢您快速回答Bartude!因此,如果我在我的“test.php”文件中创建并设置了一个数据库(例如MySql或Sqlite),它将工作,我将能够显示数据? – 2013-05-10 14:28:06

+0

mmm ...你对PhP的了解究竟有多远?你有没有可能已经做了一些基本的操作,比如将表单中的数据保存到数据库中?因为它真的是一样的想法... – 2013-05-10 14:36:11

+0

不幸的是我是一个真正的PHP初学者。但如果你说这是正确的方向,我可以了解它。你认为我将不得不改变Arduino脚本,或者它只是PhP文件的问题? – 2013-05-10 14:50:56