Bonjour et encore merci.
Voilà, j'ai mon code mais ily a des bug, probablement en terme de formatage.
D'abord voici comment j'ai modifié ma la librairie Adfruit_Fona.
(NB: Mon code compile bien
)
Dans mon fichier Adafruit_fona.h, j'ai ajouté ceci:
// Ubidots
#define SERVER "translate.ubidots.com"
#define PORT "9010"
#define USER_AGENT "FONA"
#define VERSION "2.0"
#define MAX_VALUES 5
typedef struct Value {
char *varName;
char *ctext;
float varValue;
} Value;
et encore ceci:
private:
// Ubidots
char* _dsName;
char* _dsTag;
uint8_t currentValue;
Value * val;
et finalement encore ceci
void ubidotsAdd(char *variable_id, float value, char *ctext1 = NULL);
boolean ubidotsSendAll(char* token, char* server = SERVER);
Dans mon fichier Adafruit_Fona.ccp, j'ai ajouté ceci dans le constructuer
Adafruit_FONA::Adafruit_FONA(int8_t rst)
{
_rstpin = rst;
apn = F("FONAnet");
apnusername = 0;
apnpassword = 0;
mySerial = 0;
httpsredirect = false;
useragent = F("FONA");
ok_reply = F("OK");
/*
* Ubidots
*/
_dsName = NULL;
_dsTag = "FONA";
currentValue = 0;
val = (Value *)malloc(MAX_VALUES*sizeof(Value));
}
puis en bas de ce fichier j'ai finallement ajouté ceci:
/*
* UBIDOT
*/
void Adafruit_FONA::ubidotsAdd(char *variable_id, float value, char *ctext1) {
Serial.print(F("Ubidots: "));
Serial.print(variable_id);
Serial.print(F(", ")); Serial.print(value);
Serial.print(F(", ")); Serial.println(ctext1);
(val+currentValue)->varName = variable_id;
(val+currentValue)->ctext = ctext1;
(val+currentValue)->varValue = value;
currentValue++;
if (currentValue > MAX_VALUES) {
currentValue = MAX_VALUES;
}
}
boolean Adafruit_FONA::ubidotsSendAll(char* token, char* server){
int i;
char alls[255];
char tmp[255];
// String all;
// String str;
/*
all = USER_AGENT;
all += "/";
all += VERSION;
all += "|POST|";
all += token;
all += "|";
all += _dsTag;
*/
if (_dsName != NULL) {
//all += ":";
//all += _dsName;
sprintf(alls,"%s%s%s%s%s%s%s=>",USER_AGENT,"/",VERSION,"|POST|",token,"|",_dsTag,_dsName);
}
// all += "=>";
sprintf(alls,"%s%s%s%s%s%s%s=>",USER_AGENT,"/",VERSION,"|POST|",token,"|",_dsTag,_dsName);
Serial.print(F("ALLS: ")); Serial.println(alls);
Serial.print(F("VAR: "));
// Dessous je dois encore trouver comment faire pour encapsuler ceci dans le tmp ou alls
for (i = 0; i < currentValue; ) {
// str = String(((val + i)->varValue), 2); // Ici je dois trouver comment convertir de uint8_t en char, mais printf pourrais m'aider
//Serial.print(((val + i)->varValue), 2);
//all += String((val + i)->varName); // Ici, je mets le résultat dans tmp
Serial.print((val + i)->varName);
Serial.print(":");
//all += ":";
//all += str;
Serial.print(((val + i)->varValue), 2);
if ((val + i)->ctext != NULL) {
//all += "$";
Serial.print("$");
//all += String((val + i)->ctext);
Serial.print((val + i)->ctext);
}
i++;
if (i >= currentValue) {
break;
} else {
//all += ",";
Serial.print(",");
}
}
// all += "|end";
Serial.print("|end");
// Serial.println(all.c_str());
}
Dans mon sketch, j'ai ces ligne qui font appel a ubidotsAdd() pour mettre dans constructeur les variable et valeurs à envoyer (je ne met pas les valeurs des variable, ca fonctionne bien)
fona.ubidotsAdd("imei", 123, imei);
fona.ubidotsAdd("valid", 1);
fona.ubidotsAdd("latitude", latitude);
fona.ubidotsAdd("longitude", longitude);
fona.ubidotsAdd("battery", battery);
fona.ubidotsAdd("localisation",0, "GSM");
fona.ubidotsAdd("tower", 0, celltower0);
fona.ubidotsAdd("timestamp", 0, timestamp);
Serial.println(F("Sending to Ubidots"));
fona.ubidotsSendAll(TOKEN);
Ca semble relativement fonctionner. Du moins, ubidotsAdd() semble bien sauver les valeurs, sauf pour les trois dernières. A encore vérifier.
A noter que le deuxième paramettes de ubidotsAdd() doit etre un float. Etant donné que celltower0 et timestamp ne soit pas des float (contrairement aux autre) mais des char, je les passe dans le troisème parametre. Mais il semble qu'elles n'ont pas été sauvées. Je verrai ca plus tard, pourquoi?
Voici ce que m'affiche le terminal et je viendrai sur la problématique que je vois actuellement.
Sending to Ubidots
ALLS: FONA/2.0|POST|tTPyJRD21PsM0q|FONA=>
VAR: imei:123.00$8650670207500000,valid:0.00,latitude:46.22,longitude:6.14,speed:0.00|end
Ce que je constate, c'est que ALLS m'affihe un résultat qui me semble est correct.
Pour rappel, c'est cette partie de ubidotsSendAll(TOKEN):
int i;
char alls[255];
char tmp[255];
// String all;
// String str;
/*
all = USER_AGENT;
all += "/";
all += VERSION;
all += "|POST|";
all += token;
all += "|";
all += _dsTag;
*/
if (_dsName != NULL) {
//all += ":";
//all += _dsName;
sprintf(alls,"%s%s%s%s%s%s%s=>",USER_AGENT,"/",VERSION,"|POST|",token,"|",_dsTag,_dsName);
}
// all += "=>";
sprintf(alls,"%s%s%s%s%s%s%s=>",USER_AGENT,"/",VERSION,"|POST|",token,"|",_dsTag,_dsName);
Serial.print(F("ALLS: ")); Serial.println(alls);
Parcontre l'extraction de valeurs enregistré dans la Structure, me semble voler en kakaouette :o) et c'est cette partie ou j'ai mis des Serial.print() pour voir au moin ce que m'affiche, approximativement la boucle
Serial.print(F("VAR: "));
// Dessous je dois encore trouver comment faire pour encapsuler ceci dans le tmp ou alls
for (i = 0; i < currentValue; ) {
// str = String(((val + i)->varValue), 2); // Ici je dois trouver comment convertir de uint8_t en char, mais printf pourrais m'aider
//Serial.print(((val + i)->varValue), 2);
//all += String((val + i)->varName); // Ici, je mets le résultat dans tmp
Serial.print((val + i)->varName);
Serial.print(":");
//all += ":";
//all += str;
Serial.print(((val + i)->varValue), 2);
if ((val + i)->ctext != NULL) {
//all += "$";
Serial.print("$");
//all += String((val + i)->ctext);
Serial.print((val + i)->ctext);
}
i++;
if (i >= currentValue) {
break;
} else {
//all += ",";
Serial.print(",");
}
}
// all += "|end";
Serial.print("|end");
Et c'est sur cette partie que je nage. J'essaye donc que le résultat doit empiler dans 'alls' qui est de type char, à la place de 'all', qui est de type String.
Et d'empiler les résultat de 'tmp' qui est de type char, à la place de 'str' qui est de type String.
Et c'est là dessus, ou j'aimerais bien un coup de pource.
Le format final, je ne le sais pas, car c'est la premiere fois que je fais ceci mais je pense qu'il doit etre proche de
imei:123.00$865067020750000,valid:0.00,latitude:46.22,longitude:6.14,speed:0.00|end
saud que là il manque 'localisation', 'tower','timestamp'
Je pense que si on arrive bien refaire cette boucle, j'arriverais à aller chercher les problème suivant.
Miles et miles merci pour vos aides!!!!!
(J'espère avoir bien fourni les informations nécessaires)