@ -0,0 +1,2 @@ | |||
#!/bin/bash | |||
g++ thingSpeak.cpp network/SocketClient.cpp -o thingSpeak |
@ -0,0 +1,23 @@ | |||
# Edit this file to introduce tasks to be run by cron. | |||
# | |||
# Each task to run has to be defined through a single line | |||
# indicating with different fields when the task will be run | |||
# and what command to run for the task | |||
# | |||
# To define the time you can provide concrete values for | |||
# minute (m), hour (h), day of month (dom), month (mon), | |||
# and day of week (dow) or use '*' in these fields (for 'any').# | |||
# Notice that tasks will be started based on the cron's system | |||
# daemon's notion of time and timezones. | |||
# | |||
# Output of the crontab jobs (including errors) is sent through | |||
# email to the user the crontab file belongs to (unless redirected). | |||
# | |||
# For example, you can run a backup of all your user accounts | |||
# at 5 a.m every week with: | |||
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ | |||
# | |||
# For more information see the manual pages of crontab(5) and cron(8) | |||
# | |||
# m h dom mon dow command | |||
*/30 * * * * ~/exploringBB/chp11/thingSpeak/thingSpeak > /dev/null 2>&1 |
@ -0,0 +1,72 @@ | |||
#include "SocketClient.h" | |||
#include <stdio.h> | |||
#include <string.h> | |||
#include <unistd.h> | |||
using namespace std; | |||
namespace exploringBB { | |||
SocketClient::SocketClient(std::string serverName, int portNumber) { | |||
this->socketfd = -1; | |||
this->server = NULL; | |||
this->serverName = serverName; | |||
this->portNumber = portNumber; | |||
this->isConnected = false; | |||
} | |||
int SocketClient::connectToServer(){ | |||
socketfd = socket(AF_INET, SOCK_STREAM, 0); | |||
if (socketfd < 0){ | |||
perror("Socket Client: error opening socket.\n"); | |||
return 1; | |||
} | |||
server = gethostbyname(serverName.data()); | |||
if (server == NULL) { | |||
perror("Socket Client: error - no such host.\n"); | |||
return 1; | |||
} | |||
bzero((char *) &serverAddress, sizeof(serverAddress)); | |||
serverAddress.sin_family = AF_INET; | |||
bcopy((char *)server->h_addr,(char *)&serverAddress.sin_addr.s_addr, server->h_length); | |||
serverAddress.sin_port = htons(portNumber); | |||
if (connect(socketfd, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0){ | |||
perror("Socket Client: error connecting to the server.\n"); | |||
return 1; | |||
} | |||
this->isConnected = true; | |||
return 0; | |||
} | |||
int SocketClient::send(std::string message){ | |||
const char *writeBuffer = message.data(); | |||
int length = message.length(); | |||
int n = write(this->socketfd, writeBuffer, length); | |||
if (n < 0){ | |||
perror("Socket Client: error writing to socket"); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
string SocketClient::receive(int size=1024){ | |||
char readBuffer[size]; | |||
int n = read(this->socketfd, readBuffer, sizeof(readBuffer)); | |||
if (n < 0){ | |||
perror("Socket Client: error reading from socket"); | |||
} | |||
return string(readBuffer); | |||
} | |||
int SocketClient::disconnectFromServer(){ | |||
this->isConnected = false; | |||
close(this->socketfd); | |||
return 0; | |||
} | |||
SocketClient::~SocketClient() { | |||
if (this->isConnected == true){ | |||
disconnectFromServer(); | |||
} | |||
} | |||
} |
@ -0,0 +1,33 @@ | |||
#ifndef SOCKETCLIENT_H_ | |||
#define SOCKETCLIENT_H_ | |||
#include <sys/socket.h> | |||
#include <sys/types.h> | |||
#include <netinet/in.h> | |||
#include <netdb.h> | |||
#include <string> | |||
namespace exploringBB { | |||
class SocketClient { | |||
private: | |||
int socketfd; | |||
struct sockaddr_in serverAddress; | |||
struct hostent *server; | |||
std::string serverName; | |||
int portNumber; | |||
bool isConnected; | |||
public: | |||
SocketClient(std::string serverName, int portNumber); | |||
virtual int connectToServer(); | |||
virtual int disconnectFromServer(); | |||
virtual int send(std::string message); | |||
virtual std::string receive(int size); | |||
bool isClientConnected() { return this->isConnected; } | |||
virtual ~SocketClient(); | |||
}; | |||
} | |||
#endif /* SOCKETCLIENT_H_ */ |
@ -0,0 +1,44 @@ | |||
#include <iostream> | |||
#include <sstream> | |||
#include <fstream> | |||
#include "network/SocketClient.h" | |||
#define ADC_PATH "/sys/bus/iio/devices/iio:device0/in_voltage" | |||
#define ADC 0 | |||
using namespace std; | |||
using namespace exploringBB; | |||
float getTemperature(int adc_value) { // from the TMP36 datasheet | |||
float cur_voltage = adc_value * (1.80f/4096.0f); // Vcc = 1.8V, 12-bit | |||
float diff_degreesC = (cur_voltage-0.75f)/0.01f; | |||
return (25.0f + diff_degreesC); | |||
} | |||
int readAnalog(int number){ | |||
stringstream ss; | |||
ss << ADC_PATH << number << "_raw"; | |||
fstream fs; | |||
fs.open(ss.str().c_str(), fstream::in); | |||
fs >> number; | |||
fs.close(); | |||
return number; | |||
} | |||
int main() { | |||
ostringstream head, data; | |||
cout << "Starting ThingSpeak Example" << endl; | |||
SocketClient sc("api.thingspeak.com",80); | |||
data << "field1=" << getTemperature(readAnalog(ADC)) << endl; | |||
cout << "Sending the temperature: " << getTemperature(readAnalog(ADC)) << endl; | |||
sc.connectToServer(); | |||
head << "POST /update HTTP/1.1\n" | |||
<< "Host: api.thingspeak.com\n" | |||
<< "Connection: close\n" | |||
<< "X-THINGSPEAKAPIKEY: Z7PNWRYKDEBRX5F7\n" | |||
<< "Content-Type: application/x-www-form-urlencoded\n" | |||
<< "Content-Length:" << string(data.str()).length() << "\n\n"; | |||
sc.send(string(head.str())); | |||
sc.send(string(data.str())); | |||
string rec = sc.receive(1024); | |||
cout << "[" << rec << "]" << endl; | |||
cout << "End of ThingSpeak Example" << endl; | |||
} |