Пользователь
0,0
рейтинг
14 декабря 2014 в 20:40

Бесплатная отправка SMS из Arduino без GSM модуля



Понадобилось мне слать SMS из ардуинины себе на телефон. Да так, что бы без заморочек с GSM, сим картами и оплатой. Под катом то, что из этого вышло.

Раз GSM не подходит, то слать придется через интернет. В закромах имелся сверх дешевый Wi-Fi модуль ESP8266. Про его предварительную настройку можно почитать в этой отличной статье ссылка.
Перво-наперво полез гуглить различные интернет-сервисы для отправки SMS. Сервисов оказалось много, но вот подходящего среди них не оказалось. Либо 10 SMS в день, либо хотят денег. Да и капчи ардуинине не по зубам. Но тут совершенно случайно наткнулся на на интересный сервис своего мобильного оператора (MTS BY) — всего за 1$ можно подключить услугу приема email в виде SMS ссылка. Что же, полностью бесплатно не получилось, и после оплаты я получил почтовый адрес вида 375XXYYYYYYY@sms.mts.by ( где XX и YYYYYYY — код сети и номер). То есть все свелось к банальной отправке email из arduino.

Но не тут-то было. Оказывается в последнее время все уважающие себя почтовые сервера отказываются принимать почту по 25 порту и без шифрования. А с другими связываться не хотелось, как и привязываться к своему домашнему серверу. Нагуглил вот такой сервис ссылка. В базовом бесплатном варианте дают 6к писем в месяц, что для моего домашнего использования хватает с головой. После регистрации идем в настройки и видим адрес smtp сервера, порт, логин и сгенерированный нам пароль.

Быстро накатал скетч, отправляю email 375XXYYYYYYY@sms.mts.by и… Облом. Отправляю на обычную почту — приходит. Пытался так и эдак переделывать заголовок — все равно письма исчезают в безднах серверов МТС, явно попадая в котел спам фильтра.

Значит нужно «отмыть» почту. В качестве сервиса отмывки выбрал (тихо ненавидимый мною за рекламу) mail.ru. Для отмывки в настройках почты, в разделе «Фильтры и пересылка», создал новое правило:
Настройки
После создания фильтра его понадобилось активировать введя код, пришедший в виде email-SMS на телефон.
Вот и момент триумфа — отправляю email из ардуинины, и через минуту телефон раздается радостным сигналом оповещения, при этом пугая проходящего рядом кота.

Далее скучные технические подробности.
В качестве платы взял Arduino Mega 2560, так как в нем целых три дополнительных последовательных порта (хотя можно и обычный UNO, только дебажить будет сложнее).
ESP8266 подключен: GND -> GND, VCC и CH_PD -> +3.3V, RX -> TX3, TX -> RX3. Скорость ESP8266 настроена на 115200 бод.
Для общения с smtp сервером нужно закодировать свои логин и пароль в Base64.
Можно воспользоваться консолью Linux:
openssl enc -base64 <<< 'email@gmail.com'
openssl enc -base64 <<< 'password'
Или же каким-либо онлайн сервисом, например ссылка.
Ну и собственно код скетча. После включения отправляется СМС и код уходит в вечный цикл. Дополнительные библиотеки не использовал.
Код
#define SSID "wi-fi_login" // ваш SSID
#define PASS "wi-fi_password" // ваш пароль Wi-Fi

#define SMTPServer "s02.atomsmtp.com" //smtp сервер
#define SMTPPort "2525" // smtp порт
#define MailLogin "smtp_example@gmail.com" // логин для smtp
#define MailLoginBase64 "dWd1LCBrb25lNG5vCg==" //логин для smtp в Base64
#define MailPasswordBase64 "aHJlbiB0YW0K" // пароль для smtp в Base64
#define MailRelay "example@mail.ru" // промежуточная почта для "отмывания" email
#define PhoneNumber "375290000000" // номер телефона
#define Message "Hello from Arduino!" //сообщение

#define SERIAL_RX_BUFFER_SIZE 256
#define SERIAL_TX_BUFFER_SIZE 256

