Pass chaingable string from void loop to another function - arduino-ide

I am making an app using MIT app inventor that sends data to ESP8266 ..I want to send the password and store it EEPROM .. it is a changable string.. every thing looks fine when I use RecieveData function ... but the changes must happen in void loop ..
how can i pass this SecondValue from void loop instead of RecieveData function
#include <ESP_EEPROM.h>
String PW ;
String SecondValue;
void setup() {
Serial.begin(115200);
Serial.println();
SecondValue ="0";
PW = "2" ;
EEPROM.begin(sizeof(512));
WritePassWordToEEPROM( 0 , PW );
boolean ok1 = EEPROM.commitReset();
Serial.println((ok1) ? "Commit (Reset) OK" : "Commit failed");
Serial.println("read");
Serial.println(EEPROM.read(0));
PutValueInMemory() ;
Serial.println("the stored value is that read :");
Serial.println(readStringFromEEPROM(0));
}
void loop()
{
// Iwant the string to be passed from here
//SecondValue ="MMMMMMMMMMM";
}
void RecieveData()
{
SecondValue = "MMMMMMMMMMMM" ;
}
void PutValueInMemory()
{
RecieveData() ;
if ( SecondValue != PW )
{
PW = SecondValue ;
}
WritePassWordToEEPROM(0, PW);
EEPROM.commitReset();
}
//save the password to eeprom .. function :
void WritePassWordToEEPROM( int address , String str){
byte len = str.length() ;
EEPROM.write( address , len ) ;
for ( int m = 0 ; m < len ; m++ )
{
EEPROM.write( address + 1 + m , str[m] ) ;
}
}
//Read from EEPROM
String readStringFromEEPROM(int address)
{
int len =EEPROM.read(address);
char data[len + 1];
for(int i =0 ; i < len ; i++ ){
data[i] =EEPROM.read(address + 1 + i ) ;
}
data[len] = '\0' ;
return String(data);
}

Related

use an int and params as an argument

