проблемы с передачей файлов с одного на несколько мобильных устройств в Android с использованием прямого Wi-Fi

Я пытаюсь создать приложение, в котором одно приложение для Android может передавать файлы (текст, видео, фото) на другие несколько устройств Android. Первоначально я думал использовать прямой Wi-Fi в Android для обмена файлами на нескольких устройствах.

но проблема, с которой я столкнулся с прямым WiFi, заключается в его непоследовательности в поддержании соединения и поиске других устройств.

1) иногда приложению приходится ждать около 5 минут или более минут, после чего оно может подключиться.

2) много раз после принятия приглашения через диалог с другого устройства требуется много времени для изменения соединения в состояние connected, и до этого устройство не может получить IP-адрес другого устройства.

столкнувшись с несоответствием, я решил отказаться от идеи использования прямого Wi-Fi. есть ли у кого-нибудь лучшее предложение по FASTER передаче нескольких файлов с одного мобильного устройства на другое без точек доступа.


person Hunt    schedule 07.06.2015    source источник
comment
Я начал с той же идеи, а затем, наконец, использовал Wi-Fi-Hotspot. Загляните в него...   -  person unrealsoul007    schedule 07.06.2015
comment
у вас есть какие-нибудь указатели? \   -  person Hunt    schedule 07.06.2015
comment
@unrealsoul007, не могли бы вы указать мне, где вы реализуете точку доступа Wi-Fi. Заранее спасибо.   -  person Rishav Singla    schedule 11.09.2020


Ответы (2)


Hotspot использует скрытые методы, которые вызываются с помощью Reflection. По сути, точка доступа — это точка доступа, к которой могут подключаться другие люди, поскольку они подключаются к обычным сетям Wi-Fi.

Как сказано выше, это точка доступа, следовательно, это две основные функции, которые необходимо поддерживать.

  1. Создание точки доступа
  2. Подключение к одному.

<сильный>1. Создание точки доступа

/**
     * Start AccessPoint mode with the specified
     * configuration. If the radio is already running in
     * AP mode, update the new configuration
     * Note that starting in access point mode disables station
     * mode operation
     * @param wifiConfig SSID, security and channel details as part of WifiConfiguration
     * @return {@code true} if the operation succeeds, {@code false} otherwise
     */
    public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
        try {
            if (enabled) { // disable WiFi in any case
                mWifiManager.setWifiEnabled(false);
            }

            Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
            return (Boolean) method.invoke(mWifiManager, wifiConfig, enabled);
        } catch (Exception e) {
            Log.e(this.getClass().toString(), "", e);
            return false;
        }
    }

Настройка точки доступа с паролем (WPA2 в следующем примере)

WifiConfiguration wifiCon = new WifiConfiguration();
wifiCon.SSID = "ssid";
wifiCon.preSharedKey = "password";
wifiCon.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
wifiCon.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wifiCon.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wifiCon.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
try
{
    Method setWifiApMethod = wm.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
    boolean apstatus=(Boolean) setWifiApMethod.invoke(wm, wifiCon,true);
} 
catch (Exception e) 
{
    Log.e(this.getClass().toString(), "", e);
}

<сильный>2. Подключение к точке доступа

public Boolean connectToHotspot(WifiManager wifiManager, String ssid) 
    {
        this.wifiManager = wifiManager;
        WifiConfiguration wc = new WifiConfiguration();
        wc.SSID = "\"" +encodeSSID(ssid) +"\"";
        wc.preSharedKey  = "\"" + generatePassword(new StringBuffer(ssid).reverse().toString())  +  "\"";
        wifiManager.addNetwork(wc);
        List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
        for( WifiConfiguration i : list ) {
            if(i!=null && i.SSID != null && i.SSID.equals(wc.SSID)) 
            {
                 wifiManager.disconnect();
                 boolean status = wifiManager.enableNetwork(i.networkId, true);
                 wifiManager.reconnect();               
                 return status;
            }
         }
        return false;
    }

Если подумать, вам также может понадобиться список устройств, подключенных к точке доступа.

/**
     * Gets a list of the clients connected to the Hotspot, reachable timeout is 300
     * @param onlyReachables {@code false} if the list should contain unreachable (probably disconnected) clients, {@code true} otherwise
     * @param finishListener, Interface called when the scan method finishes
     */
    public void getClientList(boolean onlyReachables, FinishScanListener finishListener) {
        getClientList(onlyReachables, 300, finishListener );
    }
