Arduino Polska Forum

Pełna wersja: GSM A6 połączenie z serwerem za pomocą Websocket
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Dzień dobry,

Poszukuję pomocy w napisaniu skryptu dla Arduino, który będzie wymieniał się danymi z serwerem za pomocą WebSocket'a przez moduł GSM A6 z użyciem komend AT, czy w ogóle jest to możliwe?

Narazie zebrałem informacje na temat, że najpierw trzeba otworzyć połączenie za pomocą request'a, który ma wyglądać tak:

Protokół WebSocket został zaprojektowany tak, aby dobrze współpracował ze starszą infrastrukturą internetową. Używa uzgadniania zgodnego z HTTP, aby ustanowić połączenie między klientem a serwerem. Proces uruchamiania połączenia WebSocket rozpoczyna się od wysłania przez klienta GET HTTP za pomocą pola WebSocket „Upgrade”. Po połączeniu inicjowane są przełączniki komunikacji do dwukierunkowego protokołu binarnego w przeciwieństwie do protokołu HTTP.

GET /INDEX HTTP/1.1
Host: testgolang.cba.pl
Connection: Upgrade
Upgrade: websocket
Origin: http://testgolang.cba.pl


Jeśli serwer obsługuje WebSocket's, odpowiada odpowiedzią UPGRADE HTTP.

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade


W tym momencie gniazdo TCP używane do komunikacji HTTP jest przetwarzane w celu wykorzystania do połączenia z WebSocket, a każda ze stron może rozpocząć wysyłanie danych. WebSocket's używają tych samych portów co HTTP - 80 dla HTTP i 443 dla HTTPS.


Kod:
#include <SoftwareSerial.h>
SoftwareSerial GSM(3,2);

void setup() {
  GSM.begin(115200);
  Serial.begin(115200);

  Serial.println("Start...");

  GSM.println("AT+CSQ");
  updateSerial();
  GSM.println("AT+CGATT=1");
  updateSerial();
  GSM.println("AT+CIPSTART=\"TCP\",\"testgolang.cba.pl\",80");
  updateSerial();
  delay(2000);
  GSM.println("at+cipsend=80","GET /index.php?a=okok HTTP/1.1");
  delay(2000);
  updateSerial();

}

void loop() {
  updateSerial();

}

void updateSerial(){
  delay(2000);
  while(Serial.available())
    GSM.write(Serial.read());
   
  while(GSM.available())
    Serial.write(GSM.read());
}


Zaczynam od kodów z request'em i teraz będę próbował napisać kod, który będzie wymieniał się informacjami z serwerem za pomocą WebSocket, może macie pomysły jak ten kod napisać?
(21-06-2019, 22:17)kita007 napisał(a): [ -> ]Poszukuję pomocy w napisaniu skryptu dla Arduino, który będzie wymieniał się danymi serwerem za pomocą WebSocket'a przez moduł GSM A6 z użyciem komend AT, czy w ogóle jest to możliwe?
Jak najbardziej możliwe, czego dowodem jest np projekt "Domofon GSM" opublikowany w https://ep.com.pl/.
Niestety, aby dobrze zrobić obsługę GSM, zapomnij o arduinowym podejściu (CMD, delay, CMD, delay itd) bo prędzej czy później program się "wysypie". Musisz zrobić maszynę stanów, parsowanie danych. Na ile jest to trudne, może świadczyć fakt, że tak jak do większości projektów udostępniam kody źródłowe, tak do domofonu GSM czy innych z modemami GSM, kodów nie udostępniam.
Realizacja obsługi GSM zajęła mi ok 2 miesiące. Z pewnością niedługo przeczytasz, ze to jest proste, więc proszę udostępnić mi te proste kody a pokażę, ze w kilka minut spowoduję, ze program się "wysypie". Nagminną wadą arduinowych programów, jest założenie, ze modem jest włączony a ZAWSZE może się zdarzyć, że wyłączy się. ZAWSZE możesz otrzymać komendę o wylogowaniu. Arduinowe badziewiarskie programy, praktycznie NIGDY nie sprawdzają jakości sygnału i odpowiedzi modemu, np po wysyłaniu SMS.

Jeśli nie jesteś dobrym programistą, który potrafi pisać programy wielowątkowe, to raczej zapomnij o GSM. Sugerowałbym użycie RTOS, znasz go?
Potrafisz posługiwać się debugerem?
Masz analizator logiczny, choćby https://www.gotronik.pl/la1016-analizato...-2691.html. O SaleAE raczej zapomnij, nie ma on wewnętrznej pamięci na próbki. Do tego oscyloskop, wystarczy któryś z https://www.gotronik.pl/rigol-c-4_35.html + wskazane licencje za jakieś 4..8k zł. Ja bym od razu zainwestował w 4 kanały. Modem GSM jest bardzo czuły na jakość zasilania, jak będziesz miał problemy z modemem (wylogowania) to bez oscyloskopu długo będziesz szukał problemu.
Pomijając fakt, czy masz oscyloskop, potrafisz się nim posługiwać?
Na ile dobrze znasz uC którego chcesz użyć? Jaki to uC? Widzę, że zabierasz się za ETH, więc sensowna minimalna wielkość RAM to 8kB, z praktyki stwierdzę, że 32. FLASH min 64kB, więc bez 128 a raczej 256 bym nie podchodził. Te wymagania w praktyce eliminują AVR (mega czy nawet Xmega), nie to, że się nie da. Da się ale się namęczysz. Warto użyć kilkadziesiąt razy gorszego AVR i co istotne DROŻSZEGO od ARM i się narobić? Lubisz wyzwania?
W naszym kraju, z ARM, popularne są STM32, to dobry wybór, tanie, łatwo osiągalne, tani (13zł) debuger (ile kosztuje do AVR sam sprawdź - przepaść cenowa). Dużo literatury, darmowych kursów w Internecie, bardzo duży wybór uC, od kilku kB Flash/RAM, do megabajtów. Mniej popularne są NXP (Philips), debuger trochę kosztuje.