Recent Posts

Archive

Tags

Weekend IoT Project: Send a Tweet

The Weekend IoT Project blog series provides interesting and easy to follow evening or weekend projects for students, developers and IoT enthusiasts.

This blog will show you how to easily send a Tweet from virtually any IoT device, and should take less than an hour to complete (assuming you already have an IoT device and the pre-requisites are met). The examples below will provide code in the following languages: C++, Python and Node.js, and the IoT devices used are an Arduino-compatible chip (the MXChip), a Raspberry Pi, and the Matrix Creator hat.

Note: You can still follow most of the steps below without an actual IoT device if you are interested in learning how to tweet without an SDK. To do so, follow the Node.js instructions under the Matrix Creator section after you have configured Twitter and Enzo Online.

Pre-Requisites

  1. An IoT device that you can already program and deploy code to that is either an Arduino-compatible chip (ex: MXChip), a Raspberry Pi, or a Matrix Creator hat.

  2. An IoT device that can communicate to the Internet using the HTTP protocol

  3. A Twitter account

  4. An account with Enzo Online (sign up for free: http://portal.enzounified.com)

Create a Twitter Application

The first step is to create an Application registered with Twitter, so that the IoT device can tweet on your behalf. To create your Twitter application, visit https://apps.twitter.com/. Login with your Twitter account.

NOTE: Your Twitter profile must have a phone number specified; visit your settings on Twitter and add a mobile phone number before proceeding.

  1. Click on the button "Create New App"

  2. Enter a Name, Description, a website URL you own, and agree to the developer agreement terms. You do not need to specify a Callback URL.

  3. Click on Create Twitter Application

That's it! You have registered a new Application with Twitter; by default you can read from and write to your Twitter timeline. From the Application page click on Keys and Access Tokens then click on Create my Access Tokens at the bottom of the page. Copy the following information as you will need them later:

  • Consumer Key (API Key)

  • Consumer Secret (API Secret)

  • Access Token

  • Access Token Secret

Create an Enzo Twitter Configuration

The next step is to configure Enzo Online with the above Twitter secrets, so your IoT device can tweet through basic HTTP calls. Let's configure an Enzo Twitter Service:

  1. Login to Enzo Online (https://portal.enzounified.com)

  2. Click on the Twitter service on the left menu

  3. Click on the Create button

  4. In the name field, enter the configuration name (for example: twitterconfig)

  5. Select the Instance where the Enzo Twitter service will be running on

  6. In the remaining fields, enter the API Keys and Access Token information previously obtained from your Twitter application

  7. Click Save

NOTE: Sensitive information is stored encrypted in the Enzo Online service data store, and all communications take place over HTTPS for strong security.

At this point, the configuration of Twitter is complete; you can start sending tweets and search for tweets using simple HTTP commands.

Sending a Tweet from an Arduino Chip

The following code will send a Tweet using the C++ language, which is the language you need to use to program an Arduino or Arduino compatible board such as the MXChip. For a complete tutorial on how to program against the MXChip see my previous blog on How to Send Temperature Data to Azure Tables.

NOTE: The Arduino HTTP libraries may require the SSL public certificate, which is included below for convenience. Other languages do not require the certificate.

NOTE: Replace "ENZO_AUTH_ID" with your Enzo AuthToken as found on the Enzo Online Portal under Enzo Accounts.

include "http_client.h";

const char enzoAuthId[] = "ENZO_AUTH_ID";

const char configName[] = "twitterconfig";

const char enzoURI[] = "https://daas001.enzounified.com:49550/bsc/twitter/poststatus";

const char enzoCERT[] =

"-----BEGIN CERTIFICATE-----\r\nMIIFdzCCBF+gAwIBAgIQAX5ydW3JgcN8+u68lX4M2zANBgkqhkiG9w0BAQsFADBC\r\nMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMS\r\nUmFwaWRTU0wgU0hBMjU2IENBMB4XDTE3MDUxMTAwMDAwMFoXDTE4MDUxMTIzNTk1\r\nOVowHDEaMBgGA1UEAwwRKi5lbnpvdW5pZmllZC5jb20wggEiMA0GCSqGSIb3DQEB\r\nAQUAA4IBDwAwggEKAoIBAQCsiFzG45oBbw6XhFBcaQzXwDRZTmAo9J3r3koV5M8e\r\nyOtgVfD9H0Kq+gKLreiaGThVwqOunSYQaqGxpGDy4+7pBc1e5ysAstsAv38XQTxO\r\nBfe8Gaw/Yj8cDSb0JlmUmzYwHLaf0XBfiE9hqRCGwBlLuFTYsJohqAoTezpwHgC5\r\nkoeIx9kWpYvt3CbV/63YGHb0C0dUhGW8rEYZwFYoiwyvrD9wqvjVFxYb6BROVDfi\r\nRVjyqcqmAv0zoDwXfsSji22wEbz+XSMRjc0ymmlPxZ7ny+EhMclINRZvRCCdUELa\r\nJFEhc/sD8hg5gJUCG/GjbxcmdnRCLQs1dPfDuwIptaOpAgMBAAGjggKNMIICiTAt\r\nBgNVHREEJjAkghEqLmVuem91bmlmaWVkLmNvbYIPZW56b3VuaWZpZWQuY29tMAkG\r\nA1UdEwQCMAAwKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL2dwLnN5bWNiLmNvbS9n\r\ncC5jcmwwbwYDVR0gBGgwZjBkBgZngQwBAgEwWjAqBggrBgEFBQcCARYeaHR0cHM6\r\nLy93d3cucmFwaWRzc2wuY29tL2xlZ2FsMCwGCCsGAQUFBwICMCAMHmh0dHBzOi8v\r\nd3d3LnJhcGlkc3NsLmNvbS9sZWdhbDAfBgNVHSMEGDAWgBSXwidQnsLJ7AyIMsh8\r\nreKmAU/abzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG\r\nAQUFBwMCMFcGCCsGAQUFBwEBBEswSTAfBggrBgEFBQcwAYYTaHR0cDovL2dwLnN5\r\nbWNkLmNvbTAmBggrBgEFBQcwAoYaaHR0cDovL2dwLnN5bWNiLmNvbS9ncC5jcnQw\r\nggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdgDd6x0reg1PpiCLga2BaHB+Lo6dAdVc\r\niI09EcTNtuy+zAAAAVv4zhcwAAAEAwBHMEUCIQD7SFp1RI26gLAtLDZeradAPH5K\r\n0f4rhTLEYw/tbgBRXQIgfzzLX9L6tgujhd9rV9kI74ht2+iMYPeSnu0y3r704XcA\r\n"

"dgCkuQmQtBhYFIe7E6LMZ3AKPDWYBPkb37jjd80OyA3cEAAAAVv4zhdYAAAEAwBH\r\nMEUCIQD3n+NLpiApkkRzo1PfIPNdfZdrFGFFfce8MWm/UMh+bAIgSsVkFTxehdk0\r\nfxS97TybOi12YouP9uFEq1ujClK349MwDQYJKoZIhvcNAQELBQADggEBAJH8p5Bc\r\n72E6zOWf3tHytVxfTCD7zv5tpskYCuA1Any+EsC8QPgXvNG84GpBAvb0wEAVZ79W\r\nKn5qrGcj9+aVCBnP8A06M+91+ghNHegyeVm7/FIl8DWHHVWjP01dlJGdEWhYSHsS\r\nl7MFKZ6I8M8aJNVbz/qASm8cS0BctoXq5JnB4tJ4iDkY7Hu/gOBlFWXX6nV3y3b6\r\ncqhpSzaVjadmdGUIHPvEaVFt0r7rQzXF6Nfw3/Bkb4yyzCNge3TA57HiLySCPu0d\r\n5ZUEaJlePT1dVbHhp6JBVwk1i0i0XaqxMTyS0Bk4jYZ42EAUGMVdK9TCmceEKwPY\r\n/jTmOG01aSXp5As=\r\n-----END CERTIFICATE-----\r\n\r\n-----BEGIN CERTIFICATE-----\r\nMIIETTCCAzWgAwIBAgIDAjpxMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT\r\nMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i\r\nYWwgQ0EwHhcNMTMxMjExMjM0NTUxWhcNMjIwNTIwMjM0NTUxWjBCMQswCQYDVQQG\r\nEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSUmFwaWRTU0wg\r\nU0hBMjU2IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu1jBEgEu\r\nl9h9GKrIwuWF4hdsYC7JjTEFORoGmFbdVNcRjFlbPbFUrkshhTIWX1SG5tmx2GCJ\r\na1i+ctqgAEJ2sSdZTM3jutRc2aZ/uyt11UZEvexAXFm33Vmf8Wr3BvzWLxmKlRK6\r\nmsrVMNI4/Bk7WxU7NtBDTdFlodSLwWBBs9ZwF8w5wJwMoD23ESJOztmpetIqYpyg\r\nC04q18NhWoXdXBC5VD0tA/hJ8LySt7ecMcfpuKqCCwW5Mc0IW7siC/acjopVHHZD\r\ndvDibvDfqCl158ikh4tq8bsIyTYYZe5QQ7hdctUoOeFTPiUs2itP3YqeUFDgb5rE\r\n1RkmiQF1cwmbOwIDAQABo4IBSjCCAUYwHwYDVR0jBBgwFoAUwHqYaI2J+6sFZAwR\r\nfap9ZbjKzE4wHQYDVR0OBBYEFJfCJ1CewsnsDIgyyHyt4qYBT9pvMBIGA1UdEwEB\r\n/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMDYGA1UdHwQvMC0wK6ApoCeGJWh0\r\n"

"dHA6Ly9nMS5zeW1jYi5jb20vY3Jscy9ndGdsb2JhbC5jcmwwLwYIKwYBBQUHAQEE\r\nIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vZzIuc3ltY2IuY29tMEwGA1UdIARFMEMw\r\nQQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdlb3RydXN0\r\nLmNvbS9yZXNvdXJjZXMvY3BzMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTeW1h\r\nbnRlY1BLSS0xLTU2OTANBgkqhkiG9w0BAQsFAAOCAQEANevhiyBWlLp6vXmp9uP+\r\nbji0MsGj21hWID59xzqxZ2nVeRQb9vrsYPJ5zQoMYIp0TKOTKqDwUX/N6fmS/Zar\r\nRfViPT9gRlATPSATGC6URq7VIf5Dockj/lPEvxrYrDrK3maXI67T30pNcx9vMaJR\r\nBBZqAOv5jUOB8FChH6bKOvMoPF9RrNcKRXdLDlJiG9g4UaCSLT+Qbsh+QJ8gRhVd\r\n4FB84XavXu0R0y8TubglpK9YCa81tGJUheNI3rzSkHp6pIQNo0LyUcDUrVNlXWz4\r\nPx8G8k/Ll6BKWcZ40egDuYVtLLrhX7atKz4lecWLVtXjCYDqwSfC2Q7sRwrp0Mr8\r\n2A==\r\n-----END CERTIFICATE-----\r\n\r\n-----BEGIN CERTIFICATE-----\r\nMIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT\r\nMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i\r\nYWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG\r\nEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg\r\nR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9\r\n9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq\r\nfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv\r\niS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU\r\n1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+\r\nbw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW\r\nMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA\r\n"

"ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l\r\nuMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn\r\nZ57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS\r\ntQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF\r\nPseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un\r\nhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV\r\n5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==\r\n-----END CERTIFICATE-----\r\n";

// Method that sends a tweet

void sendTweet(const char * data)

{

char tweet[256]; // add the @enzo_unified tag

snprintf(tweet, 256, "%s @enzo_unified"

,data

);

HTTPClient client = HTTPClient(enzoCERT, HTTP_POST, enzoURI);

client.set_header("authToken", enzoAuthId);

client.set_header("_configName", configName);

client.set_header("status", tweet);

const Http_Response *response = client.send(NULL, 0);

}

void setup() {

// initialization code for the arduino board

}

int counter = 0;

void loop() {

// the main programming loop

// Send a single tweet

if (count == 0) {

sendTweet("Sending a tweet from an IoT device! ");

}

count++;

}

Sending a Tweet from a Raspberry Pi

In this section of the blog, you will send a tweet from a Raspberry Pi, using Python. If are not familiar with Python, check this introduction from the Raspberry Pi website: https://www.raspberrypi.org/documentation/usage/python

Python is a simple programming language that, like other languages, uses libraries to communicate through HTTP. Unlike the C++ libraries available on the Arduino, the HTTP libraries for Python do not require the certificate chain of the Enzo service.

NOTE: While we are sending an HTTP POST, we are not posting any data; the tweet content is provided as a header. However, you could also send the tweet as a data payload by specifying the Content-Type as application/x-www-form-urlencoded. See the Enzo Online documentation for more information.

import sys import urllib import urllib2 import requests

enzourl=”https://daas001.enzounified.com:49550/bsc/twitter/postStatus” enzoAuthId=”ENZO_AUTH_ID” configName=”twitterconfig”

headers={‘status’:'Sending a tweet using Python - @enzo_unified', ‘authToken’:enzoAuthId, ‘_configName’:configName, }

response=requests.post(enzourl,headers=headers, data = { })

As you can see above, sending a tweet using Python and Enzo Online is trivial; no SDK or special libraries are needed.

Sending a Tweet from the Matrix Creator

The Matrix Creator is a Raspberry Pi hat that requires special configuration; this blog assumes you can already program against the Matrix Creator and publish a Node.js application to the board. To download Node.js, follow this link.

The following code written in Node.js sends a single tweet through Enzo Online.

var request = require('request');

const enzoUrl = "https://daas001.enzounified.com:49550/bsc/twitter/poststatus";

var headers = {

'_configName': 'twitterConfig',

'authToken': 'ENZO_AUTH_ID',

'status': 'Sending a tweet from Matrix Creator - @enzo_unified' }

var options = {

url: enzoUrl,

method: 'POST',

headers: headers }

// FUNCTION: send a tweet

function sendTweet() {

request(options, function (error, response, body) {

if (!error && response.statusCode === 200) {

console.log('Tweet sent'); } else {

console.log('Status Code ERROR: ' + response.statusCode);

}

});

}

// Send the tweet now

sendTweet();

The above code sends a single tweet. You can run the above code directly from a Node.js console; I saved the code in a file called tweet.js:

Conclusion

This blog shows how to easily send a tweet from three programming languages: C++, Python and Node.js. This in turns allows you to easily tweet from a large number of IoT devices that can communicate through an internet connection.