Quantcast
Channel: Intel Developer Zone Articles
Viewing all articles
Browse latest Browse all 1201

Senden Sie SMS-Nachrichten mit Twilio* und Arduino* auf Intel® Edison

$
0
0

Einleitung

Intel® Edison ist die weltweit kleinste und energieeffizienteste Computing-Plattform für Wearable-Technologie wie das Internet der Dinge. Es handelt sich um eine Arduino*-zertifizierte Entwicklungs- und Prototyping-Platine. Der Arduino-Sketch auf Intel® Edison ist ein C++-Programm. Die Sensortechnologie liefert fortlaufend Echtzeitmessungen biometrischer Daten mit äußerst hoher Genauigkeit und Konsistenz. Sie können Intel® Edison zum Ablesen von Sensoren und zur Steuerung vieler Dinge innerhalb und außerhalb Ihres Hauses verwenden. Dieses Dokument zeigt ein Beispiel zum Ablesen des Temperatursensors und Senden von SMS-Nachrichten an Ihr Telefon mithilfe eines Twilio*-Kontos.

Mit Twilio können Softwareentwickler den Empfang und Versand von SMS- und MMS-Nachrichten auf Twilio-Telefonnummern programmieren. Sie können SMS- und MMS-Nachrichten mit der REST-API von Twilio senden, SMS-Gespräche nachverfolgen und SMS-Nachrichten während Telefongesprächen senden. In diesem Artikel befassen wir uns mit dem Versand von SMS-Nachrichten an Ihr Telefon über Twilio-Telefonnummern.

Inhalt:

Hardwarekomponenten

Die in diesem SMS-Nachrichtenprojekt verwendeten Hardwarekomponenten sind:

Einzelheiten zum Zusammenbau und zur Stromversorgung der Intel® Edison-Platine finden Sie unter https://software.intel.com/de-de/assembling-intel-edison-board-with-arduino-expansion-board.


Abbildung 1: Hardware-Diagramm

Download der Entwicklungsplatine

Besuchen Sie die Seite Intel® Edison Board Software Downloads, um die neuesten Treiber, Installationsprogramme, Firmware-Images und die Arduino-IDE herunterzuladen: https://software.intel.com/de-de/iot/hardware/edison/downloads

 

Herunterladen und Installieren der Twilio-Bibliothek

Laden Sie Twilio C++ über https://github.com/laurentluce/twilio-cplusplus herunter und entpacken Sie es in den Bibliothekenordner der Arduino-IDE unter C:\Arduino\arduino-1.5.3-Intel.1.0.4\libraries. Arduiono gestattet kein „-“ im Bibliothekenname. Benennen Sie daher twilio-cplusplus unbedingt in Twilio um.

Twilio library
Abbildung 2: Twilio-Bibliothek

Wechseln Sie in das Twilio-Verzeichnis und benennen Sie Example.cpp zu Example.cpp.org um, damit Example.cpp nicht jedes Mal aufgerufen wird, wenn wir die Twilio-Bibliothek verwenden. Bearbeiten Sie Utils.h wie folgt:

#include <string.h>
#include <vector>

using namespace std;

Code-Beispiel 1: Utils.h

Zugriff auf die USB-Massenspeicherpartition über Edison

Das Multifunktions-Composite-Gadget (g_multi) ist ein Composite-Gadget, das mithilfe des Composite-Frameworks ein Multifunktions-Gadget bietet. Es ermöglicht eine Konfiguration mit USB-Massenspeicherfunktionen, Ethernet- (RNDIS und/oder CDC Ethernet) und ACM-Serial-Link-Schnittstellen. Zum manuellen Laden oder Entfernen von Kernelmodulen verwenden wir den Modulbefehl modprobe. Wir entfernen das Modul g_multi, um das USB-Massenspeichergerät über die Edison-Platine zu deaktivieren:

From Edison - Modprobe
Abbildung 3: Über Edison – modprobe

Wir erstellen ein Mount-Verzeichnis:

From Edison - Mount Directory
Abbildung 4: Über Edison – Mount-Verzeichnis

Wir verwenden losetup, um die Partitionsbezeichnung der Laufwerks-Image-Datei „update“ einem Loopback-Gerät (/dev/loop0) mit dem Offset 8192 zuzuordnen. Im untenstehenden Beispiel wird das Loopback-Gerät als /mnt/transfer gemountet.

