2010-11-24 168 views
12

我想從android設備傳輸消息到桌面應用程序。我的問題是,我可以連接的Android WiFi設備與桌面WiFi設備沒有任何使用互聯網連接。我想像藍牙一樣使用它。這可能嗎?如果有可能,那我該如何執行它?使用Android的WIFI到WIFI連接性

感謝和問候 阿米特Thaper

+0

這個問題很難閱讀,請檢查你的格式! – 2010-11-24 11:36:25

回答

15

這裏是mreichelt的建議的實施。當我遇到同樣的問題時,我查找了這個問題,並且認爲我只是發佈瞭解決方案的實施。它非常簡單。我還構建了一個Java服務器,用於偵聽來自android設備的傳入請求(主要用於調試目的)。這裏的代碼發送的東西通過無線:

import java.net.*; 
import java.io.*; 
import java.util.*; 

import android.app.Activity; 
import android.content.Context; 
import android.content.ContentValues; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.os.Bundle; 
import android.util.Log; 


public class SMSConnection { 
     /* The socket to the server */ 
    private Socket connection; 

    /* Streams for reading and writing the socket */ 
    private BufferedReader fromServer; 
    private DataOutputStream toServer; 

    /* application context */ 
    Context mCtx; 

    private static final String CRLF = "\r\n"; 

    /* Create an SMSConnection object. Create the socket and the 
     associated streams. Initialize SMS connection. */ 
    public SMSConnection(Context ctx) throws IOException { 
     mCtx=ctx; 
     this.open(); 
     /* may anticipate problems with readers being initialized before connection is opened? */ 
     fromServer = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
     toServer = new DataOutputStream(connection.getOutputStream()); 
    } 

    public boolean open(String host, int port) { 
     try { 
      connection = new Socket(host, port); 
      return true; 
     } catch(IOException e) { 
      Log.v("smswifi", "cannot open connection: " + e.toString()); 
     } 
     return false; 
    } 

    /* Close the connection. */ 
    public void close() { 
     try { 
      connection.close(); 
     } catch (IOException e) { 
      Log.v("smswifi","Unable to close connection: " + e.toString()); 
     } 
    } 

    /* Send an SMS command to the server. Check that the reply code 
     is what is is supposed to be according to RFC 821. */ 
    public void sendCommand(String command) throws IOException { 

     /* Write command to server. */ 
     this.toServer.writeBytes(command+this.CRLF); 

     /* read reply */ 
     String reply = this.fromServer.readLine(); 
    } 
} 

這是一個連接類的基本骨架。你只需實例化這個類,然後在使用主機和端口創建的實例上調用open(不要忘記在完成時關閉連接),並且可以根據自己的喜好更改sendCommand的主體。作爲一個例子,我在函數體中包含了一個讀/寫操作。

這是在遠程機器上運行服務器的代碼,該服務器偵聽連接並生成一個線程來處理每個請求。它可以輕鬆地與上面的代碼進行交互以進行調試(或任何使用)。

import java.io.*; 
import java.net.*; 
import java.util.*; 

public final class smsd { 
    ///////MEMBER VARIABLES 
    ServerSocket server=null; 
    Socket client=null; 

    ///////MEMBER FUNCTIONS 
    public boolean createSocket(int port) { 
     try{ 
      server = new ServerSocket(port); 
      } catch (IOException e) { 
      System.out.println("Could not listen on port "+port); 
      System.exit(-1); 
     } 
     return true; 
    } 

    public boolean listenSocket(){ 
     try{ 
      client = server.accept(); 
     } catch (IOException e) { 
      System.out.println("Accept failed: "); 
      System.exit(-1); 
     } 
     return true; 
    } 

    public static void main(String argv[]) throws Exception { 
     // 
     smsd mySock=new smsd(); 

     //establish the listen socket 
     mySock.createSocket(3005); 
     while(true) { 
      if(mySock.listenSocket()) { 
       //make new thread 
       // Construct an object to process the SMS request message. 
       SMSRequest request = new SMSRequest(mySock.client); 

       // Create a new thread to process the request. 
       Thread thread = new Thread(request); 

       // Start the thread. 
       thread.start(); 
      } 
     } 

     //process SMS service requests in an infinite loop 

    } 
///////////end class smsd///////// 
} 


final class SMSRequest implements Runnable { 
    // 
    final static String CRLF = "\r\n"; 
    Socket socket; 

    // Constructor 
    public SMSRequest(Socket socket) throws Exception 
    { 
     this.socket = socket; 
    } 

    // Implement the run() method of the Runnable interface. 
    public void run() 
    { 
     try { 
      processRequest(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 

    private static void sendBytes(FileInputStream fis, OutputStream os) throws Exception 
     { 
      // Construct a 1K buffer to hold bytes on their way to the socket. 
      byte[] buffer = new byte[1024]; 
      int bytes = 0; 

      // Copy requested file into the socket's output stream. 
      while((bytes = fis.read(buffer)) != -1) { 
       os.write(buffer, 0, bytes); 
      } 
     } 

    private void processRequest() throws Exception 
    { 
     // Get a reference to the socket's input and output streams. 
     InputStream is = this.socket.getInputStream(); 
     DataOutputStream os = new DataOutputStream(this.socket.getOutputStream()); 

     // Set up input stream filters. 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 

     // Get the request line of the SMS request message. 
     String requestLine = br.readLine(); 

     //print message to screen 
     System.out.println(requestLine); 

     //send a reply 
     os.writeBytes("200"); 

     // Close streams and socket. 
     os.close(); 
     br.close(); 
     socket.close(); 
    } 
} 

nb4namingconventions。

差點忘了。您需要在AndroidManifest.xml中的標籤內設置這些權限才能使用無線。

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
2

這是容易地如果兩個設備都使用相同的WiFi網絡可以相互ping。您可以在桌面上創建一個Java應用程序,創建一個ServerSocket。然後,您可以使用桌面的IP地址在Android應用程序中打開Socket,並通過OutputStream發送數據。

2

我相信阿米特是指使用無線方式直接相互連接的機器。

目前有Wifi-direct規範的開發允許即插即用設置接入點。目前的問題是確保其中一臺機器是其他機器可以建立連接的AP。

我對這與Ad-Hoc網絡的關係感興趣。我沒有解決方案,但是我對這個問題也很感興趣! (假設這是你的問題阿米特)。

+0

是的,我想通過Eric定義的方式進行連接。例子來澄清答案是手機藍牙。我想要像藍牙一樣使用WiFi與兩臺設備配對,而不使用任何路由器。 – 2011-02-10 10:38:41