TTL Phòng gửi vào
- 12183 lượt xem
I. Mở đầu
Đây là vấn đề mình đã nghiên cứu ra từ lâu rồi nhưng bận quá, gần cả tháng chưa viết bài lại. Và bây giờ làm một phát vào năm học mới cho nó xôm. Không dài dòng lôi thôi, vấn đề nạp tài khoản từ xa cũng rất là hữu ích cho nhiều dự án có GSM và khai thác rất nhiều về chúng nên việc hao tổn tài khoản là tất nhiên, có thể các bạn có các mẹo tận dụng tài nguyên như dùng sim khuyến mãi, học sinh sinh viên hay các gói các loại thuê bao gì đấy.. để tiết kiệm nhưng về mặt tiện lợi và lâu dài thì đây là giải pháp tối ưu nhất!hehe,vào bài thôi!Và trước khi đọc tiếp đề nghị quá vị, quáy bà con cô bác nội ngoại "n" họ xem lại các bài viết khác về Sim900A của mình với từ khóa Sim900 trên thanh tìm kiếm!
II. Thực hành
Bài viết này sử dụng các kĩ thuật không hẳn là căn bản để các bạn mới nhập môn không lâu cũng có thể nắm bắt được và gợi các kĩ thuật xử lí String-một kĩ thuật rất hay trên Arduino nên code rất là thô! những gì vần chuẩn bị thì y chang các bài viết trước và cần thêm cái điện thoại với 1 mã thẻ cào (đúng sai tùy thích, test chơi thôi mà!).ahihi!bà con đọc cho kĩ chỗ này rồi ngẫm nghĩ xem có gì .... không nhé!
1. Phương hướng
Mấu chốt của vấn đề là sử dụng tập lệnh AT để tạo ra chức năng (chức năng kích hoạt phương thức USSD mà thư viện chưa hỗ trợ, tính viết 1 thư viện luôn mà vẫn chưa viết :3!
gsm.SimpleWriteln("AT+CUSD=1,\"*101#\"");
Đây là câu lệnh gọi lệnh AT với cú pháp
gsm.SimpleWriteln();
Phần biến ở trong sẽ là một String đặt giữa cặp dấu nháy " "
bên trong cặp dấu này sẽ là các kí tự bắt buộc để thực hiện chức năng USSD
AT+CUSD=1,\
Và phần sau như các bạn quan sát thì sẽ là các mã đặt trưng cho các nhà mạng! để mọi người khỏi rối rắm thì chỉ cần thay đổi *101# như ví dụ trên thôi!
Như trên đã phân tích, lợi dụng đặc điểm đó, ta chỉ cần dùng nhiều thành phần String nói ghép lại với nhau để có được điều mình mong muốn!
Vậy cái thao tác huyền thoại chúng ta cần là *100*mã số thẻ#, ok tronng có thành phần là hằng *100* và #; biến là mã số thẻ!
2. Code
Như trên mình đã phân tích, các bạn tự vận động xem các comment mình ghi trong code đi nha! và Code này mình có kết hợp cả chức năng kiểm tra tài khoản nữa!
#include "SIM900.h" #include "SoftwareSerial.h" #include "sms.h" #include "call.h" CallGSM call; SMSGSM sms; char state[50], msg[50], resp[50], c2[20]="NAPTIEN", phong[100], ahihi[100]="AT+CUSD=1,\"*100*",ohoho[100]="#\"", so[30];//khoi tao cac xau ki tu char smstext[160];//noi dung tin nhan den char number[20];//so dien thoai tin nhan den theo dinh dang quoc te int numdata;//bien nay dung cho doc du lieu int flag=0; void setup() { Serial.begin(9600); Serial.println("GSM Shield testing."); if (gsm.begin(2400)) Serial.println("\nstatus=READY"); else Serial.println("\nstatus=IDLE"); delay(200); sms.SendSMS("0163yyyyxxx", "Arduino Community Vietnam"); } void loop() { char pos; //địa chỉ bộ nhớ sim (sim luu tối đa 40 sms nên max pos = 40) pos = sms.IsSMSPresent(SMS_UNREAD); // kiểm tra tin nhắn chưa đọc trong bộ nhớ //hàm này sẽ trả về giá trị trong khoảng từ 0-40 if((int)pos){//nêu có tin nhắn chưa đọc if(sms.GetSMS(pos, number, smstext, 160)){ Serial.print("So dien thoai: "); Serial.println(number); Serial.print("Noi dung tin nhan: "); Serial.println(smstext); if(strstr (smstext, c2)!=NULL){ strncpy(so, smstext+7, 13); so[30]='\0'; Serial.println(so); strcat(ahihi, so); strcat(ahihi, ohoho); Serial.println(ahihi); delay(100); gsm.SimpleWriteln(ahihi); delay(5000);//phai doi 5 giay moi gui va doc het du lieu char resp[100];//khoi tao xau cho noi dung tra ve gsm.read(resp, 100); //lay no Serial.println(resp);//in ra lan 2 delay(100); strncpy(phong, resp+17, 100); Serial.println(phong);//in ra thanh cong delay(100); sms.SendSMS(number, phong); //nhan tin tra ve noi dung delay(100); } else { if(strcmp(smstext,"KIEMTRA")==0)//so sánh 2 chuỗi,neu trong SMS gui toi co cuoi ky tu KIEMTRA moi thuc hien kiem tra { delay(100); gsm.SimpleWriteln("AT+CUSD=1,\"*101#\""); delay(5000); char resp[100]; gsm.read(resp, 100); delay(100); strncpy(phong, resp+17, 100); Serial.println(phong);//in ra thanh cong delay(100); sms.SendSMS(number, phong); //nhan tin tra ve noi dung delay(100); } } } sms.DeleteSMS(byte(pos));//xóa sms vừa nhận } delay(1000); }
III. Kết thúc
Nếu các bạn để ý thì trên đấy có các thao tác với String, chưa biết thì mọi người cũng tự tìm thấy trên cộng đồng nhá! Và rồi ai đã từng khúc mắc hay phiền toái với các tin nhắn trả về dài dòng và có nhiều phần không cần thiết thì mình cũng đã tích hợp luôn ở trên!tinh ý là thấy à nha!
Các bạn tha hồ sáng tạo với các chức năng nâng cao khác như kiểm tra định kì, tài khoản thấp thì tự báo......
À mém chút quên cái này, bạn nào lấy mã thẻ tồ lô đi test thì ráng tới khi tin nhắn trả về nó là lạ thì hãy chụp ảnh và cho mình thấy ở comment phía dưới nhá!hehehehe!
Thường thì nội dung tin nhắn trả về nó phải thế này:
ma so the cao khong hop le hoac da su dung..... đại loại là thế nhá, khác thì cho mình xem nha!
Mình sẽ sớm up video cho trực quan hên! Đi mượn điện thoại cô hàng xóm nhờ quay hoài cũng ngại!hehehehe