Sudah lama sekali saya tidak membahas mengenai SMS gateway menggunakan modul sim800, salah satu alasannya mungkin karena ada pemblokiran IMEI dari pemerintah yang menyebabkan beberapa modem menjadi "reject" karena saat diberi AT command "AT+CREG?" balasannya "CREG :0,2" yang artinya reject dari netwoknya. Namun jangan khawatir karena beberapa trik yang dibagikan para penggiat modem simcom ada yg memang cukup jitu, dimana salah satu langkah berikut dapat dilakukan sebelum kamu membuang modem simcom kamu:
1. Pastikan tegangan VCC sesuai yaitu di 3.5-4.2 volt yang merupakan tegangan normal baterai lithium 18650. Jadi jika power supply kamu diatas itu tegangannya maka gunakanlah modul stepdown atau gunakan baterai lithium 18650 + chargernya. Ikuti salah satu setup hardware dibawah :
2. Jika menggunakan modul sim808 atau sim900 yang berupa evaluation board dan sudah ada regulator stepdown, maka pastikan power supply yg masuk ke arduino uno (jika menggandeng 5 voltnya sebagai input power) atau ke modul EV board harus menggunakan adaptor yg amperenya tinggi diatas 1.5A dan diusahakan voltase adaptor 7.5 volt keatas. Saya menemukan dua kali seperti ini kasus dimana ketika dikasi input tegangan 5 volt modem sim808 saya auto standby / restart saat melakukan registrasi ke network (hanya kedip 4 x saja).
3. Jika memang IMEI dari modem kamu terblok oleh operator, maka langkah terakhir adalah merubah imei dengan perintah "AT+SIMEI=nomer imei baru" . Dimana bisa dapat imei baru ? Ya cari aja hp lawas yang tidak terpakai dan gunakan saja IMEI nya. Saya sukses merubah imei dari sim800L dan jangan sekali kali menghidupkan hp lawas tadi agar server CEIR dari operator seluler tidak mendeteksi fraud imei.
Dan ketika gembira mendapatkan LED modem berkedip per 0.5 detik, atau ketika dicoba "AT+COPS" dibalas "+COPS:0,0,"Indosat" " , maka kamu bisa mencoba script berikut untuk mengirim sms (pastikan pulsanya ada ya !).
#include <SoftwareSerial.h> #define TX_PIN 8 #define RX_PIN 7 SoftwareSerial serialSIM800(TX_PIN, RX_PIN); void setup() { Serial.begin(9600); //HW Serial Monitor while(!Serial); Serial.println("Inisialisasi modul SIM800L"); serialSIM800.begin(9600); delay(1000); Serial.println("Kirim SMS..."); //Set mode teks untuk pengiriman sms serialSIM800.write("AT+CMGF=1\r\n"); delay(1000); //Mulai mengirim Sms ganti nomer tujuan kamu serialSIM800.write("AT+CMGS=\"081234567890\"\r\n"); delay(1000); serialSIM800.write("System ready"); delay(1000); serialSIM800.write((char)26); //CTRL-Z delay(1000); Serial.println("SMS Terkirim!"); } void loop() { }
Mari kita ingat kembali sekitar 11 tahun lalu saya membagi script untuk melakukan kontrol ke mikrokontroller yang dikirimkan melalui SMS, bisa dibaca disini : https://www.aisi555.com/2013/05/sms-kontrol-mengirim-perintah-ke-micro.html , dan perintah AT commnd yang penting adalah :
AT+CMGF=1 : Untuk merubah ke mode SMS teks
AT+CNMI=2,2 : Untuk merubah sms mode flash sehingga teks bisa langsung diparsing
+CMT :"+628155555555","11/10/01,12 :30 :00+00", pesan sms disini
AT+CPMS =? : ini bisa diubah untuk memilih penyimpanan sms, lakukan di luar koding
AT+CMGD=1,4 : Delete semua sms agar tidak gagal sms yg baru masuk
Tujuan saya pada tulisan ini adalah untuk membuat semacam gateway sms humor yang akan kemudian dicoba didepan kelas mikrokontroler di prodi teknik listrik vokasi Unesa Surabaya. Jadi para mahasiswa akan mengirim sms nama mereka ke nomer sim808 yang saya pakai untuk kemudian di balas berupa humor bapack-bapack yang lumayan garing namun seru.
Bagaimana scriptnya ? Ini lengkapnya :
#include <SoftwareSerial.h>
#include <avr/pgmspace.h> // untuk menghemat RAM gunakan PROGMEM
SoftwareSerial gsm(2, 3); // RX, TX pins ke modem
String message = "";
String senderNumber = ""; // variabel nomer yang akan dibalas
bool newMessage = false; // Flag ada pesan baru
// jokes bapak bapak disimpan di PROGMEM
const char joke1[] PROGMEM = "Kenapa ayam nyebrang jalan? Karena mau ke seberang!";
const char joke2[] PROGMEM = "Kenapa gajah bawa koper? Karena mau pergi liburan!";
const char joke3[] PROGMEM = "Kenapa Indonesia panas banget ya? Padahal negara ASEAN.";
const char joke4[] PROGMEM = "Uang 100 ribu jika dilempar bakal jadi apa? Jadi rebutan.";
const char joke5[] PROGMEM = "Apa yang lebih besar dari dinosaurus? Hutan tempat mereka tinggal.";
const char joke6[] PROGMEM = "Huruf-huruf apa yang sering kedinginan? Huruf B karena ada di tengah-tengah AC.";
const char joke7[] PROGMEM = "Kentang apa yang bisa bikin bayi ketawa? Kentang-tingtung-tingtang-tingtungtang.";
const char joke8[] PROGMEM = "Kesenian apa yang sering dilakukan nasabah bank? Tari tunai.";
const char joke9[] PROGMEM = "Sapi apa yang larinya cepat? Sapida motor.";
const char joke10[] PROGMEM = "Monyet apa yang bikin sebel? Monyetel tivi nggak ada remote.";
const char joke11[] PROGMEM = "Sepeda apa yang tak bisa dicat? Sepeda hilang.";
const char* const jokes[] PROGMEM = {joke1, joke2, joke3, joke4, joke5, joke6, joke7, joke8, joke9, joke10, joke11}; // Array of joke pointers
void setup() {
gsm.begin(9600); // Start GSM communication
Serial.begin(9600); // For serial monitor
delay(1000);
Serial.println("Test GSM Modem Server for UNESA");
// Initialize GSM modem
gsm.println("ATE1");
delay(1000);
gsm.println("AT+CMGF=1"); // Set text mode
delay(1000);
gsm.println("AT+CNMI=2,2"); // Sms langsung baca
delay(1000);
gsm.println("AT+CMGD=31,4"); // Hapus sms
delay(1000);
}
void loop() {
if (gsm.available()) {
char c = gsm.read();
message += c;
if (c == '\n') { // End of a line
Serial.print("Received: ");
Serial.println(message);
// Check for SMS header (+CMT) to know it's an incoming message
if (message.indexOf("+CMT") != -1) {
senderNumber = extractPhoneNumber(message); // Extract sender's number
newMessage = true; // Set flag indicating the next line will be the message body
}
else if (newMessage && message.length() > 1) { // Process the next line after +CMT as the message body
String studentName = message;
studentName.trim(); // Remove any trailing spaces or newlines
// Send greeting with a random joke
String reply = createReply(studentName);
sendSMS(senderNumber, reply); // Use senderNumber extracted earlier
newMessage = false; // Reset flag after sending the SMS
}
message = ""; // Clear the message for the next line
}
}
}
// Extract phone number from the +CMT line
String extractPhoneNumber(String msg) {
int startIndex = msg.indexOf("\"") + 1;
int endIndex = msg.indexOf("\"", startIndex);
return msg.substring(startIndex, endIndex);
}
// Create the reply message with a greeting and a random joke
String createReply(String name) {
String greeting = "Halo " + name + ", ";
// Generate a random index and fetch the joke from PROGMEM
int randomIndex = random(0, 11);
char joke[100]; // Create a buffer to store the joke
strcpy_P(joke, (char*)pgm_read_word(&(jokes[randomIndex]))); // Read the joke from PROGMEM
return greeting + String(joke); // Combine greeting with joke
}
// Function to send an SMS
void sendSMS(String phoneNumber, String message) {
gsm.println("AT+CMGS=\"" + phoneNumber + "\"\r"); // Send the AT command for the recipient's number
delay(100);
gsm.print(message); // Send the SMS body
delay(100);
gsm.write(26); // Send Ctrl+Z to end the SMS
delay(500);
}
BREAKDOWN :
Yang paling penting adalah meng-extract nomer pengirim dan nama pengirim SMS saat ada pesan masuk dari uart modem berupa string "+CMT " :
if (gsm.available()) {
char c = gsm.read();
message += c;
if (c == '\n') { // End of a line
Serial.print("Received: ");
Serial.println(message);
// Check for SMS header (+CMT) to know it's an incoming message
if (message.indexOf("+CMT") != -1) {
senderNumber = extractPhoneNumber(message); // Extract sender's number
newMessage = true; // Set flag indicating the next line will be the message body
}
else if (newMessage && message.length() > 1) { // Process the next line after +CMT as the message body
String studentName = message;
studentName.trim(); // Remove any trailing spaces or newlines
// Send greeting with a random joke
String reply = createReply(studentName);
sendSMS(senderNumber, reply); // Use senderNumber extracted earlier
newMessage = false; // Reset flag after sending the SMS
}
message = ""; // Clear the message for the next line
}
}
Ekstraksinya ada di function ini :
// Extract phone number from the +CMT line
String extractPhoneNumber(String msg) {
int startIndex = msg.indexOf("\"") + 1;
int endIndex = msg.indexOf("\"", startIndex);
return msg.substring(startIndex, endIndex);
}
Selanjutnya adalah pemilihan jokes bapack-bapack secara random serta ditambahkan nama pengirim. Disini dapat dilihat terdapat perintah random dan diarahkan ke array jokes[] di PROGMEM
// Create the reply message with a greeting and a random joke
String createReply(String name) {
String greeting = "Halo " + name + ", ";
// Generate a random index and fetch the joke from PROGMEM
int randomIndex = random(0, 11);
char joke[100]; // Create a buffer to store the joke
strcpy_P(joke, (char*)pgm_read_word(&(jokes[randomIndex]))); // Read the joke from PROGMEM
return greeting + String(joke); // Combine greeting with joke
}
Lalu kemudian SMS dikirim kembali.
// Function to send an SMS
void sendSMS(String phoneNumber, String message) {
gsm.println("AT+CMGS=\"" + phoneNumber + "\"\r"); // Send the AT command for the recipient's number
delay(100);
gsm.print(message); // Send the SMS body
delay(100);
gsm.write(26); // Send Ctrl+Z to end the SMS
delay(500);
}
Dan hasilnya bisa dilihat pada gambar yang paling atas. SMS gateway seperti ini dulunya banyak digunakan untuk server penjual pulsa dimana pada saat pembelian pulsa maka dikirmkan kode-kode pulsa melalui sms ke nomer gatewaynya, dan kalau kalian sempat melihat voting indonesian idol jadul dibawah tahun 2010an maka votingnya dilakukan menggunakan sms gateway seperti penjelasan saya diatas.
0 komentar:
Posting Komentar