diff options
| author | cjybyjk <cjybyjk@zjnu.edu.cn> | 2021-07-03 04:08:24 +0800 |
|---|---|---|
| committer | cjybyjk <cjybyjk@zjnu.edu.cn> | 2021-07-03 04:56:04 +0800 |
| commit | 8a4e14b0bbfbb3deb7319ec9b8b646bfe2d42ec5 (patch) | |
| tree | 39c7ee5c1cbf13ae86f8eebcdfcc6616fca442fc | |
| parent | 9aebfe62786166abc50628ad282957e3024363a5 (diff) | |
use List<WifiClient> in SoftApCallback to update client list
If we use the `ip neigh` command to get clients, we need to judge the reachability in the code.
Using the client list provided by WifiManager.SoftApCallback will not cause this problem
The result of the `ip neigh` command is only used to get the IP address.
Signed-off-by: cjybyjk <cjybyjk@zjnu.edu.cn>
Change-Id: I33ace64bbbd74492259a79709eb69e3cbefe8d92
| -rw-r--r-- | app/src/main/java/org/exthmui/softap/ClientListActivity.java | 2 | ||||
| -rw-r--r-- | app/src/main/java/org/exthmui/softap/SoftApManageService.java | 53 |
2 files changed, 24 insertions, 31 deletions
diff --git a/app/src/main/java/org/exthmui/softap/ClientListActivity.java b/app/src/main/java/org/exthmui/softap/ClientListActivity.java index 650e4f2..86c7055 100644 --- a/app/src/main/java/org/exthmui/softap/ClientListActivity.java +++ b/app/src/main/java/org/exthmui/softap/ClientListActivity.java @@ -125,7 +125,7 @@ public class ClientListActivity extends FragmentActivity implements SoftApManage continue; } mBlockedClients.addPreference(makeClientPreference(info)); - } else if (info.isConnected()) { + } else { removeConnectedPrefList.remove(info.getMACAddress()); if (mConnectedClients.findPreference(info.getMACAddress()) != null) { continue; diff --git a/app/src/main/java/org/exthmui/softap/SoftApManageService.java b/app/src/main/java/org/exthmui/softap/SoftApManageService.java index 800050c..46b577a 100644 --- a/app/src/main/java/org/exthmui/softap/SoftApManageService.java +++ b/app/src/main/java/org/exthmui/softap/SoftApManageService.java @@ -80,12 +80,12 @@ public class SoftApManageService extends Service implements WifiManager.SoftApCa public SoftApManageService() { } - private Thread createClientUpdateThread() { + private Thread createClientUpdateThread(final List<WifiClient> clients) { return new Thread() { @Override public void run() { try { - IUpdateClientList(); + IUpdateClientList(clients); sendStatusChangedMessage(STATUS_NORMAL); } catch (Exception e) { e.printStackTrace(); @@ -114,12 +114,11 @@ public class SoftApManageService extends Service implements WifiManager.SoftApCa if (mClientUpdateThread != null && mClientUpdateThread.getState() != Thread.State.NEW && mClientUpdateThread.getState() != Thread.State.TERMINATED) { - mHandler.sendEmptyMessageDelayed(MSG_UPDATE_CLIENT_LIST, 1000); + mHandler.removeMessages(MSG_UPDATE_CLIENT_LIST); + mHandler.sendMessageDelayed(msg, 1000); return; } - if (mClientUpdateThread == null || mClientUpdateThread.getState() != Thread.State.NEW) { - mClientUpdateThread = createClientUpdateThread(); - } + mClientUpdateThread = createClientUpdateThread((List<WifiClient>) msg.obj); mClientUpdateThread.start(); } } @@ -216,12 +215,22 @@ public class SoftApManageService extends Service implements WifiManager.SoftApCa return false; } - private void IUpdateClientList() { + private void IUpdateClientList(List<WifiClient> clients) { HashMap<String, ClientInfo> clientInfoHashMap = new HashMap<>(); sendStatusChangedMessage(STATUS_CLIENTS_REFRESHING); // 取得当前连接的设备 + for (WifiClient client : clients) { + String macAddress = client.getMacAddress().toString(); + ClientInfo info = new ClientInfo(macAddress); + MACData macData = MACDataHelper.findMACData(macAddress); + if (macData != null) { + info.setManufacturer(macData.toString()); + } + clientInfoHashMap.put(macAddress, info); + } + // MAC-IP 匹配 String res = execCommand(String.format(IP_NEIGHBOR_COMMAND_FORMAT, mInterfaceName)); if (!TextUtils.isEmpty(res)) { String[] lines = res.split("\n"); @@ -230,20 +239,10 @@ public class SoftApManageService extends Service implements WifiManager.SoftApCa String ipAddress = values[COLUMN_IP_ADDRESS]; String macAddress = values[COLUMN_MAC_ADDRESS]; if (!isValidMACAddress(macAddress)) continue; - ClientInfo info; if (clientInfoHashMap.containsKey(macAddress)) { - info = clientInfoHashMap.get(macAddress); - } else { - info = new ClientInfo(macAddress); - MACData macData = MACDataHelper.findMACData(macAddress); - if (macData != null) { - info.setManufacturer(macData.toString()); - } - clientInfoHashMap.put(macAddress, info); + ClientInfo info = clientInfoHashMap.get(macAddress); + info.addIPAddress(ipAddress); } - if (info == null) continue; - info.addIPAddress(ipAddress); - info.setConnected(info.isConnected() || isReachable(ipAddress)); } } @@ -257,7 +256,6 @@ public class SoftApManageService extends Service implements WifiManager.SoftApCa if (macData != null) { info.setManufacturer(macData.toString()); } - info.setConnected(false); info.setBlocked(true); clientInfoHashMap.put(blockedMAC, info); } @@ -281,14 +279,6 @@ public class SoftApManageService extends Service implements WifiManager.SoftApCa return ip != null && ip.matches("((25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))"); } - private boolean isReachable(String ip) { - try { - return InetAddress.getByName(ip).isReachable(1500); - } catch (IOException e) { - return false; - } - } - private void sendStatusChangedMessage(int what) { Message msg = mHandler.obtainMessage(); msg.what = MSG_STATUS_CHANGED; @@ -325,7 +315,10 @@ public class SoftApManageService extends Service implements WifiManager.SoftApCa @Override public void onConnectedClientsChanged(List<WifiClient> clients) { - mHandler.sendEmptyMessageDelayed(MSG_UPDATE_CLIENT_LIST, 1000); + Message msg = mHandler.obtainMessage(); + msg.what = MSG_UPDATE_CLIENT_LIST; + msg.obj = clients; + mHandler.sendMessage(msg); } private static String execCommand(String cmd) { @@ -398,4 +391,4 @@ public class SoftApManageService extends Service implements WifiManager.SoftApCa public interface StatusListener { void onStatusChanged(int what); } -}
\ No newline at end of file +} |
