2012-09-03 19 views
7

Estoy intentando enviar datos del sensor desde un Arduino Uno a través de un Copperhead Wi-Fi shield a una dirección IP y puerto específicos en una LAN.Enviar datos de Arduino a través de un protector de Wi-Fi a una dirección IP específica en la LAN

Puedo obtener el ejemplo del servidor de Wiper de Copperhead sketch para trabajar (pegar abajo). Sin embargo, no estoy interesado en responder a las solicitudes del servidor a través de HTML. Todo lo que me interesa es configurar una conexión tipo socket y enviar datos a través de TCP o UDP a la dirección IP 192.168.0.3, puerto 1234.

Estoy seguro de que hay una solución fácil para esto, pero como yo Soy nuevo en Arduino y mis intentos de encontrar una solución no han tenido éxito.

#include <WiServer.h> 
#define WIRELESS_MODE_INFRA 1 
#define WIRELESS_MODE_ADHOC 2 

// Wireless configuration parameters ---------------------------------------- 
unsigned char local_ip[] = {192,168,0,2}; // IP address of WiShield 
unsigned char gateway_ip[] = {192,168,0,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 = {"WiFi_AP"};  // 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 Wi-Fi device 
unsigned char wireless_mode = WIRELESS_MODE_INFRA; 

unsigned char ssid_len; 
unsigned char security_passphrase_len; 
// End of wireless configuration parameters ---------------------------------------- 


// This is our page serving function that generates web pages 
boolean sendMyPage(char* URL) { 

    // Check if the requested URL matches "/" 
    if (strcmp(URL, "/") == 0) { 
     // Use WiServer's print and println functions to write out the page content 
     WiServer.print("<html>"); 
     WiServer.print("Hello World"); 
     WiServer.print("</html>"); 

     // URL was recognized 
     return true; 
    } 
    // URL not found 
    return false; 
} 


void setup() { 
    // Initialize WiServer and have it use the sendMyPage function to serve pages 
    WiServer.init(sendMyPage); 

    // Enable Serial output and ask WiServer to generate log messages (optional) 
    Serial.begin(57600); 
    WiServer.enableVerboseMode(true); 
} 

void loop(){ 
    // Run WiServer 
    WiServer.server_task(); 

    delay(10); 
} 

Respuesta

2

Parece que está utilizando la biblioteca WiShield. Debería haber una carpeta de ejemplos en la descarga WiShield con un ejemplo SocketApp y UDPApp. Este es un buen lugar para comenzar.

Algunas cosas que aprendí mientras hacía una aplicación UDP.

  1. Puede que tenga que modificar algunos #defines (por ejemplo APP_UDPAPP en apps-conf.h, en UIP_CONF_UDPuip-conf.h) antes de volver a compilar la aplicación.

  2. Si usted está haciendo una aplicación UDP, tenga en cuenta que usted tiene una memoria intermedia limitada recibir (UIP_CONF_BUFFER_SIZE en uip-conf.h conjuntos a). Mi enrutador estaba enviando un mensaje XML de difusión UDP que era ~ 700 bytes que causaba que este buffer se desbordara y sobreescribía otros datos. No creo que TCP tenga este problema porque negociará un MSS que no sobrepase el buffer.

Al final me realizan cambios en la función handle_connection() en el ejemplo UDPapp. A continuación se muestra un fragmento (con uip_ipaddr establecido en 255.255.255.255).

void send_state(void) { 
    sprintf((char*)uip_appdata, "state %ld %ld %ld %c %d", 
    clock_time(), 
    state.sensors.ping[0].cm, 
    state.sensors.ping[1].cm, 
    state.actuators.chassis.direction, 
    state.actuators.chassis.speed); 
    uip_send(uip_appdata, strlen((char*)uip_appdata)); 
} 

void send_beacon(void) { 
    if(timer_expired(&beacon_timer)) { 
     timer_reset(&beacon_timer); 
     sprintf((char*)uip_appdata, "beacon %ld", clock_time()); 
     uip_send(uip_appdata, strlen((char*)uip_appdata)); 
     uip_log("beacon sent"); 
    } 
} 

boolean data_or_poll(void) { 
    return (uip_newdata() || uip_poll()); 
} 

static PT_THREAD(handle_connection(void)) { 
    PT_BEGIN(&s.pt); 
    PT_WAIT_UNTIL(&s.pt, data_or_poll()); 
    if(uip_newdata()) { 
     uip_flags &= (~UIP_NEWDATA); 
     send_state(); 
    } else if (uip_poll()) { 
     uip_flags &= (~UIP_POLL); 
     send_beacon(); 
    } 

    PT_END(&s.pt); 
} 
+0

¡Muy útil! ¡Gracias por el mano a mano en el tamaño del búfer, también! – Kappa

0

¿Recibió la oportunidad de mirar el Arduino WiFiWebClient tutorial? Este ejemplo muestra cómo conectarse a un servidor web y enviar una solicitud HTTP GET.

Puede crear un servidor simple en cualquier máquina en la LAN y usar la biblioteca del cliente para conectarse al servidor y enviar datos utilizando el conjunto de funciones write/print/println. Sé que es más fácil decirlo que hacerlo, pero esa es la diversión de la programación ¿no?

+0

Gracias por el enlace. Exploraré esta opción también. – Kappa

Cuestiones relacionadas