SNIC UART Interface library: Serial to Wi-Fi library for Murata TypeYD Wi-Fi module. For more information about TypeYD: http://www.murata.co.jp/products/microwave/module/lbwb1zzydz/index.html

Dependents:   SNIC-xively-jumpstart-demo SNIC-FluentLogger-example TCPEchoServer murataDemo ... more

Fork of YDwifiInterface by Takao Kishino

Files at this revision

API Documentation at this revision

Comitter:
kishino
Date:
Fri May 30 08:30:40 2014 +0000
Parent:
31:15c22824cc46
Child:
33:33f1bc919486
Commit message:
Implemented a API of TCP server.

Changed in this revision

SNIC/SNIC_Core.cpp Show annotated file Show diff for this revision Revisions of this file
SNIC/SNIC_Core.h Show annotated file Show diff for this revision Revisions of this file
SNIC/SNIC_UartCommandManager.cpp Show annotated file Show diff for this revision Revisions of this file
SNIC/SNIC_UartCommandManager.h Show annotated file Show diff for this revision Revisions of this file
Socket/Socket.cpp Show annotated file Show diff for this revision Revisions of this file
Socket/Socket.h Show annotated file Show diff for this revision Revisions of this file
Socket/TCPSocketConnection.cpp Show annotated file Show diff for this revision Revisions of this file
Socket/TCPSocketConnection.h Show annotated file Show diff for this revision Revisions of this file
Socket/TCPSocketServer.cpp Show annotated file Show diff for this revision Revisions of this file
Socket/TCPSocketServer.h Show annotated file Show diff for this revision Revisions of this file
--- a/SNIC/SNIC_Core.cpp	Thu May 29 03:23:21 2014 +0000
+++ b/SNIC/SNIC_Core.cpp	Fri May 30 08:30:40 2014 +0000
@@ -262,18 +262,16 @@
             {
                 uartRecvBuf_p = (tagMEMPOOL_BLOCK_T *)evt.value.p;
 
+#if 0
                 {
                     int i;
-                    printf("[rcv]:%d",uartRecvBuf_p->size );
-/*
                     for(i=0;i<uartRecvBuf_p->size;i++)
                     {
                         printf("%02x", uartRecvBuf_p->buf[i]);
                     }
-*/
                     printf("\r\n");
                 }
-
+#endif
                 unsigned char command_id;
                 // Get payload from received data from UART.
                 int payload_len = C_SNIC_UartMsgUtil::getResponsePayload( uartRecvBuf_p->size, uartRecvBuf_p->buf
@@ -284,6 +282,12 @@
                     // Packet buffering
                     uartCmdMgr_p->bufferredPacket( gUART_TEMP_BUF, payload_len );
                 }
+                // Check connected from TCP client
+                else if( (command_id == UART_CMD_ID_SNIC) && (gUART_TEMP_BUF[0] == UART_CMD_SID_SNIC_TCP_CLIENT_SOCKET_IND) )
+                {
+                    // Connected from TCP client
+                    uartCmdMgr_p->connectedTCPClient( gUART_TEMP_BUF, payload_len );
+                }
                 // Check scan results indication 
                 else if( (command_id == UART_CMD_ID_WIFI) && (gUART_TEMP_BUF[0] == UART_CMD_SID_WIFI_SCAN_RESULT_IND) )
                 {
--- a/SNIC/SNIC_Core.h	Thu May 29 03:23:21 2014 +0000
+++ b/SNIC/SNIC_Core.h	Fri May 30 08:30:40 2014 +0000
@@ -28,6 +28,7 @@
 #define MAX_SOCKET_ID   5
 
 #define MEMPOOL_UART_RECV_NUM 2
+#define SNIC_UART_RECVBUF_SIZE         2048
 
 /** Wi-Fi security
  */
@@ -75,6 +76,7 @@
 friend class C_SNIC_WifiInterface;
 friend class TCPSocketConnection;
 friend class Socket;
+friend class TCPSocketServer;
 
 private:
     /** Wi-Fi Network type
@@ -92,6 +94,8 @@
         CircBuffer<char>    *recvbuf_p;
         bool                is_connected;
         bool                is_received;
+        int                 parent_socket;
+        bool                is_accept;
     }tagCONNECT_INFO_T;
 
     /** GEN_FW_VER_GET_REQ Command */
@@ -158,6 +162,16 @@
         unsigned char payload_len[2];
     }tagSNIC_TCP_SEND_FROM_SOCKET_REQ_T;
     
+    /** SNIC_TCP_CREATE_CONNECTION_REQ */
+    typedef struct
+    {
+        unsigned char cmd_sid;
+        unsigned char seq;
+        unsigned char socket_id;
+        unsigned char recv_bufsize[2];
+        unsigned char max_client;
+    }tagSNIC_TCP_CREATE_CONNECTION_REQ_T;
+
     /** SNIC_TCP_CONNECT_TO_SERVER_REQ */
     typedef struct
     {
@@ -170,6 +184,14 @@
         unsigned char timeout;
     }tagSNIC_TCP_CONNECT_TO_SERVER_REQ_T;
     
+    /** SNIC_GET_DHCP_INFO_REQ */
+    typedef struct
+    {
+        unsigned char cmd_sid;
+        unsigned char seq;
+        unsigned char interface;
+    }tagSNIC_GET_DHCP_INFO_REQ_T;
+    
     /** WIFI_ON_REQ Command */
     typedef struct 
     {
--- a/SNIC/SNIC_UartCommandManager.cpp	Thu May 29 03:23:21 2014 +0000
+++ b/SNIC/SNIC_UartCommandManager.cpp	Fri May 30 08:30:40 2014 +0000
@@ -183,3 +183,36 @@
     }
     con_info_p->is_received = true;
 }
