Android-приложение Wi-Fi-устройство - подключение к AP
Я создаю приложение, которое может передавать данные между мобильным устройством и устройством Wi-Fi... Мобильный телефон получил AP (через код), а другое устройство подключается к этой конкретной сети... Как я могу обнаружить через код, чтобы увидеть детали устройств, подключенных к сети (AP)? ** Есть ли решение для этого?
Я видел приложение под названием Wifi Hot spot в HTC Desire, в котором эта функция показывает IP-адреса устройств, подключенных к сеть. Как это можно достичь?
Отъезд Обзор: Sprint Mobile Hotspot на HTC EVO 4G.
В нем отображается приложение, которое может отображать подключенных пользователей. Как мы можем сделать это программно? Есть ли для этого API?
Для создания точки доступа:
private void createWifiAccessPoint() {
if (wifiManager.isWifiEnabled())
{
wifiManager.setWifiEnabled(false);
}
Method[] wmMethods = wifiManager.getClass().getDeclaredMethods(); //Get all declared methods in WifiManager class
boolean methodFound = false;
for (Method method: wmMethods){
if (method.getName().equals("setWifiApEnabled")){
methodFound = true;
WifiConfiguration netConfig = new WifiConfiguration();
netConfig.SSID = "\""+ssid+"\"";
netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
//netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
//netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
//netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
//netConfig.preSharedKey = password;
//netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
//netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
//netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
//netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
try {
boolean apstatus = (Boolean) method.invoke(wifiManager, netConfig,true);
//statusView.setText("Creating a Wi-Fi Network \""+netConfig.SSID+"\"");
for (Method isWifiApEnabledmethod: wmMethods)
{
if (isWifiApEnabledmethod.getName().equals("isWifiApEnabled")){
while (!(Boolean)isWifiApEnabledmethod.invoke(wifiManager)){
};
for (Method method1: wmMethods){
if(method1.getName().equals("getWifiApState")){
int apstate;
apstate = (Integer)method1.invoke(wifiManager);
// netConfig = (WifiConfiguration)method1.invoke(wifi);
//statusView.append("\nSSID:"+netConfig.SSID+"\nPassword:"+netConfig.preSharedKey+"\n");
}
}
}
}
if(apstatus)
{
System.out.println("SUCCESSdddd");
//statusView.append("\nAccess Point Created!");
//finish();
//Intent searchSensorsIntent = new Intent(this,SearchSensors.class);
//startActivity(searchSensorsIntent);
}
else
{
System.out.println("FAILED");
//statusView.append("\nAccess Point Creation failed!");
}
}
catch (IllegalArgumentException e) {
e.printStackTrace();
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
if (!methodFound){
//statusView.setText("Your phone API does not contain setWifiApEnabled method to configure an access point");
}
}
Ответы
Ответ 1
Вы можете прочитать файл /proc/net/arp
, чтобы прочитать все записи ARP. См. Пример в сообщении блога Android: Как найти MAC-адрес аппаратного обеспечения удаленного хоста. В таблице ARP найдите все хосты, принадлежащие вашей сети Wi-Fi, на основе IP-адреса.
Вот пример кода, который подсчитывает количество хостов, подключенных к AP. Этот код предполагает, что одна запись ARP предназначена для телефона, подключенного к сети, а остальные - от хостов, подключенных к AP.
private int countNumMac()
{
int macCount = 0;
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("/proc/net/arp"));
String line;
while ((line = br.readLine()) != null) {
String[] splitted = line.split(" +");
if (splitted != null && splitted.length >= 4) {
// Basic sanity check
String mac = splitted[3];
if (mac.matches("..:..:..:..:..:..")) {
macCount++;
}
}
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
br.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
if (macCount == 0)
return 0;
else
return macCount-1; //One MAC address entry will be for the host.
}
Ответ 2
Вы можете выполнить ping-устройство, если знаете его имя хоста или его IP-адрес.
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("ping -c 1 " + hostname);
proc.waitFor();
Вы можете выполнить сканирование IP-адресов, пробовать каждый IP-адрес в сети для ответа с помощью пинга, как описано выше, или пытаться подключиться с помощью TCP или UDP.
Если вы знаете MAC-адрес, вы можете использовать таблицу ARP.
Если у вас есть собственное программное обеспечение, запущенное на устройствах, вы можете отправлять UDP-пакеты на каждое устройство и слушать их на своем устройстве Android. См. Отправка и получение широковещательных пакетов UDP в Android о том, как это сделать.
Ответ 3
Вы можете использовать accesspoint:
WifiApControl apControl = WifiApControl.getInstance(context);
// These are cached and may no longer be connected, see
// WifiApControl.getReachableClients(int, ReachableClientListener)
List<WifiApControl.Client> clients = apControl.getClients()