2016-02-21 166 views
0

我試圖發送多個數據到使用Ethercard庫的網絡服務器,但出於任何原因,一次只能發送一個數據。使用Ethercad從Arduino發送數據到網絡服務器lib

這裏是我使用的代碼:

#include <enc28j60.h> 
#include <EtherCard.h> 
#include <net.h> 

#define HTTP_HEADER_OFFSET 163 
#define MAX_STRINGS 100 
#define MAX_STRING_LENGTH 8 


/* Setup for Ethernet Library */ 
static byte mymac[] = { 0x74, 0x69, 0x69, 0x2D, 0x30, 0x31 }; 
const char website[] PROGMEM = "www.arksecurity.net16.net"; 
const char device[] = "0004"; 
char test[MAX_STRINGS][MAX_STRING_LENGTH+1]; 
unsigned long timer; 
unsigned long tempo = 5000; 
String register[20]; 
unsigned int sentOK = 0; 
char* localID[MAX_STRINGS]; 
int countRegister = 2; 
//int countRegister = 1; 
int countID; 

byte Ethernet::buffer[700]; 


void setup() 
{ 
    Serial.begin(57600); 
    register[0] = "empty"; 

    if (!ether.begin(sizeof Ethernet::buffer, mymac, 53)) 
    { 
    Serial.println("Failed to access Ethernet controller"); 
    while(1); 
    } 
    else 
    Serial.println("Ethernet controller initialized"); 
    Serial.println(); 

    if (!ether.dhcpSetup()) 
    { 
    Serial.println("Failed to get configuration from DHCP"); 
    while(1); 
    } 
    else 
    Serial.println("DHCP configuration done"); 

    if (!ether.dnsLookup(website)) 
    { 
    Serial.println("DNS failed"); 
    while(1); 
    } 
    else 
    Serial.println("DNS resolution done"); 

    ether.printIp("SRV IP:\t", ether.hisip); 
    Serial.println(); 

    timer = millis() - tempo; 
} 

void loop() 
{ 

    char tempRegister[80]; 

    ether.packetLoop(ether.packetReceive()); 

    if (millis() - timer > tempo) 
    { 
    timer += tempo; 
    ether.browseUrl(PSTR("/DevicesQuery.php?device="), device , website, response_callback); 


    if(test[0][0] != 0) 
    { 
     int missing = 0;  
     Serial.println("Data Received"); 

     for(int i = 0; i < countID ; i++) 
     { 
     for(int x = 0; x < 8 ; x++) 
     { 
      if (test[i][x] == '\0') 
      { 
      missing = 1;    
      } 
     } 
     } 

     if(missing) 
     { 
     Serial.println("Data Missing"); 
     tempo = 5000; 
     } 
     else 
     { 
     for(int g; g < countID ; g++) 
     { 
      register[g] = String(test[g]); 
     } 
     tempo = 40000; 
     } 
    }  
    else{ 
     Serial.println("Waiting for server response..."); 
     tempo = 5000; 
    } 


    //register[0] = "?ID=1234"; 
    //register[1] = "?ID=5678"; 

    if(register[0] != "empty") 
    { 
     for(int i = 0; i < countRegister ; i++) 
     { 
     register[i].toCharArray(tempRegister, 80); 
     //delay(5000); 
     //Serial.println(tempRegister); 
     ether.browseUrl(PSTR("/log.php"), tempRegister , website, browser_callback); 
     //while(sentOK == 0);  
     //sentOK = 0; 
     } 
     countRegister = 0; 
     register[0] = "empty"; 
    } 
    } 
} 


static void response_callback (byte status, word off, word len) { 
    for(int i=0;i<MAX_STRINGS;i++) 
     for(int j=0;j<=MAX_STRING_LENGTH;j++) 
      test[i][j] = 0; 

    int i_string = 0; 
    int i_char = 0; 
    int i_ethBuff = off + HTTP_HEADER_OFFSET; 
    char carat; 
    countID = 0; 
    for (i_ethBuff = off + HTTP_HEADER_OFFSET; (carat = (char)Ethernet::buffer[i_ethBuff]) != 0; i_ethBuff++) 
    { 
     if (carat == '\n') 
     { // New line char = new string 
      if (i_string < MAX_STRINGS - 1){ 
       i_string++; 
       i_char = 0; 
       } 
      else 
       break; // Limite de memória do Arduino 
     } 
     else 
     { 
      if (i_char < MAX_STRING_LENGTH) 
      { 
       test[i_string][i_char] = carat; 
       i_char++; 
      } // otherwise discard the char (max length of string reached) 
     } 
    } 
} 


static void browser_callback (byte status, word off, word len) 
{ 
    Serial.println("Data sent"); 
    //sentOK = 1; 
} 

countRegister是一個變量,當它等於1,它的偉大工程,但是,如果他等於2,例如,他只發送了第二個數據到服務器並忽略第一個。任何人都知道爲什麼發生?現在,我強制註冊[0],註冊[1]的值,正如您在上面的代碼中看到的,但是想法是,稍後這個值來自外包。

+0

我不認爲這裏的PHP標籤是相關的。無論如何,首先檢查tempRegister是否包含你認爲它包含的內容。另外,嘗試在循環中添加一些休眠時間。我沒有這方面的經驗,但可能會有所幫助。 – aron9forever

+0

我認爲tempRegister工作良好,因爲它返回一個沒有問題,但我會使用serial.println後,它只是爲了確保。我還嘗試在register [i] .toCharArray(tempRegister,80)和ether.browserUrl(PTSR(「/ log.php」),tempRegister,browser_callback)之間添加延遲(3000),但它也不起作用。 –

+0

嘗試添加一個'Serial.println(tempRegister);'到循環中,以便您可以看到裏面的數據。你還需要解釋發生了什麼好一點,你說如果它循環兩次,它只發送第二塊數據。是否打印兩次「數據發送」,或只打印一次?您可能還想發佈您的PHP腳本,並解釋您是如何注意到它僅發送第二個數據。 – aron9forever

回答

0

它的缺點是browseurl異步工作。看看

http://forum.jeelabs.net/node/1477.html

+0

該死的......我正在嘗試修改他寫的代碼,但沒有運氣。這比我想象的要困難得多。 –

相關問題