2016-07-28 74 views
-1

我在Android的編程新,不知道如何與UDP和MQTT協議工作在Android設備要編寫聊天使用UDP和MQTT協議的Android

我想建立的聊天機器人到一個應用程序編程房間內的Android設備連接到同一個Wi-Fi路由器。

但我不知道什麼IP地址和端口我應該綁定到DatagramSocket和DatagramPacket。

我嘗試了很多從網上的例子,但我不明白它將如何在Android中工作。

回答

2

MQTT需要TCP,它是一個有狀態的協議,你不能用UDP

實現它有一個類似的協議稱爲MQTT-SN能與像UDP無狀態協議來實現。

但是這兩個仍然會要求地方運行的代理向用戶傳遞信息的協調,給出主題

+0

謝謝@hardillb –

1

我發現代碼在UDP協議,如下面的作品發送消息。

public class SendUDP extends AsyncTask<Void, Void, String> { 
    String message; 

    public SendUDP(String message) { 
     this.message = message; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(Void[] params) { 

     try { 
      DatagramSocket socket = new DatagramSocket(13001); 
      byte[] senddata = new byte[message.length()]; 
      senddata = message.getBytes(); 

      InetSocketAddress server_addr; 
      DatagramPacket packet; 

      server_addr = new InetSocketAddress(getBroadcastAddress(getApplicationContext()).getHostAddress(), 13001); 
      packet = new DatagramPacket(senddata, senddata.length, server_addr); 
      socket.setReuseAddress(true); 
      socket.setBroadcast(true); 
      socket.send(packet); 
      Log.e("Packet", "Sent"); 

      socket.disconnect(); 
      socket.close(); 
     } catch (SocketException s) { 
      Log.e("Exception", "->" + s.getLocalizedMessage()); 
     } catch (IOException e) { 
      Log.e("Exception", "->" + e.getLocalizedMessage()); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String text) { 
     super.onPostExecute(text); 
    } 
} 

和下方用於取入連接在LAN網絡通過其LAN中的所有其他設備將接收到該消息在設備的廣播IP地址的功能。

public static InetAddress getBroadcastAddress(Context context) throws IOException { 
    WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    DhcpInfo dhcp = wifi.getDhcpInfo(); 
    // handle null somehow 

    int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; 
    byte[] quads = new byte[4]; 
    for (int k = 0; k < 4; k++) 
     quads[k] = (byte) (broadcast >> (k * 8)); 
    return InetAddress.getByAddress(quads); 
} 

,這將執行此作爲

new SendUDP("Hello All Device").execute(); 

它的工作原理就像一個魅力後發送UDP消息!