Skip to content

Commit

Permalink
[代码完善](github-master): 优化广播地址的获取和广播消息的发送
Browse files Browse the repository at this point in the history
  • Loading branch information
eurigo committed Jul 26, 2021
1 parent 1bb0c23 commit 53c0b88
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 9 deletions.
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
package="com.eurigo.udputils">

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

<application
Expand Down
15 changes: 13 additions & 2 deletions app/src/main/java/com/eurigo/udputils/UdpActivity.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,28 @@
package com.eurigo.udputils;

import android.annotation.SuppressLint;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.DhcpInfo;
import android.net.LinkProperties;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.NetworkUtils;
import com.blankj.utilcode.util.TimeUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.blankj.utilcode.util.Utils;
import com.eurigo.udplibrary.UdpUtils;
import com.google.android.material.button.MaterialButton;

Expand All @@ -35,8 +45,9 @@ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.udp_receive_activity);
initView();
mAdapter.addDataAndScroll("本机WIFI地址: "+ NetworkUtils.getIpAddressByWifi());
mAdapter.addDataAndScroll("本机Ipv4地址: "+ NetworkUtils.getIPAddress(true));
mAdapter.addDataAndScroll("本机WiFi地址: " + NetworkUtils.getIpAddressByWifi());
mAdapter.addDataAndScroll("本机Ipv4地址: " + NetworkUtils.getIPAddress(true));
mAdapter.addDataAndScroll("本机广播地址: " + UdpUtils.getInstance().getBroadcastHost(this));
}

private void initView(){
Expand Down
76 changes: 69 additions & 7 deletions udplibrary/src/main/java/com/eurigo/udplibrary/UdpUtils.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
package com.eurigo.udplibrary;

import android.annotation.SuppressLint;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.DhcpInfo;
import android.net.LinkProperties;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;

Expand All @@ -8,11 +16,17 @@
import com.google.gson.JsonObject;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
Expand All @@ -23,6 +37,8 @@
import java.util.concurrent.atomic.AtomicLong;
import java.util.regex.Pattern;

import static android.os.Build.VERSION_CODES.M;

/**
* @author Eurigo
* Created on 2021/7/1 14:43
Expand Down Expand Up @@ -55,8 +71,7 @@ public void startUdpSocket() {
}
}

public static final String DEFAULT_SOCKET_HOST = "192.168.0.1";
public static final String BROADCAST_HOST = "255.255.255.255";
public static final String DEFAULT_SOCKET_HOST = "192.168.43.255";
public static final int DEFAULT_SOCKET_UDP_PORT = 9090;

private String udpHost = "";
Expand Down Expand Up @@ -157,13 +172,14 @@ public void run() {
});
}


/**
* 发送全局广播
* 自动获取广播地址并发送广播消息
*
* @param message 消息文本
*/
public void sendBroadcastMessage(String message) {
setUdpHost(BROADCAST_HOST);
public void sendBroadcastMessage(Context context, String message) {
getBroadcastHost(context);
sendMessage(message);
}

Expand All @@ -172,8 +188,30 @@ public void sendBroadcastMessage(String message) {
*
* @param map 数据Map
*/
public void sendBroadcastMessage(Map<String, String> map) {
setUdpHost(BROADCAST_HOST);
public void sendBroadcastMessage(Context context, Map<String, String> map) {
getBroadcastHost(context);
sendMessage(map);
}

/**
* 发送基于Android设备热点的广播
* 当连接孤立的Android设备通讯时,建议使用此方法发送广播
*
* @param message 消息文本
*/
public void sendBroadcastMessageInAndroidHotspot(String message) {
setUdpHost(DEFAULT_SOCKET_HOST);
sendMessage(message);
}

/**
* 发送基于Android设备热点的广播
* 当连接孤立的Android设备通讯时,建议使用此方法发送广播
*
* @param map 数据Map
*/
public void sendBroadcastMessageInAndroidHotspot(Map<String, String> map) {
setUdpHost(DEFAULT_SOCKET_HOST);
sendMessage(map);
}

Expand Down Expand Up @@ -272,6 +310,30 @@ public void stopUdpSocket() {
onUdpReceiveListener = null;
}

/**
* 获取广播IP地址
* 有些路由器/Wi-Fi热点不支持255.255.255.255广播地址(例如:用Android手机做Wi-Fi热点的时候)
* 会出现“ENETUNREACH (Network is unreachable)”的异常,因此,为了保证程序成功发送广播包,建议使用直接广播地址
*
* @param context 上下文
* @return 广播IP地址
*/
public String getBroadcastHost(Context context) {
WifiManager wifiManager = (WifiManager) context.getApplicationContext()
.getSystemService(Context.WIFI_SERVICE);
DhcpInfo dhcp = wifiManager.getDhcpInfo();
if (dhcp == null) {
return DEFAULT_SOCKET_HOST;
}
int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
StringBuilder builder = new StringBuilder();
for (int k = 0; k < 4; k++) {
builder.append(((broadcast >> k * 8) & 0xFF)).append(".");
}
builder.deleteCharAt(builder.length() - 1);
return builder.toString();
}

/**
* 是否为Ip地址
*
Expand Down

0 comments on commit 53c0b88

Please sign in to comment.