Shield GSM dla Arduino z Fibocom G510

Internet Rzeczy (IoT) to jeden z gorętszych tematów ostatnich miesięcy. Okazuje się, że nie tylko ludzie mogą odnosić korzyści  z komunikacji za pomocą mediów elektronicznych. W ten sposób możemy równie dobrze łączyć ze sobą maszyny (M2M: machine – to – machine).

Powstają więc całe sieci, gdzie urządzenia wymieniają między sobą dane, magazynują je i wspólnie przetwarzają. Jednym z ciekawszych zastosowań są samochody, które same wzywają pomoc w razie wypadku.

IoT wymaga modułów, które będą zapewniały łączność. W przypadku mikrokontrolerów, do niedawna wybór był bardzo ograniczony. Czasy jednak (na szczęście) się zmieniają a ceny modułów znacząco spadają.

Ostatnio dostałem do testowania shield dla Arduino umożliwiający wymianę danych i wysyłanie SMS’ów po GSM. Zobaczmy, jak można go wykorzystać.

fibocom_0


Sprzęt do testów dostarczył: electropark.pl
electropark_logo


Specjalnie dla Was przygotowałem kod źródłowy, który pozwoli Wam na swobodną obsługę tego rozszerzenia. Ponieważ zajmuje trochę miejsca, umieściłem go na githubie (taka chmura do przechowywania  kodu). Znajdziecie go pod adresem: github Fibocom G510.

Wejścia/wyjścia

Płytka dostarczana jest jako rozszerzenie do Arduino UNO/MEGA lub STM32 Nucleo. Zbudowano ją wokół czipu Fibocom G510.

fibocom_1Płytkę wyposażono w slot na kartę SIM (dużą) oraz gniazdo SMA do podłączenia zewnętrznej anteny. Sama antena również znajduje się w zestawie.

Rozszerzenie komunikuje się z kontrolerem za pomocą transmisji szeregowej (UART).

Zwróćcie uwagę na zworkę A-N: przełącza ona pin do którego podłączane jest wyjście z portu szeregowego czipu G510 (czyli do odbierania danych z niego). Dla Arduino możecie użyć pozycji A (odbieranie na pinie D12) lub N (odbieranie na pinie D2). Dla Nucleo użyjcie ustawienia N – wtedy wyjście z G510 podłączone będzie do PA10 STM (USART1_RX). Nadawanie do G510 odbywa się przez pin D8 (dla Nucleo PA9 – USART1_TX).

Nieużywane przez rozszerzenie piny Arduino (D3, D4, D5, D6, D7 oraz analogowe A2 i A3) wyprowadzono na bloki terminalne rozmieszczone na skraju płytki. Umożliwia to uzupełnienie modułu o dodatkowe funkcje. Terminale mają ułatwiać szybkie podłączenie.

Na płytce znajdziecie również terminale do zasilenia modułu: oznaczone +/- (nad gniazdem USB Arduino). Podłączono je (podobnie jak VIN z Arduino) do stabilizatora zapewniającego zasilanie płytce.

Na płytce znajdują się 3 LEDy:

  • ON: moduł w stanie „włączony”,
  • Power: moduł zasilany,
  • LPG: stan połączenia GSM.

G510

G510 Q50 to 4-zakresowy czip GSM (GSM850/900/1800/1900) z możliwością transmisji po GPRS.

Piny G510 (pobrane z instrukcji)
Piny G510 (pobrane z instrukcji)

Sam czip zasilany jest napięciem 3.3-4V. Jego logika pracuje z napięciem do 3.3v. Ponieważ Arduino posługuje się logiką 5v (maksymalne napięcie logicznej „1”), producent dodał konwertery poziomów logiki na wszystkie używane przez rozszerzenie piny.

G510 umożliwia wysyłanie SMS i wymianę danych poprzez GPRS oraz prowadzenie rozmów.

GSM: część „głosowa”, GPRS: część umożliwiająca wymianę danych. Technologia GPRS (pakietowa transmisja danych) określana jest jako 2.5G. Umożliwia transmisję danych z maksymalną szybkością do 85kbit/s (pobieranie) i 46kbit/s (wysyłanie). Historycznie poprzedniczka EDGE, technologii 3G i 4G (LTE).