From Edison - Mount the Device
Abbildung 5: Über Edison – Gerät mounten

Zugriff auf die USB-Massenspeicherpartition über einen Computer

Drücken Sie die Reset-Taste und der USB-Massenspeicher wird wie folgt im Windows Explorer angezeigt:

USB Mass Storage Device
Abbildung 6: USB-Massenspeichergerät

Unmounten Sie das Laufwerk und fügen Sie das Modul g_multi wieder h

Un-mount the Device
Abbildung 7: Gerät unmounten

Installation von Curl- und Crypto-Bibliotheken

Beziehen Sie sich auf Zugriff auf die USB-Massenspeicherpartition über Edison, um libcurl und jegliche Abhängigkeiten von /usr/lib auf der Edison-Platine in das Root-Verzeichnis der Arduino-IDE unter hardware\tools\edison\sysroots\core2-32-poky-linux\usr\lib zu kopieren:

  • libcurl.so
  • libtasn1.so.6
  • libgcrypt.so.11
  • libgnutls.so.26
  • libgpg-error.so.0

From Edison – Curl and other Libraries
Abbildung 8: Über Edison – Curl und andere Bibliotheken

To Windows - Curl and other Libraries
Abbildung 9: Zu Windows – Curl und andere Bibliotheken

Beziehen Sie sich auf gleiche Art und Weise auf Zugriff auf die USB-Massenspeicherpartition über Edison, um die untenstehenden Bibliotheken von /usr/lib auf der Edison-Platine in das Root-Verzeichnis der Arduino-IDE unter hardware\tools\edison\sysroots\core2-32-poky-linux\lib zu kopieren:

  • libz.so.1
  • libcap.so.2
  • libcrypto.so

From Edison - Crypto and other Libraries
Abbildung 10: Über Edison – Crypto und andere Bibliotheken

To Windows - Crypto Libraries and other Libraries
Abbildung 11: Zu Windows – Crypto und andere Bibliotheken

Installation der Curl-Headerdateien

Die Curl-Headerdateien sollten im Root-Verzeichnis der Arduino-IDE unter hardware\tools\edison\sysroots\core2-32-poky-linux\usr\include installiert werden, das wie folgt aussieht:

Curl Header Files
Abbildung 12: Curl-Headerdateien

Die openssl-Headerdateien sollten im Root-Verzeichnis der Arduino-IDE unter hardware\tools\edison\sysroots\core2-32-poky-linux\usr\include installiert werden, das wie folgt aussieht:

Openssl Header Files
Abbildung 13: Openssl-Headerdateien

Modifizieren der Kompilier-Patterns

Im Root-Verzeichnis der Arduino-IDE befinden sich unter hardware\arduino\edison plattformzugehörige.*.txt-Dateien. Bearbeiten Sie die Plattformdatei entsprechend Ihrer Build-Plattform. Wenn Sie die Arduino-IDE für Edison auf einem Microsoft* Windows*-System ausführen, bearbeiten Sie platform.win.txt.

platform.win.txt for Windows
Abbildung 14: platform.win.txt für Windows

Um den Linker dazu anzuweisen, libcurl und libcrypto beim Verlinken der ausführbaren Datei zur Liste der Bibliotheken hinzuzufügen, fügen Sie –lcurl und –lcrypto zum Ende der Zeile „recipe.c.combine.pattern“ hinzu und achten Sie darauf, keine Zeilenumbrüche einzufügen.

recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -march={build.mcu} -o "{build.path}/{build.project_name}.elf" {object_files} "{build.path}/{archive_file}""-L{build.path}" -lm -lpthread -lcurl –lcrypto

Abbildung 15: platform.win.txt – Dynamisches Linking

Erstellen eines Twilio-Kontos

Um SMS- und MMS-Nachrichten empfangen zu können, benötigen Sie eine SMS-fähige Twilio-Telefonnummer. Ihre eigene Telefonnummer erhalten Sie, indem Sie sich für ein Twilio-Testkonto registrieren. Nachdem der SMS-Zugriff für Twilio aktiviert wurde, gehen Sie zu „Hide API Credentials“, um Ihre Konto-SID und Ihr Auth-Token zu finden:

