在 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();
它很有魅力!
我是 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();
它很有魅力!