Chip posiada piny do podłączenia mikrofonu i 8Ω głośniczka – chociaż opisywane rozszerzenie takiej opcji nie udostępnia.

Uwaga: zasilanie!

Jeżeli spojrzycie na charakterystykę czipu G510 okaże się, że potrafi on być całkiem prądożerny:

  • Dla rozmów, średnio do 240mA, maksymalnie do 1630mA,
  • Dla danych, typowo do 400mA – maksymalne nie podane przez producenta.

Prezentowane rozszerzenie nie umożliwia prowadzenia rozmów, więc te najwyższe poziomy poboru prądu nie powinny nas martwić. Producent G510 podał jedynie średni pobór prądu (tabela 3.3.2) dla transmisji danych – w granicach 400mA. Możemy się dodatkowo spodziewać skoków, które wartość tą znacząco przekroczą. Arduino z takim rozszerzeniem „klasycznie” zasilane przez USB (katalogowo: max 500mA) mogłoby nie działać poprawnie.

Przewidując te problemy, producent postanowił zasilić rozszerzenie przez pin VIN Arduino (lub dodatkowy terminal umieszczony na płytce) i dalej na stabilizator LM2596 –  zalecajac jednocześnie stosowanie zewnętrznego zasilacza.

Jeżeli zasilicie Arduino przez USB, napięcie pojawi się również na pinie VIN. Powodem tego jest… dioda D1 zabezpieczająca stabilizator 1117 przed tzw. back-feed (pobrano z instrukcji do NCP1117) :

back_feed_ams1117Dioda ta zadziała, gdy na wejściu do stabilizatora nie będzie napięcia – a pojawi się ono na wyjściu – czyli gdy Arduino zasilicie przez USB a nie przez VIN.

LM2596 zapewnia do 3A prądu. Minimalne napięcie wejściowe dla niego to 4.75V, a więc – po wtóre – zasilanie przez USB może nie spełnić tego wymagania.

Gdy zasiliłem Arduino przez port USB mojego laptopa, na VIN Arduino pojawiło się napięcie jedynie 4.45V. W tych warunkach, na wyjściu stabilizatora pojawiło się jedynie 3.1V. Minimalne zasilanie czipu G510 to 3.3V (VBAT). Rozszerzenie – pomimo że lampki „Power” i „On” świeciły się – nie działo poprawnie.

Maksymalne napięcie wejściowe tego stabilizatora to 45V – ale biorąc pod uwagę możliwości stabilizatora 5V na Arduino, pewnie lepiej pozostać przy maksymalnie 12V.

Arduino z tą płytką GSM należy zasilać zewnętrznie przez port DC Arduino (okrągły jack) lub dodatkowy terminal na płytce rozszerzenia, oznaczony +/-. Plus tego terminala połączony jest z VIN Arduino (przez diodę zabezpieczającą). Zasilając przez port DC Arduino lub terminal – zasilicie rozszerzenie i płytkę Arduino jednocześnie.

Pewnym rozwiązaniem może być również dobry, aktywny hub USB. Moja płytka działała poprawnie z hubem PiHut.

Gdy zasiliłem Arduino przez USB z aktywnego huba USB PiHut, na VIN Arduino pojawiło się napięcie 4.75V. Dzieki temu na wyjściu stabilizatora pojawiło się 3.32V, co wystarczyło do zasilenia czipu.

Zasilanie Vin/bez rozszerzenia Vin/z rozszerzeniem Wyjście ze stabilizatora Czip działa?
 Port USB laptopa  4.45V  3.88V  3.1V Nie odpowiada na komendy  AT
Hub USB  4.75V  4.45V  3.32V  Ok
 Zewnętrzny zasilacz 12V  11.340v  11.4634  3.32  Ok

Uruchomienie

Kilka szczegółów technicznych na temat tego  rozszerzenia znajdziecie w dalszych sekcjach tego tekstu. Teraz po prostu je uruchomimy.

Rozszerzenie sprzedawane jest w postaci zmontowanej. Nie musicie nic lutować. Wystarczy nałożyć je na Arduino, dokręcić antenkę, podłączyć zasilanie do Arduino przez wtyk jack (lub terminal na rozszerzeniu) i samo Arduino do komputera przez USB (do programowania).

