2012-09-03 25 views
7

Tôi đang cố gắng gửi dữ liệu cảm biến từ Arduino Uno qua một số Copperhead Wi-Fi shield đến địa chỉ IP cụ thể và cổng trên mạng LAN.Gửi dữ liệu Arduino qua lá chắn Wi-Fi đến địa chỉ IP cụ thể trên LAN

Tôi có thể tải ví dụ về Máy chủ Wi-Fi Copperhead sketch để hoạt động (được dán bên dưới). Tuy nhiên, tôi không quan tâm đến việc phản hồi các yêu cầu máy chủ thông qua HTML. Tất cả những gì tôi quan tâm là thiết lập kết nối giống như ổ cắm và gửi dữ liệu qua TCP hoặc UDP tới địa chỉ IP 192.168.0.3, cổng 1234.

Tôi chắc chắn có giải pháp dễ dàng, nhưng như tôi mới với Arduino và nỗ lực của tôi để tìm một giải pháp đã không thành công.

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

Trả lời

2

Có vẻ như bạn đang sử dụng thư viện WiShield. Nên có một thư mục mẫu trong tải xuống WiShield với ví dụ SocketAppUDPApp. Đây là một nơi tốt để bắt đầu.

Một vài điều tôi đã học được khi tạo ứng dụng UDP.

  1. Bạn có thể phải chỉnh sửa một số # định nghĩa (ví dụ APP_UDPAPP trong apps-conf.h, UIP_CONF_UDP trong uip-conf.h) trước khi biên dịch lại ứng dụng của bạn.

  2. Nếu bạn đang làm một ứng dụng UDP, hãy nhớ rằng bạn có một bộ đệm nhận hạn chế (UIP_CONF_BUFFER_SIZE trong uip-conf.h bộ nó để). Bộ định tuyến của tôi đang gửi một tin nhắn XML phát sóng UDP là ~ 700 byte khiến bộ đệm này tràn và ghi dữ liệu khác. Tôi không nghĩ rằng TCP sẽ có vấn đề này bởi vì nó sẽ thương lượng một MSS mà sẽ không overrun bộ đệm.

Cuối cùng tôi đã thực hiện thay đổi đối với handle_connection() chức năng trong ví dụ UDPapp. Bên dưới là một đoạn mã (với uip_ipaddr được đặt thành 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

Rất hữu ích! Cảm ơn những người đứng đầu về kích thước bộ đệm, quá! – Kappa

0

Bạn có cơ hội để xem Arduino WiFiWebClient tutorial không? Ví dụ này cho thấy cách kết nối với máy chủ web và gửi yêu cầu HTTP GET.

Bạn có thể tạo một máy chủ đơn giản trên bất kỳ máy nào trên mạng LAN và sử dụng thư viện máy khách để kết nối với máy chủ và gửi dữ liệu bằng cách sử dụng các chức năng ghi/in/println. Tôi biết nói dễ hơn làm, nhưng đó là niềm vui của lập trình phải không?

+0

Cảm ơn bạn đã liên kết. Tôi cũng sẽ khám phá tùy chọn này. – Kappa

Các vấn đề liên quan