292 lines
8.6 KiB
C++
292 lines
8.6 KiB
C++
/*
|
|
* GPRS_Shield_Arduino.h
|
|
* A library for SeeedStudio seeeduino GPRS shield
|
|
*
|
|
* Copyright (c) 2015 seeed technology inc.
|
|
* Website : www.seeed.cc
|
|
* Author : lawliet zou
|
|
* Create Time: April 2015
|
|
* Change Log :
|
|
*
|
|
* The MIT License (MIT)
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
|
|
#ifndef __GPRS_SHIELD_ARDUINO_H__
|
|
#define __GPRS_SHIELD_ARDUINO_H__
|
|
|
|
#include "sim900.h"
|
|
|
|
/** GPRS class.
|
|
* used to realize GPRS communication
|
|
*/
|
|
|
|
enum Protocol {
|
|
CLOSED = 0,
|
|
TCP = 1,
|
|
UDP = 2,
|
|
};
|
|
|
|
class GPRS
|
|
{
|
|
public:
|
|
/** Create GPRS instance
|
|
*/
|
|
|
|
GPRS(Stream& serial, uint8_t pkPin = 9);
|
|
|
|
/** get instance of GPRS class
|
|
*/
|
|
static GPRS* getInstance() {
|
|
return inst;
|
|
};
|
|
|
|
/** initialize GPRS module including SIM card check & signal strength
|
|
* @return true if connected, false otherwise
|
|
*/
|
|
|
|
bool init(void);
|
|
|
|
|
|
/** check if GPRS module is powered on or not
|
|
* @returns
|
|
* true on success
|
|
* false on error
|
|
*/
|
|
bool checkPowerUp(void);
|
|
|
|
|
|
/** power Up GPRS module (JP has to be soldered)
|
|
* @param pin pin 9 connected to JP jumper so we can power up and down through software
|
|
* @returns
|
|
*
|
|
*/
|
|
void powerOn();
|
|
void powerOff();
|
|
void reset();
|
|
|
|
/** send text SMS
|
|
* @param *number phone number which SMS will be send to
|
|
* @param *data message that will be send to
|
|
* @returns
|
|
* false on success
|
|
* true on error
|
|
*/
|
|
bool sendSMS(char* number, char* data);
|
|
|
|
/** Check if there is any UNREAD SMS: this function DOESN'T change the UNREAD status of the SMS
|
|
* @returns
|
|
* 1..20 on success, position/index where SMS is stored, suitable for the function ReadSMS
|
|
* -1 on error
|
|
* 0 - there is no SMS with specified status (UNREAD)
|
|
*/
|
|
|
|
char isSMSunread();
|
|
|
|
/** read SMS if getting a SMS message
|
|
* @param buffer buffer that get from GPRS module(when getting a SMS, GPRS module will return a buffer array)
|
|
* @param message buffer used to get SMS message
|
|
* @param check whether to check phone number(we may only want to read SMS from specified phone number)
|
|
* @returns
|
|
* true on success
|
|
* false on error
|
|
*/
|
|
|
|
bool readSMS(int messageIndex, char *message, byte length);
|
|
|
|
/** get SMS on the fly, phone and date
|
|
* @param message buffer used to get SMS message
|
|
* @param phone buffer used to get SMS's sender phone number
|
|
* @param datetime buffer used to get SMS's send datetime
|
|
* @returns
|
|
* true on success
|
|
* false on error
|
|
*/
|
|
|
|
bool getSMS(char *message, char *phone, char *datetime);
|
|
|
|
/** delete SMS message on SIM card
|
|
* @param index the index number which SMS message will be delete
|
|
* @returns
|
|
* true on success
|
|
* false on error
|
|
*/
|
|
|
|
bool deleteSMS(int index);
|
|
|
|
/** call someone
|
|
* @param number the phone number which you want to call
|
|
* @returns
|
|
* true on success
|
|
* false on error
|
|
*/
|
|
bool callUp(char* number);
|
|
|
|
/** auto answer if coming a call
|
|
* @returns
|
|
*/
|
|
void answer(void);
|
|
|
|
/** hang up if coming a call
|
|
* @returns
|
|
* true on success
|
|
* false on error
|
|
*/
|
|
bool hangup(void);
|
|
|
|
/** Disable +CLIP notification when an incoming call is active, RING text is always shown. See isCallActive function
|
|
* This is done in order no to overload serial outputCheck if there is a call active and get the phone number in that case
|
|
* @returns
|
|
* true on success
|
|
* false on error
|
|
*/
|
|
bool ifcallNow(void);
|
|
|
|
bool ifcallEnd(void);
|
|
|
|
void callEnd(void);
|
|
|
|
bool disableCLIPring(void);
|
|
|
|
/** Check if there is a call active and get the phone number in that case
|
|
* @returns
|
|
* true on success
|
|
* false on error
|
|
*/
|
|
bool isCallActive(char *number);
|
|
|
|
/** get DateTime from SIM900 (see AT command: AT+CLTS=1) as string
|
|
* @param
|
|
* @returns
|
|
* true on success
|
|
* false on error
|
|
*/
|
|
bool getDateTime(char *buffer);
|
|
|
|
/** getSignalStrength from SIM900 (see AT command: AT+CSQ)
|
|
* @returns
|
|
0 — 113 dBm or less
|
|
1 — 111 dBm
|
|
2...30 — 109... 53 dBm
|
|
31 — 51 dBm or greater
|
|
99 — not known or not detectable
|
|
*/
|
|
byte getSignalStrength();
|
|
|
|
|
|
//////////////////////////////////////////////////////
|
|
/// GPRS
|
|
//////////////////////////////////////////////////////
|
|
/** Connect the GPRS module to the network.
|
|
* @return true if connected, false otherwise
|
|
*/
|
|
|
|
// bool join(const __FlashStringHelper *apn = 0, const __FlashStringHelper *userName = 0, const __FlashStringHelper *passWord = 0);
|
|
bool join(char* apn = 0, char* = 0, char* = 0, int timeout = 2 * DEFAULT_TIMEOUT);
|
|
|
|
/** Disconnect the GPRS module from the network
|
|
* @returns
|
|
*/
|
|
void disconnect(void);
|
|
|
|
/** Open a tcp/udp connection with the specified host on the specified port
|
|
* @param socket an endpoint of an inter-process communication flow of GPRS module,for SIM900 module, it is in [0,6]
|
|
* @param ptl protocol for socket, TCP/UDP can be choosen
|
|
* @param host host (can be either an ip address or a name. If a name is provided, a dns request will be established)
|
|
* @param port port
|
|
* @param timeout wait seconds till connected
|
|
* @returns true if successful
|
|
*/
|
|
bool connect(Protocol ptl, const char * host, int port, int timeout = 2 * DEFAULT_TIMEOUT);
|
|
bool connect(Protocol ptl, const __FlashStringHelper *host, const __FlashStringHelper *port, int timeout = 2 * DEFAULT_TIMEOUT);
|
|
|
|
/** Check if a tcp link is active
|
|
* @returns true if successful
|
|
*/
|
|
bool is_connected(void);
|
|
|
|
/** Close a tcp connection
|
|
* @returns true if successful
|
|
*/
|
|
bool close(void);
|
|
|
|
/** check if GPRS module is readable or not
|
|
* @returns true if readable
|
|
*/
|
|
int readable(void);
|
|
|
|
/** wait a few time to check if GPRS module is readable or not
|
|
* @param socket socket
|
|
* @param wait_time time of waiting
|
|
*/
|
|
int wait_readable(int wait_time);
|
|
|
|
/** wait a few time to check if GPRS module is writeable or not
|
|
* @param socket socket
|
|
* @param wait_time time of waiting
|
|
*/
|
|
int wait_writeable(int req_size);
|
|
|
|
int send(const char * str);
|
|
/** send data to socket
|
|
* @param socket socket
|
|
* @param str string to be sent
|
|
* @param len string length
|
|
* @returns return bytes that actually been send
|
|
*/
|
|
int send(const char * str, int len);
|
|
|
|
/** read data from socket
|
|
* @param socket socket
|
|
* @param buf buffer that will store the data read from socket
|
|
* @param len string length need to read from socket
|
|
* @returns bytes that actually read
|
|
*/
|
|
int recv(char* buf, int len);
|
|
|
|
/** convert the host to ip
|
|
* @param host host ip string, ex. 10.11.12.13
|
|
* @param ip long int ip address, ex. 0x11223344
|
|
* @returns true if successful
|
|
*/
|
|
//NOT USED bool gethostbyname(const char* host, uint32_t* ip);
|
|
|
|
char* getIPAddress();
|
|
unsigned long getIPnumber();
|
|
|
|
/** set GPIO level
|
|
* @param GPIO number
|
|
* @param GPIO level
|
|
* @returns true if successful
|
|
*/
|
|
bool controlGPIO(uint8_t num, uint8_t level);
|
|
|
|
private:
|
|
bool checkSIMStatus(void);
|
|
uint8_t _pkPin = 9;
|
|
|
|
uint32_t str_to_ip(const char* str);
|
|
Stream* stream;
|
|
static GPRS* inst;
|
|
uint32_t _ip;
|
|
char ip_string[16]; //XXX.YYY.ZZZ.WWW + \0
|
|
};
|
|
#endif
|