Modem M590 – obsługa z Arduino – wywołujemy RESTapi

Dziś kolejna część artykułu o połączeniu Arduino i modemu M590 firmy Neoway, tym razem wywołamy już metody z RESTapi.

Połączenie z RESTapi:

bool SendGprsData(SoftwareSerial& ser, int SensorId, String Message)
{
  bool ok;
  probeCount++;
  WriteAdv(gsm, 1, "AT+IPSTATUS=0\r", "TCP", ok, 0);
#ifdef DEBUG_ON
  Serial.println("___Polaczenie z moim IP: " + String(ok));
#endif
  if (!ok) // jesli nie polaczony z moim IP
  {
    WriteAdv(gsm, 2, "AT+TCPSETUP=0,104.40.147.1,80\r", "OK", ok, 0);
    WriteAdv(gsm, 5, "AT+IPSTATUS=0\r", "TCP", ok, 0);
  }
  if (!ok)
  {
    ModemRestart();
    PrepareGprs(ser);
    SendGprsData(ser, SensorId, Message);
    return 0;
  }
  String strC0 = "GET /api/BusApi/Save" + PrepareMessage(SensorId, Message) + " HTTP/1.1\r\n";
  int lenC0 = strC0.length();
  String strC1 = "AT+TCPSEND=0," +  String(35 + lenC0) + "\r";
#ifdef DEBUG_ON
  Serial.println("strC1: " + String(strC1));
#endif
  WriteAdv(gsm, 3, strC1, ">", ok, 1);
  if (!ok)
  {
    ModemRestart();
    PrepareGprs(ser);
    SendGprsData(ser, SensorId, Message);
    return 0;
  }
#ifdef DEBUG_ON
  Serial.println("strCO: " + strC0);
#endif
  WriteAdv(gsm, 1, String(strC0), "", ok, 1);
  WriteAdv(gsm, 1, "HOST:MojaDomena.azurewebsites.net\r\n", "", ok, 1);
  WriteAdv(gsm, 5, "\r\n\r\n", "REC", ok, 5);
  if (!ok && probeCount < 2)
  {
    WriteAdv(gsm, 1, "AT+TCPCLOSE=0", "", ok, 5);
    SendGprsData(ser, SensorId, Message);
    return 0;
  }
  if (!ok) //TODO:
  {
    probeCount = 0;
    ModemRestart();
    PrepareGprs(ser);
    SendGprsData(ser, SensorId, Message);
    return 0;
  }
}

Tutaj najtrudniejsza część kodu – jeszcze niedopracowana, są z nią problemy. Generalnie… działa, ale absolutnie nie jestem z niej zadowolony.

Zaczynamy łatwo: łączymy się z adresem IP naszego serwera na porcie 80. Nie możemy tutaj używać nazwy DNSowej, do rozwiązywania nazw służy odrębna komenda – opisana w poprzednim artykule.

Jeśli nie uda się połączyć – restartujemy modem i zaczynamy procedurę od nowa.

Później następuje najgorsze: budowanie łańcucha żądania GET.

Koniecznie musimy poinformować serwer że używamy protokołu HTTP/1.1 i „wcisnąć klawisz ENTER” za pomocą przesłania znaków \r\n.

Za pomocą AT+TCPSEND=0,X informujemy modem, że zamierzamy przesłać X znaków. Szerzej opisałem to w poprzednim artykule.

Dalej następuje przesłanie żądania, jeśli są problemy – standardowo restartujemy modem i rozpoczynamy procedurę od początku.


Kod dostępny na GIThubie projektu.


Artykuł w ukazuje się w ramach projektu CyberHome tworzonego w ramach akcji DajSięPoznać.


 

6 odpowiedzi na “Modem M590 – obsługa z Arduino – wywołujemy RESTapi”

  1. No brawo, chyba pierwsza strona gdzie wszystko jest wytłumaczone „łopatologicznie” od A do Z, czekam jeszcze tylko na opis jak za pomocą tego modułu można wrzucić dane na swój serwer i jestem w niebie 😉
    BTW, jeśli potrzebujesz pomocy od strony elektronicznej służę pomocą 😉

  2. Hej,
    Mam dwa zagadnienia które mnie męczą.
    AT+XIIC? zwraca IP. Niestety nie jest to adres IP modemu co można łatwo sprawdzić logując się z M590 na serwer ftp i zerkając w logi. Skąd w takim razie pobrać adres IP?
    AT+TCPLISTEN=port- wg dokumentacji powinno uruchomić nasłuch na podanym porcie. Niestety to nie działa. Dobijanie się na ten port pozostaje bez odzewu.
    Masz może pomysł jak te dwa problemy rozwiązać? Utrudniają mi one zbudowanie malutkiego serwerka na bazie M590 i arduino.

  3. Hej,
    faktycznie na Twoje oba problemy jest jedno rozwiązanie!
    Gdy łączysz się poprzez GPRS (Internet Mobilny) otrzymujesz najczęściej IP z podsieci prywatnej, podczas uzyskiwania dostępu do sieci zewnętrznej (WAN, Internet) Twój adres jest tłumaczony (NAT) na adrespubliczny.
    Innymi słowy:
    1. Adres publiczny sprawdzisz na stronie https://whatismyipaddress.com/ (jest też kilka API do tego).
    2. Serwera „za NATem” bez dostępu do hosta świadczącego usługę NAT w łatwy sposób nie postawisz.
    To Twój M590 musi nawiązywać połączenie (poczytaj o LongPolling) lub zrób autorskie rozwiązanie oparte o Timer i okresowe sprawdzanie „czy jest coś do zrobienia”…
    Sorry, za duży skrót, ale to temat na oddzielny, spory artykuł! 🙂

  4. NAT
    Więcej już nie musisz pisać 🙂
    Gapiłem się jak sroka w gnat w ten ip 10….. i nie wpadłem że po drodze po prostu NAT jest.
    A mogło być tak pięknie jakby modem dostawał publiczne IP. Trzeba będzie coś wykombinować.
    Wielkie dzięki za szybką i rzeczową odpowiedź.
    pzdr

  5. String strC1 = „AT+TCPSEND=0,” + String(35 + lenC0) + „\r”;
    te 35 to które to znaki?
    Bo nijak nie mogę się doliczyć. Wydaje mi się że obfuskowałeś adres swojej strony i stąd niejasność.
    Czy \r i \n liczy się za jeden znak czy dwa?

Leave a Reply