+
+void C_SNIC_UartCommandManager::connectedTCPClient( unsigned char *payload_p, int payload_len )
+{
+    if( (payload_p == NULL) || (payload_len == 0) )
+    {
+        return;
+    }
+    
+    C_SNIC_Core *instance_p = C_SNIC_Core::getInstance();
+    int          socket_id;
+    
+    // Get socket id of client from payload
+    socket_id = payload_p[3];
+
+    printf("[connectedTCPClient] socket id:%d\r\n", socket_id);
+    
+    // Get Connection information
+    C_SNIC_Core::tagCONNECT_INFO_T *con_info_p = instance_p->getConnectInfo( socket_id );
+    if( con_info_p == NULL )
+    {
+        return;
+    }
+
+    if( con_info_p->recvbuf_p == NULL )
+    {
+        printf( "create recv buffer[socket:%d]\r\n", socket_id);
+        con_info_p->recvbuf_p = new CircBuffer<char>(SNIC_UART_RECVBUF_SIZE);
+    }
+    con_info_p->is_connected  = true;
+    con_info_p->is_received   = false;
+    con_info_p->is_accept     = true;
+    con_info_p->parent_socket = payload_p[2];
+}
--- a/SNIC/SNIC_UartCommandManager.h	Thu May 29 03:23:21 2014 +0000
+++ b/SNIC/SNIC_UartCommandManager.h	Fri May 30 08:30:40 2014 +0000
@@ -56,6 +56,7 @@
 friend class C_SNIC_Core;
 friend class C_SNIC_WifiInterface;
 friend class TCPSocketConnection;
+friend class TCPSocketServer;
 friend class Socket;
 
 private:
@@ -110,6 +111,8 @@
     
     void scanResultIndicate( unsigned char *payload_p, int payload_len );
     
+    void connectedTCPClient( unsigned char *payload_p, int payload_len );
+
     /** Checks in the command which is waiting from Command ID and Sub ID.
         @param  command_id  Command ID
         @param  payload_p   Command payload
--- a/Socket/Socket.cpp	Thu May 29 03:23:21 2014 +0000
+++ b/Socket/Socket.cpp	Fri May 30 08:30:40 2014 +0000
@@ -132,12 +132,15 @@
     req_len++;
     if( bind != 0 )
     {
-/*
-        req.local_addr = local_addr;
-        req_len++;
-        req.local_port = port;
-        req_len++;
-*/
+        // set ip addr ( byte order )
+        req.local_addr[0] = ( (local_addr & 0xFF000000) >> 24 );
+        req.local_addr[1] = ( (local_addr & 0xFF0000) >> 16 );
+        req.local_addr[2] = ( (local_addr & 0xFF00) >> 8 );
+        req.local_addr[3] = (local_addr & 0xFF);
+        req.local_port[0] = ( (port & 0xFF00) >> 8 );
+        req.local_port[1] = (port & 0xFF);
+
+        req_len = sizeof(C_SNIC_Core::tagSNIC_TCP_CREATE_SOCKET_REQ_T);
     }
 
     unsigned char *command_array = snic_core_p->getCommandBuf();
