Problem beim Senden via WiFi

Micka

Micka

Fortgeschrittenes Mitglied
1
Hallo,

derzeit versuche ich mich in die Kommunikation zwischen Android und Arduino einzuarbeiten. Seitens Arduino ist das schreiben von Sketches(Programmen) schnell erledigt.

Momentan hänge ich bei der Android App beim senden fest.
Meine App besteht derzeit nur aus 2 Textfeldern und einem ToggleButton. Die Textfelder dienen dabei zum eingeben von IP(vom Arduino) und Port (auf dem gesendet werden soll). Denn ToggleButton werte ich wie folgt aus
Code:
 public void onToggleClicked(View view) 
    {
        Log.i("WifiButtonLed","onToggleClicked");
        InetAddress ip;
        int port;
        int pin = 11;
        //Ip und Port bestimmen.
        try
        {
            Log.i("WifiButtonLed","onToggleClicked try 1 IP holen");
            //IP aus dem Textfeld holen(falls unverändert standard ip)
            if(editText_Ip.getText().toString().equals(""))
            {
                Log.i("WifiButtonLed","onToggleClicked try 1 IP holen if");
                // Get by IP as host name
                ip = InetAddress.getByName("192.168.2.1");
            }
            else
            {
                Log.i("WifiButtonLed","onToggleClicked try 1 IP holen else");
                ip = InetAddress.getByName(editText_Ip.getText().toString());
            }
        }catch (Exception ex)
        {
            Log.i("WifiButtonLed","onToggleClicked try 1 IP holen catch");
            Toast.makeText(this, "IP nicht erreichbar",
                    Toast.LENGTH_LONG).show();
            return;
        }
        //Port aus dem Textfeld holen(falls unverändert standard port)
        if(editText_Port.getText().toString().equals(""))
        {
            Log.i("WifiButtonLed","onToggleClicked Port holen if");
            port = 80;
        }
        else
        {
            Log.i("WifiButtonLed","onToggleClicked  Port holen else");
            port = Integer.valueOf(editText_Port.getText().toString());
        }
        //Button aktiv?
        boolean on = ((ToggleButton) view).isChecked();
        
        try
        {
            Log.i("WifiButtonLed","onToggleClicked try 2 try");
            if (on) 
            {
                Log.i("WifiButtonLed","onToggleClicked try 2 Button aktiv if");
                //    Button ist aktiv
                //    LED AN
                commMan.sendDigitalCommand(pin, true, ip, port);
            }else 
            {
                Log.i("WifiButtonLed","onToggleClicked try 2 Button inaktiv else");
                //Button ist inaktiv
                //LED AUS
                commMan.sendDigitalCommand(pin, false, ip, port);
            }
        }catch (Exception ex)
        {
            System.out.println(ex.toString());
            Log.i("WifiButtonLed","onToggleClicked try 2 catch");
            //System.out.println(ex.getMessage());
            Toast.makeText(this, ex.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
Die Kommunikation mit dem Arduino wird in einer eigenen Klasse ArduinoCommManager abgewickelt. Diese Klasse habe ich von einem Example kopiert. Beim Beispiel handelt es sich um die gleiche Arduino Hardware(MegaADK und RedFly Wlan Shield).

Jedesmal wenn ich etwas sende(den Button betätige) greift der catch Block.
Code:
//Button aktiv?
        boolean on = ((ToggleButton) view).isChecked();
        
        try
        {
            Log.i("WifiButtonLed","onToggleClicked try 2 try");
            if (on) 
            {
                Log.i("WifiButtonLed","onToggleClicked try 2 Button aktiv if");
                //    Button ist aktiv
                //    LED AN
                commMan.sendDigitalCommand(pin, true, ip, port);
            }else 
            {
                Log.i("WifiButtonLed","onToggleClicked try 2 Button inaktiv else");
                //Button ist inaktiv
                //LED AUS
                commMan.sendDigitalCommand(pin, false, ip, port);
            }
        }catch (Exception ex)
        {
            System.out.println(ex.toString());
            Log.i("WifiButtonLed","onToggleClicked try 2 catch");
            //System.out.println(ex.getMessage());
            Toast.makeText(this, ex.getMessage(), Toast.LENGTH_LONG).show();
        }
komischweise erscheint ein Toast ohne Inhalt. Normalerweise sollte im Toast der Text der Exception ausgegeben werden.

Nun bin ich ratlos wo ich meinen Fehler suchen soll, bzw wo er liegt. Der ArduinoCommManager scheidet für mich eigentlich aus das er 1:1 aus einem Beispiel stammt und dort einwandfrei funktioniert. Hat Jemand ne Idee woran es liegen könnte?

Vielen Dank schonmal an alle die bis hier gelesen haben und ein schönes Wochenende.


P.S: den gesammten Quellcode der APp sowie des Sketches habe ich angehangen
 

Anhänge

  • WifiButtonLed.zip
    1,1 MB · Aufrufe: 58
Pack in den catch Block mal

Code:
ex.printStrackTrace;
dann siehst du im Logcat wodurch die Exception auftritt. Viel ergiebiger als .getMessage(). Was aber sowieso schon mal eine Exception wirft, sind Netzwerk-Sachen im UI Thread. Wenn Netzwerk-Krams nicht in einem separaten Thread (z.b. per AsyncTask) gemacht wird, wirft Android eine NetworkOnMainThreadException.

Ausserdem solltest du darauf achten, dass du im Manifest die Internet permission reingeschrieben hast, sonst hast du nämlich sofort die nächste Exception.
 
  • Danke
Reaktionen: Micka
Mike_SD schrieb:
Pack in den catch Block mal

Code:
ex.printStrackTrace;
dann siehst du im Logcat wodurch die Exception auftritt. Viel ergiebiger als .getMessage(). Was aber sowieso schon mal eine Exception wirft, sind Netzwerk-Sachen im UI Thread. Wenn Netzwerk-Krams nicht in einem separaten Thread (z.b. per AsyncTask) gemacht wird, wirft Android eine NetworkOnMainThreadException.

Ausserdem solltest du darauf achten, dass du im Manifest die Internet permission reingeschrieben hast, sonst hast du nämlich sofort die nächste Exception.

Dankeschön für die Tipps. Leider komme ich vor Dienstag nicht dazu mich ran zu setzen. Am Dienstag werd ich das ganze dann anpassen und mal schauen wie weit ich komme. Bis dahin schonmal dankeschön
 
Immer wieder schön wenn man direkt an Profis gerät.

Ich habe die App deiner Empfehlung nach geändert und siehe da im LogCat wird die von dir genannte Exception angezeigt.

11-27 11:30:41.315: W/System.err(6889): android.os.NetworkOnMainThreadException
11-27 11:30:41.330: W/System.err(6889): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
11-27 11:30:41.330: W/System.err(6889): at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:175)
11-27 11:30:41.330: W/System.err(6889): at libcore.io.IoBridge.sendto(IoBridge.java:463)
11-27 11:30:41.330: W/System.err(6889): at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:182)
11-27 11:30:41.330: W/System.err(6889): at java.net.DatagramSocket.send(DatagramSocket.java:287)
11-27 11:30:41.330: W/System.err(6889): at de.fhdo.gerding.wifibuttonled.ArduinoCommManager.sendDigitalCommand(ArduinoCommManager.java:46)
11-27 11:30:41.330: W/System.err(6889): at de.fhdo.gerding.wifibuttonled.WifiButtonLed.onToggleClicked(WifiButtonLed.java:105)
11-27 11:30:41.330: W/System.err(6889): at java.lang.reflect.Method.invokeNative(Native Method)
11-27 11:30:41.330: W/System.err(6889): at java.lang.reflect.Method.invoke(Method.java:511)
11-27 11:30:41.330: W/System.err(6889): at android.view.View$1.onClick(View.java:3064)
11-27 11:30:41.330: W/System.err(6889): at android.view.View.performClick(View.java:3591)
11-27 11:30:41.330: W/System.err(6889): at android.widget.CompoundButton.performClick(CompoundButton.java:106)
11-27 11:30:41.330: W/System.err(6889): at android.view.View$PerformClick.run(View.java:14263)
11-27 11:30:41.330: W/System.err(6889): at android.os.Handler.handleCallback(Handler.java:605)
11-27 11:30:41.330: W/System.err(6889): at android.os.Handler.dispatchMessage(Handler.java:92)
11-27 11:30:41.330: W/System.err(6889): at android.os.Looper.loop(Looper.java:137)
11-27 11:30:41.330: W/System.err(6889): at android.app.ActivityThread.main(ActivityThread.java:4507)
11-27 11:30:41.330: W/System.err(6889): at java.lang.reflect.Method.invokeNative(Native Method)
11-27 11:30:41.330: W/System.err(6889): at java.lang.reflect.Method.invoke(Method.java:511)
11-27 11:30:41.330: W/System.err(6889): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
11-27 11:30:41.330: W/System.err(6889): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
11-27 11:30:41.330: W/System.err(6889): at dalvik.system.NativeStart.main(Native Method)

Nun muss ich ehrlich sagen ich habe keine Ahnung wie das mit einem Async Task funktioniert. werde mal gucken ob ich dazu etwas im WWW finde, wäre aber auch über hilfreiche Anleitungen hier nicht abgeneigt.

Was mich allerdings wundert ist das der gleiche Fehler nicht auch bei folgendem Projekt auftrat.
http://android-arduino-redfly-projekt.de.to/
Anhand dieses Projekts eines Studierenden habe ich das ganze versucht zu realisieren.
 
Zuletzt bearbeitet:
Diese Exception gibt es erst seit API Level 11.

Du musst nicht notwendigerweise einen Async-Task nehmen (ich weiß sowieso nicht, weshalb den alle so toll finden).
Einfacher geht es meiner Meinung nach mit einem Handler:
- Du legst im globalen Adressbereich einen Handler an und implementierst dessen handleMessage(int what, Message msg) entsprechend (also mit dem, was passieren soll, wenn das Networking beendet ist?)
- Deinen Netzwerkzugriff packst du in einen eigenen Thread
- Am Ende des Threads rufst du *meinHandler*.sendEmptyMessage() auf / .sendMessage(int what, Object msg)
 
  • Danke
Reaktionen: Micka
Okay, welche Methode ist denn am einfachsten zu implementieren. Um ehrlich zu sein habe ich noch nicht Mit Threads gearbeitet, daher stockt es hier
- Deinen Netzwerkzugriff packst du in einen eigenen Thread
 
Code:
new Thread(){
[INDENT]public void run(){[/INDENT]
[INDENT]/ Netzwerk-Kram[/INDENT]
[INDENT]/ Handler, falls nötig[/INDENT]
}.start();

Nachdem du ja in der App nicht auf den Abschluss der Netzwerk-Kommunikation reagieren musst (soweit ich das sehen kann), kannst du dir den Handler auch sparen ...
 
Okay vielen Dank. Das Problem ist nun behoben. Zwar klappt das ganze noch nicht so wie es soll, aber das kann nun auch am Arduino liegen. werd mal weiter suchen.
 

Ähnliche Themen

wernho
Antworten
11
Aufrufe
677
wernho
wernho
S
  • Sempervivum
Antworten
2
Aufrufe
605
Sempervivum
S
Jansenwilson
Antworten
1
Aufrufe
747
swa00
swa00
Zurück
Oben Unten