// Twilio REST API version
const char API_VERSION[] = "2010-04-01";

// SMS-enabled Twilio phone number
const char CALLER_ID[] = "1480405xxxx";

// Twilio Account SID and Auth token
const char ACCOUNT_SID[] = "AC9c55339a5a070ae81e782117xxxxxxxx";
const char ACCOUNT_TOKEN[] = "59e8819f3f5b530b97b84baexxxxxxxx";

Code-Beispiel 2: Beispiel für Twilio-Telefonnummer, Konto-SID und Auth-Token

POST-Aufruf an Twilio

Um eine SMS-Nachricht zu senden, senden wir eine POST-Anfrage mit der URL „/SMS/Messages“ and Twilio und füllen die Felder „To“, „From“ und „Body“ aus. „To“ enthält dabei Ihre Handynummer, „From“ die Telefonnummer des SMS-fähigen Twilio-Kontos und „Body“ die SMS-Nachricht selbst.

    // URL path = /API_VERSION/Accounts/ACCOUNT_SID/SMS/Messages
    char postReqStr[150];
    strcpy(postReqStr, twilioAcc);
    strcat(postReqStr, "/SMS/Messages");
    Serial.println(postReqStr);

    // Send SMS
    vars.clear();
    vars.push_back(Var("To", "480-xxx-xxxx"));
    vars.push_back(Var("From", "480-405-xxxx"));
    vars.push_back(Var("Body", smsStr));
    string response = twilioRest.request(postReqStr, "POST", vars);

Code-Beispiel 3: Beispiel für den Versand von „/SMS/Messages“

Temperatursensor

Jetzt, wo Sie auf SMS-Nachrichten zugreifen und diese empfangen und versenden können, können Sie ebenfalls eine Funktion zum Ablesen des Temperatorsensors erstellen. Mit einem Temperatorsensor kann die aktuelle Temperatur über eine analoge Eingabe gemessen werden. Um mehr über die Temperatursensorfunktion zu erfahren, sehen Sie sich das Datenblatt unter http://www.seeedstudio.com/wiki/images/a/a1/NCP18WF104F03RC.pdf an. Nachfolgend ein Beispiel zum Ablesen der Temperatur aus einem Sensor und zur Rückgabe der Daten:

// Connect temperature sensor to Analog pin 1
const int tempSensorPin = 1;

// Temperatuere in Fahrenheit
float degF = 0;

// This function reads the analog pin value, converts to Fahrenheit, then
// returns current temperature in Fahrenheit.
float getTemperature()
{
    int analogValue = analogRead(tempSensorPin);

    //Get the resistance of the sensor;
    float resistance = (float)(1023 - analogValue) * 10000/analogValue;

    //Convert to temperature via datasheet;
    float degKelvin = 1/(log(resistance/10000)/B_THERMISTOR + 1/298.15);

    // Convert Kelvin to Celcius
    float degC = degKelvin - 273.15;

    // Celcius to Fahrenheit
    degF = (degC * 9.0) / 5.0 + 32.0;

    return degF;
}

Code-Beispiel 4: Senden einer SMS, wenn die Temperatur einen Schwellenwert erreicht

Beispiel-Sketch

Es folgt ein vollständiges Beispiel zum Senden einer SMS an Ihr Handy, wenn die Temperatur den Schwellenwert von 100o Fahrenheit erreicht. Die Ausgabe wird für die serielle Konsole von Galileo an die Arduino-IDE weitergegeben.

#include "WString.h"
#include <Utils.h>
#include <Rest.h>
#include <TwiML.h>
#include <vector>
#include <math.h>

using namespace twilio;

vector<Var> vars;

// Twilio REST API version
const char API_VERSION[] = "2010-04-01";

// SMS-enabled Twilio phone number
const char CALLER_ID[] = "1480405xxxx";

// Twilio Account SID and Auth token
const char ACCOUNT_SID[] = " AC9c55339a5a070ae81e782117xxxxxxxx ";
const char ACCOUNT_TOKEN[] = "59e8819f3f5b530b97b84baexxxxxxxx ";

// Response from Twilio
const char* responseStr;

// Temperature sensor variables in Fahrenheit
const int THRESHOLD_TEMP = 100;
const int WAIT = 1000000;