void setup()
{
	delay(2000);
	Serial3.begin(115200);
	Serial3.setTimeout(5000);
	Serial.begin(115200); // для отладки
	Serial.println("Init");
	Serial3.println("AT+RST"); // сброс и проверка, что модуль готов
	if(WaiteString("Ready", 5000)) {
		while(Serial3.available()) { Serial3.read();}
		Serial.println("WiFi - Module is ready");
	}else{
		Serial.println("Module dosn't respond.");
		while(1);
	}
	delay(100);

	Serial3.println(" AT+CIPMODE=0");
	WaiteString("OK");
	while(Serial3.available()) { Serial3.read();}

	Serial3.println("AT+CIPMUX=1");
	WaiteString("OK");
	while(Serial3.available()) { Serial3.read();}

	// try to connect to wifi
	boolean connected = false;
	for(int i=0;i<5;i++) {
		if(connectWiFi()) {
			connected = true;
			break;
		}
	}
		if (!connected) {
		while(1);
	}
}
void loop()
{
	String cmd = "AT+CIPSTART=0,\"TCP\",\"";
	cmd += String(SMTPServer);
	cmd += "\"," + String(SMTPPort);
	Serial3.println(cmd);

	if(WaiteString("Linked", 5000)) {
		while(Serial3.available()) { Serial3.read();}
		Serial.println("Link");
	}
	else {
		Serial.println("Link fail");
		while (1);
	}

	if (WaiteString("OK", 2000)) {
		while(Serial3.available()) { Serial3.read();}
	}
	else {
		while (1);
	}
  
	Send("HELO 1.2.3.4", true);
	Send("AUTH LOGIN", true);
	Send(MailLoginBase64, true);
	Send(MailPasswordBase64, true);
	Send("MAIL FROM:<" + String(MailLogin) + ">", true);
	Send("RCPT TO:<" + String(MailRelay) + ">", true);
	Send("DATA", true);
	Send("Subject:SMS", false);
	Send("To:\"" + String(PhoneNumber) + "\" <" + String(PhoneNumber) + "@sms.mts.by>", false);
	Send("From: <" + String(MailLogin) + ">", false);
	Send("", false);
	Send(Message, false);
	Send(".", true);
	Send("QUIT", true);

	while(1) {};
}
 
boolean connectWiFi()
{
  Serial3.println("AT+CWMODE=1");
  while (!Serial3.available())	{ delay(10);}
  while (Serial3.available()) {Serial3.read();}
  String cmd="AT+CWJAP=\"";
  cmd+=SSID;
  cmd+="\",\"";
  cmd+=PASS;
  cmd+="\"";
  Serial3.println(cmd);

  if(WaiteString("OK", 8000)){
    Serial.println("Connected to WiFi.");
    return true;
  }else{
    Serial.println("Can not connect to the WiFi.");
    return false;
  }
}

bool Send(String S, bool wait) {
	Serial3.print("AT+CIPSEND=0,");
	Serial3.println(S.length()+2);
	while (!Serial3.available()) { delay(10);}
	if(Serial3.find(">")){
	}else{
		Serial3.println("AT+CIPCLOSE=0");
		delay(1000);
		return false;
	}
	Serial3.print(S + "\r\n");//добаяляем перевод строки
	if (WaitString("OK", 15000)) {
		if (wait) {
			WaitString("+IPD", 15000);
			while(Serial3.available()) {
				Serial3.read();}}
		return true;}
	else {
		return false;}
}

void WaiteString(String S) {
	int L = S.length();
	String T = String(" ");
	while(1) {
		if (Serial3.available()) {
			char c = Serial3.read();
			T = T + String(c);
			if (T.length() > L) T = T.substring(1);
			if (S.charAt(0) == T.charAt(0))
			if (S.compareTo(T) == 0) return;
		}
		else {
			delay(1);
		}
	}
}

bool WaiteString(String S, int Time) {
	int L = S.length();
	String T = String(" ");
	while(Time>0) {
		if (Serial3.available()) {
			char c = Serial3.read();
			T = T + String(c);
			if (T.length() > L) T = T.substring(1);
			if (S.charAt(0) == T.charAt(0))
			if (S.compareTo(T) == 0) return true;
		}
		else {
			delay(1);
			Time--;
		}
	}
	return false;
}