/**
 * Gets a list of the clients connected to the Hotspot 
 * @param onlyReachables {@code false} if the list should contain unreachable (probably disconnected) clients, {@code true} otherwise
 * @param reachableTimeout Reachable Timout in miliseconds
 * @param finishListener, Interface called when the scan method finishes 
 */

public void getClientList(final boolean onlyReachables, final int reachableTimeout, final FinishScanListener finishListener) {

Runnable runnable = new Runnable() {
    public void run() {

        BufferedReader br = null;
        final ArrayList<String> resultIPAddr = new ArrayList<String>();

        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("..:..:..:..:..:..")) {
                        boolean isReachable = InetAddress.getByName(splitted[0]).isReachable(reachableTimeout);

                        if (!onlyReachables || isReachable) {
                            resultIPAddr.add(splitted[0]);
                        }
                    }
                }
            }
        } catch (Exception e) {
            Log.e(this.getClass().toString(), e.toString());
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                Log.e(this.getClass().toString(), e.getMessage());
            }
        }

        // Get a handler that can be used to post to the main thread
        Handler mainHandler = new Handler(context.getMainLooper());
        Runnable myRunnable = new Runnable() {
            @Override
            public void run() {
                finishListener.onFinishScan(result);
            }
        };
        mainHandler.post(myRunnable);
    }
};

Thread mythread = new Thread(runnable);
mythread.start();
}

Также вам может понадобиться отсканировать близлежащие сети Wi-Fi, чтобы получить сеть для подключения.

//This can be done by getting WifiManager's instance from the System.

WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiManager.getScanResults();

// The above is an async call and will results are available System will broadcast `SCAN_RESULTS_AVAILABLE` intent and you need to set a `BroadCastReceiver` for it.

// And get the results like this 

List<ScanResult> results = wifiManager.getScanResults();

Надеюсь, это все указатели, которые вам нужны..!!

person unrealsoul007    schedule 08.06.2015
comment
Я понял, о чем вы говорите, но как я могу получить доступ к коду для ClientScanResult, так как он содержит IP и другую информацию - person Hunt; 16.06.2015
comment
что вы имеете в виду под тем, как я могу получить доступ к коду для ClientScanResult..? Можно немного подробнее..? - person unrealsoul007; 16.06.2015
comment
хорошо, мне понадобится список устройств в радиусе действия и их IP слишком правильно, чтобы инициировать подключение и обмениваться файлами - person Hunt; 16.06.2015
comment
IP будет доступен только после того, как одно из устройств вызовет connectToHotspot. Затем, чтобы получить IP-адрес устройства, подключенного к точке доступа, вы можете получить его IP-адрес из splitted[0]. Splitted[0] — это IP, а splitted[3] — mac. Извините за ClientScanResult, это класс, который я не добавлял. - person unrealsoul007; 16.06.2015
comment
обновил ответ. Теперь resultIpAddr содержит IP-адреса всех устройств, подключенных к точке доступа. - person unrealsoul007; 16.06.2015
comment
если мои устройства подключатся к точке доступа, которую я создам с помощью этого кода, то они не смогут получить доступ к сети 3G, верно? - person Hunt; 16.06.2015
comment
Они будут. Пока нет способа заблокировать это. И, пожалуйста, отметьте ответ принятым, если он решает ваши упомянутые проблемы, чтобы будущие пользователи могли использовать его в качестве справочного материала. Спасибо! - person unrealsoul007; 16.06.2015

Прямой Wi-Fi как технология идеально подходит для одноранговой связи. Однако, говоря о прямом Wi-Fi для Android, он хорошо работает только для одного соединения, которое является только 1-1 вариантом использования. Можно создать один ко многим, где каждое устройство подключается к владельцу группы (Soft AP). Но даже если вы создадите один к одному и попытаетесь расширить вариант использования с несколькими, у вас будут проблемы с некоторыми устройствами, которые не подключаются идеально. Устройства застревают в приглашенном состоянии. Ознакомьтесь с некоторыми проблемами, перечисленными в разделе «Проблемы», после загрузки этого приложения https://play.google.com/store/apps/details?id=com.budius.WiFiShoot&hl=en

Если вы хотите использовать несколько подключений, лучше использовать точку доступа. Одно устройство становится точкой доступа, а другие клиенты подключаются к точке доступа. Оно используется множеством приложений, таких как xender, zapiya.

person Sahil Bahl    schedule 08.06.2015
comment
Скажите, пожалуйста, как я могу добиться того же, используя точку доступа, особенно с помощью программирования? - person Hunt; 08.06.2015