Bonjour à tous,

Je me tourne vers vous car je suis désespéré. Pour un projet de fin d'année je dois établir une connexion entre une carte arduino ( Due) avec un shield ethernet et l'application que j'ai créée, le tout grâce à un router wifi.
Le prof nous a donné 2 solutions, soit par UDP, soit par OSC ( qui passe par l'UDP également).
Donc avant de faire des liens entre le code arduino et android, j'ai voulu allumer une led à distance en utilisant l'UDP et c'est là que le problème arrive. Mon application est séparée en plusieurs fragment auxquels je peux accéder avec un navigationDrawer. Dans le 1er fragment qui est ma fenêtre principale , j'ai mis un toggleButton (j'ai essayé avec un switch également) pour allumer cette fameuse led.
J'ai tout essayé (ou presque puisque ça ne fonctionne pas). A chaque fois j'ai l'erreur android.os.NetworkOnMainThreadException.

Donc je me suis renseigné et j'ai donc essayé avec une AsyncTask et aussi avec un nouveau Thread. Comme je suis débutant je pense que je les ai mal écrit car j'avais des crash et du coup je suis revenu en arrière avec la méthode sans l'AsyncTask et j'ai mis 2 boutons simples.

Voici le fragment

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
 
import android.app.Fragment;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
 
 
public class HomeFragment extends Fragment {
 
    public HomeFragment() {
    }
 
    private Button on;
    private Button off;
    private String myIP = "192.168.1.105";
    private int port = 8032;
    InetAddress ip;
 
 
    DatagramPacket send, rec;
    DatagramSocket d1;
    String modifiedSentence;
    byte[] data;
 
 
    private boolean isOnline() {
        ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();
        if (ni != null && ni.isConnected())
            return true;
 
        return false;
    }
 
    public void led(String s) throws Exception {
 
        data = (s.getBytes());
        if (isOnline()) {
            ip = InetAddress.getByName(myIP);
            d1 = new DatagramSocket();
 
            try {
                send = new DatagramPacket(data, data.length, ip, port);
            } catch (Exception e) {
 
            }
 
 
            d1.send(send);
            d1.setSoTimeout(1000);
            d1.receive(rec);
            modifiedSentence = new String(rec.getData());
            InetAddress returnIPAddress = rec.getAddress();
            Toast.makeText(getActivity().getApplicationContext(), "Reply from Server:" + returnIPAddress, Toast.LENGTH_LONG).show();
            d1.close();
        } else {
            Toast.makeText(getActivity().getApplicationContext(), "No network", Toast.LENGTH_LONG).show();
        }
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        SeekBar seekBarProgress;
        seekBarProgress = (SeekBar) rootView.findViewById(R.id.seekBar_progress);
        final CircleProgressBar circleProgressBar = (CircleProgressBar) rootView.findViewById(R.id.custom_progressBar);
        final TextView tv = (TextView) rootView.findViewById(R.id.viewvitesse);
        on = (Button) rootView.findViewById(R.id.button_on);
        off = (Button) rootView.findViewById(R.id.button_off);
 
        seekBarProgress.setProgress((int) circleProgressBar.getProgress());
        seekBarProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                float value = ((float) progress / 5.0f);
                if (fromUser)
                    circleProgressBar.setProgressWithAnimation(progress);
                else
                    circleProgressBar.setProgress(value);
                tv.setText(String.valueOf(value) + " cm/s");
            }
 
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
 
            }
 
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
 
            }
        });
        on.setOnClickListener(new View.OnClickListener() {
 
            public void onClick(View v) {
 
                try {
                    led("1");
                    Toast.makeText(getActivity().getApplicationContext(), "ON", Toast.LENGTH_LONG).show();
                } catch (Exception e) {
 
                    System.out.println("Error::" + e);
                }
 
            }
        });
 
        off.setOnClickListener(new View.OnClickListener() {
 
            public void onClick(View v) {
 
                try {
                    led("2");
                    Toast.makeText(getActivity().getApplicationContext(), "OFF", Toast.LENGTH_LONG).show();
 
                } catch (Exception e) {
                    System.out.println("Error::" + e);
                }
 
            }
        });
 
 
        return rootView;
    }
 
 
}

Voilà, j'espère que vous pourrez m'aider

Cordialement.