EtherCard ошибка HTTP/1.1 404 Not Found

gmel
Offline
Зарегистрирован: 14.05.2013

Помогите разобраться с проблемой

Задача: собирать показания датчиков и передавать на сервер

Скетч

#include <EtherCard.h>
#include "DHT.h"
#include <Wire.h>
#include <BMP085.h>

#define DHTPIN 8
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);
BMP085 dps = BMP085(); 

long pr = 0, al = 0, tm = 0;
unsigned long time1=0;

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];
static uint32_t timer;

char website[] PROGMEM = "192.168.1.110";
static byte hisip[] = {192,168,1,110};
boolean use_hisip = true; 

// ether.hisip[0] = 192; 
// ether.hisip[1] = 168; 
 //ether.hisip[2] = 1; 
// ether.hisip[3] = 110;

// called when the client request is complete
static void my_callback (byte status, word off, word len) {
  Serial.println(">>>");
  Ethernet::buffer[off+300] = 0;
  Serial.print((const char*) Ethernet::buffer + off);
  Serial.println("...");
}

void setup () {
  Serial.begin(57600);
  Wire.begin();
  Serial.println("\n[webClient]");
  dht.begin();
  dps.init(MODE_STANDARD, 19000, true);

   if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0) 
   Serial.println( "Failed to access Ethernet controller");
   if (!ether.dhcpSetup())
   Serial.println("DHCP failed");

    ether.printIp("IP:  ", ether.myip);
    ether.printIp("GW:  ", ether.gwip);  
    ether.printIp("DNS: ", ether.dnsip);  

    if (!ether.dnsLookup(website))
    Serial.println("DNS failed");
    ether.printIp("SRV: ", ether.hisip);
}

void loop () {
  ether.packetLoop(ether.packetReceive());
  
  if (millis() > timer) {
    timer = millis() + 3000;
    
    int t = dht.readTemperature();
    int h = dht.readHumidity();
    dps.getPressure(&pr);
    int p = pr/133.322368;
    dps.getAltitude(&al);
    int a = al/100;
    
    char buff[1];
    sprintf(buff, "?t=%d&h=%d&a=%d&p=%d", t, h, a, p);
    
    Serial.println();
    Serial.println(buff);
    Serial.print("<<< REQ ");
    ether.browseUrl(PSTR("/update.php"), buff, website, my_callback);
  }
}

При запуске получаю ошибку

?t=27&h=36&a=195&p=754
<<< REQ >>>
HTTP/1.1 404 Not Found
Connection: close
Content-Type: text/plain
Transfer-Encoding: chunked
 

Изменив в коде строчку

sprintf(buff, "?t=%d&h=%d&a=%d&p=%d", t, h, a, p);

на

sprintf(buff, "?t=%d&h=%d&a=%d", t, h, a);

все работает

Где ошибка? Как поправить?

ilya_dan
Offline
Зарегистрирован: 21.11.2011

Как минимум одна ошибка - в объявлении

 char buff[1];

Следующей строкой sprintf в этот буфер выводит явно больше одного символа, т.е. банально перетирает память, следующую за этой переменной. Надо вместо единицы указать реально необходимый размер буфера, подсчитав предварительно размер выводимой строки в байтах.

FYI: работающий пример скетча-сервера для EtherCard + DS18B20 можно посмотреть, например, здесь.