2016-07-28 77 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消息!