Zanim przejdziemy do opisu mojego pomysłu na komunikację z Internetem za pomocą M590 i Arduino – kilka słów o tym jak zmusić go do rozmowy ze stroną WEB za pomocą komend AT.
Dla totalnie początkujących:
Standardem w niskopoziomowej komunikacji z modemami są komendy AT.
Modem ma zazwyczaj interfejs szeregowy umożliwiający komunikację z nim za pomocą ciągu bitów. Komendy AT przesyłamy właśnie poprzez ten interfejs.
Jeśli nie mamy w komputerze portu szeregowego możemy kupić tanią przejściówkę USB=>UART i za jej pomocą komunikować się szeregowo z tego typu urządzeniami. Mikro-kontrolery i mikrokomputery (np. RaspberryPi, Arduino i inne) mają zazwyczaj sprzętowe wsparcie dla UART, jeśli nie – nie ma problemy aby programowo symulować taką komunikację. Więcej pisałem o tym w poprzednim artykule.
Procedurę połączenia z siecią GSM pominę – można się z nią będzie zapoznać w kolejnym wpisie.
Konfiguracja połączenia z APN:
Zaczynamy od podłączenia do APNu:
AT+CGDCONT=1,"IP","internet"
Najczęściej APN nazywa się „internet” (do sprawdzenia na stronie danego operatora GSM, ja korzystam z PLAY i ich oferty Rok ważności konta).
Połączenie z APN:
AT+XIIC=1
W odpowiedzi powinniśmy otrzymać „OK„.
W tym momencie rozpoczyna się negocjacja parametrów połączenia, przydzielenie adresu IP i finalne połączenie z APNem. Zajmuje to z reguły około 30 sekund.
Sprawdzenie stanu połączenia:
AT+XIIC?
W odpowiedzi powinniśmy otrzymać przydzielony nam adres IP.
jeśli nie – czekamy i okresowo ponawiamy zapytanie AT+XIIC?.
Połączenie z serwerem:
Teraz najciekawsze – łączymy się ze zdalnym hostem, na razie jest jeszcze łatwo:
AT+TCPSETUP=0,220.199.66.56,6800
- Pierwszy parametr to numer linku po którym się łączymy.
M590 udostępnia nam dwa linki – możemy więc utrzymywać dwa równoległe połączenia z serwerami. - Drugi parametr to adres IP serwera.
- Trzeci to numer portu zdalnego.
Wysyłamy zapytanie:
Teraz najmniej wygodna część:
AT+TCPSEND=0,10
Zaczynamy od poinformowania modemu, że zamierzamy przesłać poprzez link 0 dziesięć znaków, np.:
>1234567890
OK
+TCPSEND:0,10
Wiadomość możemy wpisać „na kilka razy”, po każdej części wysyłając znaki \r\n, gdy dojdziemy do 10 znaków i wyślemy \r\n – modem rozpozna, że zakończyliśmy przesyłanie wiadomości.
Dozwolone jest więc:
AT+TCPSEND=0,11
> hello {enter}
> world {enter}
odpowiedź: OK +TCPSEND:0,12
Pewną trudność sprawia policzenie ilości transmitowanych znaków.
Wysyłamy żądanie GET:
Teraz kwintesencja – wyślemy do serwera żądanie GET.
Prawidłowe żądanie powinno mieć postać:
GET /api/engine HTTP/1.1\r\nHost: art.azurewebsite.net\r\n\r\n
Koniecznie musimy poinformować serwer, że nasze żądanie dotyczy protokołu HTTP w wersji 1.1 oraz że nazwa wirtualnego hosta (czyli nasza domena) to np. art.azurewebsite.net.
Przypominam, że na jednym serwerze (pod tym samym adresem IP może znajdować się wiele serwisów internetowych w róźnych domenach, na IIS konfigurujemy to za pomoca host-headers, kiedyś o tym napiszę :)).
Przykład:
AT+TCPSEND=0,55
>GET /MyRestApi/ HTTP/1.1 {enter}
>Host: art.azurewebsite.net {enter}{enter}
Otrzymywanie danych:
Gdy nasze zapytanie zostanie przesłane poprawnie – otrzymamy odpowiedź w formacie:
+TCPRECV:0,10,1234567890
Gdzie:
- Zero to numer linku.
- 10 to ilość otrzymanych w odpowiedzi znaków
- 1234567890 to otrzymana odpowiedź.
Zamykanie połączenia:
AT+TCPCLOSE=0
Gdzie 0 to oczywiście numer naszego linku.
Jak rozwiązac nazwę DNS?
AT+DNS="www.wp.pl"
Odpowiedź: +DNS: 212.77.98.9 +DNS: OK
Pozostałe:
Modem potrafi również nawiązywac połączenia UDP i FTP.
Możemy również uruchomić na nim… serwer TCP (TCP listener)!
W pigułce:
Poniżej bardzo czytelny diagram komunikacji poprzez TCP zaczerpnięty z oryginalnej dokumentacji:
Co dalej:
W kolejnym artykule pojawią się konkrety związane z moją implementacją obsługi RESTapi w M590. Zapraszam! 🙂
Artykuł ukazuje się w ramach projektu CyberHome tworzonego w ramach akcji DajSięPoznać.
Potrzebuję wysłać taki kod:
https://api.thingspeak.com/update?api_key=XXXXXXXXXXXXXXXX&field1=5
Nie wiem jak to rozpisać.