使用Arduino以太网屏蔽在Web服务器上发出POST请求

时间:2013-05-10 14:10:28

标签: post webserver request arduino ethernet

首先,抱歉我的英语不好,我是法国人。 :)

好的,所以我的目标是定期向网络服务器发送温度数据。我在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"]) . '!';
?>

Arduino串口终端上的client.read()结果为5,证明POST请求和PHP部分正常工作。 但是,如果我在我的浏览器上访问网址:192.168.0.55/test.php,则只显示“Temperature =”。缺少值(5)。 因此,如果有人知道我如何直接在我的浏览器上显示该值,它对我有很大的帮助。

此致 纪尧姆

1 个答案:

答案 0 :(得分:1)

嗯,你做得不对,但这是整个http请求概念你没有做对,所以详细解释会很长。简而言之:

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

当你显示test.php页面时,在该请求期间没有发布数据(这不是你的arduino控制器发起的数据),所以没有什么可以展示的。你应该做的是查询数据库以显示上一步中存储的数据

编辑:

以下是您应该做的事情的一小步:

  1. 创建数据库表以存储数据。这会好的 存储温度,以及存储的日期,和 最终将来的一些“评论”领域
  2. 创建一个PhP脚本 处理POSTED数据并将其存储在数据库中
  3. 从一个非常基本的HTML表单请求该脚本:1 texbox with 您的arduino上的帖子变量的名称,1个按钮 提交。此表单将允许您测试您的PhP脚本
  4. 一旦你对它好,请从你的arduino提出同样的要求
  5. 从那里,如果一切顺利,你将能够存储发送的数据 从你的arduino到数据库。使用像PhPMyadmin这样的东西 你应该能够看到数据
  6. 写一个PhP脚本来阅读和 显示存储在数据库中的数据(也是一个非常基本的操作, 你会找到许多教程来做到这一点)