GSMモジュールなしでArduinoからSMSを無料で送信





arduininaから携帯電話にSMSを送信するのに時間がかかりました。 はい、GSM、SIMカード、支払いに問題はありません。 カットの下で、それは何から来たのか。



GSMは適切ではないため、インターネット経由で送信する必要があります。 ビンには、超安価なWi-FiモジュールESP8266がありました。 この優れた記事リンクで事前設定について読むことができます。

まず最初に、SMSを送信するためのさまざまなインターネットサービスをGoogleで検索しました。 多くのサービスがありましたが、適切なサービスはありませんでした。 1日あたり10 SMSか、お金が必要です。 はい、そしてキャプチャarduinineが強すぎます。 しかし、ここで、偶然、携帯電話会社の興味深いサービス(MTS BY)に出会いました。たった1ドルで、SMS リンクの形式でメール受信サービスを有効にできます。 まあ、それは完全に無料では機能せず、支払い後に375XXYYYYYYY@sms.mts.by(XXとYYYYYYYはネットワークコードと番号)の形式の郵送先住所を受け取りました。 つまり、すべてはarduinoからの通常の電子メール送信に帰着しました。



しかし、そこにありました。 最近、すべての自尊心のあるメールサーバーが、暗号化なしでポート25でのメールの受信を拒否していることが判明しました。 また、他のユーザーと通信したり、ホームサーバーに接続したりしたくありませんでした。 ここでそのようなサービスリンクを Googleで検索しました。 基本的な無料版では、彼らは月に6000文字を与えます。これは私の家庭での使用に十分です。 登録後、設定に移動し、生成されたsmtpサーバーのアドレス、ポート、ログイン、パスワードを確認します。



すぐにスケッチを描いて、メール375XXYYYYYYY@sms.mts.by and ... Bummerを送信します。 普通郵便に送る-来ます。 私はこの方法でヘッダーをやり直そうとしました-まったく同じように、文字はMTSサーバーの深byに消え、明らかにスパムフィルターボイラーに落ちました。



したがって、メールを「ウォッシュ」する必要があります。 洗濯サービスとしてmail.ru.(広告のために静かに嫌われている)を選びました。 メール設定で洗浄するために、「フィルターと転送」セクションで、新しいルールを作成しました。

設定




フィルターを作成した後、電子メールSMSの形式で提供されたコードを電話に入力して、フィルターをアクティブにする必要がありました。

これが勝利の瞬間です-私はアルドゥイニンから電子メールを送信し、一分後に電話がうれしそうなアラート信号で鳴り、通り過ぎる猫を怖がらせます。



さらに退屈な技術的詳細。

Arduino Mega 2560をボードとして使用しました。シリアルポートが3つ追加されているためです(通常の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 <<< 'パスワード'

または、 リンクなどのオンラインサービス。

さて、実際にはスケッチコードです。 スイッチを入れると、SMSが送信され、コードは永遠のサイクルに入ります。 追加のライブラリは使用されません。

コード
#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; }
      
      






All Articles