2013-05-10 138 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