2014-03-04 53 views
1

我們試圖使用官方的Arduino Wifi Shield將連續的數據流從Arduino Uno發送到網頁。 Arduino充當服務器,編寫網頁降價並從引腳發送數據。我們需要AJAX讓數據在不刷新頁面的情況下不斷更新 - 所以我們使用的是socket.io。我們可以將客戶端socket.io代碼寫入網頁,但我們也需要能夠在Arduino Uno上創建套接字。Arduino WebServer和socket.io

我們嘗試使用WebServer示例,但失敗了。任何幫助,將不勝感激。

基地socket.io以下代碼:

client.println("HTTP/1.1 200 OK"); 
client.println("Content-type:text/html"); 

client.println(); 

//change updating 
client.print("<HEAD>"); 
client.print("<TITLE />3 Phase Relay</title>"); 
client.println("</head>"); 

client.println("<script src=\"/socket.io/socket.io.js\"></script>"); 
client.println("<script>"); 
client.println("var socket = io.connect('http://192.168.11.2');"); 
client.println("socket.on('news', function (data) {"); 
client.println("console.log(data);"); 
client.println("socket.emit('my other event', { my: 'data' });"); 
client.println("});"); 
client.println("</script>"); 

// the content of the HTTP response follows the header: 
client.print("Peak Voltage Reading: "); 
client.println(peak); 
client.print("Phase Time Reading: "); 
client.println(phasetime); 

回答

2

這裏是XY problem的一個典型的例子。你問到我上不一定是解決原來的問題的解決方案的幫助,沒有告訴更多關於你原來的問題是什麼?

因爲你的問題是,你讓你的問題一個錯誤的假設:

[...]我們需要AJAX有連續數據而無需刷新頁面更新 - 所以我們使用socket.io [...]

你想有不斷更新的數據,所以你要AJAX更新

。使用socket.io不是使用AJAX的結果,儘管它需要AJAX才能運行。但socket.io也需要長的輪詢套接字,我真的懷疑是在arduino網絡服務器中實現的,因爲它至少需要實現類似於select()這樣的事情,這不太可能發生在沒有概念的系統上一個文件描述符。我甚至沒有談論Arduino Uno的Atmega328只有2k內存的事實,這使得它很難爲多個長輪詢客戶端提供服務。

所以,如果你堅持使用socket.io,你可能想通過使用代理服務器來改變它的工作方式,使用代理服務器,你的arduino連接到併發送更新到,使用arduino socket.io client。儘管使用GET/POST參數將更新調用Web服務器頁面一樣簡單,但您必須運行一些服務器端代碼。最後,您可能更喜歡使用另一種模式來進行長輪詢,而不需要在您的AJAX請求中進行長輪詢。這樣做的最有效的方法是使用基於JSON輪詢通信技術,其基本原則是:帶時間戳索引在你的記憶被髮送

  • 緩衝器中的所有數據(RAM或外部);
    • 我會使用循環緩衝區,如果數據集可以變得非常大,我會使用外部閃存;
  • 當客戶端發送請求時,要求輸入最後更新(或0)的時間戳或ID;
  • 如果有更新:
    • 發回的JSON你要發送回
  • 其他

對於時間戳,只需使用日期因爲arduino已經開始了,但要小心,如果運行超過50天,它會溢出。它不應該是一個大問題,但仍然需要考慮。

Here您可以找到提供JSONP內容的Web服務器的實現。實現時間戳和數據緩衝區的處理仍然取決於您,它最適合您的需求。