-hi, i have this function:
public static void conversion(int number ,params int [] tab)
-i tried to do the division of the number on each int in tab and put the results of each division in an arraylist then reverse it after that i put in a string
it didn't work
-i tried it like this
public static string Conversion(int number,params int [] tab)
{ ArrayList nbr = new ArrayList();
string Sconversion = string.Empty;
int b;
b = number;
for (int i=0;i<tab.Length;i++)
{
int reste;
do
{
reste = number % tab[i];
number = number / tab[i];
nbr.Add(reste);
} while (number != 0);
nbr.Reverse();
number = b;
for(int j = 0; j < nbr.Count ; j++) {
Sconversion += nbr[j];
}
}

How can I get a variable in C to be used in a MySQL Query

I have a temperature sensor hooked up to a Raspberry Pi, I am able to read and printf the temperature. What I am trying to do next is to get the values from the sensor and have them get logged into a MySQL database.
Everything works, except, I can not figure out how to format the MySQL insert Query to use the f variable and the h variable that is generated by the read_dht_data() function and pass it to the MIA_temp_insert(float f, float h).
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>
#include <wiringPi.h>
#include <stdint.h>
#define MAX_TIMINGS 85
#define DHT_PIN 3 /* GPIO-22 */
int data[5] = { 0, 0, 0, 0, 0 };
float temp_f;
static char *host = "XXX.XXX.XXX.XXX";
static char *user = "XXX";
static char *password = "XXX";
static char *dbname = "XXX";
unsigned int port = 3306;
static char *unix_socket = NULL;
unsigned int flag = 0;
static MYSQL *conn; //Needed to be static so all of the functions can draw from it
void MIA_mysql_connection()
{
// Connecting to the Database
conn = mysql_init(NULL);
if (!(mysql_real_connect(conn, host, user, password, dbname, port, unix_socket, flag)))
{
fprintf(stderr, "\n Error: %s [%d] \n", mysql_error(conn),mysql_errno(conn));
exit (1);
}
//Connected
printf ("We Are Connected \n");
}
void MIA_mysql_close()
{
//Closing Connection
mysql_close(conn);
}
void MIA_temp_insert(float f, float h)
{
//Inserting into MySQL Table
if(mysql_query(conn, "INSERT INTO `temperature` (`id`, `Date`,`Time`, `Temperature`, `Humidity`) VALUES (NULL, CURRENT_DATE(), CURRENT_TIME(), '%f' , '%f')") !=0)
{
fprintf(stderr, "%s\n", mysql_error(conn));
exit (-1);
} else {
printf("Rows were insert \n");
}
}
void read_dht_data()
{
uint8_t laststate = HIGH;
uint8_t counter = 0;
uint8_t j = 0, i;
data[0] = data[1] = data[2] = data[3] = data[4] = 0;
/* pull pin down for 18 milliseconds */
pinMode( DHT_PIN, OUTPUT );
digitalWrite( DHT_PIN, LOW );
delay( 18 );
/* prepare to read the pin */
pinMode( DHT_PIN, INPUT );
/* detect change and read data */
for ( i = 0; i < MAX_TIMINGS; i++ )
{
counter = 0;
while ( digitalRead( DHT_PIN ) == laststate )
{
counter++;
delayMicroseconds( 1 );
if ( counter == 255 )
{
break;
}
}
laststate = digitalRead( DHT_PIN );
if ( counter == 255 )
break;
/* ignore first 3 transitions */
if ( (i >= 4) && (i % 2 == 0) )
{
/* shove each bit into the storage bytes */
data[j / 8] <<= 1;
if ( counter > 16 )
data[j / 8] |= 1;
j++;
}
}
/*
* check we read 40 bits (8bit x 5 ) + verify checksum in the last byte
* print it out if data is good
*/
if ( (j >= 40) &&
(data[4] == ( (data[0] + data[1] + data[2] + data[3]) & 0xFF) ) )
{
float h = (float)((data[0] << 8) + data[1]) / 10;
if ( h > 100 )
{
h = data[0]; // for DHT11
}
float c = (float)(((data[2] & 0x7F) << 8) + data[3]) / 10;
if ( c > 125 )
{
c = data[2]; // for DHT11
}
if ( data[2] & 0x80 )
{
c = -c;
}
float f = c * 1.8f + 32;
//printf( "Humidity = %.1f %% Temperature = %.1f *C (%.1f *F)\n", h, c, f );
printf ("Temp of the room is : %.1f \n",f);
//Insert Data into MIA Temperature Table
MIA_temp_insert(10.0,11.1);
}else {
//printf( "Data not good, skip\n" );
}
}
int main ()
{
printf( "Raspberry Pi DHT11/DHT22 temperature/humidity test\n" );
if ( wiringPiSetup() == -1 )
exit( 1 );
while ( 1 )
{
MIA_mysql_connection();
read_dht_data();
delay (1000);
MIA_mysql_close();
printf("End of program \n");
}
return(0);
}
You cannot use printf()-style format specifiers in mysql_query() directly as you have above. Instead, you can use sprintf() or snprintf() to write the format string -- with the formatted numbers instead of format specifiers -- into a buffer... then pass that as your query string.
So in MIA_temp_insert(), instead of the following:
if(mysql_query(conn, "INSERT INTO `temperature` (`id`, `Date`,`Time`, `Temperature`, `Humidity`) VALUES (NULL, CURRENT_DATE(), CURRENT_TIME(), '%f' , '%f')") !=0)
{
fprintf(stderr, "%s\n", mysql_error(conn));
exit (-1);
/* ...etc... */
...you could try this:
/* Your original query string, with the %f specifiers */
const char *formatstring = "INSERT INTO `temperature` (`id`, `Date`,`Time`, `Temperature`, `Humidity`) VALUES (NULL, CURRENT_DATE(), CURRENT_TIME(), '%f' , '%f')";
/* snprintf() the query into a buffer, to fill in the numbers */
char buf[256]; // should be large enough for the query with the numbers filled in
if (snprintf(buf, sizeof(buf), formatstring, f, h) >= sizeof(buf))
{
exit(-1); // if snprintf() returned sizeof(buf) or more, buf was too short
}
/* call mysql_query() with the formatted query from the buffer */
if (mysql_query(conn, buf) != 0)
{
fprintf(stderr, "%s\n", mysql_error(conn));
exit (-1);
/* ...etc... */

Pass stream to function

vector<bool> retroswap (vector<bool> v)
{
reverse(v.begin(), v.end()) ;
for (int i = 0 ; i < v.size() ; i++)
{
if (v[i] == 0)
{
v[i] = 1 ;
} else {
v[i] = 0 ;
}
}
v.insert(v.begin(), 1) ;
return v ;
}
// Overloading the + operator
vector<bool> operator+ (vector<bool> gds, vector<bool> rs)
{
for (int i = 0 ; i < rs.size() ; i++)
{
gds.push_back(rs[i]) ;
}
return gds ;
}
ostream& operator<< (ostream& out, vector<bool> v)
{
for (int i = 0 ; i < v.size() ; i++)
{
out << v[i] << endl ;
}
return out ;
}
vector<bool> generate_dragon_sequence (vector<bool> v, int n, ostream& out)
{
if (n==1)
{
return v ;
}
vector<bool> rs = retroswap(generate_dragon_sequence(v, n-1, out)) ;
out << generate_dragon_sequence(v, n-1, out) + rs ;
return generate_dragon_sequence(v, n-1, out) + rs ;
}
Above is my code that i am doing for my school project. I have a question regarding passing ostream objects to functions. I am constructing a recursive function which generates larger and larger vectors according to an algorithm. All I want to do is to output the final vector product using the stream object
Hence, in int main(), if I were to write generate_dragon_function(v, n, cout), it will output the final vector to the console.
I was wondering how I could do it? Thank you so much guys!

trouble getting JWT for a server to server application in C

I have trouble getting a JWT for a server to server application.
With the following command
openssl pkcs12 -in mypkcs12-private.p12 -out privateKey.pem.
Following the doc /docs/OAuth2ServiceAccount,
I encoded my header
{"alg":"RS256","typ":"JWT"}
and my claim
{"iss":"******#developer.gserviceaccount.com","scope":"https://www.googleapis.com/auth/drive.file,"aud":"https://accounts.google.com/o/oauth2/token","exp":1401710837,"iat":1401707237}
in base64. so I created the base64 encoded signature using (b64header.b64claim), my private key and HMAC function. When I request the token using curl, I get an invalid_grant error. I tried many things but I don't know where the issue is.
here is the code
static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
size_t realsize = size * nmemb;
MemoryStruct *mem = (MemoryStruct *)userp;
mem->memory = realloc(mem->memory, mem->size + realsize + 1);
if(mem->memory == NULL) {
/* out of memory! */
printf("not enough memory (realloc returned NULL)\n");
return 0;
}
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
char *base64encode(const char *normal, size_t length)
{
BIO *bmem, *b64;
BUF_MEM *bptr;
char *buff = NULL;
b64 = BIO_new(BIO_f_base64());
bmem = BIO_new(BIO_s_mem());
b64 = BIO_push(b64, bmem);
BIO_write(b64, normal, (int) length);
if (BIO_flush(b64) != 1) {
return NULL;
}
BIO_get_mem_ptr(b64, &bptr);
buff = (char *) malloc(bptr->length);
memcpy(buff, bptr->data, bptr->length-1);
buff[bptr->length - 1] = 0;
BIO_free_all(b64);
b64 = NULL;
return buff;
}
char * createClaimSet(char * address)
{
char * output = NULL;
char claim_format[] = "{\"iss\":\"%s\",\"scope\":\"https://www.googleapis.com/auth/drive.file\",\"aud\":\"https://accounts.google.com/o/oauth2/token\",\"exp\":%ld,\"iat\":%ld}";
size_t len_address = 0;
size_t size = 0;
time_t iat;
time_t exp;
time(&iat);
exp = iat + 3600;
if (address) len_address = strlen(address);
size = strlen(claim_format);
output = (char*) calloc(len_address + size - 8 + 20 + 1, sizeof(char));
sprintf(output,claim_format, address, exp, iat);
printf(output);
return output;
}
char *b64HmacSha256fct(char *line, char * keyp12, size_t size)
{
char *Hmac64 = "";
const EVP_MD *evp_md = EVP_sha256();
unsigned char md[EVP_MAX_MD_SIZE];
unsigned int md_len;
// HMAC
HMAC(evp_md, keyp12, (int)size, (const unsigned char*) line, strlen(line), md, &md_len);
Hmac64=base64encode(md, md_len);
return Hmac64;
}
int AuthServiceAccount(CURL *curl)
{
char * b64_claim_set = NULL;
char * claim_set = NULL;
char * header64 = NULL;
char * JWT = NULL;
char * toSign = NULL;
char * sig64 = NULL;
char * str = NULL;
char * data = NULL;
char * privateKey = NULL;
char grant[] = "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer";
char uri[] = "https://accounts.google.com/o/oauth2/token";
char header[] = "{\"alg\":\"RS256\",\"typ\":\"JWT\"}";
char emailAddress[] = "xxxxxx#developer.gserviceaccount.com";
char PKCS12_FILE_PATH[] = "C:\\temp\\mykey.key";
FILE * pInputP12Name = NULL;
int i = 0;
int j = 0;
MemoryStruct writeMemory;
size_t fileP12size = 0;
size_t lclaim64 = 0;
size_t lclaimSet = 0;
size_t lheader64 = 0;
size_t lstr = 0;
size_t resultat;
header64 = base64encode(header, strlen(header));
if (header64) lheader64 = strlen(header64);
claim_set = createClaimSet(emailAddress);
if (claim_set) lclaimSet = strlen(claim_set);
b64_claim_set = base64encode(claim_set, lclaimSet);
if (b64_claim_set) lclaim64 = strlen(b64_claim_set);
str = (char*) calloc(lclaim64+1, sizeof(char));
if (!str) return 1;
for (i=0; i<lclaim64; i++) {
if (isprint(b64_claim_set[i])) {
str[j] = b64_claim_set[i];
j++;
}
}
str[j] = '\0';
if (str) lstr = strlen(str);
toSign = (char*) calloc(lheader64 + 1 + lstr + 1, sizeof(char));
if (!toSign) return 1;
sprintf(toSign,"%s.%s",header64,str);
pInputP12Name = fopen (PKCS12_FILE_PATH,"rb");
if (pInputP12Name==NULL) {
perror ("Error opening file");
return (-1);
}
else
{
resultat = _fseeki64(pInputP12Name, 0, SEEK_END);
fileP12size= (size_t) ftell(pInputP12Name);
rewind(pInputP12Name);
privateKey = (char *) calloc(fileP12size+1, sizeof(char));
resultat = fread (privateKey,sizeof(char),fileP12size,pInputP12Name);
fclose (pInputP12Name);
}
sig64 = b64HmacSha256fct(toSign,privateKey,fileP12size);
if (!sig64) return 1;
JWT = (char *) calloc(strlen(toSign) + 1 + strlen(sig64) + 1, sizeof(char));
sprintf(JWT,"%s.%s", toSign, sig64);
if (curl) {
FILE* pfile = NULL;
size_t size = 0;
memset(&writeMemory,'\0',sizeof(MemoryStruct));
size = strlen(grant)+strlen("&assertion=")+strlen(JWT);
data = (char *) calloc(size+1, sizeof(char));
if (!data) return 1;
sprintf(data,"%s&assertion=%s", grant, JWT);
curl_easy_reset(curl);
curl_easy_setopt( curl, CURLOPT_URL, uri );
curl_easy_setopt( curl, CURLOPT_PORT , 443 );
curl_easy_setopt( curl, CURLOPT_POST, 1 );
curl_easy_setopt( curl, CURLOPT_POSTFIELDS, data);
curl_easy_setopt( curl, CURLOPT_POSTFIELDSIZE, strlen(data));
curl_easy_setopt( curl, CURLOPT_HEADER, 1 );
curl_easy_setopt( curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt( curl, CURLOPT_WRITEDATA, &writeMemory);
curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_easy_setopt( curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt( curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_perform(curl);
printf("%s",writeMemory.memory);
}
return 0;
}
int main(void)
{
CURL *curl;
curl_version_info_data *CurlVers;
CurlVers = curl_version_info( CURLVERSION_NOW );
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
AuthServiceAccount(curl);
/* always cleanup */
curl_easy_cleanup(curl);
curl_global_cleanup();
exit(0);
}
The documentation states that you must use base64url encoding, which is a variant of base64 encoded that uses URL-safe characters.

How to separate result values in different rows using Mysql query

I created this table (results) in my sql database (test)
CREATE DATABASE `test`;
USE `test`;
CREATE TABLE `results` (
`number` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`id_machine` int(10) unsigned NOT NULL,
`value` float NOT NULL,
`datetime` datetime NOT NULL,
PRIMARY KEY (`number`),
UNIQUE KEY `indice_UNIQUE` (`number`)
) ENGINE=InnoDB AUTO_INCREMENT=100;
My external device gives me these results:
+DATA: 43 BYTES FROM 0000:0000 (045)
Machine_8: (T=22.22, HR=42.56, Dw=8.95, VCC=3.64V)
and with the usage of strtok I get some values of these results to save them in the database:
Results: 8, 22.22, 42.56, 8.95, 3.64
I would like to save my data in my table in this way:
101, 8, 22.22, 2013-06-05 14:03:00
102, 8, 42.56, 2013-06-05 14:03:00
103, 8, 8.95, 2013-06-05 14:03:00
104, 8, 3.64, 2013-06-05 14:03:00
This is my code in my function until now
int learn_port2(int fd)
{
MYSQL *conn;
MYSQL_RES *res;
MYSQL_RES *res1;
MYSQL_ROW row;
char *server = "127.0.0.1";
char *user = "root";
char *password = "***"; // got tot keep my data secret
char *database = "test";
conn = mysql_init(NULL);
if(!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0))
{
fprintf(stderr, "%s\n", mysql_error(conn));
return -1;
//finish_with_error(conn);
}
int n, i;
char buff[300];
memset(buff, 0, sizeof(buff));
for (int x = 0; x<1; x++)
//for (;;)
{
char id_machine[35] = "";
char temp[35] = "";
char hum[35] = "";
char dw[35] = "";
char vol[45] = "";
char* ptr;
int i,nodo,nodo1;
float temp, hum, dw, vcc;
n=read(fd,buff,sizeof(buff));
sleep(1);
printf("%s", buff);
printf("\n");
if (buff[37] == 'N' || buff[38] == 'N' || buff[39] == 'N' || buff[40] == 'N' )
{
ptr = strtok(buff, "Machine_,=T:HR:DW:Vcc()");
i = 0;
while (ptr != NULL)
{
if (i == 9)
strcat(id_machine, ptr); // copies Nodo
if (i == 10)
strcat(temp, ptr); // copies T
if (i == 11)
strcat(hum, ptr); // copies HR
if (i == 13)
strcat(dw, ptr); // copies DW
if (i == 15)
strcat(vol, ptr); // copies Vcc
ptr = strtok(NULL, "Machine_,=T:HR:DW:Vcc()");
i++;
}
printf("Results: %s, %s, %s, %s, %s\n", id_machine, temp, hum, dw, vol);
}
char query[]="INSERT INTO results(`id_machine`,`value`,`valor`) VALUES(id_machine,'14',value)";
if(mysql_query(conn, query))
{
fprintf(stderr, "%s\n", mysql_error(conn));
return -1;
}
res = mysql_use_result(conn);
}
}
How can I modify the char query[] to have the results which I want? Or if there are some examples like this.
To make a parameterized query you could use something like the following...
The example uses vsnprintf() to take a printf like format string and a variable number of arguments after it to print the query into a temporary buffer and then pass the buffer to the MYSQL query. In this way you can get a paramaterized query...
vsnprintf() accepts a variable parameter list, va_list and also is buffer-overflow safe.
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#define BUFSTRLEN 255
/* Returns -1 if the internal buffer was not large enough to hold the formatted
* string, or a format error occurred. If neither condition occurred then the
* result of the MYSQL query is returned... */
int DoMysqlQuery(MYSQL *conn, char const *printfstring, ...)
{
int len;
va_list args;
char buffer[BUFSTRLEN + 1];
memset(buffer, '\0', sizeof(buffer));
va_start(args, printfstring);
len = vsnprintf(buffer, BUFSTRLEN, printfstring, args);
va_end(args);
/* Did the buffer print work ? */
if( len < 0 || len >= BUFSTRLEN + 1 )
return -1;
return mysql_query(conn, buffer);
}
int main(int argc, char const *argv[])
{
int result;
MYSQL mysqlConn = ...;
/* Example stuff to send to the function.... */
char *id_machine= "8";
char *value= "1234";
char *valor= "1";
/* Send the query */
result = DoMysqlQuery(
&mysqlConn,
"INSERT INTO results(`id_machine`,`value`,`valor`) VALUES(%s,'%s',%s);",
id_machine, value, valor);
if( result )
{
/* handle error etc... *.
}
}
In this example, the query string that will be sent to mysql_query() is:
INSERT INTO results(id_machine,value,valor) VALUES(8,'1234',1);
Hope this helps :)