@ -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; | |||||
} |