Small demo to purely test UDP, depends on the module already being configured to auto connect to an access point

Dependencies:   USBDevice cc3000_hostdriver_mbedsocket mbed

Fork of WifiDipCortex-UDPDemo by Carl - SolderSplash Labs

Wifi-DipCortex - Test application that shows you how to listen for UDP message on one port while sending messages on another

- Listens on UDP_LISTEN_PORT, upon data being recvied it can be found in UDP_RecvBuffer - Transmits UDP_TX_Buffer on UDP_TARGET_PORT to UDP_TARGET_IP

Committer:
SolderSplashLabs
Date:
Wed Jul 09 19:27:41 2014 +0000
Revision:
1:5fa4efb214e7
Parent:
0:ff40ad3448c5
Child:
2:6813713a64e1
- Listens on UDP_LISTEN_PORT, upon data being recvied it can be found in UDP_RecvBuffer; - Transmits UDP_TX_Buffer on UDP_TARGET_PORT to UDP_TARGET_IP

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SolderSplashLabs 1:5fa4efb214e7 1 /* ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 1:5fa4efb214e7 2 SolderSplash Labs - Wifi-DipCortex
SolderSplashLabs 1:5fa4efb214e7 3 Test application that shows you how to listen for UDP message on one port while sending messages on another
SolderSplashLabs 1:5fa4efb214e7 4
SolderSplashLabs 1:5fa4efb214e7 5 - Listens on UDP_LISTEN_PORT, upon data being recvied it can be found in UDP_RecvBuffer
SolderSplashLabs 1:5fa4efb214e7 6 - Transmits UDP_TX_Buffer on UDP_TARGET_PORT to UDP_TARGET_IP
SolderSplashLabs 1:5fa4efb214e7 7
SolderSplashLabs 1:5fa4efb214e7 8 Note : V1.28 firmware has an issue sending UDP data to 224.0.0.251
SolderSplashLabs 1:5fa4efb214e7 9 http://forum.soldersplash.co.uk/viewtopic.php?f=15&t=97
SolderSplashLabs 1:5fa4efb214e7 10 ----------------------------------------------------------------------------------------------------------- */
SolderSplashLabs 1:5fa4efb214e7 11
SolderSplashLabs 0:ff40ad3448c5 12 #include "mbed.h"
SolderSplashLabs 0:ff40ad3448c5 13 #include "cc3000.h"
SolderSplashLabs 0:ff40ad3448c5 14 #include "wifi.h"
SolderSplashLabs 0:ff40ad3448c5 15 #include "UDPSocket.h"
SolderSplashLabs 0:ff40ad3448c5 16 #include "USBSerial.h"
SolderSplashLabs 0:ff40ad3448c5 17
SolderSplashLabs 0:ff40ad3448c5 18 using namespace mbed_cc3000;
SolderSplashLabs 0:ff40ad3448c5 19
SolderSplashLabs 1:5fa4efb214e7 20 #define SERIAL_BAUD_RATE 115200
SolderSplashLabs 1:5fa4efb214e7 21 #define SOCKOPT_RECV_NONBLOCK 0
SolderSplashLabs 0:ff40ad3448c5 22
SolderSplashLabs 0:ff40ad3448c5 23 cc3000 wifi(p28, p27, p30, SPI(p21, p14, p37));
SolderSplashLabs 0:ff40ad3448c5 24 Serial uart(p19, p20);
SolderSplashLabs 0:ff40ad3448c5 25
SolderSplashLabs 0:ff40ad3448c5 26 // USB CDC serial port
SolderSplashLabs 0:ff40ad3448c5 27 USBSerial pc;
SolderSplashLabs 0:ff40ad3448c5 28
SolderSplashLabs 1:5fa4efb214e7 29 const char UDP_TX_Buffer[] = {0,0,0,0,0,1,0,0,0,0,0,0,6,0x61,0x61,0x61,0x61,0x61,0x61,5,0x6c,0x6f,0x63,0x61,0x6c,0,0,1,0,1};
SolderSplashLabs 1:5fa4efb214e7 30
SolderSplashLabs 1:5fa4efb214e7 31 // Multicast address - this causes issues with firmware version 1.28
SolderSplashLabs 1:5fa4efb214e7 32 //const char* UDP_TARGET_IP = "224.0.0.251";
SolderSplashLabs 1:5fa4efb214e7 33
SolderSplashLabs 1:5fa4efb214e7 34 // This is the broadcast address for the subnet 192.168.0.x
SolderSplashLabs 1:5fa4efb214e7 35 const char* UDP_TARGET_IP = "192.168.0.255";
SolderSplashLabs 1:5fa4efb214e7 36
SolderSplashLabs 1:5fa4efb214e7 37 const int UDP_TARGET_PORT = 5353;
SolderSplashLabs 1:5fa4efb214e7 38 UDPSocket UDP_TransmitSocket;
SolderSplashLabs 1:5fa4efb214e7 39
SolderSplashLabs 1:5fa4efb214e7 40 const int UDP_LISTEN_PORT = 11028;
SolderSplashLabs 1:5fa4efb214e7 41 UDPSocket UDP_RecvSocket;
SolderSplashLabs 1:5fa4efb214e7 42
SolderSplashLabs 1:5fa4efb214e7 43 #define UDP_RECV_BUF_LEN 512
SolderSplashLabs 1:5fa4efb214e7 44 uint8_t UDP_RecvBuffer[ UDP_RECV_BUF_LEN ];
SolderSplashLabs 1:5fa4efb214e7 45
SolderSplashLabs 0:ff40ad3448c5 46 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 47 /*!
SolderSplashLabs 0:ff40ad3448c5 48 @brief WaitForConnection
SolderSplashLabs 0:ff40ad3448c5 49 */
SolderSplashLabs 0:ff40ad3448c5 50 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 51 void WaitForConnection ( void )
SolderSplashLabs 0:ff40ad3448c5 52 {
SolderSplashLabs 0:ff40ad3448c5 53 tNetappIpconfigRetArgs ipinfo;
SolderSplashLabs 0:ff40ad3448c5 54
SolderSplashLabs 0:ff40ad3448c5 55 while (! ( wifi.is_dhcp_configured() ) )
SolderSplashLabs 0:ff40ad3448c5 56 {
SolderSplashLabs 0:ff40ad3448c5 57 // Still not connected
SolderSplashLabs 0:ff40ad3448c5 58 pc.printf("No Connection\r\n");
SolderSplashLabs 0:ff40ad3448c5 59 wait(1);
SolderSplashLabs 0:ff40ad3448c5 60 }
SolderSplashLabs 0:ff40ad3448c5 61
SolderSplashLabs 0:ff40ad3448c5 62 if (( wifi.is_enabled() ) && ( wifi.is_dhcp_configured() ))
SolderSplashLabs 0:ff40ad3448c5 63 {
SolderSplashLabs 0:ff40ad3448c5 64 wifi.get_ip_config(&ipinfo);
SolderSplashLabs 0:ff40ad3448c5 65 }
SolderSplashLabs 0:ff40ad3448c5 66
SolderSplashLabs 0:ff40ad3448c5 67 pc.printf("Connected to (%s) %s \r\n", ipinfo.uaSSID, wifi.getIPAddress());
SolderSplashLabs 0:ff40ad3448c5 68
SolderSplashLabs 0:ff40ad3448c5 69 }
SolderSplashLabs 0:ff40ad3448c5 70
SolderSplashLabs 0:ff40ad3448c5 71 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 72 /*!
SolderSplashLabs 0:ff40ad3448c5 73 @brief WaitForUser
SolderSplashLabs 0:ff40ad3448c5 74 */
SolderSplashLabs 0:ff40ad3448c5 75 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 76 void WaitForUser ( void )
SolderSplashLabs 0:ff40ad3448c5 77 {
SolderSplashLabs 0:ff40ad3448c5 78 char charIn;
SolderSplashLabs 0:ff40ad3448c5 79
SolderSplashLabs 0:ff40ad3448c5 80 pc.printf("Press Enter to Continue\r\n");
SolderSplashLabs 0:ff40ad3448c5 81
SolderSplashLabs 0:ff40ad3448c5 82 while (1)
SolderSplashLabs 0:ff40ad3448c5 83 {
SolderSplashLabs 0:ff40ad3448c5 84 charIn = pc.getc();
SolderSplashLabs 0:ff40ad3448c5 85
SolderSplashLabs 0:ff40ad3448c5 86 pc.printf("%c", charIn);
SolderSplashLabs 0:ff40ad3448c5 87 if ((charIn == '\n') || (charIn == '\r'))
SolderSplashLabs 0:ff40ad3448c5 88 {
SolderSplashLabs 0:ff40ad3448c5 89 break;
SolderSplashLabs 0:ff40ad3448c5 90 }
SolderSplashLabs 0:ff40ad3448c5 91 }
SolderSplashLabs 0:ff40ad3448c5 92 }
SolderSplashLabs 0:ff40ad3448c5 93
SolderSplashLabs 1:5fa4efb214e7 94 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 1:5fa4efb214e7 95 /*!
SolderSplashLabs 1:5fa4efb214e7 96 @brief UdpTx_Init
SolderSplashLabs 1:5fa4efb214e7 97 */
SolderSplashLabs 1:5fa4efb214e7 98 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 1:5fa4efb214e7 99 void UdpTx_Init ( void )
SolderSplashLabs 1:5fa4efb214e7 100 {
SolderSplashLabs 1:5fa4efb214e7 101 // Creating the socket once and then re-using it is quicker than creating it everytime
SolderSplashLabs 1:5fa4efb214e7 102 // but it does tie up a 1 of the 4 sockets
SolderSplashLabs 1:5fa4efb214e7 103 UDP_TransmitSocket.init();
SolderSplashLabs 1:5fa4efb214e7 104 }
SolderSplashLabs 0:ff40ad3448c5 105
SolderSplashLabs 0:ff40ad3448c5 106 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 107 /*!
SolderSplashLabs 0:ff40ad3448c5 108 @brief UdpTx
SolderSplashLabs 0:ff40ad3448c5 109 */
SolderSplashLabs 0:ff40ad3448c5 110 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 111 void UdpTx ( void )
SolderSplashLabs 0:ff40ad3448c5 112 {
SolderSplashLabs 0:ff40ad3448c5 113 Endpoint target;
SolderSplashLabs 1:5fa4efb214e7 114 int returnVal;
SolderSplashLabs 1:5fa4efb214e7 115
SolderSplashLabs 1:5fa4efb214e7 116
SolderSplashLabs 0:ff40ad3448c5 117 target.set_address(UDP_TARGET_IP, UDP_TARGET_PORT);
SolderSplashLabs 0:ff40ad3448c5 118
SolderSplashLabs 0:ff40ad3448c5 119 pc.printf("Sending UDP Message ..\r\n");
SolderSplashLabs 1:5fa4efb214e7 120
SolderSplashLabs 1:5fa4efb214e7 121 returnVal = UDP_TransmitSocket.sendTo(target, (char *)UDP_TX_Buffer, sizeof(UDP_TX_Buffer));
SolderSplashLabs 1:5fa4efb214e7 122
SolderSplashLabs 1:5fa4efb214e7 123 if ( returnVal < 0 )
SolderSplashLabs 1:5fa4efb214e7 124 {
SolderSplashLabs 1:5fa4efb214e7 125 pc.printf("UdpTx : failed to send UDP message ReturnVal : %i\r\n", returnVal);
SolderSplashLabs 1:5fa4efb214e7 126 }
SolderSplashLabs 1:5fa4efb214e7 127 else
SolderSplashLabs 1:5fa4efb214e7 128 {
SolderSplashLabs 1:5fa4efb214e7 129 pc.printf("UDP Message Sent (%i)..\r\n", returnVal);
SolderSplashLabs 1:5fa4efb214e7 130 }
SolderSplashLabs 1:5fa4efb214e7 131 }
SolderSplashLabs 1:5fa4efb214e7 132
SolderSplashLabs 1:5fa4efb214e7 133 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 1:5fa4efb214e7 134 /*!
SolderSplashLabs 1:5fa4efb214e7 135 @brief UdpRxTx_Init - Set up a non blocking UDP port for incoming messages
SolderSplashLabs 1:5fa4efb214e7 136 */
SolderSplashLabs 1:5fa4efb214e7 137 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 1:5fa4efb214e7 138 void UdpRx_Init ( void )
SolderSplashLabs 1:5fa4efb214e7 139 {
SolderSplashLabs 1:5fa4efb214e7 140 long optvalue_block = 0;
SolderSplashLabs 1:5fa4efb214e7 141
SolderSplashLabs 1:5fa4efb214e7 142 // Note : This seems wrong but .. we are using a socket option that stops the cc3000 blocking
SolderSplashLabs 1:5fa4efb214e7 143 // this lets us call recvfrom and not wait for a message, if it has any data it returns with it, if theres no data it returns immediately
SolderSplashLabs 1:5fa4efb214e7 144 UDP_RecvSocket.set_blocking(true, 0);
SolderSplashLabs 1:5fa4efb214e7 145
SolderSplashLabs 1:5fa4efb214e7 146 if ( 0 == UDP_RecvSocket.bind(UDP_LISTEN_PORT) )
SolderSplashLabs 1:5fa4efb214e7 147 {
SolderSplashLabs 1:5fa4efb214e7 148 // Socket bound to the port
SolderSplashLabs 1:5fa4efb214e7 149 // Configure the module to not block when checking for UDP data
SolderSplashLabs 1:5fa4efb214e7 150 UDP_RecvSocket.set_option(SOL_SOCKET, SOCKOPT_RECV_NONBLOCK, &optvalue_block, 1);
SolderSplashLabs 1:5fa4efb214e7 151 pc.printf("UDP Socket open and listening\r\n");
SolderSplashLabs 1:5fa4efb214e7 152 }
SolderSplashLabs 1:5fa4efb214e7 153 else
SolderSplashLabs 1:5fa4efb214e7 154 {
SolderSplashLabs 1:5fa4efb214e7 155 pc.printf("Failed to bind to UDP port\r\n");
SolderSplashLabs 1:5fa4efb214e7 156 }
SolderSplashLabs 1:5fa4efb214e7 157 }
SolderSplashLabs 1:5fa4efb214e7 158
SolderSplashLabs 1:5fa4efb214e7 159 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 1:5fa4efb214e7 160 /*!
SolderSplashLabs 1:5fa4efb214e7 161 @brief UdpRx
SolderSplashLabs 1:5fa4efb214e7 162 */
SolderSplashLabs 1:5fa4efb214e7 163 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 1:5fa4efb214e7 164 void UdpRx ( void )
SolderSplashLabs 1:5fa4efb214e7 165 {
SolderSplashLabs 1:5fa4efb214e7 166 Endpoint client;
SolderSplashLabs 1:5fa4efb214e7 167 int returnVal = 0;
SolderSplashLabs 1:5fa4efb214e7 168
SolderSplashLabs 1:5fa4efb214e7 169 returnVal = UDP_RecvSocket.receiveFrom(client, (char *)UDP_RecvBuffer, UDP_RECV_BUF_LEN);
SolderSplashLabs 1:5fa4efb214e7 170
SolderSplashLabs 1:5fa4efb214e7 171 if ( returnVal > 0 )
SolderSplashLabs 1:5fa4efb214e7 172 {
SolderSplashLabs 1:5fa4efb214e7 173 pc.printf("UDP Message Recv'd %i bytes from : %s \r\n", returnVal, client.get_address());
SolderSplashLabs 1:5fa4efb214e7 174
SolderSplashLabs 1:5fa4efb214e7 175 // TODO : Process your UDP message here
SolderSplashLabs 1:5fa4efb214e7 176 }
SolderSplashLabs 0:ff40ad3448c5 177 }
SolderSplashLabs 0:ff40ad3448c5 178
SolderSplashLabs 0:ff40ad3448c5 179 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 180 /*!
SolderSplashLabs 0:ff40ad3448c5 181 @brief Init
SolderSplashLabs 0:ff40ad3448c5 182 */
SolderSplashLabs 0:ff40ad3448c5 183 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 184 void init()
SolderSplashLabs 0:ff40ad3448c5 185 {
SolderSplashLabs 0:ff40ad3448c5 186 NVIC_SetPriority(SSP1_IRQn, 0x0);
SolderSplashLabs 0:ff40ad3448c5 187 NVIC_SetPriority(PIN_INT0_IRQn, 0x1);
SolderSplashLabs 0:ff40ad3448c5 188
SolderSplashLabs 0:ff40ad3448c5 189 // SysTick set to lower priority than Wi-Fi SPI bus interrupt
SolderSplashLabs 0:ff40ad3448c5 190 NVIC_SetPriority(SysTick_IRQn, 0x2);
SolderSplashLabs 0:ff40ad3448c5 191
SolderSplashLabs 0:ff40ad3448c5 192 // Enable RAM1
SolderSplashLabs 0:ff40ad3448c5 193 LPC_SYSCON->SYSAHBCLKCTRL |= (0x1 << 26);
SolderSplashLabs 0:ff40ad3448c5 194
SolderSplashLabs 0:ff40ad3448c5 195 uart.baud(SERIAL_BAUD_RATE);
SolderSplashLabs 0:ff40ad3448c5 196
SolderSplashLabs 0:ff40ad3448c5 197 wait(1);
SolderSplashLabs 0:ff40ad3448c5 198 }
SolderSplashLabs 0:ff40ad3448c5 199
SolderSplashLabs 0:ff40ad3448c5 200 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 201 /*!
SolderSplashLabs 0:ff40ad3448c5 202 @brief main loop
SolderSplashLabs 0:ff40ad3448c5 203 */
SolderSplashLabs 0:ff40ad3448c5 204 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 205 int main( void )
SolderSplashLabs 0:ff40ad3448c5 206 {
SolderSplashLabs 1:5fa4efb214e7 207 int tickCnt = 0;
SolderSplashLabs 1:5fa4efb214e7 208
SolderSplashLabs 0:ff40ad3448c5 209 // Initalise the WiFi Module
SolderSplashLabs 0:ff40ad3448c5 210 init();
SolderSplashLabs 0:ff40ad3448c5 211
SolderSplashLabs 0:ff40ad3448c5 212 WaitForUser();
SolderSplashLabs 0:ff40ad3448c5 213
SolderSplashLabs 1:5fa4efb214e7 214 pc.printf("Starting CC3000 module\r\n");
SolderSplashLabs 1:5fa4efb214e7 215
SolderSplashLabs 0:ff40ad3448c5 216 wifi.start(0);
SolderSplashLabs 0:ff40ad3448c5 217
SolderSplashLabs 0:ff40ad3448c5 218 WaitForConnection();
SolderSplashLabs 0:ff40ad3448c5 219
SolderSplashLabs 1:5fa4efb214e7 220 // set up a lisening socket
SolderSplashLabs 1:5fa4efb214e7 221 UdpRx_Init();
SolderSplashLabs 1:5fa4efb214e7 222 UdpTx_Init();
SolderSplashLabs 1:5fa4efb214e7 223
SolderSplashLabs 0:ff40ad3448c5 224 while (1)
SolderSplashLabs 1:5fa4efb214e7 225 {
SolderSplashLabs 1:5fa4efb214e7 226 // Check for UDP coms, non blocking
SolderSplashLabs 1:5fa4efb214e7 227 UdpRx();
SolderSplashLabs 1:5fa4efb214e7 228
SolderSplashLabs 1:5fa4efb214e7 229 // TODO : Do other things, like service sensors etc..
SolderSplashLabs 1:5fa4efb214e7 230 // For now lets simulate a task that lasts for 100ms
SolderSplashLabs 1:5fa4efb214e7 231 wait(0.1);
SolderSplashLabs 1:5fa4efb214e7 232 pc.printf(".");
SolderSplashLabs 1:5fa4efb214e7 233
SolderSplashLabs 1:5fa4efb214e7 234 if ( tickCnt > 100 )
SolderSplashLabs 1:5fa4efb214e7 235 {
SolderSplashLabs 1:5fa4efb214e7 236 tickCnt = 0;
SolderSplashLabs 1:5fa4efb214e7 237 // And then send a UDP message
SolderSplashLabs 1:5fa4efb214e7 238 UdpTx();
SolderSplashLabs 1:5fa4efb214e7 239 }
SolderSplashLabs 1:5fa4efb214e7 240 tickCnt ++;
SolderSplashLabs 0:ff40ad3448c5 241 }
SolderSplashLabs 1:5fa4efb214e7 242
SolderSplashLabs 0:ff40ad3448c5 243 }