Namówiłem Karola żebyśmy połączyli siły i zrobili aplikację embedded z interfejsem webowym, współpraca zapowiada się znakomicie bo mamy uzupełniające się kompetencje. Karol zawodowo zajmuje się sklepami internetowymi a próbkę jego możliwości można zobaczyć tutaj http://www.autogas-lpg.pl/ . Część sprzętowa to będzie moduł GSM i mikrokontroler z całą armaturą dookoła, pisząc galanteria mam na myśli elementy zasilające, interface czy też raczej sygnalizację stanu, obudowy...
Robimy proste doświadczenia dotyczące styku pomiędzy serwerem a modułem GSM. Mamy dwóch faworytów:
- metoda POST/GET
- surowe dane przesyłane socketami
Oba sposoby mają wady i zalety. POST jest prosty do wytłumaczenia webowcom, każdy od razu wie o co chodzi i nie ma problemu z hostingiem. Problemem posta jest duży narzut na protokół, nie można po prostu przesłać bajtu do serwera bo każdą daną trzeba opakować w nagłówek POSTa, post siłą rzeczy jest tekstowy co rodzi dodatkowe problemy. Socket za to daje pełną swobodę, socket pod względem trudności obsługi po stronie modułu GSM jest porównywalny z przesyłaniem danych uartem. Można wysłać i pojedynczy 8-bitowy znak ale jest problem: Serwer musi być uruchomiony jako osobna maszyna - żaden zdrowo myślący administrator nie pozwoli wystawić otwartych socketów. Cały protokół trzeba budować od początku.
Narazie dostałem od Karola namiar na serwer który przyjmuje dane metodą POST, zanim zaimplementuję POSTy na module GSM postanowiłem przećwiczyć składnię wysyłając "recznie" składane requesty terminalem teraterm. Teraterm jest to Ferrari wśród terminali - dostarcza prosty język dzięki któremu nie trzeba klikać za każdym razem i wklejać danych do wysyłki. Teraterm jest dostępny tutaj http://logmett.com/index.php?/download/tera-term-474-freeware.html a opis języka skryptowego tutaj http://ttssh2.sourceforge.jp/manual/en/macro/index.html . Poniżej wklejam prościutki skrypt który wysyła dane metodą POST. Jak widać teraterm ma problem ze znakami końca lini, funkja sendln nie dołącza CR LF, ale można sobie z tym poradzić, liczę na to że w następnej wersji będzie lepiej.
changedir 'c:\'
logopen 'test.log' 0 1
while 1
connect 'test.someserwer.pl:80 /T=0 /LA=U'
setecho 1
send 'POST /arek01/www/add.html HTTP/1.1'
send 13
send 10
send 'Host: test.halaba.com.pl'
send 13
send 10
send 'Connection: keep-alive'
send 13
send 10
send 'Origin: http://test.halaba.com.pl'
send 13
send 10
send 'Content-Type: application/x-www-form-urlencoded'
send 13
send 10
send 'Content-Length: 26'
send 13
send 10
send 13
send 10
send 'urzadzenieId=nazwa2&data=2'
send 13
send 10
pause 2
disconnect 0
endwhile
Ważna uwaga:
/T=0
w skrypcie zmusza teraterm do otwarcia zwyklego socketa, w przeciwnym razie teraterm będzie próbował połączyć się protokołem telnet.
Składnia jest toporna ale można przywyknąć. Czas spędzony na nauce języka zwróci się co spróbuję udowodnić w jednym z kolejnych postów pokazując jak można wygodnie rozparsować odpowiedź otrzymaną przez port COM. Język skryptowy teraterm pozwala przetestować algorytm odpalając go na PC zamiast na docelowej platformie. Na sprzęcie musi działać tylko wysyłka, odbiór i interpretacja poleceń odebranych portem COM a cała "logika" zostaje zamknięta w skrypcie. Lubię teraterm w sytuacjach kiedy trzeba robić długotrwałe testy z generowaniem wydarzeń co pewne odcinki czasu - zamiast siedzieć ze stoperem w ręku przez godzinę - uruchamiam skrypt i mogę iść na kolejną obowiązkową przerwę kawową...