2013-06-22 69 views
0

我想从Android应用程序发送UDP数据包到Arduino使用Wifi盾,但我不能,它会引发异常(Ex3)。 我想和Arduino沟通一个Android手机,用这个Shield发送命令。我不能发送UDP数据包从Android到Arduino

下面是Android代码:

public class MainActivity extends Activity { 

    String udpMsg = "hello world from UDP client "; 
    DatagramSocket ds = null; 
    Button bt; 
    TextView tv; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     bt = (Button) findViewById(R.id.myButton); 
     tv = (TextView) findViewById(R.id.myTextView); 
     runUdpClient(); 
    } 

    private static final int UDP_SERVER_PORT = 1050; 

    private void runUdpClient() { 

     Toast.makeText(getApplicationContext(), 
       "E", 
       Toast.LENGTH_SHORT).show(); 
     bt.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 

        try { 
         EditText et = (EditText) findViewById(R.id.EditText01); 
         String str = et.getText().toString(); 
         ds = new DatagramSocket(); 
         InetAddress serverAddr = InetAddress.getByName("192.168.1.16"); 
         DatagramPacket dp; 
         dp = new DatagramPacket(str.getBytes(), udpMsg.length(), 
           serverAddr, UDP_SERVER_PORT); 
         dp.setData(str.getBytes()); 

         ds.send(dp); 

         Log.d("Ok","Ok"); 

        } catch (SocketException e) { 
         Toast.makeText(getApplicationContext(), 
           "Ex", 
           Toast.LENGTH_SHORT).show(); 
         e.printStackTrace(); 
        } catch (UnknownHostException e) { 
         Toast.makeText(getApplicationContext(), 
           "Ex1", 
           Toast.LENGTH_SHORT).show(); 
         e.printStackTrace(); 
        } catch (IOException e) { 
         Toast.makeText(getApplicationContext(), 
           "Ex2", 
           Toast.LENGTH_SHORT).show(); 
         e.printStackTrace(); 
        } catch (Exception e) { 
         Toast.makeText(getApplicationContext(), 
           "Ex3", 
           Toast.LENGTH_SHORT).show(); 
         e.printStackTrace(); 
        } finally { 
         if (ds != null) { 

          ds.close(); 
         } 
        } 
      } 
      }); 


    } 
} 

这是Arduino的代码:

include <SPI.h> 
include <WiFi.h> 
include <WiFiUdp.h> 

char ssid[] = "MySSid"; 
char pass[] = "00000000"; 
int status = WL_IDLE_STATUS; 

unsigned int localPort = 1050;  // local port to listen on 

char packetBuffer[255]; //buffer to hold incoming packet 
char ReplyBuffer[] = "acknowledged";  // a string to send back 

WiFiUDP Udp; 

void setup() { 
    //Initialize serial and wait for port to open: 
    Serial.begin(9600); 
    while (!Serial) { 
    ; // wait for serial port to connect. Needed for Leonardo only 
    } 

    // check for the presence of the shield: 
    if (WiFi.status() == WL_NO_SHIELD) { 
    Serial.println("WiFi shield not present"); 
    // don't continue: 
    while(true); 
    } 

    // attempt to connect to Wifi network: 
    while (status != WL_CONNECTED) { 
    Serial.print("Attempting to connect to SSID: "); 
    Serial.println(ssid); 
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:  
    status = WiFi.begin(ssid); 

    // wait 10 seconds for connection: 
    delay(10000); 
    } 
    Serial.println("Connected to wifi"); 
    printWifiStatus(); 

    Serial.println("\nStarting connection to server..."); 
    // if you get a connection, report back via serial: 
    Udp.begin(localPort); 
} 

void loop() { 

    // if there's data available, read a packet 
    int packetSize = Udp.parsePacket(); 
    if(packetSize) 
    { 
    Serial.print("Received packet of size "); 
    Serial.println(packetSize); 
    Serial.print("From "); 
    IPAddress remoteIp = Udp.remoteIP(); 
    Serial.print(remoteIp); 
    Serial.print(", port "); 
    Serial.println(Udp.remotePort()); 

    // read the packet into packetBufffer 
    int len = Udp.read(packetBuffer,255); 
    if (len >0) packetBuffer[len]=0; 
    Serial.println("Contents:"); 
    Serial.println(packetBuffer); 

    // send a reply, to the IP address and port that sent us the packet we received 
/* Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); 
    Udp.write(ReplyBuffer); 
    Udp.endPacket();*/ 
    } 
} 


