私はWifiのクライアント通信で自分のコードについて質問したいと思います。私はサーバーとしてラズベリーパイと通信しています。 私のコードのアーキテクチャは次のとおりです。Android wifi:ハンドラmsgが動作しない
主な活動:私はHandlerクラスを持っていると私はWiFi接続を確立するの面倒をOnCreat最初のスレッド(スレッド1)で起動します。
public class MainActivity extends AppCompatActivity { public int serverPort = 40000; public String serverIP = "10.177.86.212"; public WiFiConnector wifiConnection; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextWE = (EditText) findViewById(R.id.editText_WE); wifiConnection = new WiFiConnector(serverIP, serverPort); Handler mHandler = new MyHandler(); WiFiConnector.Thread1 = new Thread(new WiFiConnector.Thread1(mHandler,true)); WiFiConnector.Thread1.start(); } private class MyHandler extends Handler { private byte[] bytes = null; @Override public void handleMessage(Message msg) { bytes = msg.getData().getByteArray("KEY"); if(bytes!= null){ for (int i = 0; i < bytes.length; i++){ Log.d("Data received", "value " + (0xFF & bytes[i])); } for (int i=0; i<bytes.length; i++) { editTextWE.setText(editTextWE.getText()+ "Server says: " + bytes.length + " "+ (0xFF & bytes[i]) + "\n"); } } } } }
WifiConnectorクラス:スレッド1とスレッド2が主な活動から来るハンドラを共有しています。 Thread1はRaspberry Piにコマンドを送信してデータの送信を開始させます。 Thread2は、サーバーから受信したデータを読み込むためのものです。
public class WiFiConnector { static String serverIP; static int serverPort; public static Thread Thread1 = null; //Constructor public WiFiConnector(String IP, int port) { serverIP = IP; serverPort = port; } public static class Thread1 extends Thread implements Runnable { private Handler handler1; boolean firsttime = false; OutputStream out ; public Thread1(Handler handler_1, boolean firsttime) { this.handler1 = handler_1; this.firsttime = firsttime; } public void run() { Socket socket = null; try { //Writing to a Socket InetAddress serverAddress = InetAddress.getByName(serverIP); socket = new Socket(serverAddress, serverPort); out = new DataOutputStream(socket.getOutputStream()); if(firsttime){ //I send "B" to Raspberry to let him start sending data out.write("B".getBytes()); this.fisrttime = false; } Thread2 comThread = new Thread2(socket, handler1); new Thread(comThread).start(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } public static class Thread2 implements Runnable { public Socket clientSocket; private Handler handler_2; public DataInputStream in; public byte[] bytes = new byte[13]; public Message msg; public Thread2(Socket clientSocket, Handler handler2) { this.clientSocket = clientSocket; this.handler_2 = handler2; } public void run() { while (!Thread.currentThread().isInterrupted()) { try { if (Looper.myLooper() == null) { Looper.prepare(); } this.in = new DataInputStream(clientSocket.getInputStream()); in.readFully(bytes); if (in != null) { for (int i = 0; i < bytes.length; i++){ Log.d("Data received", "valuewifi " + (0xFF & bytes[i])); } msg = new Message(); Bundle b = new Bundle(); b.putByteArray("KEY", bytes); msg.setData(b); handler_2.sendMessage(msg); } else { Thread1 = new Thread(new Thread1(handler_2,false)); Thread1.start(); return; } } catch (IOException e) { e.printStackTrace(); } } Looper.loop(); } } }
NOW問題です: 私は確かに、ラズベリーパイから(13バイトごとのパッケージ)が正しく私のデータを受信しています:
Log.d("Data received", "valuewifi " + (0xFF & bytes[i]));
正しく印刷私の値を。 MainActivityのハンドラに送るメッセージを作成します。
Log.d("Data received", "value " + (0xFF & bytes[i]));
(私は2を取得しようとしています各メッセージの最初のバイトの値を代入:バンドルは、入力ストリームの同じ値を受信しますが、MainActivityのハンドラに印刷されたメッセージは、(私が確認している)が含まれRPiとの各通信をパッケージ化します)66で、実際にはRaspberry Piからのデータ送信を開始するために送信した「B」のASCIIコードです。
あなたはこの身分証明書をお持ちですか?事前にあなたの助けのための 多くの感謝!:)