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
- Download der Entwicklungsplatine
- Herunterladen und Installieren der Twilio-Bibliothek
- Zugriff auf die USB-Massenspeicherpartition über Edison
- Zugriff auf die USB-Massenspeicherpartition über einen Computer
- Installation von Curl- und Crypto-Bibliotheken
- Installation der Curl-Headerdateien
- Modifizieren der Kompilier-Patterns
- Erstellen eines Twilio-Kontos
- POST-Aufruf an Twilio
- Temperatursensor
- Beispiel-Sketch
Hardwarekomponenten
Die in diesem SMS-Nachrichtenprojekt verwendeten Hardwarekomponenten sind:
- Intel® Edison Compute-Modul
- Arduino-Erweiterungsplatine
- Grove – Starter Kit Plus
- Zwei USB-Kabel mit Micro-B-auf-Typ-A-Anschlüssen
- Eine Gleichspannungsstromquelle (DC).
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.
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:
Abbildung 3: Über Edison – modprobe
Wir erstellen ein Mount-Verzeichnis:
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.
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:
Abbildung 6: USB-Massenspeichergerät
Unmounten Sie das Laufwerk und fügen Sie das Modul g_multi wieder h
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
Abbildung 8: Über Edison – Curl und andere Bibliotheken
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
Abbildung 10: Über Edison – Crypto und andere Bibliotheken
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:
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:
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.
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.