Teraz uruchomcie Arduino IDE, ustawcie w menu typ Waszego Arduino oraz port szeregowy, do którego jest podłączone. Nasz pierwszy projekt będzie bardzo prosty: wyślemy na płytkę komendę AT i sprawdzimy, czy moduł odpowiada.

Rozszerzenie komunikuje się z Arduino za pomocą portu szeregowego UART. Rozszerzeniem (a właściwie czipem G510) sterujemy wysyłając komendy AT na ten port szeregowy.

Upewnijcie się, że zworka A-N jest w pozycji A.

Otwórzcie nowy projekt i dodajcie bibliotekę SoftwareSerial. Teraz wpiszcie następujący kod:

Ten programik jest bardzo prosty: co 1 sekundę wysyła do czipa instrukcję „AT”. Jeżeli czip działa, powinien odpowiedzieć na nią echem (tą samą komendą „AT”) oraz „OK”.

Zauważcie, że używam 2 portów szeregowych: „ss” – do komunikacji z rozszerzeniem, oraz wbudowany „Serial”, do wyświetlania postępów programu na konsoli szeregowej komputera, z którego programuję Arduino.

Zwróćcie uwagę na deklarację portu szeregowego:

Arduino nadaje na pin D8 a odbiera na pinie D12. Jeżeli jednak zworkę A-N przełączycie w pozycję N – powinniście zamienić powyższe na:

Dla Nucleo użyjcie ustawienia 'N'.

Jeżeli z czipem jest wszystko ok, wyjście z monitora portu szeregowego (uruchomcie go wciskając kombinację [ctrl]+[m] w Arduino IDE) powinno wyglądać tak:

Więcej o komendach AT

Do poniższych przykładów wykorzystywałem jedynie bibliotekę SoftwareSerial. Istnieje wiele bibliotek dla Arduino, które obsługują czipy GSM. Moim celem było jednak przedstawienie jak G510 działa. Zastosowanie gotowej biblioteki „przykryłoby” kilka problemów, na które chciałem Wam zwrócić uwagę.

Jak widzicie, komunikacja z czipem odbywa się po interfejsie szeregowym. Komendy wydajemy tekstowo – taki też jest format ich rezultatu zwracany przez chip. Sprawdźmy teraz numer IMEI modemu. Służy do tego komenda AT+CGSN.

Kompletny zestaw komend dla G510 znajdziecie w tej dokumentacji.

Zmodyfikuję tylko funkcję „loop()”:

Instrukcję z poprzedniego przykładu: ss.println("AT"); zamieniłem na ss.println("AT+CGSN");. Na monitorze portu szeregowego pojawi się teraz:

Zauważcie, że zwrócony numer jest taki sam jak ten nadrukowany na czipie rozszerzenia.

chip_imei
Ogólny format odpowiedzi na komendy AT jest następujący (niektóre komendy mogą zachowywać się trochę inaczej – odsyłam do dokumentacji):

W przypadku błędu:

gdzie:

  • <komenda>: komenda AT, którą wydaliście (w pierwszej linii echo z czipa)
  • <CR>: carriage return, znak o kodzie ASCII 13,
  • <LF>: line feed, znak o kodzie ASCII 10,

Zwróćcie uwagę na echo komendy. W pierwszej linii G510 powinien najpierw odpowiedzieć wydaną przez Was komendą. Po wysłaniu komendy zdarzają się odpowiedzi:

OK
AT+C
ERROR

W takim wypadku powinniście zignorować pierwsze „OK” – wynik komendy „AT+C” znajduje się dopiero w 3-ciej linijce („ERROR”, takiej komendy nie ma).

Kod do wysyłania komend AT znajdziecie na githubie: github Fibocom G510. Szukajcie funkcji „sendATcommand” i „sendATcommandS”.

Ciekawe komendy, które możecie wykonać:

  • AT+CGMI: producent czipu,
  • AT+CGMM: wspierane technologie,
  • AT+CGMR: wersja czipu,
  • AT+CGSN: numer IMEI.

SMSy

Kolejną wypróbowaną przeze mnie funkcją było wysyłanie SMS’ów.

