From d9e241c32284e342a6ab8f80865cc6515413f429 Mon Sep 17 00:00:00 2001 From: asynclabs Date: Fri, 17 Jul 2009 17:04:09 -0700 Subject: [PATCH] Adding UDPApp sketch UDPApp sketch is a simple network application which demonstrates the use of UDP protocol for communication with other network devices. --- apps-conf.h | 5 ++ examples/UDPApp/UDPApp.pde | 51 ++++++++++++++ examples/UDPApp/udpapp.c | 137 +++++++++++++++++++++++++++++++++++++ stack.c | 4 ++ udpapp.h | 62 +++++++++++++++++ uip-conf.h | 6 +- uip.c | 5 +- 7 files changed, 266 insertions(+), 4 deletions(-) create mode 100644 examples/UDPApp/UDPApp.pde create mode 100644 examples/UDPApp/udpapp.c create mode 100644 udpapp.h diff --git a/apps-conf.h b/apps-conf.h index a636c90..5020e80 100644 --- a/apps-conf.h +++ b/apps-conf.h @@ -39,6 +39,7 @@ #define APP_WEBSERVER //#define APP_WEBCLIENT //#define APP_SOCKAPP +//#define APP_UDPAPP //#define APP_WISERVER #ifdef APP_WEBSERVER @@ -53,6 +54,10 @@ #include "socketapp.h" #endif +#ifdef APP_UDPAPP +#include "udpapp.h" +#endif + #ifdef APP_WISERVER #include "server.h" #endif diff --git a/examples/UDPApp/UDPApp.pde b/examples/UDPApp/UDPApp.pde new file mode 100644 index 0000000..d0d23b9 --- /dev/null +++ b/examples/UDPApp/UDPApp.pde @@ -0,0 +1,51 @@ +/* + * Web Server + * + * A simple web server example using the WiShield 1.0 + */ + +#include + +#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

Hello World!! I am WiShield

Toggle LED:
"}; + +void loop() +{ + WiFi.run(); +} diff --git a/examples/UDPApp/udpapp.c b/examples/UDPApp/udpapp.c new file mode 100644 index 0000000..f019164 --- /dev/null +++ b/examples/UDPApp/udpapp.c @@ -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: + + + Author Date Comment + --------------------------------------------------------------- + AsyncLabs 07/11/2009 Initial version + + *****************************************************************************/ + +#include "uip.h" +#include +#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(); +} diff --git a/stack.c b/stack.c index 34e6864..cbb036e 100644 --- a/stack.c +++ b/stack.c @@ -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]); diff --git a/udpapp.h b/udpapp.h new file mode 100644 index 0000000..bc4f570 --- /dev/null +++ b/udpapp.h @@ -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: + + + 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__ */ diff --git a/uip-conf.h b/uip-conf.h index fa5c930..db67e79 100644 --- a/uip-conf.h +++ b/uip-conf.h @@ -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 @@ -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. diff --git a/uip.c b/uip.c index 2a86894..26e0e37 100644 --- a/uip.c +++ b/uip.c @@ -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]; @@ -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;