2012-09-03 4 views
7

Ich versuche Sensordaten von Arduino Uno über eine Copperhead Wi-Fi shield an eine bestimmte IP-Adresse und einen Port in einem LAN zu senden.Senden von Arduino-Daten über eine Wi-Fi-Abschirmung an eine bestimmte IP-Adresse im LAN

Ich kann das Copperhead Wi-Fi Serverbeispiel sketch funktionieren (unten eingefügt). Ich bin jedoch nicht daran interessiert, auf Serveranforderungen über HTML zu antworten. Alles, was mich interessiert, ist das Einrichten einer socket-ähnlichen Verbindung und das Senden von Daten über TCP oder UDP an IP-Adresse 192.168.0.3, Port 1234.

Ich bin mir sicher, dass es eine einfache Lösung dafür gibt, aber wie ich Ich bin neu bei Arduino und meine Versuche, eine Lösung zu finden, waren erfolglos.

#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); 
} 

Antwort

2

Sieht so aus, als ob Sie die WiShield Bibliothek verwenden. Es sollte einen Beispielordner im WiShield Download mit einem SocketApp und UDPApp Beispiel geben. Dies ist ein guter Anfang.

Ein paar Dinge, die ich beim Erstellen einer UDP-App gelernt habe.

  1. Sie müssen einige #defines bearbeiten können (z APP_UDPAPP in apps-conf.h, UIP_CONF_UDP in uip-conf.h), bevor Ihre Anwendung neu zu kompilieren.

  2. Wenn Sie eine UDP App tun, denken Sie daran, dass Sie einen begrenzten Puffer erhalten haben (UIP_CONF_BUFFER_SIZE in uip-conf.h setzt es auf). Mein Router hat eine UDP-Broadcast-XML-Nachricht gesendet, die ~ 700 Bytes war, die dazu führte, dass dieser Puffer überläuft und andere Daten überschreibt. Ich glaube nicht, dass TCP dieses Problem haben wird, weil es ein MSS aushandeln wird, das den Puffer nicht überläuft.

Am Ende habe ich Änderungen an der handle_connection() Funktion im UDPapp Beispiel. Unten ist ein Schnipsel (mit uip_ipaddr festgelegt auf 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

Sehr hilfreich! Danke auch für das Heads-Up zur Puffergröße! – Kappa

0

Haben Sie eine Chance bekommen, die Arduino WiFiWebClient tutorial zu betrachten? Dieses Beispiel zeigt, wie eine Verbindung zu einem Webserver hergestellt und eine HTTP-GET-Anforderung gesendet wird.

Sie könnten einen einfachen Server auf einem beliebigen Computer im LAN erstellen und die Clientbibliothek verwenden, um eine Verbindung zum Server herzustellen und Daten mit den Funktionen write/print/println zu senden. Ich weiß, es ist einfacher gesagt als getan, aber das ist der Spaß am Programmieren, nicht wahr?

+0

Danke für den Link. Ich werde diese Option auch erkunden. – Kappa

Verwandte Themen