wtorek, 15 lipca 2014

Komendy AT, wysyłanie SMS PDU MODE - rozkminiamy po trochu


Cześć i czołem!

"Zestaw" do testów
Rozszerzenie mikrokontrolera o moduł GSM lub coś co będzie za niego służyć daje nam spore pole do popisu. Od alarmów z domu przed zalaniem/przegrzaniem pieca, przez sterowanie oświetleniem, aż po otwieranie bramy automatycznej skądkolwiek zasięg GSM pozwoli. Do uzyskania tych efektów mamy dwie drogi - albo zakupić moduł GSM, albo wykorzystać stary aczkolwiek działający telefon. Pierwsza nie zawsze tania, druga kusząca, o ile walają się nam stare komórki po domu. Obie można sterować na pomocą komend AT.

Czym są komendy AT? Są to takie zaklęcia, dzięki którym możemy "przejąć" kontrolę nad telefonem. Wypowiadamy je za pośrednictwem portu UART'u, a ich efektem może być jakaś akcja, lub odpowiedź na pytanie. Przeglądając internet możemy natrafić na spore "księgi zaklęć", ja postaram się przytoczyć przydatne, przetestowane na Ericssonie T20, który jest moim królikiem doświadczalnym przy tematyce GSM.


Sprawa jest o tyle fajna, że tym "czarodziejem" nie musi być człowiek, a np. mikrokontroler, czy komputer. Podpinamy piny Rx i Tx (jak to jest w UART) do telefonu i śmiga. Najlepszym polem do pierwszych testów jest terminal działający z portem COM komputera, kto jeszcze nie zna, polecam gorąco program PuTTY.

Stronka pobierania PuTTY:
http://goo.gl/OHa6HH

Lista przydatnych zaklęć AT, (rozszerzę ją jeśli znajdę jakieś ciekawe):
ATD <numer-telefonu>; najzwyklejsze wykręcenie numeru i dzwonienie, baza do najprostszego alarmu, należy pamiętać o średniku na końcu np: ATD 123456789;
ATH odłożenie słuchawki
AT+CBC zwraca nam stan baterii
AT+CSQ zwraca nam jakość sygnału
AT+CKPD="<klawisz>" emulacja klawiatury, można za jej pomocą "ręcznie" sterować telefon
Dla Ericssona T20:
S - zielona słuchawka YES
E - czerwona słuchawka NO
< , > - klawisz w lewo i w prawo
C - wiadomo, c klawisz od kasowania
Od 0 do 9, * oraz # - normalne klawisze do wystukiwania numeru telefonu
AT+CMGF=? dostępne tryby wysyłania smsów, jeśli zwróci nam +CMGF: (0) to mamy tylko PDU, jeśli +CMGF: (0, 1) wygrałeś, masz prostszy TEXT MODE. Niestety większość starych telefonów posiada tylko PDU, więc jeśli chcemy wysyłać sms'y są dwie opcje. Albo dorwać taki co nadaje TEXT MODE, albo rozkminić PDU MODE.


Przy TEXT MODE nadawanie sms'ów jest banalane:
AT+CMGS="+48123123123" wciskamy enter lub przesyłamy znak ASCII 13
>Tekst wiadomości wciskamy CTRL+Z lub przesyłamy znak ASCII 26

 Zainteresowanych odsyłam do dokumentacji w google, gdyż chcę się skupić na aspekcie wysyłania SMS'ów w trybie PDU.

Przy PDU mode sprawa wygląda tak:
AT+CMGS=<długość komunikatu>
jw. ENTER/ASCII 13
> <zakodowany komunikat>
jw. CTRL+Z/ASCII 26

Przykład:
AT+CMGS=25
> 0011000B918466515076F80000AA0CD437485D9ED341D3E6D405 

Takie czary. Pod całym komunikatem jest schowane wszystko. Numer centrum SMS, numer odbiorcy, czas ważności sms'a, jak i sama treść sms'a. Myślę sobie wtf, kto to zrobił, a komu to potrzebne? Znalazłem translator który tłumaczy z trybu tekstowego na PDU i odwrotnie.

PDU <-> TEXT translator:
http://twit88.com/home/utility/sms-pdu-encode-decode

Pierwsze wnioski: Nie potrzeba podawać numeru centrum SMS. Komenda która podaje translator AT+CMGW= służy do zapisania wiadomości w telefonie, potem trzeba wysłać komendą AT+CMSS=1. Jeśli chcemy od razu wysłać potrzeba użyć AT+CMGS=<długość komunikatu> i pozostałe elementu jak podałem wyżej.

Teraz aby wysłać wiadomość mamy dwie opcje:
Albo generujemy sobie parę "gotowców" - przygotowanych komunikatów i podpinamy je pod jakąś reakcje w programie, co też jest jakimś rozwiązaniem, albo tworzymy funkcję do której podamy numer odbiorcy oraz treść sms'a a ona sobie go już przetłumaczy na swój język. Własny translator okaże się przydatny gdy zechcemy przesyłać jakąś zmienną, temperaturę, godzinę, cokolwiek.


Funkcja nadawania SMS
Poszperałem, pokombinowałem, ze 100 kompilacji programu później udało się mi osiągnąć pierwszy cel - funkcja wysyłania SMS w trybie PDU. Bazowałem na artykule ze strony http://goo.gl/gGJhTs tylko że tam argumenty były rozbite, wymagało to paru przeróbek.
Ja jako że się grzebać przy tych argumentach nie będę, jedyną wartością jaką będę zmieniać to numer i treść sms'a, postanowiłem maksymalnie ją uprościć i doprowadzić do postaci używalnej przy zwykłym uC AVR.
Jeszcze jedna poprawka polegała na dodaniu zera przed liczbę mniejszą od 16 (równą 0x0F lub mniej), bez tego po prostu komunikat nie działał.

Przyznam szczerze że procederu tłumaczenia samej treści sms'a średnio ogarniam, komu to potrzebne i w jakim celu ktoś to stworzył. Niemniej działa, funkcja wygląda mniej więcej tak (screen obok).

Do funkcji sendsms przekazujemy treść sms'a i numer, oba parametry w postaci łańcucha znaków. Co do numeru trzeba zrobić jeden gwizd, oznaczyłem to w źródłach:

Mamy numer: 48123456789
Dodajemy F na końcu: 48123456789F
Zamieniamy cyfry w kolejnych parach miejscami:  8421436587F9

Wszystko co trzeba opisałem w prostym testowym programie, jak coś to pytać :)

Testowy program:
http://goo.gl/r5oCKp

Następny cel do osiągnięcia - odczyt sms'ów w trybie PDU, tak więc stay tuned for more :)

Spodobało się? 
Zostaw komentarz, daj lajka, powiedz babci. Zrób cokolwiek. Umieram z braku feedback'u.
https://www.facebook.com/avr4fun <- Odwiedź fanpage
https://www.youtube.com/user/Marcin19941 <- Sprawdź co podziewa się na moim kanale youtube, wrzucam tam czasem zajawki projektów :)

Peace!

Brak komentarzy:

Prześlij komentarz