void printWifiStatus() { 
    // print the SSID of the network you're attached to: 
    Serial.print("SSID: "); 
    Serial.println(WiFi.SSID()); 

    // print your WiFi shield's IP address: 
    IPAddress ip = WiFi.localIP(); 
    Serial.print("IP Address: "); 
    Serial.println(ip); 

    // print the received signal strength: 
    long rssi = WiFi.RSSI(); 
    Serial.print("signal strength (RSSI):"); 
    Serial.print(rssi); 
    Serial.println(" dBm"); 
} 

我认为这个问题是在ds.send(DP);

这里是堆栈跟踪:

06-23 13:24:03.896: W/System.err(5915): java.lang.IllegalArgumentException 
06-23 13:24:03.897: W/System.err(5915):  at java.net.DatagramPacket.setData(DatagramPacket.java:183) 
06-23 13:24:03.898: W/System.err(5915):  at java.net.DatagramPacket.<init>(DatagramPacket.java:75) 
06-23 13:24:03.898: W/System.err(5915):  at java.net.DatagramPacket.<init>(DatagramPacket.java:97) 
06-23 13:24:03.898: W/System.err(5915):  at java.net.DatagramPacket.<init>(DatagramPacket.java:118) 
06-23 13:24:03.898: W/System.err(5915):  at com.example.arduino.Arduino$1.onClick(Arduino.java:52) 
06-23 13:24:03.899: W/System.err(5915):  at android.view.View.performClick(View.java:3517) 
06-23 13:24:03.899: W/System.err(5915):  at android.view.View$PerformClick.run(View.java:14155) 
06-23 13:24:03.900: W/System.err(5915):  at android.os.Handler.handleCallback(Handler.java:605) 
06-23 13:24:03.900: W/System.err(5915):  at android.os.Handler.dispatchMessage(Handler.java:92) 
06-23 13:24:03.901: W/System.err(5915):  at android.os.Looper.loop(Looper.java:154) 
06-23 13:24:03.901: W/System.err(5915):  at android.app.ActivityThread.main(ActivityThread.java:4624) 
06-23 13:24:03.902: W/System.err(5915):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-23 13:24:03.902: W/System.err(5915):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-23 13:24:03.902: W/System.err(5915):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809) 
06-23 13:24:03.903: W/System.err(5915):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576) 
06-23 13:24:03.903: W/System.err(5915):  at dalvik.system.NativeStart.main(Native Method) 

谢谢。

+0

请详细说明哪些代码行正在抛出异常,抛出了什么异常以及可能与此问题相关的其他任何内容... –

+0

抛出的异常是: catch(Exception e){ Toast.makeText(getApplicationContext(), “Ex3”, Toast.LENGTH_SHORT).show(); e.printStackTrace(); 因为,我看到吐司“Ex3”。也许是套接字的问题。无论如何,我不确定这种方式是否正确地沟通这两种设备(使用Wifi Shield)。 – user2512569

+0

请向我们展示堆栈跟踪 – GreyBeardedGeek

回答

0

你有没有在你的Manifest文件中设置下列权限?

uses-permission android:name="android.permission.INTERNET" 
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" 
uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" 
+0

是的,我有,但它总是抛出异常。 – user2512569

+0

你应该阅读[DatagramPacket]的参考资料(http://developer.android.com/reference/java/net/DatagramPacket.html#DatagramPacket%28byte [],%20int,%20java.net.InetAddress,%20int% 29),然后用调试器遍历代码。 – ubergesundheit

+0

第二个权限可能是不必要的,请证明他们的包含。 –

0

看堆栈跟踪和你的代码中,异常在该行抛出:

dp.setData(str.getBytes()); 

但是,看着你的代码,你不需要做setData()为你已经把它给了构造函数。你可以尝试没有这条线。