2017-01-11 3 views
2

J'essaie d'utiliser une connexion TCP pour communiquer entre mon téléphone Android et un microcontrôleur (un Particle Photon, très similaire à un Arduino), où le téléphone est un hotspot sans fil connecté à Internet.Utilisation de TCP pour communiquer entre un Android et un microcontrôleur

Chaque fois que je tente de les faire se connecter les uns aux autres, je peux obtenir le client (application Android) pour se connecter au serveur (Photon). La classe d'assistance TCPClient semble être bloquée à

serverMessage = in.readLine(); 

dans la classe TCPClient helper. Ceci est mon résultat de débogage:

E/TCP Client: C: Connecting... 
E/TCP Client: C: out2 = [email protected] 
E/TCP Client: C: out1 = [email protected] 
E/TCP Client: C: out0 = [email protected] 
E/TCP Client: C: Sent. 
E/TCP Client: C: Done. 
E/TCP Client: C: received = [email protected] 
E/TCP Client: C: run = true 
E/TCP Client: C: I got to the while loop! 

Il semble donc assez clair où la casse classe d'aide vers le bas à in.readLine(). Que doit-il se passer pour que le code progresse à travers la ligne et montre le résultat reçu?

C'est le TCPClient.java:

import android.util.Log; 
import java.io.*; 
import java.net.InetAddress; 
import java.net.Socket; 

public class TCPClient { 

     private String serverMessage; 
     public static final String SERVERIP = "192.168.43.157"; //your Photon (formerly computer) IP address 
     public static final int SERVERPORT = 23; 
     private OnMessageReceived mMessageListener = null; 
     private boolean mRun = false; 

     PrintWriter out; 
     BufferedWriter out1; 
     OutputStreamWriter out2; 
     BufferedReader in; 

     /** 
     * Constructor of the class. OnMessagedReceived listens for the messages received from server 
     */ 
     public TCPClient(OnMessageReceived listener) { 
      mMessageListener = listener; 
     } 

     /** 
     * Sends the message entered by client to the server 
     * @param message text entered by client 
     */ 
     public void sendMessage(String message){ 
      if (out != null && !out.checkError()) { 
       out.println(message); 
       out.flush(); 
      } 
     } 

     public void stopClient(){ 
      mRun = false; 
     } 

     public void run() { 

      mRun = true; 

      try { 
       //here you must put your computer's IP address. 
       InetAddress serverAddr = InetAddress.getByName(SERVERIP); 

       Log.e("TCP Client", "C: Connecting..."); 

       //create a socket to make the connection with the server 
       Socket socket = new Socket(serverAddr, SERVERPORT); 

       try { 
        //send the message to the server 
        out2 = new OutputStreamWriter(socket.getOutputStream()); 
        out1 = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
        Log.e("TCP Client", "C: out2 = " + out2); 
        Log.e("TCP Client", "C: out1 = " + out1); 
        Log.e("TCP Client", "C: out0 = " + out); 
        Log.e("TCP Client", "C: Sent."); 

        Log.e("TCP Client", "C: Done."); 

        //receive the message which the server sends back 
        in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
        Log.e("TCP Client", "C: received = " + in); 
        Log.e("TCP Client", "C: run = " + mRun); 
        //in this while the client listens for the messages sent by the server 
        while (mRun) { 
         Log.e("TCP Client", "C: I got to the while loop!"); 

         serverMessage = in.readLine(); 

         Log.e("TCP Client", "C: serverMessage = " + serverMessage); 

         if (serverMessage != null && mMessageListener != null) { 
          //call the method messageReceived from MyActivity class 
          mMessageListener.messageReceived(serverMessage); 
         } else { 
          serverMessage = null; 
         } 
        } 

        Log.e("TCP Client", "C: run = " + mRun); 

        Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + serverMessage + "'"); 

       } catch (Exception e) { 

        Log.e("TCP", "S: Error", e); 

       } finally { 
        //the socket must be closed. It is not possible to reconnect to this socket 
        // after it is closed, which means a new socket instance has to be created. 
        socket.close(); 
       } 

      } catch (Exception e) { 

       Log.e("TCP", "C: Error", e); 

      } 

     } 

     //Declare the interface. The method messageReceived(String message) will must be implemented in the MyActivity 
     //class at on asynckTask doInBackground 
     public interface OnMessageReceived { 
      public void messageReceived(String message); 
     } 
} 

