2017-12-08 6 views
0

Ich habe ein GPS-Tracker-Gerät, einen TCP/IP-Servercode ausgeführt, der erfolgreich eine Verbindung mit jedem Gerät in einem separaten Thread und Gerät herstellt. Nach einer Minute wird der Herzschlag gesendet und der Server antwortet. Wenn ich einen Befehl sende, um den Gerätestandort zu erhalten, gibt er mir den Standort und alles funktioniert gut.TCP-Dienst- und REST-APIs

Jetzt möchte ich Ort von einem Android-Gerät mit Web-Service zu bekommen, jetzt bin ich verwirrt, wie kann ich laufenden Thread eines bestimmten Geräts aus einer Android App verwenden?

+0

macht die Android webservice eine Zwei-Port-Anwendung sein. Ein Port ist über eine IP-Adresse mit dem GPS-Tracker-Gerät verbunden. Der zweite Port ist eine Webseitenanwendung, die HTTP (Port 8080) verwendet. In der Anwendung benötigen Sie eine Methode der Webseiten-App, um Ergebnisse von der TCP-Klasse zu erhalten. – jdweng

+0

Bitte erklären Sie, dass Sie mein Problem verstanden haben. Wenn ich Rest-Dienste schreiben möchte, wie verwende ich dann meine Geräteverbindung? –

+0

Sie stellen eine Verbindung zum Dienst her, indem Sie einen Webrequest (oder eine beliebige Webmethode wie WebClient) über die IP-Adresse des Android-Geräts verwenden. Die Antwort enthält den Ort des GPS-Trackers. Der Rest nimmt die Ergebnisse der TCP-Verbindung und formatiert die TCP-Bytes in eine Zeichenfolge und sendet die Antwort an den Client. – jdweng

Antwort

0
class Server 
{ 
    TcpListener server = null; 
    public Server(string ip, int port) 
    { 
     IPAddress localAddr = IPAddress.Parse(ip); 
     server = new TcpListener(localAddr, port); 
     server.Start(); 
     StartListener(); 
    } 

    public void StartListener() 
    { 
     try 
     { 
      while (true) 
      { 
       Console.WriteLine("Waiting for a connection... "); 
       TcpClient client = server.AcceptTcpClient(); 
       Console.WriteLine("Connected!"); 

       Thread t = new Thread(new ParameterizedThreadStart(HandleDeivce)); 
       t.Start(client); 
      } 
     } 
     catch (SocketException e) 
     { 
      Console.WriteLine("SocketException: {0}", e); 
     } 
    } 

    public void HandleDeivce(Object obj) 
    { 
     TcpClient client = (TcpClient)obj; 
     NetworkStream stream = client.GetStream(); 

     string data = null; 
     Byte[] bytes = new Byte[256]; 
     int i; 

     while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) 
     { 
      data = Encoding.ASCII.GetString(bytes, 0, i); 
      Console.WriteLine("{1}: Received: {0}", data, Thread.CurrentThread.ManagedThreadId); 

      if (data.StartsWith("##")) 
      { 
       data = "LOAD"; 
      } 
      else 
      { 
       data = "ON"; 
      } 

      byte[] msg = Encoding.ASCII.GetBytes(data); 
      stream.Write(msg, 0, msg.Length); 

      Console.WriteLine("{1}: Sent: {0}", data, Thread.CurrentThread.ManagedThreadId); 
     } 
     client.Close(); 
    } 
} 
0

Versuchen Code aussehen wie dieses

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 


namespace ConsoleApplication16 
{ 
    class Program 
    { 
     const string IP = "123.456.789.000"; 
     const int PORT_NUMBER = 1234; 
     static AutoResetEvent autoEvent = new AutoResetEvent(false); 

     static void Main(string[] args) 
     { 
      GPSClient client = new GPSClient(IP, PORT_NUMBER); 
      //start http client or equivalent here 

      while (true) 
      { 
       autoEvent.Reset(); 

       autoEvent.WaitOne(); 

       //wait for message from user/client on service port 

       string message = client.message; 

       //send message back to user/client 

      } 
     } 
    } 
    public class WebServer 
    { 

    } 
    public class GPSClient 
    { 
     const int BUFFER_SIZE = 256; 
     TcpClient client = null; 
     NetworkStream stream = null; 
     Byte[] bytes = new Byte[BUFFER_SIZE]; 
     public string message { get; set; } 



     public GPSClient(string ip, int port) 
     { 
      try 
      { 

       Console.WriteLine("Connecting to Device... "); 

       client.Connect(ip, port); 
       Console.WriteLine("Connected!"); 
       stream = client.GetStream(); 

       stream.BeginRead(bytes, 0, BUFFER_SIZE, new AsyncCallback(HandleDeivce), stream); 
      } 
      catch (SocketException e) 
      { 
       Console.WriteLine("SocketException: {0}", e); 
      } 
     } 

     public void HandleDeivce(IAsyncResult ar) 
     { 
      NetworkStream stream = ar.AsyncState as NetworkStream; 

      string data = null; 

      int i = stream.Read(bytes, 0, BUFFER_SIZE); 

      data = Encoding.ASCII.GetString(bytes, 0, i); 
      Console.WriteLine("Received: {0}", data); 
      message = data; 

      if (data.StartsWith("##")) 
      { 
       data = "LOAD"; 
      } 
      else 
      { 
       data = "ON"; 
      } 

      byte[] msg = Encoding.ASCII.GetBytes(data); 
      stream.Write(msg, 0, msg.Length); 

      Console.WriteLine("Sent: {0}", data); 

      stream.BeginRead(bytes, 0, BUFFER_SIZE, new AsyncCallback(HandleDeivce), stream); 
     } 
    } 
} 
+0

Danke, aber wie können wir eine API zum Lesen eines einzelnen Parameters schreiben, während dieser TCP-Listener läuft? –

+0

Ich war nicht sicher, welche Methode Sie für den Benutzerport wollten. Also Kommentare hinzugefügt, wo der Code gehört. Wenn Sie mir ein Beispiel für die Methode geben, die Sie für den Benutzerport verwenden möchten, aktualisiere ich den Code. Es gibt zu viele verschiedene Methoden, die Sie verwenden können und die Sie zur Verfügung stellen möchten. – jdweng

+0

Ich habe meinen Code in der obigen Antwort gepostet. Bitte führe mir den Weg. –

Verwandte Themen