Sprawdzimy najpierw, w jakim trybie chip będzie umożliwiał wysyłanie wiadomości SMS. Służy do tego komenda AT: „AT+CMGF?” – zgadza się, na końcu linijki powinien być znak zapytania.

SMS’y można wysyłać w trybie PDU i tekstowym. Stworzenie wiadomości w trybie PDU jest dość skomplikowane! Tutaj zajmiemy się jedynie trybem tekstowym.

Dostaliście „ERROR”? Cóż – czas włożyć kartę SIM! Najpierw odłączcie Arduino, potem wsuńcie kartę SIM do slotu na rozszerzeniu i z powrotem włączcie Arduino.

fibocom_05

Niektóre karty pre-paidowe wymagają uprzedniej aktywacji w „normalnym” telefonie. Dla Play wystarczy wykonać połączenie lub sprawdzić stan konta.

Teraz już możecie sprawdzić tryb wysyłania SMS’ów. Jeżeli komenda „AT+CMGF?” zwróci wartość „0” – czip jest w trybie PDU. Musicie zmienić go na tekstowy wydając komendę: „AT+CMGF=1”.

Czy to wszystko, żeby wysłać SMS’a?

Podobnie jak w przypadku normalnego telefonu komórkowego, zasilony czip musi się zalogować do swojej sieci, ściągnąć z niej ustawienia – słowem: chwilę to trwa. Czysta komenda „AT” zwróci nam „OK” gdy tylko czip jest uruchomiony. Trzeba będzie jednak chwilę odczekać, zanim wyślecie pierwszego SMS’a.

W momencie gdy rozszerzenie jest zalogowane do właściwej karcie SIM sieci komórkowej, dioda LPG powinna krótko zapalać się co 3s. Stan taki trudno jednak wykryć Arduino:) Dużo łatwiej jest wydać inną komendę AT: „AT+CSCA?”. Komenda ta zwraca numer centrum SMS’owego operatora. Jeżeli zwróci poprawny numer (w praktyce jakikolwiek) – jesteście gotowi do wysyłania SMS’ów.

Samo wysłanie SMS’a jest trochę bardziej skomplikowane. Najpierw musicie wykonać komendę: AT+CMGS=”+48*********” – razem z cudzysłowami (gwiazdki zamieńcie na numer telefonu).

Komendę tą możecie przygotować sobie za pomocą takiego fragmentu kodu:

Zauważcie, że numer telefonu musi znajdować się między cudzysłowiami. Jeżeli komendę wysyłacie funkcją „print()” – musi kończyć się <CR><LF> – czyli „\r\n”. W przypadku „println()” nie jest to potrzebne.

Podobnie przygotujcie sobie wiadomość: musi kończyć się sekwencją znaków 26, 13, 10. Ja używam „println” – więc końcowe <CR>, <LF> nie jest konieczne:

W odpowiedzi na komendę AT+CMGS=”+48*********” dostaniecie jej echo oraz znak „>”. Wtedy powinniście podać wiadomość (już bez cudzysłowów). Poczekajcie na „OK”  – i SMS wysłany.

Kod do wysyłania SMS’ów znajdziecie na githubie: github Fibocom G510. Szukajcie funkcji „sms”.

Kilka szczegółów…

Podłączenie do pinów

Rozszerzenie wykorzystuje piny kontrolera w następujący sposób:

Pin Arduino Znaczenie
 D0 RX, nie wykorzystywany przez rozszerzenie
 D1 TX,  nie wykorzystywany przez rozszerzenie
 D2 Wyprowadzone na złącze A-N, odbieranie danych z chipu gdy N zwarte z pinem środkowym
 D3 Wyprowadzone na płytce jako blok terminalny – może być wykorzystywane do innych zastosowań
 D4 Wyprowadzone na płytce jako blok terminalny – może być wykorzystywane do innych zastosowań
 D5 Wyprowadzone na płytce jako blok terminalny – może być wykorzystywane do innych zastosowań
 D6 Wyprowadzone na płytce jako blok terminalny – może być wykorzystywane do innych zastosowań
 D7 Wyprowadzone na płytce jako blok terminalny – może być wykorzystywane do innych zastosowań
 D8 Wysyłanie danych do czipa
 D9 Nieużywane, nie wyprowadzone
 D10 Nieużywane, nie wyprowadzone
 D11 Nieużywane, nie wyprowadzone
 D12 Wyprowadzone na złącze A-N, odbieranie danych z chipu gdy N zwarte z pinem środkowym
 D13 Podanie sygnału niskiego przez co najmniej 800ms włącza (jeżeli wyłączony) lub wyłącza czip (jeżeli włączony).
 A0  Wyprowadzenie WakeUp
 A1  Nieużywane, nie wyprowadzone
 A2 Wyprowadzone na płytce jako blok terminalny – może być wykorzystywane do innych zastosowań
