Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BufferedSerial
Dependents: ThinkSpeak_Test roam_v1 roam_v2 finalv3
Fork of GPRSInterface by
Revision 14:3c6454f033ac, committed 2015-04-03
- Comitter:
- yihui
- Date:
- Fri Apr 03 09:51:13 2015 +0000
- Parent:
- 13:379ce1d51b88
- Commit message:
- bugfix
Changed in this revision
| GPRS/GPRS.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 379ce1d51b88 -r 3c6454f033ac GPRS/GPRS.cpp
--- a/GPRS/GPRS.cpp Fri Apr 03 15:44:04 2015 +0800
+++ b/GPRS/GPRS.cpp Fri Apr 03 09:51:13 2015 +0000
@@ -1,26 +1,26 @@
-/*
- GPRS.cpp
- 2014 Copyright (c) Seeed Technology Inc. All right reserved.
-
- Author:lawliet zou(lawliet.zou@gmail.com)
- 2014-2-24
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#include "mbed.h"
+/*
+ GPRS.cpp
+ 2014 Copyright (c) Seeed Technology Inc. All right reserved.
+
+ Author:lawliet zou(lawliet.zou@gmail.com)
+ 2014-2-24
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include "mbed.h"
#include "GPRS.h"
#define DEBUG
@@ -32,38 +32,38 @@
#else
#define LOG(args...)
#endif
-
-
-GPRS* GPRS::inst;
-
-GPRS::GPRS(PinName tx, PinName rx, const char* apn, const char* userName, const char* passWord) : Modem(tx,rx)
-{
- inst = this;
- _apn = apn;
- _userName = userName;
- _passWord = passWord;
+
+
+GPRS* GPRS::inst;
+
+GPRS::GPRS(PinName tx, PinName rx, const char* apn, const char* userName, const char* passWord) : Modem(tx,rx)
+{
+ inst = this;
+ _apn = apn;
+ _userName = userName;
+ _passWord = passWord;
socketID = -1;
connected = false;
- recv_bytes = 0;
-}
-
-
-
-bool GPRS::join()
-{
+ recv_bytes = 0;
+}
+
+
+
+bool GPRS::join()
+{
char ip_addr_buf[32];
-
- //Select multiple connection
+
+ //Select multiple connection
command("AT+CIPMUX=1\r\n");
-
- // Set APN
+
+ // Set APN
command("AT+CSTT=\"%s\",\"%s\",\"%s\"\r\n",_apn,_userName,_passWord);
-
- // Brings up wireless connection
- command("AT+CIICR\r\n");
-
- // Get local IP address
+
+ // Brings up wireless connection
+ command("AT+CIICR\r\n");
+
+ // Get local IP address
printf("AT+CIFSR\r\n");
readline(ip_addr_buf, sizeof(ip_addr_buf)); // read echo
@@ -79,32 +79,32 @@
return false;
}
- _ip = (a << 24) + (b << 16) + (c << 8) + d;
-
- return true;
-}
-
-bool GPRS::setProtocol(int socket, Protocol p)
-{
- if (socket < 0 || socket > MAX_SOCK_NUM-1) {
- return false;
- }
- //ToDo: setProtocol
- return true;
-}
-
-bool GPRS::connect(int socket, Protocol ptl, const char * host, int port, int timeout)
+ _ip = (a << 24) + (b << 16) + (c << 8) + d;
+
+ return true;
+}
+
+bool GPRS::setProtocol(int socket, Protocol p)
{
- const char *protocol;
- if (socket < 0 || socket > MAX_SOCK_NUM-1) {
- return false;
- }
- if(ptl == TCP) {
- protocol = "TCP";
- } else if(ptl == UDP) {
- protocol = "UDP";
- } else {
- return false;
+ if (socket < 0 || socket > MAX_SOCK_NUM-1) {
+ return false;
+ }
+ //ToDo: setProtocol
+ return true;
+}
+
+bool GPRS::connect(int socket, Protocol ptl, const char * host, int port, int timeout)
+{
+ const char *protocol;
+ if (socket < 0 || socket > MAX_SOCK_NUM-1) {
+ return false;
+ }
+ if(ptl == TCP) {
+ protocol = "TCP";
+ } else if(ptl == UDP) {
+ protocol = "UDP";
+ } else {
+ return false;
}
command("AT+CIPSTART=%d,\"%s\",\"%s\",%d\r\n", socket, protocol, host, port);
@@ -121,47 +121,67 @@
} else {
LOG("failed to connect (r:%s)\r\n", response);
return false;
- }
-}
-
-bool GPRS::gethostbyname(const char* host, uint32_t* ip)
+ }
+}
+
+bool GPRS::gethostbyname(const char* host, uint32_t* ip)
{
- int a, b, c, d;
+ int a, b, c, d;
if (sscanf(host, "%d.%d.%d.%d", &a, &b, &c, &d) == 4) {
*ip = (a << 24) + (b << 16) + (c << 8) + d;
return true;
}
-
- return false;
-}
-
-bool GPRS::disconnect()
-{
+
+ return false;
+}
+
+bool GPRS::disconnect()
+{
puts("AT+CIPSHUT\r\n");
- connected = false;
- return true;
-}
-
-bool GPRS::is_connected(int socket)
-{
- return connected;
-}
-
-void GPRS::reset()
-{
-
-}
-
-bool GPRS::close(int socket)
-{
- if (socket < 0 || socket > (MAX_SOCK_NUM - 1)) {
- return false;
+ connected = false;
+ return true;
+}
+
+bool GPRS::is_connected(int socket)
+{
+ static uint32_t last = 0;
+ if (((uint32_t)us_ticker_read() - last) > 60000000) {
+ last = us_ticker_read();
+
+ flush();
+ printf("AT+CIPSTATUS=%d\r\n", socket);
+
+ connected = false;
+
+ char response[80];
+ readline(response, sizeof(response)); // echo, ignore
+ if (readline(response, sizeof(response)) > 0) {
+ if (strstr(response, "CONNECTED")) {
+ connected = true;
+ }
+
+ readline(response, sizeof(response)); // ok
+ }
}
-
- printf("AT+CIPCLOSE=%d\r\n", socket);
- connected = false;
- return true;
+
+ return connected;
+}
+
+void GPRS::reset()
+{
+
+}
+
+bool GPRS::close(int socket)
+{
+ if (socket < 0 || socket > (MAX_SOCK_NUM - 1)) {
+ return false;
+ }
+
+ printf("AT+CIPCLOSE=%d\r\n", socket);
+ connected = false;
+ return true;
}
int GPRS::sock_send(int socket, const char * data, int len)
@@ -247,9 +267,7 @@
int sock;
int bytes = 0;
if (sscanf(response, "+RECEIVE,%d,%d:", &sock, &bytes) != 2) {
- LOG("socket is closed, r(%s)\r\n", response);
-
- connected = false;
+ LOG("unknow:%s\r\n", response);
return -1;
}
@@ -268,4 +286,4 @@
{
socketID = 0; //we only support one socket.
return socketID;
-}
+}
