support library for C027 helper functions for Buffer Pipes, Buffered Serial Port (rtos capable) and GPS parsing. It includes modem APIs for USSD, SMS and Sockets.

Dependents:   HTTPClient_Cellular_HelloWorld Cellular_HelloMQTT MbedSmartRestMain Car_Bon_car_module ... more

This library is intended to be used with u-blox products such as the C027 or a shield with u-blox cellular and GPS modules like the cellular and positioning shield from Embedded Artist.

For 2G/GSM and 3G/UMTS you need to:

  • have a SIM card and know its PIN number
  • need to know you network operators APN setting These setting should be passed to the connect or init and join functions. You can also extend the APN database in MDMAPN.h.

For CDMA products you need to make sure that you have provisioned and activated the modem with either Sprint or Verizon.

Committer:
mazgch
Date:
Tue Apr 08 09:15:37 2014 +0000
Revision:
21:c4d64830bf02
Parent:
19:2b5d097ca15d
Child:
22:29322c22577e
improved modem library (network, sockets, sms, ussd)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mazgch 17:296d94a006b4 1 #pragma once
mazgch 17:296d94a006b4 2
mazgch 17:296d94a006b4 3 #include "mbed.h"
mazgch 21:c4d64830bf02 4 #include <stdarg.h>
mazgch 21:c4d64830bf02 5
mazgch 18:e5697801df29 6 #include "Pipe.h"
mazgch 18:e5697801df29 7 #include "SerialPipe.h"
mazgch 17:296d94a006b4 8
mazgch 19:2b5d097ca15d 9 #ifdef TARGET_UBLOX_C027
mazgch 19:2b5d097ca15d 10 // if we detect the C027 platform we will assign the
mazgch 19:2b5d097ca15d 11 // default pinname and baudrate in the constructor
mazgch 19:2b5d097ca15d 12 // this helper macro will be used.
mazgch 19:2b5d097ca15d 13 #define _C027DEFAULT(name) = name
mazgch 19:2b5d097ca15d 14 #else
mazgch 19:2b5d097ca15d 15 #define _C027DEFAULT(name)
mazgch 19:2b5d097ca15d 16 #endif
mazgch 18:e5697801df29 17
mazgch 21:c4d64830bf02 18 typedef uint32_t IP;
mazgch 21:c4d64830bf02 19
mazgch 18:e5697801df29 20 class MDMParser
mazgch 18:e5697801df29 21 {
mazgch 18:e5697801df29 22 public:
mazgch 21:c4d64830bf02 23 // waitFinalResp Responses
mazgch 21:c4d64830bf02 24 #define NOT_FOUND 0
mazgch 21:c4d64830bf02 25 #define WAIT -1 // TIMEOUT
mazgch 21:c4d64830bf02 26 #define OK -2
mazgch 21:c4d64830bf02 27 #define ERROR -3
mazgch 21:c4d64830bf02 28 #define PROMPT -4
mazgch 21:c4d64830bf02 29 // getLine Responses
mazgch 21:c4d64830bf02 30 #define LENGTH(x) (x & 0x00FFFF)
mazgch 21:c4d64830bf02 31 #define TYPE(x) (x & 0xFF0000)
mazgch 21:c4d64830bf02 32 #define TYPE_UNKNOWN 0x000000
mazgch 21:c4d64830bf02 33 #define TYPE_OK 0x110000
mazgch 21:c4d64830bf02 34 #define TYPE_ERROR 0x120000
mazgch 21:c4d64830bf02 35 #define TYPE_RING 0x210000
mazgch 21:c4d64830bf02 36 #define TYPE_CONNECT 0x220000
mazgch 21:c4d64830bf02 37 #define TYPE_NOCARRIER 0x230000
mazgch 21:c4d64830bf02 38 #define TYPE_NODIALTONE 0x240000
mazgch 21:c4d64830bf02 39 #define TYPE_BUSY 0x250000
mazgch 21:c4d64830bf02 40 #define TYPE_NOANSWER 0x260000
mazgch 21:c4d64830bf02 41 #define TYPE_PROMPT 0x300000
mazgch 21:c4d64830bf02 42 #define TYPE_PLUS 0x400000
mazgch 21:c4d64830bf02 43 // Socket Return Codes
mazgch 21:c4d64830bf02 44 #define SOCKET_ERROR -1
mazgch 21:c4d64830bf02 45 #define SOCKET_OK 0
mazgch 21:c4d64830bf02 46
mazgch 21:c4d64830bf02 47 MDMParser(void);
mazgch 18:e5697801df29 48
mazgch 21:c4d64830bf02 49 // interaction with AT command interface
mazgch 18:e5697801df29 50 virtual int getLine(char* buf, int len) = 0;
mazgch 18:e5697801df29 51 virtual int send(const char* buf, int len);
mazgch 21:c4d64830bf02 52 int sendFormated(const char* format, ...);
mazgch 21:c4d64830bf02 53 typedef int (*_CB)(int type, const char* buf, int len, void* param);
mazgch 21:c4d64830bf02 54 int waitFinalResp(_CB cb = NULL, void* param = NULL, int timeout_ms = 5000);
mazgch 21:c4d64830bf02 55
mazgch 21:c4d64830bf02 56 // network
mazgch 21:c4d64830bf02 57 bool init(const char* pin = NULL);
mazgch 21:c4d64830bf02 58 bool checkNetStatus(void);
mazgch 21:c4d64830bf02 59 bool powerOff(void);
mazgch 21:c4d64830bf02 60 // internet connection
mazgch 21:c4d64830bf02 61 bool join(const char* apn, const char* user = NULL, const char* password = NULL);
mazgch 21:c4d64830bf02 62 bool disconnect(void);
mazgch 21:c4d64830bf02 63 bool gethostbyname(const char* host, IP* ip);
mazgch 21:c4d64830bf02 64 // sockets
mazgch 21:c4d64830bf02 65 typedef enum { IPPROTO_TCP, IPPROTO_UDP } IpProtocol;
mazgch 21:c4d64830bf02 66 int socketSocket(IpProtocol ipproto);
mazgch 21:c4d64830bf02 67 bool socketConnect(int socket, const char * host, int port);
mazgch 21:c4d64830bf02 68 int socketSend(int socket, const char * buf, int len);
mazgch 21:c4d64830bf02 69 int socketSendTo(int socket, IP ip, int port, const char * buf, int len);
mazgch 21:c4d64830bf02 70 int socketReadable(int socket);
mazgch 21:c4d64830bf02 71 int socketRecv(int socket, char* buf, int len);
mazgch 21:c4d64830bf02 72 int socketRecvFrom(int socket, char* buf, int len, IP* ip);
mazgch 21:c4d64830bf02 73 bool socketClose(int socket);
mazgch 21:c4d64830bf02 74 bool socketFree(int socket);
mazgch 21:c4d64830bf02 75 // sms
mazgch 21:c4d64830bf02 76 bool smsSend(const char* num, const char* buf);
mazgch 21:c4d64830bf02 77 bool smsDelete(int ix);
mazgch 21:c4d64830bf02 78 bool smsRead(int ix, char* num, char* buf, int len);
mazgch 21:c4d64830bf02 79 // ussd
mazgch 21:c4d64830bf02 80 int ussdCommand(const char* cmd, char* buf, int len);
mazgch 18:e5697801df29 81 protected:
mazgch 18:e5697801df29 82 static int _getLine(Pipe<char>* pipe, char* buffer, int length);
mazgch 21:c4d64830bf02 83 static int _parseMatch(Pipe<char>* pipe, int len, const char* sta, const char* end);
mazgch 21:c4d64830bf02 84 static int _parseFormated(Pipe<char>* pipe, int len, const char* fmt);
mazgch 18:e5697801df29 85 virtual int _send(const void* buf, int len) = 0;
mazgch 21:c4d64830bf02 86 private:
mazgch 21:c4d64830bf02 87 typedef enum { MODEL_UNKNOWN, MODEL_SARA_G350, MODEL_LISA_U200, MODEL_LISA_C200 } Model;
mazgch 21:c4d64830bf02 88 typedef enum { SIM_UNKNOWN, SIM_PIN, SIM_READY } Sim;
mazgch 21:c4d64830bf02 89 typedef enum { NET_UNKNOWN, NET_DENIED, NET_NONE, NET_HOME, NET_ROAMING } Net;
mazgch 21:c4d64830bf02 90 static int _cbATI(int type, const char* buf, int len, Model* model);
mazgch 21:c4d64830bf02 91 static int _cbUDNSRN(int type, const char* buf, int len, IP* ip);
mazgch 21:c4d64830bf02 92 static int _cbUSOCR(int type, const char* buf, int len, int* socket);
mazgch 21:c4d64830bf02 93 static int _cbUSORD(int type, const char* buf, int len, char* out);
mazgch 21:c4d64830bf02 94 typedef struct { char* buf; IP ip; int port; } USORFparam;
mazgch 21:c4d64830bf02 95 static int _cbUSORF(int type, const char* buf, int len, USORFparam* param);
mazgch 21:c4d64830bf02 96 typedef struct { char* buf; char* num; } CMGRparam;
mazgch 21:c4d64830bf02 97 static int _cbCUSD(int type, const char* buf, int len, char* buf);
mazgch 21:c4d64830bf02 98 static int _cbCMGR(int type, const char* buf, int len, CMGRparam* param);
mazgch 21:c4d64830bf02 99 static IP strToIp(const char* str);
mazgch 21:c4d64830bf02 100 IP _ip;
mazgch 21:c4d64830bf02 101 Model _model;
mazgch 21:c4d64830bf02 102 Sim _sim;
mazgch 21:c4d64830bf02 103 Net _net;
mazgch 21:c4d64830bf02 104 int _rssi;
mazgch 21:c4d64830bf02 105 private:
mazgch 21:c4d64830bf02 106 typedef enum { SOCK_FREE, SOCK_CREATED, SOCK_CONNECTED } SockState;
mazgch 21:c4d64830bf02 107 typedef struct { SockState state; int pending; } SockCtrl;
mazgch 21:c4d64830bf02 108 SockCtrl _sockets[16];
mazgch 18:e5697801df29 109 };
mazgch 18:e5697801df29 110
mazgch 18:e5697801df29 111 // -----------------------------------------------------------------------
mazgch 18:e5697801df29 112
mazgch 18:e5697801df29 113 class MDMSerial : public SerialPipe, public MDMParser
mazgch 17:296d94a006b4 114 {
mazgch 17:296d94a006b4 115 public:
mazgch 19:2b5d097ca15d 116 MDMSerial(PinName tx _C027DEFAULT(MDMTXD),
mazgch 19:2b5d097ca15d 117 PinName rx _C027DEFAULT(MDMRXD),
mazgch 19:2b5d097ca15d 118 int baudrate _C027DEFAULT(MDMBAUD),
mazgch 19:2b5d097ca15d 119 #if DEVICE_SERIAL_FC
mazgch 19:2b5d097ca15d 120 PinName rts _C027DEFAULT(MDMRTS),
mazgch 19:2b5d097ca15d 121 PinName cts _C027DEFAULT(MDMCTS),
mazgch 19:2b5d097ca15d 122 #endif
mazgch 19:2b5d097ca15d 123 int rxSize = 256 ,
mazgch 21:c4d64830bf02 124 int txSize = 128 );
mazgch 18:e5697801df29 125 virtual int getLine(char* buffer, int length);
mazgch 18:e5697801df29 126 protected:
mazgch 18:e5697801df29 127 virtual int _send(const void* buf, int len);
mazgch 17:296d94a006b4 128 };
mazgch 18:e5697801df29 129
mazgch 18:e5697801df29 130 // -----------------------------------------------------------------------
mazgch 18:e5697801df29 131
mazgch 18:e5697801df29 132 #define HAVE_MDMUSB
mazgch 18:e5697801df29 133 #ifdef HAVE_MDMUSB
mazgch 18:e5697801df29 134 class MDMUsb : /*public UsbSerial,*/ public MDMParser
mazgch 18:e5697801df29 135 {
mazgch 18:e5697801df29 136 public:
mazgch 18:e5697801df29 137 MDMUsb(void);
mazgch 18:e5697801df29 138 virtual int getLine(char* buffer, int length);
mazgch 18:e5697801df29 139 protected:
mazgch 18:e5697801df29 140 virtual int _send(const void* buf, int len);
mazgch 18:e5697801df29 141 };
mazgch 18:e5697801df29 142 #endif
mazgch 18:e5697801df29 143
mazgch 18:e5697801df29 144