--- a/Socket/Socket.h	Thu May 29 03:23:21 2014 +0000
+++ b/Socket/Socket.h	Fri May 30 08:30:40 2014 +0000
@@ -35,8 +35,6 @@
 
 typedef unsigned long socklen_t;
 
-#define SNIC_UART_RECVBUF_SIZE  2048
-
 /** Socket file descriptor and select wrapper
   */
 class Socket {
--- a/Socket/TCPSocketConnection.cpp	Thu May 29 03:23:21 2014 +0000
+++ b/Socket/TCPSocketConnection.cpp	Fri May 30 08:30:40 2014 +0000
@@ -255,3 +255,8 @@
 
     return i;
 }
+
+void TCPSocketConnection::setAcceptSocket( int socket_id )
+{
+    mSocketID = socket_id;
+}
--- a/Socket/TCPSocketConnection.h	Thu May 29 03:23:21 2014 +0000
+++ b/Socket/TCPSocketConnection.h	Fri May 30 08:30:40 2014 +0000
@@ -80,6 +80,7 @@
      */
     int receive(char *data_p, int length);
     
+    void setAcceptSocket( int socket_id );
 private:
 
 };
--- a/Socket/TCPSocketServer.cpp	Thu May 29 03:23:21 2014 +0000
+++ b/Socket/TCPSocketServer.cpp	Fri May 30 08:30:40 2014 +0000
@@ -28,6 +28,7 @@
  * $Revision: 0.0.0.1 $
  * ***********************************************************************/
 #include "TCPSocketServer.h"
+#include "SNIC_Core.h"
 
 #include <cstring>
 
@@ -39,17 +40,141 @@
 {
 }
 