// B value of the thermistor
const int B_THERMISTOR = 3975;

int analogValue = 0;
float degKelvin = 0;
float degC = 0;
float degF = 0;
float resistance = 0;

// Connect temperature sensor to Analog pin 1
const int tempSensorPin = 1;

// This function initializes the serial debug interface.
void setup() {
    Serial.begin(9600);
}

// This function builds:
//     - The SMS message being sent
//     - URL path
//     - Send SMS message to your cell phone from SMS-enabled phone
// Input: float tempF - current temperature in Fahrenheit
void sendSMS( float tempF ) {

    // Convert tempF to string
    char degFstr[20];
    sprintf(degFstr, "%2f", degF);

    // Convert THRESHOLD_TEMP to string
    char thresholdStr[20];
    sprintf(thresholdStr, "%d", THRESHOLD_TEMP);

    // Build the SMS message
    char smsStr[100] = "Current temperature is ";
    strcat(smsStr, degFstr);
    strcat(smsStr, " F greater than threshold temp ");
    strcat(smsStr, thresholdStr);
    strcat(smsStr, " F.");

    // Twilio Account = /API_VERSION/Accounts/ACCOUNT_SID
    char twilioAcc[70] = "/";
    strcat(twilioAcc, API_VERSION);
    strcat(twilioAcc, "/Accounts/");
    strcat(twilioAcc, ACCOUNT_SID);

    // URL path = /API_VERSION/Accounts/ACCOUNT_SID//SMS/Messages
    char postReqStr[150];
    strcpy(postReqStr, twilioAcc);
    strcat(postReqStr, "/SMS/Messages");
    Serial.println(postReqStr);

    // Twilio REST
    Rest rest(ACCOUNT_SID, ACCOUNT_TOKEN);

    // Send SMS
    vars.clear();
    vars.push_back(Var("To", "480-xxx-xxxx"));
    vars.push_back(Var("From", "480-405-xxxx"));
    vars.push_back(Var("Body", smsStr));
    string response = twilioRest.request(postReqStr, "POST", vars);
}

// This function read the analog pin value, converts to Fahrenheit, then
// returns current temperature in Fahrenheit.
float getTemperature()
{
    analogValue = analogRead(tempSensorPin);

    //Get the resistance of the sensor;
    resistance = (float)(1023 - analogValue) * 10000/analogValue;

    //Convert to temperature via datasheet;
    degKelvin = 1/(log(resistance/10000)/B_THERMISTOR + 1/298.15);

    // Convert Kelvin to Celcius
    degC = degKelvin - 273.15;

    // Celcius to Fahrenheit
    degF = (degC * 9.0) / 5.0 + 32.0;

    return degF;
}

// The main loop read the current temperature using the temperature sensor. If the current temperature is greater than the threshold value, send a SMS message.
void loop() {
    degF = getTemperature();
    if(degF > THRESHOLD_TEMP)
    {
        sendSMS(degF);
        delay(WAIT);
    }
}

Code-Beispiel 5: Vollständiges Beispiel zum Versenden einer SMS mit Twilio

Zusammenfassung

In diesem Artikel haben wir mit dem Temperatursensor experimentiert und SMS-Nachrichten über ein Twilio-Konto versandt. Probieren Sie unterschiedliche Sensoren im Grove Starter Kit Plus aus und fordern Sie sich unter https://software.intel.com/de-de/iot/hardware/sensors mit weiteren Sensoren heraus. Ich hoffe, dieser Artikel konnte Sie zu einem interessanten Experiment mit der Intel® Edison-Plattform inspirieren.

Verweise

https://software.intel.com/de-de/iot/hardware/edison/downloads

https://www-ssl.intel.com/content/www/us/en/do-it-yourself/edison.html

https://software.intel.com/de-de/iot/hardware/edison

https://software.intel.com/de-de/iot/library/edison-getting-started

https://software.intel.com/de-de/iot/hardware/devkit

http://www.seeedstudio.com/wiki/images/a/a1/NCP18WF104F03RC.pdf.

Über den Autor

Nancy Le ist Softwareingenieurin in der Software and Services Group der Intel Corporation und arbeitet an Projekten mit dem Intel® AtomTM Prozessor, welche eine Skalierung ermöglichen.


Viewing all articles
Browse latest Browse all 1201

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>