Бесплатная отправка 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;
    }
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 46
    • +17
      Отмывание почты — это что-то новое ;)) Спасибо за статью, полезная информация.
      • +14
        — Добавление услуги «Получение SMS c E-mail» производится платно — 10 000 рублей с учётом НДС.
        — Услуга «Получение SMS c E-mail» имеет абонентскую плату — 10 000 рублей с учётом НДС.
        Не сразу догадался, что это Беларусь
        • +93
          Ну нечего, скоро и вы не будете таких сумм бояться).
          • 0
            Если бы не деноминация, то и у нас бы такие цифирки были))
        • +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
                      А если у вас мегафон то и 5 сообщений в день не дождетесь на собственный номер.
                      Будет просто постоянная ошибка «недостаточно средств».
                    • 0
                      Инфа у вас чутка устарела, sms.ru года 2 активно использовал, но…
                      habrahabr.ru/post/245805/#comment_8180107
                    • –1
                      Боюсь в моей Беларуси работать не будет. Но в целом подход удобнее.
                    • +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% от абонентской платы услуги.

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