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
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 @@
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 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 @@
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 @@
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 @@
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 @@
if (macData != null) {
info.setManufacturer(macData.toString());
}
- info.setConnected(false);
info.setBlocked(true);
clientInfoHashMap.put(blockedMAC, info);
}
@@ -281,14 +279,6 @@
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 @@
@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 interface StatusListener {
void onStatusChanged(int what);
}
-}
\ No newline at end of file
+}