A3 Wyprowadzone na płytce jako blok terminalny – może być wykorzystywane do innych zastosowań
A4 Nieużywane, nie wyprowadzone
A5 Nieużywane, nie wyprowadzone
A6 Nieużywane, nie wyprowadzone
VIN Zasilanie czipu
GND Wspólna masa
5v Nieużywane, nie wyprowadzone
3.3v Nieużywane, nie wyprowadzone
AREF Nieużywane, nie wyprowadzone
Programowe wyłączenie czipu/D13

Czip można włączać/wyłączać programowo. Czip może być zasilony (świeci się dioda Power), ale nie musi być włączony (On i LPG wyłączona).

Wystarczy utrzymać sygnał niski na pinie D13 przez więcej niż 800ms. D13 podłączono do pinu 14 czipa G510 (POWER_ON). Możecie napisać prostą funkcję:

Skoro jednak zmiana stanu (a właściwie jego opadające zbocze) D13 przełącza czip między on/off, potrzebna jest metoda na wykrycie czy czip jest aktualnie włączony/wyłączony. Możecie do tego użyć komendy AT. Jeżeli zasilony czip G510 zwróci ERROR – chip nie jest włączony.

Kod do włączania i wyłączania czipa znajdziecie na githubie: github Fibocom G510. Szukajcie funkcji „chipOn”, „chipPresent”.

LEDy

Dioda Power podłączona jest do stabilizatora. Świeci się jeżeli tylko na jego pinie wyjściowym wystąpi napięcie.

Dioda Power będzie świecić, nawet jeżeli napięcie stabilizatora nie jest wystarczające do zasilenia G510 – patrz paragraf na temat zasilania.

Dioda LPG podłączona jest  do pinu 38 (LPG) i sygnalizuje stan czipa:

  • Wyłączona: moduł wyłączony lub uśpiony
  • Wolno miga (600ms wyłączona, 600ms włączona): nie ma karty SIM, wpisz PIN, trwa rejestracja do sieci (do 15s) lub błąd rejestracji w sieci,
  • Krótko miga co pewien czas (3s wyłączona, 75ms włączona): moduł w stanie spoczynku (idle), nic nie robi
  • Szybko miga (75ms włączona/75ms wyłączona): uruchomiona transmisja po GPRS,
  • Włączona: trwa rozmowa

Dioda On informuje nas o tym, czy czip G510 jest włączony. Diodę On podłączono do do pinu VDD G510. Pin ten jest zasilany, gdy czip jest w stanie włączonym.

Dioda On dubluje więc działanie diody LPG. LPG będzie krótko migać w stanie włączonym – i zgaśnie w wyłączonym.

VDD

VDD jest wyjściem wewnętrznego stabilizatora znajdującego się w czipie G510. Fibocom przeznaczył je dla zasilania dodatkowych akcesoriów i może dać do 200mA; przy 30mA producent zapewnia napięcie 2.8V. Zasilanie tego pinu jest włączane przy starcie czipu, mogłoby więc być użyte do wykrywania jego stanu włączonego.

Podsumowanie

MikroTar.pl wyprodukował bardzo przyjemny moduł. Instalacja jest bezproblemowa. Producent poszedł na pewne kompromisy całkowicie ograniczając część „głosową” G510 jakby przeznaczając rozszerzenie specjalnie pod wymianę danych.

Z rzeczy, które warto by poprawić w kolejnej wersji, to wyprowadzenie wszystkich pinów G510 oraz tych z Arduino, które nie są używane. Pozwoliłoby to na jeszcze więcej zabawy.