Pour être complet, voici mon firmware Photon:

SYSTEM_MODE(MANUAL); 

TCPServer server = TCPServer(23); 
TCPClient client; 
int flag = 0; 

void setup() { 
     WiFi.on(); 
     WiFi.setCredentials("AndroidAP", "password"); 
     WiFi.connect(); 

     // Make sure your Serial Terminal app is closed before powering your device 
     Serial.begin(9600); 
     // Now open your Serial Terminal, and hit any key to continue! 

    // start listening for clients 
     server.begin(); 
} 

void loop() { 
    if (client.connected()) { 
     if(flag == 0) { 
      server.write("200"); 
      // Serial.println("200"); 
      flag = 0; 
      Serial.println(WiFi.SSID()); 
      Serial.println(WiFi.localIP()); 
      delay(1000); 
     } 


     // echo all available bytes back to the client 
     while (client.available() > 0) { 
      server.write("200"); 
      Serial.println("200"); 


     } 

    } else { 
     // if no client is yet connected, check for a new connection 
     client = server.available(); 
    } 
} 

Ceci est mon MainActivity.java:

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 

import java.util.ArrayList; 

public class MainActivity extends AppCompatActivity { 

    private TCPClient mTcpClient; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final Button button = (Button) findViewById(R.id.send_button); 
     button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       // connect to the server 
       new connectTask().execute("message1"); 
      } 
     }); 
    } 

    public class connectTask extends AsyncTask<String,String,TCPClient> { 

     @Override 
     protected TCPClient doInBackground(String... message) { 

      //we create a TCPClient object and 
      mTcpClient = new TCPClient(new TCPClient.OnMessageReceived() { 
       @Override 
       //here the messageReceived method is implemented 
       public void messageReceived(String message) { 
        //this method calls the onProgressUpdate 
        publishProgress(message); 
        Log.d("Message", message); 
       } 
      }); 
      mTcpClient.run(); 

      return null; 
     } 

     @Override 
     protected void onProgressUpdate(String... values) { 
      super.onProgressUpdate(values); 
      Log.d("values", values[0]); 
     } 
    } 
} 

Répondre

0

Pour toute personne d'autres qui viennent et qui cherchent à faire quelque chose de similaire, j'ai finalement eu ce code pour travailler.

TCPClient.java

import android.util.Log; 
import java.io.*; 
import java.net.InetAddress; 
import java.net.Socket; 

import static android.R.id.message; 

public class TCPClient { 

     private String serverMessage; 
     public static String buttonPushed; 
     public static final String SERVERIP = "192.168.43.157"; //your Photon (formerly computer) IP address 

     public static final int SERVERPORT = 23; 
     private OnMessageReceived mMessageListener = null; 
     private boolean mRun = false; 

     PrintWriter out; 
     BufferedWriter out1; 
     OutputStreamWriter out2; 
     OutputStream out3; 
     BufferedReader in; 

     /** 
     * Constructor of the class. OnMessagedReceived listens for the messages received from server 
     */ 
     public TCPClient(OnMessageReceived listener) { 
      mMessageListener = listener; 
     } 

     /** 
     * Sends the message entered by client to the server 
     * @param message text entered by client 
     */ 
     public void sendMessage(String message){ 
      if (out != null && !out.checkError()) { 
       out.println(message); 
       Log.d("TCP Client", "Message: " + message); 
       out.flush(); 
      } 
     } 

     public void stopClient(){ 
      mRun = false; 
     } 

