GSwifiInterface library (interface for GainSpan Wi-Fi GS1011 modules) Please see https://mbed.org/users/gsfan/notebook/GSwifiInterface/

Dependents:   GSwifiInterface_HelloWorld GSwifiInterface_HelloServo GSwifiInterface_UDPEchoServer GSwifiInterface_UDPEchoClient ... more

Fork of WiflyInterface by mbed official

GainSpan Wi-Fi library

The GS1011/GS2100 is an ultra low power 802.11b wireless module from GainSpan.

mbed RTOS supported.

/media/uploads/gsfan/gs_im_002.jpg /media/uploads/gsfan/gs1011m_2.jpg

ゲインスパン Wi-Fi モジュール ライブラリ

ゲインスパン社の低電力 Wi-Fiモジュール(無線LAN) GS1011/GS2100 シリーズ用のライブラリです。

mbed RTOS に対応しています。(mbed2.0)

Revision:
5:78943b3945b5
Parent:
4:0bcec6272784
Child:
8:64184a968e3b
--- a/Socket/UDPSocket.cpp	Thu Dec 20 15:08:58 2012 +0000
+++ b/Socket/UDPSocket.cpp	Sun Jan 27 14:31:19 2013 +0000
@@ -1,185 +1,158 @@
-/* Copyright (C) 2012 mbed.org, MIT License
- *
- * 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.
- */
-
-#include "UDPSocket.h"
-
-#include <string>
-#include <algorithm>
-
-UDPSocket::UDPSocket()
-{
-    endpoint_configured = false;
-    endpoint_read = false;
-}
-
-int UDPSocket::init(void)
-{
-    wifi->setProtocol(UDP);
-    wifi->exit();
-    return 0;
-}
-
-// Server initialization
-int UDPSocket::bind(int port)
-{
-    char cmd[17];
-    
-    // set local port
-    sprintf(cmd, "set i l %d\r", port);
-    if (!wifi->sendCommand(cmd, "AOK"))
-        return -1;
-        
-    // save
-    if (!wifi->sendCommand("save\r", "Stor"))
-        return -1;
-    
-    // reboot
-    wifi->reboot();
-    
-    // set udp protocol
-    wifi->setProtocol(UDP);
-    
-    // connect the network
-    if (wifi->isDHCP()) {
-        if (!wifi->sendCommand("join\r", "DHCP=ON", NULL, 10000))
-            return -1;
-    } else {
-        if (!wifi->sendCommand("join\r", "Associated", NULL, 10000))
-            return -1;
-    }
-        
-    // exit
-    wifi->exit();
-    wifi->flush();
-    return 0;
-}
-
-// -1 if unsuccessful, else number of bytes written
-int UDPSocket::sendTo(Endpoint &remote, char *packet, int length)
-{
-    Timer tmr;
-    int idx = 0;
-
-    confEndpoint(remote);
-
-    tmr.start();
-
-    while ((tmr.read_ms() < _timeout) || _blocking) {
-
-        idx += wifi->send(packet, length);
-
-        if (idx == length)
-            return idx;
-    }
-    return (idx == 0) ? -1 : idx;
-}
-
-// -1 if unsuccessful, else number of bytes received
-int UDPSocket::receiveFrom(Endpoint &remote, char *buffer, int length)
-{
-    Timer tmr;
-    int idx = 0;
-    int nb_available = 0;
-    int time = -1;
-
-    if (_blocking) {
-        while (1) {
-            nb_available = wifi->readable();
-            if (nb_available != 0) {
-                break;
-            }
-        }
-    }
-
-    tmr.start();
-
-    while (time < _timeout) {
-
-        nb_available = wifi->readable();
-        for (int i = 0; i < min(nb_available, length); i++) {
-            buffer[idx] = wifi->getc();
-            idx++;
-        }
-
-        if (idx == length) {
-            break;
-        }
-        
-        time = tmr.read_ms();
-    }
-
-    readEndpoint(remote);
-    return (idx == 0) ? -1 : idx;
-}
-
-bool UDPSocket::confEndpoint(Endpoint & ep)
-{
-    char * host;
-    char cmd[30];
-    if (!endpoint_configured) {
-        host = ep.get_address();
-        if (host[0] != '\0') {
-            // set host
-            sprintf(cmd, "set i h %s\r", host);
-            if (!wifi->sendCommand(cmd, "AOK"))
-                return false;
-                
-            // set remote port
-            sprintf(cmd, "set i r %d\r", ep.get_port());
-            if (!wifi->sendCommand(cmd, "AOK"))
-                return false;
-                
-            wifi->exit();
-            endpoint_configured = true;
-            return true;
-        }
-    }
-    return true;
-}
-
-bool UDPSocket::readEndpoint(Endpoint & ep)
-{
-    char recv[256];
-    int begin = 0;
-    int end = 0;
-    string str;
-    string addr;
-    int port;
-    if (!endpoint_read) {
-        if (!wifi->sendCommand("get ip\r", NULL, recv))
-            return false;
-        wifi->exit();
-        str = recv;
-        begin = str.find("HOST=");
-        end = str.find("PROTO=");
-        if (begin != string::npos && end != string::npos) {
-            str = str.substr(begin + 5, end - begin - 5);
-            int pos = str.find(":");
-            if (pos != string::npos) {
-                addr = str.substr(0, pos);
-                port = atoi(str.substr(pos + 1).c_str());
-                ep.set_address(addr.c_str(), port);
-                endpoint_read = true;
-                wifi->flush();
-                return true;
-            }
-        }
-        wifi->flush();
-    }
-    return false;
-}
+/* Copyright (C) 2012 mbed.org, MIT License
+ *
+ * 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.
+ */
+/* Copyright (C) 2013 gsfan, MIT License
+ *  port to the GainSpan Wi-FI module GS1011
+ */
+
+#include "UDPSocket.h"
+
+#include <string>
+#include <algorithm>
+
+UDPSocket::UDPSocket()
+{
+    endpoint_connected = false;
+}
+
+int UDPSocket::init(void)
+{
+    _server = false;
+    return 0;
+}
+
+// Server initialization
+int UDPSocket::bind(int port)
+{
+    _port = port;
+    _server = true;
+    return 0;
+}
+
+// -1 if unsuccessful, else number of bytes written
+int UDPSocket::sendTo(Endpoint &remote, char *packet, int length)
+{
+    Timer tmr;
+    int idx = 0;
+
+    tmr.start();
+
+    while ((tmr.read_ms() < _timeout) || _blocking) {
+
+        idx += sendPacket(remote, packet, length);
+
+        if (idx == -1) return -1;
+        if (idx == length)
+            return idx;
+    }
+    return (idx == 0) ? -1 : idx;
+}
+
+// -1 if unsuccessful, else number of bytes received
+int UDPSocket::receiveFrom(Endpoint &remote, char *buffer, int length)
+{
+    Timer tmr;
+    int idx = 0;
+    int nb_available = 0;
+    int time = -1;
+
+    if (_cid < 0 || !_wifi->is_connected(_cid)) {
+        // Socket open
+        char cmd[CFG_CMD_SIZE];
+        if (_server) {
+            sprintf(cmd, "AT+NSUDP=%d", _port);
+        } else {
+            sprintf(cmd, "AT+NCUDP=%s,%d", remote.get_address(), remote.get_port());
+            if (_port) {
+                sprintf(&cmd[strlen(cmd)], ",%d", _port);
+            }
+        }
+        if (_wifi->sendCommand(cmd, GSwifi::RES_CONNECT) == false) return -1;
+        _cid = _wifi->readCID();
+    }
+
+    if (_blocking) {
+        while (1) {
+            nb_available = _wifi->readable(_cid);
+            if (nb_available != 0) {
+                break;
+            }
+        }
+    }
+
+    tmr.start();
+
+    while (time < _timeout) {
+
+        nb_available = _wifi->readable(_cid);
+        for (int i = 0; i < min(nb_available, length); i++) {
+            buffer[idx] = _wifi->getc(_cid);
+            idx++;
+        }
+
+        if (idx == length) {
+            break;
+        }
+        
+        time = tmr.read_ms();
+    }
+
+    if (_server) {
+        char *ip;
+        int port;
+        if (_wifi->readRemote(_cid, &ip, &port)) {
+            remote.set_address(ip, port);
+        }
+    }
+    return (idx == 0) ? -1 : idx;
+}
+
+int UDPSocket::sendPacket (Endpoint &ep, const char *buf, int len)
+{
+    char cmd[CFG_CMD_SIZE];
+    Timer tmr;
+    int result = 0;
+
+    if (_cid < 0 || !_wifi->is_connected(_cid)) {
+        // Socket open
+        char cmd[CFG_CMD_SIZE];
+        if (_server) {
+            sprintf(cmd, "AT+NSUDP=%d", _port);
+        } else {
+            sprintf(cmd, "AT+NCUDP=%s,%d", ep.get_address(), ep.get_port());
+            if (_port) {
+                sprintf(&cmd[strlen(cmd)], ",%d", _port);
+            }
+        }
+        if (_wifi->sendCommand(cmd, GSwifi::RES_CONNECT) == false) return -1;
+        _cid = _wifi->readCID();
+    }
+
+    if (_server) {
+        // UDP Server
+        sprintf(cmd, "\x1bY%X%s:%d:%04d", _cid, ep.get_address(), ep.get_port(), len);
+        _wifi->send(cmd, strlen(cmd));
+        result = _wifi->send(buf, len, GSwifi::RES_NORMAL);
+    } else {
+        // UDP Client
+        sprintf(cmd, "\x1bZ%X%04d", _cid, len);
+        _wifi->send(cmd, strlen(cmd));
+        result = _wifi->send(buf, len, GSwifi::RES_NORMAL);
+    }
+
+    return result;
+}