Plusy:
  • Wystarczy nałożyć na Arduino UNO, włożyć kartę SIM i podłączyć zasilanie – gotowe do działania.
  • Rozszerzenie nie wykorzystuje sprzętowego UARTa Arduino (pinu D0 i D1), przez co nie blokuje programowania Arduino przez USB,
  • Dane z rozszerzenia można odbierać przez pin 2 lub 12 – daje to pewne możliwości ich wykorzystania do innych celów, np. podłączając się kabelkiem żeńskim do złącza A-N,
  • Karta SIM znajduje się całkowicie w obrębie płytki – nie ma więc możliwości, żeby ją przypadkowo wysunąć,
  • Płytka jest odpowiednio sztywna, posiada czytelne nadruki.
Ani tak, ani siak:
  • Zdublowana funkcjonalność diod On i LPG; On wydaje się niepotrzebna.
  • Zamiast podłączać VDD czipa do diody On, można je było wyprowadzić na jeden z pinów Arduino. W ten sposób można by odczytać czy czip jest włączony,
  • Terminale na nieużywanych pinach wyjściowych: sam nie wiem… szczerze mówiąc wolałbym normalne gniazda gold-pin i   przeorganizować płytkę tak, żeby można było nałożyć na nią kolejną płytkę rozszerzenia. Wtedy „odzyskalibyśmy” wszystkie piny nieużywane przez rozszerzenie (a jest ich kilka – patrz powyżej); w obecnym układzie płytka może być używana jako ta najwyższa,
  • Brak wyprowadzenia 5v z Arduino/zasilania ze stabilizatora – 3.3 v z dużym zapasem mocy? Przydałby się!
  • Brak wyprowadzeń pinów G510 do podtrzymania bateryjnego (tryb RTC, VBACKUP), mikrofonu i głośnika – a może by tak dodać 4-polowy wtyk na słuchawki? W każdym razie dodanie tych pinów umożliwiłyby jeszcze więcej zabawy:)
  • Może warto by było zamienić duży SIM na microSIM – duża oszczędność miejsca!
Minusy:
  • Terminal zasilający +/- znajduje się bardzo blisko gniazda USB Arduino. Przy instalacji na Arduino z „dużym” gniazdem USB, zwróćcie szczególną uwagę na spód płytki rozszerzenia: czy lut od terminala „+” nie dotyka obudowy gniazda USB (masa). Wyjście + z terminala podłączone jest do Vin przez diodę – niebezpieczeństwo zwarcia istnieje tylko przy zasilaniu przez ten terminal. Z tego co wiem, wada ta została usunięta w wersji produkcyjnej rozszerzenia (dotyczy jedynie płytek prototypowych, którą testowałem) – ale lepiej się upewnijcie,
  • Stabilizator o dość dużych wymaganiach co do napięcia wejściowego – sprawia, że rozszerzenie nie działa poprawnie zasilane z portu USB – przynajmniej mojego laptopa. Nie odpowiada wtedy na komendy AT, pomimo że świecą się diody On i Power.

W kolejnych tekstach o tym rozszerzeniu zajmę się odbieraniem wiadomości tekstowych oraz wymianą danych po GPRS.

Zakupy

Moduł dostępny w ofercie Electropark.pl: Moduł GSM/GPRS Arduino SMS,internet MT.

Źródła