     public void run() { 

      mRun = true; 

      try { 
       //here you must put your computer's IP address. 
       InetAddress serverAddr = InetAddress.getByName(SERVERIP); 

       Log.e("TCP Client", "C: Connecting..."); 

       //create a socket to make the connection with the server 
       Socket socket = new Socket(serverAddr, SERVERPORT); 

       try { 
        //send the message to the server 

        out3 = socket.getOutputStream(); 
        out2 = new OutputStreamWriter(socket.getOutputStream()); 
        out1 = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
        Log.e("TCP Client", "C: out3 = " + out3); 
        Log.e("TCP Client", "C: out2 = " + out2); 
        Log.e("TCP Client", "C: out1 = " + out1); 
        Log.e("TCP Client", "C: out0 = " + out); 

        sendMessage(buttonPushed); //this was the key 
        Log.e("TCP Client", "C: Sent."); 

        Log.e("TCP Client", "C: Done."); 

        //receive the message which the server sends back 
        in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
        Log.e("TCP Client", "C: received = " + in); 
        Log.e("TCP Client", "C: run = " + mRun); 
        //in this while the client listens for the messages sent by the server 
        while (mRun) { 
         Log.e("TCP Client", "C: I got to the while loop!"); 

         serverMessage = in.readLine(); 

         Log.e("TCP Client", "C: serverMessage = " + serverMessage); 
         new TCPClient(mMessageListener); 
         stopClient(); 
         if (serverMessage != null && mMessageListener != null) { 
          //call the method messageReceived from MyActivity class 
          mMessageListener.messageReceived(serverMessage); 
         } else { 
          serverMessage = null; 
         } 
        } 

        Log.e("TCP Client", "C: run = " + mRun); 

        Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + serverMessage + "'"); 
       } catch (Exception e) { 
        Log.e("TCP", "S: Error", e); 
       } finally { 
        //the socket must be closed. It is not possible to reconnect to this socket 
        // after it is closed, which means a new socket instance has to be created. 
        socket.close(); 
        Log.d("TCP Client", "Socket closed."); 
        serverMessage = null; 
       } 

      } catch (Exception e) { 
       Log.e("TCP", "C: Error", e); 
      } 

     } 

     //Declare the interface. The method messageReceived(String message) will must be implemented in the MyActivity 
     //class at on asynckTask doInBackground 
     public interface OnMessageReceived { 
      public void messageReceived(String message); 
     } 
} 

MainActivity.java

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 

import java.util.ArrayList; 

public class MainActivity extends AppCompatActivity { 

// private ListView mList; 
// private ArrayList<String> arrayList; 
// private MyCustomAdapter mAdapter; 
    private TCPClient mTcpClient; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final Button button = (Button) findViewById(R.id.send_button); 
     button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       // connect to the server 
       TCPClient.buttonPushed = "Get range 1"; 
       new connectTask().execute(""); 
      } 
     }); 



    } 

    public class connectTask extends AsyncTask<String,String,TCPClient> { 

     @Override 
     protected TCPClient doInBackground(String... message) { 

      //we create a TCPClient object and 
      mTcpClient = new TCPClient(new TCPClient.OnMessageReceived() { 
       @Override 
       //here the messageReceived method is implemented 
       public void messageReceived(String message) { 
        //this method calls the onProgressUpdate 
        publishProgress(message); 
        Log.d("Message", message); 
       } 
      }); 
      mTcpClient.run(); 

      return null; 
     } 

     @Override 
     protected void onProgressUpdate(String... values) { 
      super.onProgressUpdate(values); 
      Log.d("values", values[0]); 
      //in the arrayList we add the messaged received from server 
//   arrayList.add(values[0]); 
      // notify the adapter that the data set has changed. This means that new message received 
      // from server was added to the list 
//   mAdapter.notifyDataSetChanged(); 
     } 
    } 
} 

code Photon:

SYSTEM_MODE(MANUAL); 

TCPServer server = TCPServer(23); 
TCPClient client; 

void setup() { 
     WiFi.on(); 
     WiFi.setCredentials("AndroidAP", "password"); 
     WiFi.connect(); 

     // Make sure your Serial Terminal app is closed before powering your device 
     Serial.begin(9600); 
     // Now open your Serial Terminal, and hit any key to continue! 

    // start listening for clients 
     server.begin(); 
} 

void loop() { 
    if (client.connected()) { 
     // echo all available bytes back to the client 
     while (client.available() > 0) { 
      server.write("200\n"); 
      Serial.println("200"); 
      Serial.println(WiFi.SSID()); 
      Serial.println(WiFi.localIP()); 

     } 

    } else { 
     // if no client is yet connected, check for a new connection 
     client = server.available(); 
    } 
}