Sending UDP packet from Android to Arduino

1.8k views Asked by At

I'm new to android development so please be gentle :p I'm having trouble sending UDP packets from my android phone to my anrdiuno (with WiFi shield). I can send and recieve packets to or from the arduino using the TCP/UDP Terminal app from the Play Store, with no problems. For an easy beginners task I would like to send just one packet to my arduino (which is on my local network at address 192.168.0.101 and listens on port 5000), when I press a button, a message is then displayed saying that data has been sent. My current android code is below:

    //CALLED WHEN USER PRESSES BUTTON
public void sendMessage(View view){

    runUdpClient();

    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText("MESSAGE SENT");

    // Set the text view as the activity layout
    setContentView(textView);

}

private void runUdpClient()  {

    try{

    String msg = "Hello";

    byte[] msgBytes = (msg.getBytes());

    String serverHostname1 = new String ("192.168.0.101");

    InetAddress ip = InetAddress.getByName(serverHostname1);

    //SEND ON PORT 5000
    DatagramSocket socket = new DatagramSocket(5000);
    socket.setBroadcast(true);


    DatagramPacket packet =  new DatagramPacket(msgBytes,msgBytes.length, ip, 5000);    

    //packet.setAddress(ip);
    //packet.setPort(5000);

    socket.send(packet);

    socket.close();

    }catch(Exception e){
        e.printStackTrace();
    }
}

I have debugged the code and found that an exception is thrown when socket.send(packet) is called, (although i do not know how to view this expection). After stepping through the send function, this exception was thrown:

IllegalArgumentException("Packet address mismatch with connected address");

Please could someone help me with this please? Thank you ever so much for any help given :)

1

There are 1 answers

0
Zoo_lander On

found a solution to this problem. If anyone else gets this problem the solution is to call the udp packet send function from inside a thread as such:

public void sendMessage(View view){

    final EditText editMessage = (EditText) findViewById(R.id.edit_message);
    final String message = editMessage.getText().toString();
    new Thread(new Runnable(){
        @Override
        public void run() {
            try {
                runUdpClient(message);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }).start();
}

Found out that most communications need to be done inside a thread. Peace.