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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Android中使用UDP和MQTT协议编写聊天编程相关的知识,希望对你有一定的参考价值。

我是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();

它就像一个魅力!

以上是关于在Android中使用UDP和MQTT协议编写聊天编程的主要内容,如果未能解决你的问题,请参考以下文章

IP MODEM远程测控油田工业级DTU数据传输 TCP/UDP/MODEM/MQTT模式协议

USBRS485串口UDP转MQTT TCP http json网络通信协议对接定制开发

android消息推送GCM、XMPP、MQTT三种方案的优劣,越仔细越好,有具体分析更好!

Boost::Asio 点对点 udp 聊天

MQTT比TCP协议好在哪儿

如何使用QT5编写一个利用TCP协议的聊天室 编写一个TCP的服务器端