Skip to content

Commit

Permalink
Adding UDPApp sketch
Browse files Browse the repository at this point in the history
UDPApp sketch is a simple network application which demonstrates the use of
UDP protocol for communication with other network devices.
  • Loading branch information
asynclabs committed Jul 18, 2009
1 parent 1018f90 commit d9e241c
Show file tree
Hide file tree
Showing 7 changed files with 266 additions and 4 deletions.
5 changes: 5 additions & 0 deletions apps-conf.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
#define APP_WEBSERVER
//#define APP_WEBCLIENT
//#define APP_SOCKAPP
//#define APP_UDPAPP
//#define APP_WISERVER

#ifdef APP_WEBSERVER
Expand All @@ -53,6 +54,10 @@
#include "socketapp.h"
#endif

#ifdef APP_UDPAPP
#include "udpapp.h"
#endif

#ifdef APP_WISERVER
#include "server.h"
#endif
Expand Down
51 changes: 51 additions & 0 deletions examples/UDPApp/UDPApp.pde
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Web Server
*
* A simple web server example using the WiShield 1.0
*/

#include <WiShield.h>

#define WIRELESS_MODE_INFRA 1
#define WIRELESS_MODE_ADHOC 2

// Wireless configuration parameters ----------------------------------------
unsigned char local_ip[] = {192,168,1,2}; // IP address of WiShield
unsigned char gateway_ip[] = {192,168,1,1}; // router or gateway IP address
unsigned char subnet_mask[] = {255,255,255,0}; // subnet mask for the local network
const prog_char ssid[] PROGMEM = {"ASYNCLABS"}; // max 32 bytes

unsigned char security_type = 0; // 0 - open; 1 - WEP; 2 - WPA; 3 - WPA2

// WPA/WPA2 passphrase
const prog_char security_passphrase[] PROGMEM = {"12345678"}; // max 64 characters

// WEP 128-bit keys
// sample HEX keys
prog_uchar wep_keys[] PROGMEM = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, // Key 0
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Key 1
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Key 2
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Key 3
};

// setup the wireless mode
// infrastructure - connect to AP
// adhoc - connect to another WiFi device
unsigned char wireless_mode = WIRELESS_MODE_INFRA;

unsigned char ssid_len;
unsigned char security_passphrase_len;
//---------------------------------------------------------------------------

void setup()
{
WiFi.init();
}

// This is the webpage that is served up by the webserver
const prog_char webpage[] PROGMEM = {"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<center><h1>Hello World!! I am WiShield</h1><form method=\"get\" action=\"0\">Toggle LED:<input type=\"submit\" name=\"0\" value=\"LED1\"></input></form></center>"};

void loop()
{
WiFi.run();
}
137 changes: 137 additions & 0 deletions examples/UDPApp/udpapp.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@

/******************************************************************************
Filename: udpapp.h
Description: UDP app for the WiShield 1.0
******************************************************************************
TCP/IP stack and driver for the WiShield 1.0 wireless devices
Copyright(c) 2009 Async Labs Inc. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of version 2 of the GNU General Public License as
published by the Free Software Foundation.
This program 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 General Public License for
more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59
Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Contact Information:
<[email protected]>
Author Date Comment
---------------------------------------------------------------
AsyncLabs 07/11/2009 Initial version
*****************************************************************************/

#include "uip.h"
#include <string.h>
#include "udpapp.h"
#include "config.h"

#define STATE_INIT 0
#define STATE_LISTENING 1
#define STATE_HELLO_RECEIVED 2
#define STATE_NAME_RECEIVED 3

static struct udpapp_state s;

void dummy_app_appcall(void)
{
}

void udpapp_init(void)
{
uip_ipaddr_t addr;
struct uip_udp_conn *c;

uip_ipaddr(&addr, 192,168,1,100);
c = uip_udp_new(&addr, HTONS(0));
if(c != NULL) {
uip_udp_bind(c, HTONS(12344));
}

s.state = STATE_INIT;

PT_INIT(&s.pt);
}

static unsigned char parse_msg(void)
{
if (memcmp(uip_appdata, "Hello", 5) == 0) {
return 1;
}

return 0;
}

static void send_request(void)
{
char str[] = "Hello. What is your name?\n";

memcpy(uip_appdata, str, strlen(str));
uip_send(uip_appdata, strlen(str));
}