-int TCPSocketServer::bind(int port) 
+int TCPSocketServer::bind(unsigned short port) 
 {
+    int ret;
+    C_SNIC_Core               *snic_core_p  = C_SNIC_Core::getInstance();
+    C_SNIC_UartCommandManager *uartCmdMgr_p = snic_core_p->getUartCommand();
+    
+    // Get local ip address.
+    // Get buffer for response payload from MemoryPool
+    tagMEMPOOL_BLOCK_T *payload_buf = snic_core_p->allocCmdBuf();
+    if( payload_buf == NULL )
+    {
+        printf("bind payload_buf NULL\r\n");
+        return -1;
+    }
+
+    C_SNIC_Core::tagSNIC_GET_DHCP_INFO_REQ_T req;
+    // Make request
+    req.cmd_sid      = UART_CMD_SID_SNIC_GET_DHCP_INFO_REQ;
+    req.seq          = mUartRequestSeq++;
+    req.interface    = 0;
+    
+    unsigned char command_array[UART_REQUEST_PAYLOAD_MAX];
+    unsigned int  command_len;
+    // Preparation of command
+    command_len = snic_core_p->preparationSendCommand( UART_CMD_ID_SNIC, req.cmd_sid, (unsigned char *)&req
+                            , sizeof(C_SNIC_Core::tagSNIC_GET_DHCP_INFO_REQ_T), payload_buf->buf, command_array );
+    // Send uart command request
+    snic_core_p->sendUart( command_len, command_array );
+    // Wait UART response
+    ret = uartCmdMgr_p->wait();
+    if( ret != 0 )
+    {
+        printf( "bind failed\r\n" );
+        snic_core_p->freeCmdBuf( payload_buf );
+        return -1;
+    }
+    
+    if( uartCmdMgr_p->getCommandStatus() != UART_CMD_RES_SNIC_SUCCESS )
+    {
+        printf("bind status:%02x\r\n", uartCmdMgr_p->getCommandStatus());
+        snic_core_p->freeCmdBuf( payload_buf );
+        return -1;
+    }
+    
+    snic_core_p->freeCmdBuf( payload_buf );
+    
+    unsigned int local_addr = (payload_buf->buf[9]  << 24)
+                            | (payload_buf->buf[10] << 16)
+                            | (payload_buf->buf[11] << 8)
+                            | (payload_buf->buf[12]);
+   
+    // Socket create
+    ret = createSocket( 1, local_addr, port );
+    if( ret != 0 )
+    {
+        printf("bind error : %d\r\n", ret);
+        return -1;
+    }
+
     return 0;
 }
 
 int TCPSocketServer::listen(int max)
 {
+    C_SNIC_Core               *snic_core_p  = C_SNIC_Core::getInstance();
+    C_SNIC_UartCommandManager *uartCmdMgr_p = snic_core_p->getUartCommand();
+    
+    // Get buffer for response payload from MemoryPool
+    tagMEMPOOL_BLOCK_T *payload_buf = snic_core_p->allocCmdBuf();
+    if( payload_buf == NULL )
+    {
+        printf("listen payload_buf NULL\r\n");
+        return -1;
+    }
+
+    C_SNIC_Core::tagSNIC_TCP_CREATE_CONNECTION_REQ_T req;
+    // Make request
+    req.cmd_sid         = UART_CMD_SID_SNIC_TCP_CREATE_CONNECTION_REQ;
+    req.seq             = mUartRequestSeq++;
+    req.socket_id       = mSocketID;
+    req.recv_bufsize[0] = ( (SNIC_UART_RECVBUF_SIZE & 0xFF00) >> 8 );
+    req.recv_bufsize[1] = (SNIC_UART_RECVBUF_SIZE & 0xFF);
+    req.max_client      = max;
+    
+    unsigned char command_array[UART_REQUEST_PAYLOAD_MAX];
+    unsigned int  command_len;
+    // Preparation of command
+    command_len = snic_core_p->preparationSendCommand( UART_CMD_ID_SNIC, req.cmd_sid, (unsigned char *)&req
+                        , sizeof(C_SNIC_Core::tagSNIC_TCP_CREATE_CONNECTION_REQ_T), payload_buf->buf, command_array );
+
+    int ret;
+    
+    // Send uart command request
+    snic_core_p->sendUart( command_len, command_array );
+    
+    // Wait UART response
+    ret = uartCmdMgr_p->wait();
+    if( ret != 0 )
+    {
+        printf( "listen failed\r\n" );
+        snic_core_p->freeCmdBuf( payload_buf );
+        return -1;
+    }
+    
+    if( uartCmdMgr_p->getCommandStatus() != 0 )
+    {
+        printf("listen status:%02x\r\n", uartCmdMgr_p->getCommandStatus());
+        snic_core_p->freeCmdBuf( payload_buf );
+        return -1;
+    }
+
+    snic_core_p->freeCmdBuf( payload_buf );
     return 0;
 }
 
-int TCPSocketServer::accept(TCPSocketConnection& connection)
+int TCPSocketServer::accept(TCPSocketConnection *connection)
 {
-    return 0;
+    C_SNIC_Core *snic_core_p = C_SNIC_Core::getInstance();
+    int          i;
+    int          ret = -1;
+    
+    C_SNIC_Core::tagCONNECT_INFO_T *con_info_p;
+    for( i = 0; i < MAX_SOCKET_ID+1; i++ )
+    {
+        // Get connection information
+        con_info_p = snic_core_p->getConnectInfo( i );
+        if( (con_info_p->is_connected == true)
+            && (con_info_p->is_accept == true)
+            && (con_info_p->parent_socket == mSocketID) )
+        {
+            // Set socket id
+            connection->setAcceptSocket( i );
+            ret = 0;
+        }   
+    }
+    
+    return ret;
 }
--- a/Socket/TCPSocketServer.h	Thu May 29 03:23:21 2014 +0000
+++ b/Socket/TCPSocketServer.h	Fri May 30 08:30:40 2014 +0000
@@ -48,7 +48,7 @@
     \param port The port to listen for incoming connections on.
     \return 0 on success, -1 on failure.
     */
-    int bind(int port);
+    int bind(unsigned short port);
     
     /** Start listening for incoming connections.
     \param backlog number of pending connections that can be queued up at any
@@ -61,7 +61,7 @@
     \param connection A TCPSocketConnection instance that will handle the incoming connection.
     \return 0 on success, -1 on failure.
     */
-    int accept(TCPSocketConnection& connection);
+    int accept(TCPSocketConnection *connection);
 };
 
 #endif