tes sim 5360

Files at this revision

API Documentation at this revision

Comitter:
irsanjul
Date:
Tue Mar 17 09:22:08 2020 +0000
Commit message:
tes sim 5360

Changed in this revision

SIM5360.cpp Show annotated file Show diff for this revision Revisions of this file
SIM5360.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SIM5360.cpp	Tue Mar 17 09:22:08 2020 +0000
@@ -0,0 +1,416 @@
+#include "SIM5360.h"
+
+int GSM::readBuffer(char *buffer,int count)
+{
+    int i = 0;
+    timeCnt.start();  // start timer
+    while(1) {
+        while (gprsSerial.readable()) {
+            char c = gprsSerial.getc();
+            if (c == '\r' || c == '\n') c = '$';
+            buffer[i++] = c;
+            if(i > count)break;
+        }
+        if(i > count)break;
+        if(timeCnt.read() > DEFAULT_TIMEOUT) {
+            timeCnt.stop();
+            timeCnt.reset();
+            break;
+        }
+    }
+    wait(0.5);
+    while(gprsSerial.readable()) {  // display the other thing..
+        char c = gprsSerial.getc();
+    }
+    return 0;
+}
+
+void cleanBuffer(char *buffer, int count)
+{
+    for(int i=0; i < count; i++) {
+        buffer[i] = '\0';
+    }
+}
+
+void GSM::purge(void)
+{
+    while(gprsSerial.readable())
+    {
+        gprsSerial.getc();
+    }
+}
+
+void GSM::sendCmd(char *cmd)
+{
+    gprsSerial.puts(cmd);
+}
+
+int GSM::waitForResp(char *resp, int timeout)
+{
+    int len = strlen(resp);
+    int sum=0;
+    timeCnt.start();
+
+    while(1) {
+        if(gprsSerial.readable()) {
+            char c = gprsSerial.getc();
+            sum = (c==resp[sum]) ? sum+1 : 0;
+            if(sum == len)break;
+        }
+        if(timeCnt.read() > timeout) {  // time out
+            timeCnt.stop();
+            timeCnt.reset();
+            return -1;
+        }
+    }
+    timeCnt.stop();                 // stop timer
+    timeCnt.reset();                    // clear timer
+    while(gprsSerial.readable()) {      // display the other thing..
+        char c = gprsSerial.getc();
+    }
+
+    return 0;
+}
+
+int GSM::sendCmdAndWaitForResp(char *cmd, char *resp, int timeout)
+{
+    sendCmd(cmd);
+    return waitForResp(resp,timeout);
+}
+
+int GSM::powerCheck(void)
+{
+    return sendCmdAndWaitForResp("AT\r\n", "OK", 2);    
+}
+
+int GSM::init(void)
+{
+    int i=10;
+
+    while (i--) {
+        // purge any messages 
+        purge();
+        
+        // check interface
+        int r = sendCmdAndWaitForResp("AT\r\n", "OK", DEFAULT_TIMEOUT);
+        wait_ms(100);
+        if(r == 0) break;
+    }
+    if (i < 0) {
+        goto failure;
+    }
+
+    if(0 != sendCmdAndWaitForResp("ATE0\r\n", "OK", DEFAULT_TIMEOUT))
+        goto failure;
+
+    if(0 != sendCmdAndWaitForResp("AT+CMEE=2\r\n", "OK", DEFAULT_TIMEOUT))
+        goto failure;
+
+    if(0 != checkSIMStatus()) {
+        goto failure;
+    }
+
+    if(0 != sendCmdAndWaitForResp("AT+CGREG=1\r\n", "OK", DEFAULT_TIMEOUT)){
+        goto failure;
+    }
+
+    if(0 != sendCmdAndWaitForResp("AT+CREG=1\r\n", "OK", DEFAULT_TIMEOUT)){
+        goto failure;
+    }
+
+    if(0 != settingSMS()){
+        goto failure;
+    }
+
+    return 0;
+
+    failure:
+    return -1;
+}
+
+int GSM::registerNet(void)
+{
+    int ret = -1;
+    int i = 10;
+    while(i--){
+        int r = checkNetStatus();
+        if(r == 0){
+            ret = 0;
+            break;
+        }
+        wait_ms(1000);
+    }
+
+    if(checkSignalStrength()<1) {
+        goto failure;
+    }
+
+    failure:
+    return ret;
+}
+
+int GSM::checkNetStatus(void)
+{
+    int netReg = -1;
+    int gprsReg = -1;
+    char gprsBuffer[30];
+    cleanBuffer(gprsBuffer,30);
+
+    sendCmd("AT+CREG?\r\n");
+    readBuffer(gprsBuffer,30);
+    if((NULL != strstr(gprsBuffer,"+CREG: 0,1"))) {
+        netReg = 0;
+    }
+
+    wait_ms(100);
+    sendCmd("AT+CREG?\r\n");
+    readBuffer(gprsBuffer,30);
+    if((NULL != strstr(gprsBuffer,"+CGREG: 0,1"))) {
+        gprsReg = 0;
+    }
+
+    return netReg | gprsReg;
+}
+
+int GSM::checkSIMStatus(void)
+{
+    char gprsBuffer[30];
+    int count = 0;
+    cleanBuffer(gprsBuffer,30);
+    while(count < 3) {
+        sendCmd("AT+CPIN?\r\n");
+        readBuffer(gprsBuffer,30);
+        if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) {
+            break;
+        }
+        count++;
+        wait(1);
+    }
+
+    if(count == 3) {
+        return -1;
+    }
+    return 0;
+}
+
+int GSM::checkSignalStrength(void)
+{
+    char gprsBuffer[100];
+    int index,count = 0;
+    cleanBuffer(gprsBuffer,100);
+    while(count < 3) {
+        sendCmd("AT+CSQ\r\n");
+        readBuffer(gprsBuffer,25);
+        if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) {
+            break;
+        }
+        count++;
+        wait(1);
+    }
+    if(count == 3) {
+        return -1;
+    }
+    return index;
+}
+
+int GSM::settingSMS(void)
+{
+    if(0 != sendCmdAndWaitForResp("AT+CNMI=2,2\r\n", "OK", DEFAULT_TIMEOUT)) {
+        return -1;
+    }
+    if(0 != sendCmdAndWaitForResp("AT+CMGF=1\r\n", "OK", DEFAULT_TIMEOUT)) {
+        return -1;
+    }
+    return 0;
+}
+
+int GSM::sendSMS(char *number, char *data)
+{
+    char cmd[64];
+    while(gprsSerial.readable()) {
+        char c = gprsSerial.getc();
+    }
+    snprintf(cmd, sizeof(cmd),"AT+CMGS=\"%s\"\r\n",number);
+    if(0 != sendCmdAndWaitForResp(cmd,">",DEFAULT_TIMEOUT)) {
+        return -1;
+    }
+    wait(1);
+    gprsSerial.puts(data);
+    gprsSerial.putc((char)0x1a);
+    return 0;
+}
+
+int GSM::readSMS(char *message, int index)
+{
+    int i = 0;
+    char gprsBuffer[100];
+    char *p,*s;
+    gprsSerial.printf("AT+CMGR=%d\r\n",index);
+    cleanBuffer(gprsBuffer,100);
+    readBuffer(gprsBuffer,100);
+    if(NULL == ( s = strstr(gprsBuffer,"+CMGR"))) {
+        return -1;
+    }
+    if(NULL != ( s = strstr(gprsBuffer,"+32"))) {
+        p = s + 6;
+        while((*p != '$')&&(i < SMS_MAX_LENGTH-1)) {
+            message[i++] = *(p++);
+        }
+        message[i] = '\0';
+    }
+    return 0;
+}
+
+int GSM::deleteSMS(int index)
+{
+    char cmd[32];
+    snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index);
+    sendCmd(cmd);
+    return 0;
+}
+
+int GSM::getSMS(char* message)
+{
+    if(NULL != messageBuffer) {
+        strncpy(message,messageBuffer,SMS_MAX_LENGTH);
+    }
+    return 0;
+}
+
+int GSM::callUp(char *number)
+{
+    if(0 != sendCmdAndWaitForResp("AT+COLP=1\r\n","OK",5)) {
+        return -1;
+    }
+    wait(1);
+    gprsSerial.printf("\r\nATD%s;\r\n",NULL==number?phoneNumber:number);
+    return 0;
+}
+
+int GSM::answer(void)
+{
+    gprsSerial.printf("ATA\r\n");
+    return 0;
+}
+
+int GSM::join(char* apn, char* userName, char* passWord)
+{
+    char gprsBuffer[64];
+    int ret = 0;
+
+    cleanBuffer(gprsBuffer,64);
+    snprintf(gprsBuffer,sizeof(gprsBuffer),"AT+CGSOCKCONT=1,\"IP\",\"%s\"\r\n", apn);
+    if(0 != sendCmdAndWaitForResp(gprsBuffer, "OK", DEFAULT_TIMEOUT)) {
+        ret = -1;
+        goto failure;
+    }
+
+    cleanBuffer(gprsBuffer,64);
+    snprintf(gprsBuffer,sizeof(gprsBuffer),"AT+CSOCKAUTH=1,1,\"%s\",\"%s\"\r\n", passWord, userName);
+    if(0 != sendCmdAndWaitForResp(gprsBuffer, "OK", DEFAULT_TIMEOUT)) {
+        ret = -1;
+        goto failure;
+    }
+
+    if(0 != sendCmdAndWaitForResp("AT+CSOCKSETPN=1\r\n", "OK", DEFAULT_TIMEOUT)) {
+        ret = -1;
+        goto failure;
+    }
+    
+    if(0 != sendCmdAndWaitForResp("AT+CIPMODE=0\r\n", "OK", DEFAULT_TIMEOUT)) {
+        ret = -1;
+        goto failure;
+    }
+
+    if(0 != sendCmdAndWaitForResp("AT+NETOPEN\r\n", "OK", DEFAULT_TIMEOUT)) {
+        ret = -1;
+        goto failure;
+    }
+
+    failure:
+    return ret;
+
+}
+
+int GSM::SetBlocking(int netopen_to, int cipopen_to, int cipsend_to)
+{
+    int ret = 0;
+    char gprsBuffer[64];
+
+    cleanBuffer(gprsBuffer,64);
+    snprintf(gprsBuffer,sizeof(gprsBuffer),"AT+CIPTIMEOUT=%d,%d,%d\r\n", netopen_to, cipopen_to, cipsend_to);
+    if(0 != sendCmdAndWaitForResp(gprsBuffer, "OK", DEFAULT_TIMEOUT)) {
+        ret = -1;
+        goto failure;
+    }
+
+    failure:
+    return ret;
+}
+
+int GSM::connectTCP(char *ip, int port)
+{
+    int ret = 0;
+    char cipstart[64];
+#if 0
+    if(0 != sendCmdAndWaitForResp("AT+CIPOPEN=0,\"TCP\",\"\",\r\n", "OK", 5)) {
+        ret = -1;
+        goto failure;
+    }
+#endif
+    sprintf(cipstart, "AT+CIPOPEN=0,\"TCP\",\"%s\",%d\r\n", ip, port);
+    if(0 != sendCmdAndWaitForResp(cipstart, "OK", DEFAULT_TIMEOUT)) {
+        ret = -1;
+        goto failure;
+    }
+
+    purge();
+
+    failure:
+    return ret;
+}
+
+int GSM::sendTCPData(char *data, int len)
+{
+    int ret = 0;
+    char cmd[64];
+
+    snprintf(cmd,sizeof(cmd),"AT+CIPSEND=0,%d\r\n",len);
+    if(0 != sendCmdAndWaitForResp(cmd,">",DEFAULT_TIMEOUT)) {
+        ret = -1;
+        goto failure;
+    }
+    
+    if(0 != sendCmdAndWaitForResp(data,"OK",DEFAULT_TIMEOUT)) {
+        ret = -1;
+        goto failure;
+    }
+
+    failure:
+    return ret;
+}
+
+int GSM::receivedTCPData(char *buff, int len)
+{
+    readBuffer(buff, len);
+    
+    if(strlen(buff) <= 0) return -1;
+    
+    return 0;
+}
+
+int GSM::closeTCP(void)
+{
+    if(0 != sendCmdAndWaitForResp("AT+CIPCLOSE\r\n","OK",DEFAULT_TIMEOUT)) {
+        return -1;
+    }
+    return 0;
+}
+
+int GSM::disconnect(void)
+{
+    if(0 != sendCmdAndWaitForResp("AT+NETCLOSE\r\n","OK",DEFAULT_TIMEOUT)) {
+        return -1;
+    }
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SIM5360.h	Tue Mar 17 09:22:08 2020 +0000
@@ -0,0 +1,229 @@
+#ifndef _GSM_H_
+#define _GSM_H_
+
+#include <stdio.h>
+#include "mbed.h"
+
+#define DEFAULT_TIMEOUT         5
+#define SMS_MAX_LENGTH          16
+
+
+enum GSM_MESSAGE {
+    MESSAGE_RING = 0,
+    MESSAGE_SMS  = 1,
+    MESSAGE_ERROR
+};
+
+
+/** GSM class.
+ *  Used for mobile communication. attention that GSM module communicate with MCU in serial protocol
+ */
+class GSM
+{
+public:
+    /** Create GSM instance
+     *  @param tx  uart transmit pin to communicate with GSM module
+     *  @param rx  uart receive pin to communicate with GSM module
+     *  @param baudRate baud rate of uart communication
+     *  @param number default phone number during mobile communication
+     */
+    GSM(PinName tx, PinName rx, int baudRate,char *number) : gprsSerial(tx, rx) {
+        //gprsSerial.baud(baudRate);
+        phoneNumber = number;
+    };
+    
+    int powerCheck(void);
+    
+    /** init GSM module including SIM card check & signal strength & network check
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int init(void);
+    
+    /** Register Network of GSM module including signal strength & network check
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int registerNet(void);
+    
+    /** Check network status of GSM module
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int checkNetStatus(void);
+
+    /** Check SIM card' Status
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int checkSIMStatus(void);
+
+    /** Check signal strength
+     *  @returns
+     *      signal strength in number(ex 3,4,5,6,7,8...) on success,
+     *      -1 on error
+     */
+    int checkSignalStrength(void);
+
+    /** Set SMS format and processing mode
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int settingSMS(void);
+
+    /** Send text SMS
+     *  @param  *number    phone number which SMS will be send to
+     *  @param  *data   message that will be send to
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int sendSMS(char *number, char *data);
+
+    /** Read SMS by index
+     *  @param  *message   buffer used to get SMS message
+     *  @param  index    which SMS message to read
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int readSMS(char *message, int index);
+
+    /** Delete SMS message on SIM card
+     *  @param  *index    the index number which SMS message will be delete
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int deleteSMS(int index);
+
+    /** Read SMS when coming a message,it will be store in messageBuffer.
+     *  @param message  buffer used to get SMS message
+     */
+    int getSMS(char* message);
+
+    /** Call someone
+     *  @param  *number    the phone number which you want to call
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int callUp(char *number);
+
+    /** Auto answer if coming a call
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int answer(void);
+
+    /** Join GSM network
+     *  @param *apn Access  Point Name to connect network
+     *  @param *userName    general is empty
+     *  @param *passWord    general is empty
+     */
+    int join(char* apn, char* userName = NULL, char* passWord = NULL);
+    
+    /** Disconnect from network
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int disconnect(void);
+    
+    /** Set blocking of the connection
+     *  @param  netopen_to   time out of open the socket network in second
+     *  @param  cipopen_to   time out of open the connection to server in second
+     *  @param  cipsend_to   time out of send data to server in second
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int SetBlocking(int netopen_to=5, int cipopen_to=5, int cipsend_to=5);
+    
+    /** Build TCP connect
+     *  @param  *ip    ip address which will connect to
+     *  @param  *port   TCP server' port number
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int connectTCP(char *ip, int port);
+
+    /** Send data to TCP server
+     *  @param  *data    data that will be send to TCP server
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int sendTCPData(char *data, int len);
+    
+    /** Send data to TCP server
+     *  @param  *buff    data that will be received from TCP server
+     *  @param  len     size of buffer to read
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int receivedTCPData(char *buff, int len);
+
+    /** Close TCP connection
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int closeTCP(void);
+    
+    /** Clear serial pipe
+     */
+    void purge(void);
+
+    Serial gprsSerial;
+    //USBSerial pc;
+
+private:
+    /** Read from GSM module and save to buffer array
+     *  @param  *buffer buffer array to save what read from GSM module
+     *  @param  *count  the maximal bytes number read from GSM module
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int readBuffer(char *buffer,int count);
+
+    /** Send AT command to GSM module
+     *  @param  *cmd command array which will be send to GSM module
+     */
+    void sendCmd(char *cmd);
+
+    /** Check GSM module response before timeout
+     *  @param  *resp   correct response which GSM module will return
+     *  @param  *timeout    waiting seconds till timeout
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int waitForResp(char *resp, int timeout);
+
+    /** Send AT command to GSM module and wait for correct response
+     *  @param  *cmd    AT command which will be send to GSM module
+     *  @param  *resp   correct response which GSM module will return
+     *  @param  *timeout    waiting seconds till timeout
+     *  @returns
+     *      0 on success,
+     *      -1 on error
+     */
+    int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout);
+
+    Timer timeCnt;
+    char *phoneNumber;
+    char messageBuffer[SMS_MAX_LENGTH];
+};
+
+#endif // _GSM_H_
+