Salve a tutti
mi scuso in anticipo per eventuali "castronerie" che posso aver scritto in C...ma purtroppo non sono molto ferrato in merito.
Spiego brevemente cosa devo fare e cosa faccio. Ho una tabella A dove è l'anagrafica di alcuni sensori, e altra tabella B dove scrivo per ogni sensore di A il valore in quel momento. Pertanto ho scritto inizialmente del codice che mi recupera ogni singolo sensore (non è altro che la costruzione di un link http) e poi altro codice che con un link http, recupera il valore del sensore.
Passo successivo è stato unire le due cose. Ovvero, faccio prima la query per recuperare gli http, che poi metto in un ciclo for che passa alla funzione insertDB(strWget,row[0]) la stringa http più etichetta per scrivere nel DB. Quest'ultima cosa non va.
Di seguito il codice:
listaSensori.c (recupera i sensori censiti)
#include <my_global.h>
#include <mysql.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*gcc wget_insert.c -o wget_insert $(mysql_config --libs --cflags) */
char* substring(char*, int, int);
void insertDB(char*, char*);
void finish_with_error(MYSQL *con)
{
fprintf(stderr, "%s\n", mysql_error(con));
mysql_close(con);
exit(1);
}
int main(int argc, char **argv)
{
MYSQL *con = mysql_init(NULL);
char strWget[100]; //wget rerupero valori
memset(strWget, 0, 100);
if (con == NULL)
{
fprintf(stderr, "mysql_init() failed\n");
exit(1);
}
if (mysql_real_connect(con, "192.168.5.201", "root", "paswd", "DB", 0, NULL, 0) == NULL)
{
finish_with_error(con);
}
//query che mi recupera la lista dei sensori
if (mysql_query(con, "select z.Label, s.IP, s.Sensore FROM Zone as z, AnagraficaSensori as s WHERE z.Area = s.Area"))
{
finish_with_error(con);
}
MYSQL_RES *result = mysql_store_result(con);
if (result == NULL)
{
finish_with_error(con);
}
MYSQL_ROW row; // la riga
int i = 0, j = 0, n_rows = 0;
n_rows = mysql_num_rows (result);
for (j = 0; j < n_rows; j++)
{
i = 0;
mysql_field_seek (result, 0); // sposta a inizio riga
row = mysql_fetch_row (result); // preleva i dati della riga
char strWget[100];
strcpy(strWget, "http:/""/");
strcat(strWget, row[1]);
strcat(strWget, "/");
strcat(strWget, row[2]);
strcat(strWget, ".html");
printf("%s\n",strWget); //stringa della wget
printf("numero riga: %i\n", j);
// insertDB(strWget,row[0]); //passo wget e label
memset(strWget, 0, 200);
}
mysql_free_result (result);
mysql_close(con);
exit(0);
}
void insertDB(char *sWget, char *label)
{
FILE *in;
char stringSS[20];
memset(stringSS, 0, 20);
char *temperatura, *umidita, *errSensore;
char *erroreTemp ="NO VALUE";
int ret;
char command[150];
sprintf(command, "/usr/bin/wget -q -O- %s",sWget);
printf("%s\n",command);
char StringaSQL[200];
memset(StringaSQL, 0, 200);
if (!(in = popen(command, "r")))
//if (!(in = popen("/usr/bin/wget -q -O- http://192.168.5.204/DS18B20_ext.html", "r")))
{
exit(1);
printf("exit popen");
}
fgets(stringSS, 20, in);
pclose(in);
printf("%s\n",stringSS);
errSensore = substring(stringSS, 1, 8);
//printf("%s\n", errSensore);
ret=strncmp(erroreTemp, errSensore,8);
//printf("%i\n",ret);
//verifico se e' presente sia T che U. Se 0 solo T, se 1 T e U
int count =0,i;
for(i=0;i<strlen(stringSS);i++)
{
if(stringSS[i] == '-')
count++;
}
printf("%i\n",count);
if (ret == 0)
{
printf("errore lettura sensore\n");
}
else
{
temperatura = substring(stringSS, 1, 5);
printf("%s\n", temperatura);
if (count == 1) //lo split comporta due token 0 e 1
{
umidita= substring(stringSS, 7, 5);
printf("%s\n", umidita);
}
MYSQL *con = mysql_init(NULL);
if (con == NULL)
{
fprintf(stderr, "mysql_init() failed\n");
exit(1);
}
if (mysql_real_connect(con, "192.168.5.201", "root", "passwd", "DB", 0, NULL, 0) == NULL)
{
finish_with_error(con);
}
if (count == 1)
{
sprintf(StringaSQL, "INSERT INTO TemperatureLOG (ID,Time,Zona,T,U) VALUES (NULL,CURRENT_TIMESTAMP,%s,%s,%s)", label, temperatura, umidita);
printf("insert1: %s\n",StringaSQL);
}
else
{
sprintf(StringaSQL, "INSERT INTO TemperatureLOG (ID,Time,Zona,T,U) VALUES (NULL,CURRENT_TIMESTAMP,%s,%s,'0')", label, temperatura);
printf("insert2: %s\n",StringaSQL);
}
mysql_query(con, StringaSQL);
/*
if (mysql_query(con, "SELECT * FROM TemperatureLOG order by Time DESC, ID ASC LIMIT 5"))
{
finish_with_error(con);
}
MYSQL_RES *result = mysql_store_result(con);
if (result == NULL)
{
finish_with_error(con);
}
int num_fields = mysql_num_fields(result);
MYSQL_ROW row;
while ((row = mysql_fetch_row(result)))
{
for(int i = 0; i < num_fields; i++)
{
printf("%s ", row[i] ? row[i] : "NULL");
}
printf("\n");
}
mysql_free_result(result); */
//mysql_close(con);
}
exit(0);
}
char *substring(char *string, int position, int length)
{
char *pointer;
int c;
pointer = malloc(length+1);
if (pointer == NULL)
{
printf("Unable to allocate memory.\n");
exit(1);
}
for (c = 0 ; c < length ; c++)
{
*(pointer+c) = *(string+position-1);
string++;
}
*(pointer+c) = '\0';
return pointer;
}
Output
root@raspberry:/var/www/script/script_c# ./listaSensori
http://192.168.5.203/DS18B20.html
numero riga: 0
http://192.168.5.203/DHT22.html
numero riga: 1
http://192.168.5.203/luce.html
numero riga: 2
http://192.168.5.204/DS18B20.html
numero riga: 3
http://192.168.5.204/DS18B20_ext.html
numero riga: 4
http://192.168.5.204/DHT22.html
numero riga: 5
http://192.168.5.202/DHT11.html
numero riga: 6