static void send_response(void)
{
char i = 0;
char str[] = "Hello ";

while ( ( ((char*)uip_appdata)[i] != '\n') && i < 9) {
s.inputbuf[i] = ((char*)uip_appdata)[i];
i++;
}
s.inputbuf[i] = '\n';

memcpy(uip_appdata, str, 6);
memcpy(uip_appdata+6, s.inputbuf, i+1);
uip_send(uip_appdata, i+7);
}

static PT_THREAD(handle_connection(void))
{
PT_BEGIN(&s.pt);

s.state = STATE_LISTENING;

do {
PT_WAIT_UNTIL(&s.pt, uip_newdata());

if(uip_newdata() && parse_msg()) {
s.state = STATE_HELLO_RECEIVED;
uip_flags &= (~UIP_NEWDATA);
break;
}
} while(s.state != STATE_HELLO_RECEIVED);

do {
send_request();
PT_WAIT_UNTIL(&s.pt, uip_newdata());

if(uip_newdata()) {
s.state = STATE_NAME_RECEIVED;
uip_flags &= (~UIP_NEWDATA);
break;
}
} while(s.state != STATE_NAME_RECEIVED);

send_response();

s.state = STATE_INIT;

PT_END(&s.pt);
}

void udpapp_appcall(void)
{
handle_connection();
}
4 changes: 4 additions & 0 deletions stack.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ void stack_init(void)
socket_app_init();
#endif

#ifdef APP_UDPAPP
udpapp_init();
#endif

uip_ipaddr(ipaddr, local_ip[0], local_ip[1], local_ip[2], local_ip[3]);
uip_sethostaddr(ipaddr);
uip_ipaddr(ipaddr, gateway_ip[0],gateway_ip[1],gateway_ip[2],gateway_ip[3]);
Expand Down
62 changes: 62 additions & 0 deletions udpapp.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@

/******************************************************************************
Filename: udpapp.h
Description: UDP app for the WiShield 1.0
******************************************************************************
TCP/IP stack and driver for the WiShield 1.0 wireless devices
Copyright(c) 2009 Async Labs Inc. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of version 2 of the GNU General Public License as
published by the Free Software Foundation.
This program 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 General Public License for
more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59
Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Contact Information:
<[email protected]>
Author Date Comment
---------------------------------------------------------------
AsyncLabs 07/11/2009 Initial version
*****************************************************************************/

#ifndef __UDPAPP_H__
#define __UDPAPP_H__

#include "pt.h"

typedef struct socket_app_state {
char name;
} uip_tcp_appstate_t;

void dummy_app_appcall(void);
#ifndef UIP_APPCALL
#define UIP_APPCALL dummy_app_appcall
#endif /* UIP_APPCALL */

typedef struct udpapp_state {
struct pt pt;
char state;
char inputbuf[10];
} uip_udp_appstate_t;

void udpapp_appcall(void);
#ifndef UIP_UDP_APPCALL
#define UIP_UDP_APPCALL udpapp_appcall
#endif /* UIP_UDP_APPCALL */

void udpapp_init(void);

#endif /* __UDPAPP_H__ */
6 changes: 3 additions & 3 deletions uip-conf.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,14 +107,14 @@ typedef unsigned short uip_stats_t;
*
* \hideinitializer
*/
#define UIP_CONF_UDP 0
#define UIP_CONF_UDP 1

/**
* UDP checksums on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CHECKSUMS 0
#define UIP_CONF_UDP_CHECKSUMS 1

/**
* uIP statistics on or off
Expand All @@ -128,7 +128,7 @@ typedef unsigned short uip_stats_t;
*
* \hideinitializer
*/
#define UIP_CONF_BROADCAST 0
#define UIP_CONF_BROADCAST 1

/**
* The maximum amount of concurrent UDP connections.
Expand Down
5 changes: 4 additions & 1 deletion uip.c
Original file line number Diff line number Diff line change
Expand Up @@ -1148,6 +1148,9 @@ uip_process(u8_t flag)
goto drop;

udp_found:
if (uip_udp_conn->rport == 0) {
uip_udp_conn->rport = UDPBUF->srcport;
}
uip_conn = NULL;
uip_flags = UIP_NEWDATA;
uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN];
Expand Down Expand Up @@ -1869,7 +1872,7 @@ uip_process(u8_t flag)
BUF->tcpchksum = 0;
BUF->tcpchksum = ~(uip_tcpchksum());

// ip_send_nolen:
ip_send_nolen:

#if UIP_CONF_IPV6
BUF->vtc = 0x60;
Expand Down

0 comments on commit d9e241c

Please sign in to comment.