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