2012-09-03 15 views
7

Próbuję przesłać dane z czujnika z Arduino Uno przez Copperhead Wi-Fi shield do określonego adresu IP i portu w sieci LAN.Wysyłaj dane Arduino przez ekran Wi-Fi pod konkretny adres IP w sieci LAN

Mogę pobrać przykład z sieci Copperhead Wi-Fi sketch do pracy (wklejony poniżej). Jednak nie jestem zainteresowany odpowiadaniem na żądania serwera za pośrednictwem HTML. Wszystko, co mnie interesuje to konfiguracja połączenia podobnego do gniazda i wysyłanie danych przez TCP lub UDP na adres IP 192.168.0.3, port 1234.

Jestem pewien, że jest to łatwe rozwiązanie, ale tak jak ja Jestem nowy w Arduino i moje próby znalezienia rozwiązania zakończyły się niepowodzeniem.

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

Odpowiedz

2

Wygląda na to, że używasz biblioteki WiShield. W pliku WiShield powinien znajdować się folder przykładów z przykładem: SocketApp i UDPApp. To dobre miejsce na rozpoczęcie.

Kilka rzeczy dowiedziałem się podczas tworzenia aplikacji UDP.

  1. Być może trzeba zmienić niektóre #defines (np APP_UDPAPP w apps-conf.h, UIP_CONF_UDP w uip-conf.h) przed rekompilacji aplikacji.

  2. Jeśli robisz UDP aplikację, należy pamiętać, że masz ograniczony otrzymane bufor (UIP_CONF_BUFFER_SIZE w uip-conf.h ustawia go do). Mój router został wysyłając wiadomość transmisji UDP XML, który był ~ 700 bajtów które spowodowały ten bufor do przepełnienia i ponad Napisać innych danych. Nie sądzę TCP będzie miał ten problem, ponieważ będzie negocjować MSS, które nie przekraczały bufor.

W końcu wykonane zmiany funkcji handle_connection() w przykładzie UDPapp. Poniżej znajduje się fragment kodu (z uip_ipaddr ustawiony na 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

Bardzo pomocna! Dzięki za heads-up na rozmiar bufora, też! – Kappa

0

Czy masz szansę spojrzeć na Arduino WiFiWebClient tutorial? Ten przykład pokazuje, jak połączyć się z serwerem internetowym i wysłać żądanie HTTP GET.

Można by stworzyć prosty serwer na dowolnym komputerze w sieci lokalnej i korzystać z biblioteki klienta, aby połączyć się z serwerem i wysyłanie danych za pomocą zapisu/wydruku/println zestaw funkcji. Wiem, że łatwiej powiedzieć niż zrobić, ale czy to nie zabawa?

+0

Dzięki za link. Będę zbadać tę opcję, too. – Kappa

Powiązane problemy