在 Android 中使用 UDP 和 MQTT 协议编写聊天程序

To write chat programming using UDP and MQTT protocol in Android

我是 Android 编程新手,不知道如何在 android 设备

中使用 UDP 和 MQTT 协议

我想构建一个应用程序,用于与连接到同一 Wi-Fi 路由器的房间内的 android 设备聊天 android。

但是我不知道应该为DatagramSocket 和DatagramPacket 绑定什么IP 地址和端口。

我尝试了很多在线示例,但我不明白它在 android 中的工作原理。

MQTT 需要 TCP,它是一个有状态的协议,你不能用 UDP 实现它

有一个类似的协议,叫做 MQTT-SN,它可以用像 UDP 这样的无状态协议来实现。

但是这两者仍然需要代理运行在某个地方协调向订阅者发送给定主题的消息

我找到了在 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 网络中的设备的广播 IP 地址的函数,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);
}

这将在

执行后发送 UDP 消息
new SendUDP("Hello All Device").execute();

它很有魅力!