4 myśli w temacie “Shield GSM dla Arduino z Fibocom G510”

  1. Bardzo pomocny artykuł, ale zależałoby mi bardzo na opisie nawiązywania połączenia z Internetem i przesyłania danych z wykorzystaniem protokołu HTTP. Byłbym też wdzięczny za ewentualne wskazanie gotowych bibliotek do Arduino UNO/Mega, które współpracują z tym modułem.

    1. W planach:) Już niedługo ukaże się tekst, jak użyć ten moduł z Nucleo; później faktycznie chciałem spojrzeć na samą transmisję danych. Oczywiście korzystanie z gotowych bibliotek jest jak najbardziej dobrym podejściem – ja jednak chciałem pokazać tu podstawy, skąd się co bierze – i jakie problemy mogą wyniknąć.

      1. Czekam więc z niecierpliwością na kolejne artykuły. Oczywiście programowanie „na piechotę” jest bardzo pomocne z dydaktycznego punktu widzenia ale jeśli istnieje gotowa biblioteka nie zaszkodzi o niej wspomnieć.

      2. Transmisja danych to jest jedyne ciekawe zastosowanie tego modułu. Wygląda na to, że jeśli Pan to dobrze opisze, to będzie Pan pierwszy.

        Wziąłem się za testy i skleciłem coś takiego, ale brak obsługi błędów:
        //Buffers for send and receive AT messages
        const int bufSize = 255;
        //Connection has been established
        bool conEst = false;
        //*****************************************
        /*
        Connect to the Internet
        apn: APN name
        return: true if connection is extablished
        */
        bool connect(const char* apn) {
        //Allocate buffers for apn name – rememeber to delete[]
        byte apnLen = strlen(apn);
        char* bufApnMy = new char[apnLen + 6];

        bool connOK = false;

        //Check if chip is present
        if ( !chipPresent()) {
        Serial.println(„Could not find GSM module… exiting”);
        return false;
        }

        //Mipcall argument formating =1,”APN_NAME”
        sprintf(bufApnMy, „=1,\”%s\”\0”, apn );

        //Try to connect and rememeber status
        connOK = sendATcommand( &ss, „AT+MIPCALL”, bufApnMy, NULL, bufRet, bufSize );
        if ( connOK ) {
        Serial.println(„Connection established.”);
        } else {
        Serial.println(„Could not connect.”);
        }
        //Cleanup
        delete [] bufApnMy;

        return connOK;
        }
        //*****************************************
        /*
        Close connection to the Internet
        return: true if connection is closed
        */
        bool disconnect() {
        bool disOK = false;

        //Check if chip is present
        if ( !chipPresent()) {
        Serial.println(„Could not find GSM module… exiting”);
        return false;
        }

        //Try to connect and rememeber status
        disOK = sendATcommand( &ss, „AT+MIPCALL”, „=0”, NULL, bufRet, bufSize );
        if ( disOK ) {
        Serial.println(„Connection closed.”);
        } else {
        Serial.println(„Could not disconnect.”);
        }

        return disOK;
        }
        //*****************************************
        /*
        Send POST data
        url: URL
        data: POST data
        return: true if data is sent
        */
        bool postData(const char* url, const char* data) {
        //Allocate buffers for apn name – rememeber to delete[]
        byte urlLen = strlen(url);
        char* bufUrlMy = new char[urlLen + 10];

        byte dataLen = strlen(data);
        char* bufDlenMy = new char[(dataLen<10?1:dataLen<100?2:3) + 2];

        bool sentOK = false;

        //Check if chip is present
        if ( !chipPresent()) {
        Serial.println("Could not find GSM module… exiting");
        return false;
        }

        //URL argument formating "URL","url"
        sprintf(bufUrlMy, "=\"URL\",\"%s\"\0", url );

        //DATA length
        sprintf(bufDlenMy, "=%d\0", dataLen );

        //Try to connect and rememeber status
        sentOK = sendATcommand( &ss, "AT+HTTPSET", bufUrlMy, NULL, bufRet, bufSize );
        if ( sentOK ) sentOK = sendATcommand( &ss, "AT+HTTPSET", "=\"UAGENT\",\"fibocom\"", NULL, bufRet, bufSize );
        if ( sentOK ) sentOK = sendATcommand( &ss, "AT+HTTPSET", "=\"CONTYPE\",\"application/x-www-form-urlencoded\"", NULL, bufRet, bufSize );
        if ( sentOK ) sentOK = sendATcommand( &ss, "AT+HTTPDATA", bufDlenMy, data, bufRet, bufSize );
        if ( sentOK ) sentOK = sendATcommand( &ss, "AT+HTTPACT", "=1,30", NULL, bufRet, bufSize );

        if ( sentOK ) {
        Serial.println("Data sent succesfully.");
        } else {
        Serial.println("Could not send.");
        }
        //Cleanup
        delete [] bufUrlMy;
        delete [] bufDlenMy;

        return sentOK;
        }
        //*****************************************

Dodaj komentarz