![](https://habrastorage.org/files/867/a4f/7cd/867a4f7cd0d74902b2068fa5ca9f7730.jpg)
Сервис Twilio позволяет разработчикам программным путём получать SMS и MMS-сообщения на свои телефонные номера Twilio, и, соответственно, отправлять сообщения в ответ. Отправлять SMS и MMS-сообщения можно, используя REST API Twilio, можно организовывать SMS-переписку и отправлять SMS-сообщения в ходе телефонных звонков. Здесь мы рассмотрим отправку SMS-сообщений на обычный телефон с номеров Twilio.
Из этого материала вы узнаете о том, как считывать показания температурного датчика и отправлять SMS-сообщения на мобильный телефон, используя учётную запись Twilio.
Аппаратные компоненты
В этом проекте, посвященном работе с SMS-сообщениями, использованы следующие аппаратные компоненты:
- Вычислительный модуль Intel Edison
- Плата расширения Arduino
- Набор Grove – Starter Kit Plus
- Два Micro USB-кабеля для подключения платы к ПК
- Источник постоянного тока
Подробная инструкция, посвящённая сборке и обеспечению питанием платы Intel Edison, находится здесь.
![](https://habrastorage.org/getpro/habr/post_images/179/055/cf0/179055cf0d9d5c519c165781c54ed612.jpg)
Аппаратные компоненты в сборе
Загрузка программного обеспечения
Воспользуйтесь ресурсом Intel Edison Board Software Downloads для того, чтобы загрузить свежие драйверы, вспомогательные приложения, образы прошивок и IDE Arduino.
Загрузка и установка библиотеки Twilio
Загрузите библиотеку Twilio C++ и распакуйте в папку с библиотеками Arduino IDE, которая обычно расположена по адресу C:\Arduino\arduino-1.5.3-Intel.1.0.4\libraries. Arduino не позволяет, чтобы в именах библиотек содержался символ «–», поэтому переименуйте twilio-cplusplus в Twilio.
![](https://habrastorage.org/getpro/habr/post_images/f25/c7f/039/f25c7f039ce9a9abf7c4c904b1b10ac9.png)
Библиотека Twilio
Перейдите в папку Twilio и переименуйте файл Example.cpp в Example.cpp.org, в результате Example.cpp не будет вызываться каждый раз, когда мы пользуемся библиотекой Twilio. Внесите в файл Utils.h следующие изменения:
Файл Utils.h
#include <string.h>
#include <vector>
using namespace std;
Доступ к разделу устройства USB Mass Storage с Intel Edison
Multifunction Composite Gadget (g_multi) – это составной гаджет, который интенсивно использует composite framework и реализует широкую функциональность. В частности, он предоставляет USB-конфигурацию с поддержкой USB Mass Storage, а так же – интерфейсов Ethernet (RNDIS и (или) CDC Ethernet) и последовательного порта (ACM).
Для того чтобы вручную загружать или выгружать модули ядра, мы используем команду modprobe. Мы удаляем модуль g_multi для того, чтобы отключить устройство USB Mass Storage на Intel Edison.
![](https://habrastorage.org/getpro/habr/post_images/0a9/268/5b3/0a92685b375ca78e87f5530d357e7ea9.png)
Использование команды modprobe, Edison
Создадим директорию для монтирования.
![](https://habrastorage.org/getpro/habr/post_images/4fd/ad1/5ff/4fdad15ff8ef303a1bd9d5f928f19996.png)
Создание директории для монтирования, Edison
Воспользуемся командой losetup для того, чтобы назначить соответствие метки раздела «update» устройству loopback (/dev/loop0) со смещением 8192. В примере, показанном ниже, устройство loopback монтируется как /mnt/transfer.
![](https://habrastorage.org/getpro/habr/post_images/457/436/1bc/4574361bcb9182b6d312988fdc9363f7.png)
Монтирование устройства на Edison
Доступ к устройству USB Mass Storage с главного компьютера
Нажмите кнопку перезагрузки, устройство USB Mass Storage появится в Проводнике Windows.
![](https://habrastorage.org/getpro/habr/post_images/8d9/53e/633/8d953e633a1f29f5d9aa2fb0223cbff2.png)
Устройство USB Mass Storage
Размонтируем раздел и вернём модуль g_multi.
![](https://habrastorage.org/getpro/habr/post_images/814/007/ed2/814007ed222e4ccdfd6f4f382dd73b01.png)
Размонтирование устройства
Установка Curl и криптографических библиотек
Обратитесь к разделу «Доступ к разделу устройства USB Mass Storage с Intel Edison» для того, чтобы скопировать libcurl с зависимостями из папки /usr/lib на Edison в корневую директорию установки Arduino IDE, в папку hardware\tools\edison\sysroots\core2-32-poky-linux\usr\lib:
- libcurl.so
- libtasn1.so.6
- libgcrypt.so.11
- libgnutls.so.26
- libgpg-error.so.0
![](https://habrastorage.org/getpro/habr/post_images/8d5/5ce/bdb/8d55cebdb52f9d2a28560888f8b3b41e.png)
Копирование Curl и других библиотек с Edison
![](https://habrastorage.org/getpro/habr/post_images/062/557/5bd/0625575bda4de14bc46d0544120c1e3f.png)
Curl и другие библиотеки в Windows
Аналогично, воспользуйтесь рекомендациями раздела «Доступ к разделу устройства USB Mass Storage с Intel Edison» для того, чтобы скопировать нижеперечисленные библиотеки из папки /lib в Edison в корневую директорию установки Arduino IDE, в папку hardware\tools\edison\sysroots\core2-32-poky-linux\lib:
- libz.so.1
- libcap.so.2
- libcrypto.so
![](https://habrastorage.org/getpro/habr/post_images/a0a/ba4/608/a0aba4608dbad2b3e83f4e27ab0617e7.png)
Копирование криптографических и других библиотек с Edison
![](https://habrastorage.org/getpro/habr/post_images/448/ff1/a6d/448ff1a6d934c50ce2bd274aaf811436.png)
Криптографические и другие библиотеки в Windows
Установка заголовочных файлов Curl
Заголовочные файлы Curl нужно поместить в корневую директорию установки Arduino IDE по адресу hardware\tools\edison\sysroots\core2-32-poky-linux\usr\include:
![](https://habrastorage.org/getpro/habr/post_images/c82/40b/9bb/c8240b9bb6d01c06c3d4e8d0e0a96d26.png)
Заголовочные файлы Curl
Заголовочные файлы OpenSSL нужно поместить в корневую директорию установки Arduino IDE по адресу hardware\tools\edison\sysroots\core2-32-poky-linux\usr\include:
![](https://habrastorage.org/getpro/habr/post_images/547/870/408/54787040889ac8f159a368669cc78cc1.png)
Заголовочные файлы OpenSSL
Модификация шаблонов компиляции
В папке установки Arduino IDE, по адресу hardware\arduino\edison, имеются файлы platform.*.txt. Отредактируйте тот файл, имя которого соответствует платформе, на которой выполняется сборка. Если вы работаете с Arduino IDE в Microsoft Windows, отредактируйте файл platform.win.txt.
![](https://habrastorage.org/getpro/habr/post_images/83f/4ef/fae/83f4effae106de34b37cdf9573b82ab5.png)
Файл platform.win.txt для Windows
Для того чтобы сообщить компоновщику о том, что ему нужно добавить libcurl и libcrypto к списку библиотек при компоновке исполняемых файлов, добавьте –lcurl и –lcrypto в конец строки «recipe.c.combine.pattern». Эту строку не должны разрывать символы перевода строки.
Динамическая компоновка – файл platform.win.txt.
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
Создание аккаунта Twilio
Для того чтобы принимать SMS и MMS-сообщения вам нужен телефонный номер Twilio, который поддерживает работу с SMS. Для того чтобы получить собственный выделенный номер, зарегистрируйте пробную учётную запись Twilio. Как только вы получите такой номер, перейдите в раздел Hide API Credentials на сайте Twilio и найдите там Account SID и Auth Token:
Телефонный номер из сервиса Twilio и данные для программного доступа к сервису
// Версия Twilio REST API
const char API_VERSION[] = "2010-04-01";
// Телефонный номер Twilio с поддержкой SMS
const char CALLER_ID[] = "1480405xxxx";
// Account SID и Auth token для программного доступа к Twilio
const char ACCOUNT_SID[] = "AC9c55339a5a070ae81e782117xxxxxxxx";
const char ACCOUNT_TOKEN[] = "59e8819f3f5b530b97b84baexxxxxxxx";
POST-вызовы Twilio
Для того чтобы отправить SMS-сообщение, мы совершаем POST-запрос к Twilio, используя URL «/SMS/Messages». При этом нужно передать поля «To», «From» и «Body». «To» — это ваш телефонный номер, тот, на который должно прийти SMS. «From» — это телефонный номер Twilio, а «Body» — это текст SMS-сообщения.
Пример отправки SMS с помощью сервиса Twilio
// URL path = /API_VERSION/Accounts/ACCOUNT_SID/SMS/Messages
char postReqStr[150];
strcpy(postReqStr, twilioAcc);
strcat(postReqStr, "/SMS/Messages");
Serial.println(postReqStr);
// Отправка 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);
Датчик температуры
Теперь, когда вы можете работать с SMS-сообщениями, пришло время создать функцию для чтения показателей датчика температуры. Он используется для измерения окружающей температуры в реальном времени, для работы с ним применяется аналоговый вход. Подробности о датчике температуры можно найти в этом документе. Ниже приведен пример работы с датчиком.
Работа с датчиком температуры
// Датчик температуры подключён к аналоговому входу 1
const int tempSensorPin = 1;
// Температура по Фаренгейту
float degF = 0;
// Эта функция считывает данные с аналогового входа, конвертирует их
// в градусы Фаренгейта и возвращает полученную текущую температуру.
float getTemperature()
{
int analogValue = analogRead(tempSensorPin);
// Получим сопротивление сенсора;
float resistance = (float)(1023 - analogValue) * 10000/analogValue;
// Сконвертируем температурные данные в соответствии с документацией;
float degKelvin = 1/(log(resistance/10000)/B_THERMISTOR + 1/298.15);
// Конверсия из градусов Кельвина в градусы Цельсия
float degC = degKelvin - 273.15;
// Конверсия градусов Цельсия в градусы по Фаренгейту
degF = (degC * 9.0) / 5.0 + 32.0;
return degF;
}
Пример готовой программы
Вот пример готовой программы для отправки SMS-сообщения на обычный мобильный телефон в тех случаях, когда температура достигает заданного предела в 100 градусов по Фаренгейту. Отладочный вывод выполняется в эмулятор консоли Galileo в Arduino IDE.
Отправка SMS с помощью учётной записи Twilio при достижении температурой заданного порогового значения
#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
const char API_VERSION[] = "2010-04-01";
// Телефонный номер Twilio с поддержкой SMS
const char CALLER_ID[] = "1480405xxxx";
// Account SID и Auth token для программного доступа к Twilio
const char ACCOUNT_SID[] = " AC9c55339a5a070ae81e782117xxxxxxxx ";
const char ACCOUNT_TOKEN[] = "59e8819f3f5b530b97b84baexxxxxxxx ";
// Ответ от Twilio
const char* responseStr;
// Порог температуры, в Фаренгейтах
const int THRESHOLD_TEMP = 100;
const int WAIT = 1000000;
// B-значение термистора
const int B_THERMISTOR = 3975;
int analogValue = 0;
float degKelvin = 0;
float degC = 0;
float degF = 0;
float resistance = 0;
// Датчик температуры подключён к аналоговому входу 1
const int tempSensorPin = 1;
// Эта функция инициализирует последовательный отладочный интерфейс
void setup() {
Serial.begin(9600);
}
// Эта функция делает следующее:
// - Создаёт SMS-сообщение для отправки
// - Использует URL-путь
// - Отправляет SMS-сообщение на мобильный телефон с Twilio-номера
// Вход: float tempF – текущая температура в градусах Фаренгейта
void sendSMS( float tempF ) {
// Конверсия tempF в строку
char degFstr[20];
sprintf(degFstr, "%2f", degF);
// Конверсия THRESHOLD_TEMP в строку
char thresholdStr[20];
sprintf(thresholdStr, "%d", THRESHOLD_TEMP);
// Создание SMS-сообщения
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);
// Отправка 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);
}
// Эта функция считывает данные с аналогового входа, конвертирует их
// в градусы Фаренгейта и возвращает полученную текущую температуру.
float getTemperature()
{
analogValue = analogRead(tempSensorPin);
// Получим сопротивление сенсора;
resistance = (float)(1023 - analogValue) * 10000/analogValue;
// Сконвертируем температурные данные в соответствии с документацией
degKelvin = 1/(log(resistance/10000)/B_THERMISTOR + 1/298.15);
// Конверсия из градусов Кельвина в градусы Цельсия
degC = degKelvin - 273.15;
// Конверсия градусов Цельсия в градусы по Фаренгейту
degF = (degC * 9.0) / 5.0 + 32.0;
return degF;
}
// Главный цикл, в котором производится считывание текущей температуры с
// датчика. Если температура больше, чем заданное пороговое значение,
// выполняется отправка SMS-сообщения.
void loop() {
degF = getTemperature();
if(degF > THRESHOLD_TEMP)
{
sendSMS(degF);
delay(WAIT);
}
}
Итоги
В этом материале мы поэкспериментировали с датчиком температуры и отправкой SMS-сообщений с помощью сервиса Twilio. Схожим образом можно работать и с другими датчиками из комплекта Grove Starter Kit Plus – испытайте их, а если вам хочется большего – взгляните на эти датчики. Надеемся, наш рассказ вдохновит вас на интересные опыты с Intel Edison.
Полезные ссылки
software.intel.com/en-us/iot/hardware/edison/downloads
www-ssl.intel.com/content/www/us/en/do-it-yourself/edison.html
software.intel.com/en-us/iot/hardware/edison
software.intel.com/en-us/iot/library/edison-getting-started
software.intel.com/en-us/iot/hardware/devkit
www.seeedstudio.com/wiki/images/a/a1/NCP18WF104F03RC.pdf
lemial
Twilio крайне тормозной сервис по доставке СМС, у меня доходит примерно 8 из 10 сообщений, задержки бывают до 5 минут. Несколько тикетов уже висит у них в суппорте, ничего не изменилось. Насколько я понимаю, Twilio ждет от российских операторов отчет о доставке, которые, видимо не всегда приходят.