String WaiteString(int Time) {
	String T = String("");
	while(Time>0) {
		if (Serial3.available()) {
			char c = Serial3.read();
			T = T + String(c);
		}
		else {
			delay(1);
			Time--;
		}
	}
	return T;
}
@DIMOSUS
карма
6,0
рейтинг 0,0
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (46)

  • +17
    Отмывание почты — это что-то новое ;)) Спасибо за статью, полезная информация.
  • +14
    — Добавление услуги «Получение SMS c E-mail» производится платно — 10 000 рублей с учётом НДС.
    — Услуга «Получение SMS c E-mail» имеет абонентскую плату — 10 000 рублей с учётом НДС.
    Не сразу догадался, что это Беларусь
    • +93
      Ну нечего, скоро и вы не будете таких сумм бояться).
      • 0
        Если бы не деноминация, то и у нас бы такие цифирки были))
  • +5
    У твиттера есть функция присылать твитты через смс, создаём приватный аккаунт, привязываем нужный номер телефона, пишем в этот аккаунт твит и получаем смс. Выходит бесплатно.
    • –5
      В Белоруссии?
  • +4
    Google Calendar умеет отправлять бесплатное SMS с напоминанием о событии. Осталось только создать его через API на текущую дату и сразу получить бесплатное SMS.
    • +4
      Тоже пользуюсь им для отправки смс уже лет 6
  • –1
    я бы сказал что 1$ это тоже деньги. у
    «почти бесплатно» более правильная фраза
    • +2
      Отправление бесплатно, заплатить нужно только за прием ;)
      • 0
        всего за 1$ можно подключить услугу приема email в виде SMS ссылка. Что же, полностью бесплатно не получилось, и после оплаты я получил почтовый адрес вида 375XXYYYYYYY@sms.mts.by
        это не меняет сути. деньги есть деньги.
        вырожденный пример это «шведский стол» ты платишь только за подход, а еда не ограничена следуюя вашей логике бесплатна?
        • +6
          Я к тому, что заголовок кристально правдив — «бесплатная отправка»
          • 0
            Отправка почты, но не СМС, врет заголовок :)
            • 0
              о_О
              Так отправить СМС мне может кто угодно, не заплатив ни цента — следовательно отправка бесплатна. Другое дело что я не смогу такую СМС принять, если не подключу услугу.
              • +1
                Давайте по порядку.
                Бесплатная отправка SMS из Arduino без GSM модуля
                Вы можете отправить смс из Arduino без подключения услуги? если нет, то услуга платная, хоть и цена 1$
                • +1
                  Да, отправить ни чего не мешает и ни чего не стоит. Но принять сможет только тот абонент, у которого включена услуга.
  • +6
    А я вот думал, что вы будете отправлять смс-ки сервисом смс.ру — у них отправка владельцу аккаунта отправка бесплатная, вроде без особых ограничений. При это можно зарегистрировать себе и имя отправителя — чтобы было что-то «ArduinoSystem» в качестве отправителя. Правда, надо пройти верификацию этого имени, это против мошенников, прикидывающихся известными брендами.
    Отправка будет проста, просто GET запрос вида:
    sms.ru/sms/send?api_id=48bad8f3-****-****-3131-************&to=79051234567&text=hello+world
    В ответе — код результата и id сообщения, можно потом проверить, доставлено ли.
    Думаю, IP адрес у них постоянный, и отправить в прозрачном режиме запрос просто этим модулем.
    Я ни в коем случае не рекламирую сервис, предлагайте иные варианты.
    • +1
      у меня есть плохой пример с этим ресурсом. на счету было энное колдичество денег, но не пользовался. решил начать пользоваться. зашел проверить и скопировать id. все хорошо. но второй раз авторизоваться не удалось т.к. аккаунтом давно не пользовались и он удален. уже почти недклю пытаюсь им дозвониться, но у них хронически занят. а почту они тупо игнорят )8
      • 0
        у меня есть плохой пример с этим ресурсом. на счету было энное колдичество денег, но не пользовался. решил начать пользоваться. зашел проверить и скопировать id. все хорошо. но второй раз авторизоваться не удалось т.к. аккаунтом давно не пользовались и он удален.


        Столкнулся с подобной проблемой, очень смахивает на мошенническое поведение, тем более что в условиях у них ничего не сказано о сроке действия аккаунта и о праве сервиса присвоить деньги пользователя себе.
        • 0
          напишите им ещё раз сегодня 112@corp.sms.ru
          я сегодня опять им написал. ответили быстро. возможно у них были проблемы с почтой.
          если нужно могу в ЛС скинуть email человека который мне ответил на моё письмо.
          • 0
            Отписал, ответ пришел быстро, залогинился — все норм, пароль подошел, деньги на месте.
            Судя по всему аккаунт не был удален, а лишь отключен по какой-то не понятной мне причине.
            • 0
              Причина ясна.
              если не пользуешься, то отключают.
              • 0
                Нет, такой причины в условиях не было указано, но после того как я скинул им скрин с их условиями на сайте, они изменили их и внесли этот пункт под номером 14.
                Но мне интересно, если люди длительное время до появления этого пункта не заходили на сайт — как закон будет трактовать их удаление?
                • 0
                  Так не удалён же аккаунт оказался, просто отключён
          • 0
            На сайте есть форма обратной связи и система тикетов, но суть таже тупо игнор.
            На вопрос почему их же условия работы не соответствуют факту, только 1 раз както ответили, что сайт забыли обновить… прошло 2 месяца… сайт так и не обновлен походу. Судя по октябрьским новостям на него вообще забили.
    • +2
      sms.ru/?panel=price&free=1

      Сообщения на собственный номер бесплатны до 5 СМС в день при условии, что каждое сообщение помещается в 1 СМС (до 70 русских / 160 латинских символов). При превышении этих лимитов, сообщения оплачиваются согласно тарифу.

      Я уж было обрадовался…
      • 0
        А это? sms.ru/?panel=main&subpanel=programmer
        • 0
          Двояко…
          Чем у них программисты от людей отличаются? :)
          • 0
            Так, вроде, все написано.
      • 0
        А если у вас мегафон то и 5 сообщений в день не дождетесь на собственный номер.
        Будет просто постоянная ошибка «недостаточно средств».
    • 0
      Инфа у вас чутка устарела, sms.ru года 2 активно использовал, но…
      habrahabr.ru/post/245805/#comment_8180107
  • –1
    Боюсь в моей Беларуси работать не будет. Но в целом подход удобнее.
    • 0
      [удалено]
  • +2
    На Velcom тоже есть подобный сервис. Платишь за включение функции и после можно слать email'ы, которые будут конвертироваться в СМС. Давно юзаем. Из zabbix приходят уведомления о том что случилось :)
  • 0
    Подскажите, если знаете такой сервис, где «10 SMS в день» можно бесплатно слать?
    Ранее пользовался веб-шлюзом sms.ru который позволял по началу 60 смс в день слать на свой номер, потом 5, а потом на мегафон и вовсе перестали смс приходить(( поэтому если есть еще такие сервисы было б кстати.
    Ну а если у вас не мегафон, то использовать HTTP GET/POST имхо куда проще и надежнее чем заморачиваться с SMTP.
    • 0
      у Мегафона свой сервис EMail2SMS работает прекрасно, и русские буквы есть и длина не ограничена, и бесплатно, для приема личных уведомлений по SMS идеальный вариант!
      • 0
        Да, было дело 10 лет назад, даже пользовался тогда им, но в последствии по крайней мере в поволжье его прикрыли. Да и интересен шлюза на всех операторов, а не только мегафон. Да и гарантий доставки / проверки статуса в разы меньше по SMTP.
  • +1
    Как не крути, но GSM надежнее для этого дела. Лучше немного позаморачиваться, чем потом мучиться с ящиками, поиском сервиса и т.д.
  • 0
    Опять желтые заголовки. Разочарован я честно говоря статьей. Хотел увидеть, что то особенное, а тут зачем-то приплели Arduino и GSM, а на самом деле еще одна реклама сервиса доставки SMS. Я считаю, что не нужно вводить дополнительные сущности без надобности.

    Ложка дегтя:

    Работа тянет на бойскаутскую поделку. Без обид. Хотите серьезно делать возьмите любую библиотеку SMTP. Просто уверен, что день поисков и у Вас рабочая система, а если посмотрите в Raspbery, так там и вообще есть Python со своими smtplib.
    • +2
      Мне нужно было отправить именно с Arduino — как тогда мне его сюда не преплетать?
      И нужно было без завязывания на свои домашние сервера.

      Но если все же заюзал бы сервер, то зачем питон, если я могу сделать просто (при настроенном postfix):
      $ echo «Hello World» | mail -s «Test Message» you@example.com
      • 0
        Вообщем ничего интересного не нашел, а увидел как еще один человек изобрел костыль.

        > Но если все же заюзал бы сервер, то зачем питон, если я могу сделать просто

        Ну для однородности среды и вложений. Хотя думаю вы найдете вариант и в BASH прицепите файл,
        только что бы меньше возиться…

        П, С. Что помешало скомпилировать нативный libsmtp?
        • 0
          libsmtp для arduino? о_О
          • 0
            Если Вы не в курсе, то:

            Язык программирования Ардуино является стандартным C++ (используется компилятор AVR-GCC) с некоторыми особенностями.

            Другое дело, что libsmtp хочет glib и отвязать его будет достаточно сложно, а так же нужно понять на сколько ваш WiFi модуль умеет прикидываться нормальными сокетами, а так в принципе почему б ыи не собрать свой аналог libsmtp.

            Впрочем это тоже все бой скаутство, а от Вас я ожидал что-то потипу прикрутил антенну к 21 контакту и начал вещать GSM прямо из Arduino, но не дождался…
            • 0
              Сомневаюсь что в таком случае прошивка вместилась бы в 10 Кб. Да и smtp простейший протокол. С своими функциями вполне справляется и моя реализация — зачем городить огород? Максимум туда добавить генерацию уникального ID письма, но для этого нужно запрашивать текущее время.
  • 0
    [del]
  • 0
    Странные тарифы на СМС по почте

    Добавление услуги «Получение SMS c E-mail» производится платно — 10 000 рублей с учётом НДС.
    Услуга «Получение SMS c E-mail» имеет абонентскую плату — 10 000 рублей с учётом НДС.
    Начисления по услуге «Получение SMS c E-mail» при нахождении абонента в частичной блокировке взимаются в размере 100% от абонентской платы услуги.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.