httpPost gsmlib.org

Salve a tutti,
sto cercando di effettuare una POST verso un server privato tramite arduino in particolare con la shield di seed studio v.2 che monta un modulo SIM900 e la libreria gsmlib.org.
Funziona tutto ma non riesco a capire una cosa:
la funzione è cosi definita:

int InetGSM::httpPOST(const char* server, int port, const char* path, const char* parameters, char* result, int resultlength)
e la chiamo da arduino come segue:
inet.httpPOST("xxxxxxxxx.com", 80, "/addall", "&val1=100",result,50);
da notare che il parametro è definito in modo statico: "&val1=100" e funziona!!!!!
La DOMANDA è:
come faccio a renderlo dinamico?
La signature della funzione richiede un const char *??
Ho provato con String e non va, ho provato con dtostrf e sprintf ma niente.
Dove sbaglio? Può essere che non hanno previsto il passaggio di parametri variabili? Mi sembra strano!! Non capisco io!
Grazie a tutti.

Devi creare una stringa del C ovvero un array di char, null terminated, simbolo '\0', abbastanza grande da contenere parametro e valore:

char buf[12];
int valore=100;
....
snprintf(buf,12,"&val1=%d",valore);
inet.httpPOST("xxxxxxxxx.com", 80, "/addall", buf,result,50);

Ciao,
grazie mille funziona con i decimali ma non mi accetta i float in pratica questo, il %f

snprintf(param_buff,200,"&node_name=xbee&address=%s&h_s=%f",address,50.88);

Ho risolto cosi:

float hum=55.66;
char char_h[5];
dtostrf(hum, 2, 2, char_h);
snprintf(param_buff,200,"&node_name=xbee&address=%s&h_s=%s",address,char_h);

Ora mi chiedo, la soluzione è l'unica o c'è una via più "elegante"???Perchè non mi accetta i %f?
Stando al reference dovrebbe....
http://www.cplusplus.com/reference/cstdio/snprintf/

Grazie ancora!!

Si, per il C standard è corretto, ma nella snprintf e sprintf della libreria di Avr hanno "tolto" la gestione di %f perchè molto pesante.
Mi pare anche atof() è stata eliminata.
Per i float devi usare dtostrf() come hai fatto tu.

libreria di Avr

Certe volte mi sfugge che devo riferirmi a questa...
Comunque grazie ancora...

Scusa l'ulteriore quesito, ma non riesco a capire perchè stampa solo una parte, in pratica ho:

uint32_t address=0x403e0f30;
char address_ch[32]; //basterebbe 9 giusto?
itoa(address,address_ch,16);
Serial.println(address_ch);

Stampa solo f30!!
Perchè??
Anche in questo modo:
char address_ch[17];
uint32_t address=0x403e0f30;
snprintf(address_ch,17,"%x",address);
Serial.println(address_ch);

Vediamo se ci arrivi, la itoa() è definita così (vedi il primo parametro soprattutto) :

[color=#008000]char * itoa ( int value, char * str, int base );[/color]

È' un int (16 bit) mentre io "do in pasto" un 32bit! :disappointed_relieved:

Si. In teoria esiste la ltoa() (inizia con L minuscola) ma non sono sicuro ci sia in librerie base per gli Avr.

EDIT: si, c'e' anche se non è standard ISO
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga5a3fce5fbd20140584619ba9aed09f75