溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

【移動(dòng)開發(fā)】WIFI熱點(diǎn)通信(一)

發(fā)布時(shí)間:2020-07-13 22:25:05 來源:網(wǎng)絡(luò) 閱讀:6306 作者:zhf651555765 欄目:開發(fā)技術(shù)

     之前調(diào)查過Android中WIFI模塊的使用,也寫過兩篇學(xué)習(xí)總結(jié)的文章(http://smallwoniu.blog.51cto.com/3911954/1334951),后來發(fā)現(xiàn)DEMO里面還是有許多不足之處,前段時(shí)間有不少人Q我,問到WIFI模塊中的一些細(xì)節(jié),小弟這里只能說聲抱歉,因?yàn)楫?dāng)時(shí)的我也還沒研究到那個(gè)層次呀。。。【移動(dòng)開發(fā)】WIFI熱點(diǎn)通信(一),后來畢業(yè)設(shè)計(jì)選題干脆直接選擇了關(guān)于WIFI熱點(diǎn)通信方面的題目,調(diào)查和整理了一些資料,進(jìn)行了一段時(shí)間的學(xué)習(xí)算是彌補(bǔ)了自己的短板吧【移動(dòng)開發(fā)】WIFI熱點(diǎn)通信(一),主要還是希望自己能夠更加全面的掌握這方面的知識(shí)。


    廢話不多說了!今天主要講解WIFI熱點(diǎn)通信的前期準(zhǔn)備工作:

          1.熱點(diǎn)創(chuàng)建:創(chuàng)建指定名稱的熱點(diǎn)。

          2.熱點(diǎn)搜索:搜索附近可用熱點(diǎn),生成列表。

          3.熱點(diǎn)連接:在列表中點(diǎn)擊指定名稱的WIFI項(xiàng),進(jìn)行連接操作。


一.框架搭建

【移動(dòng)開發(fā)】WIFI熱點(diǎn)通信(一)

說明:

    1.幾個(gè)權(quán)限:

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

    2.相關(guān)類圖:

【移動(dòng)開發(fā)】WIFI熱點(diǎn)通信(一)


二.模塊講解

    接下來通過以下三個(gè)部分功能來逐一剖析,在此之前首先看一張最終的效果圖加深以下印象:

【移動(dòng)開發(fā)】WIFI熱點(diǎn)通信(一)

(由于本章講解的部分是我的整個(gè)項(xiàng)目中的一部分,所以大家不用在意圖片素材等其他細(xì)節(jié))


2.1熱點(diǎn)創(chuàng)建


點(diǎn)擊WIFI管理界面中創(chuàng)建熱點(diǎn)按鈕,首先會(huì)檢測當(dāng)前WIFI是否可用,若可用則需將其關(guān)閉掉才能創(chuàng)建WIFI熱點(diǎn),因?yàn)槭謾C(jī)熱點(diǎn)把手機(jī)的接收GPRS或3G信號(hào)轉(zhuǎn)化為WIFI信號(hào)再發(fā)出去,即你的手機(jī)就成了一個(gè)WIFI熱點(diǎn),所以共享和接收功能是不能同時(shí)進(jìn)行的。之后就是創(chuàng)建指定名稱的熱點(diǎn)過程。熱點(diǎn)創(chuàng)建時(shí)序圖如下圖所示。

【移動(dòng)開發(fā)】WIFI熱點(diǎn)通信(一)

幾個(gè)核心方法:

  • startApWifiHot()

/**
 * create a hot wifi
 * 
 * @param wifiName
 */
public boolean startApWifiHot(String wifiName) {
    Log.i(TAG, "into startApWifiHot(String wifiName) wifiName = " + wifiName);
    if (wifiManager.isWifiEnabled()) {
        wifiManager.setWifiEnabled(false);
    }
    if (mWifiHotAdmin != null) {
        return mWifiHotAdmin.startWifiAp(wifiName);
    }
    Log.i(TAG, "out startApWifiHot(String wifiName)");
    return false;
}
  • createWifiAp()

/**
 * start hot pot
 * @param wifiName
 * @return
 */
private boolean createWifiAp(String wifiName) {
    Log.i(TAG, "into startWifiAp() 啟動(dòng)一個(gè)Wifi 熱點(diǎn)!");
    Method method1 = null;
    boolean ret = false;
    try {
        //setWifiApEnabled is @hide, so reflect 
        method1 = mWifiManager.getClass().getMethod("setWifiApEnabled",
            WifiConfiguration.class, boolean.class);
        WifiConfiguration apConfig = createPassHotWifiConfig(wifiName,Global.PASSWORD);
        ret = (Boolean) method1.invoke(mWifiManager, apConfig, true);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
        Log.d(TAG, "stratWifiAp() IllegalArgumentException e");
    } 
    Log.i(TAG, "out startWifiAp() 啟動(dòng)一個(gè)Wifi 熱點(diǎn)!");
    return ret;
}


2.2熱點(diǎn)搜索


點(diǎn)擊WIFI管理界面中搜索熱點(diǎn)按鈕,同創(chuàng)建一樣,首先需要檢測WIFI熱點(diǎn)是否關(guān)閉,將其關(guān)閉掉后才能打開WIFI搜索功能。在搜索完成后系統(tǒng)會(huì)發(fā)送WIFI狀態(tài)變化廣播來通知消息欄,這里通過自定義廣播接收器接收了搜索成功消息,最后通過回調(diào)MainActivity中disPlayWifiScanResult()來顯示W(wǎng)IFI列表。

【移動(dòng)開發(fā)】WIFI熱點(diǎn)通信(一)

幾個(gè)核心方法:

  • scanWifiHot()

/** scan wifi hot **/
public void scanWifiHot() {
    Log.i(TAG, "into wifiHotScan()");
    if(mWifiHotAdmin.isWifiApEnabled(wifiManager)) {
        mWifiHotAdmin.closeWifiAp();
    }
    if (!wifiIsOpen()) { // WIFI is close currently
        //listen to the specified SSID wifi state 
        registerWifiStateBroadcast("");
        mWifiStateReceiver.setOperationsType(OperationsType.SCAN);
      
        //open wifi
        openWifi();
    } else { // WIFI is open currently
        scanNearWifiHots();
    }
    Log.i(TAG, "out wifiHotScan()");
}
  • scanNearWifiHots()

/** scan near wifi **/
private void scanNearWifiHots() {
    registerWifiScanBroadcast();
    //start scan
    wifiManager.startScan();
}

說明:這里的掃描實(shí)現(xiàn)過程是通過調(diào)用系統(tǒng)中WifiManager中掃描功能。

    /**
     * Request a scan for access points. Returns immediately. The availability
     * of the results is made known later by means of an asynchronous event sent
     * on completion of the scan.
     * @return {@code true} if the operation succeeded, i.e., the scan was initiated
     */
    public boolean startScan() {
        try {
            mService.startScan(false);
            return true;
        } catch (RemoteException e) {
            return false;
        }
    }


2.3熱點(diǎn)連接


在搜索完成之后,需要在WIFI列表中找到游戲的熱點(diǎn),點(diǎn)擊連接過程會(huì)處理一系列邏輯:當(dāng)前WIFI可用、是否已經(jīng)連接、注冊(cè)WIFI狀態(tài)變化廣播等,之后,開啟獨(dú)立線程進(jìn)行熱點(diǎn)匹配連接,熱點(diǎn)連接時(shí)序圖如圖所示。

【移動(dòng)開發(fā)】WIFI熱點(diǎn)通信(一)

       

幾個(gè)核心方法:

  • connectToHotpot()

/**
 * connect to hotpot
 * 
 * @param ssid
 * @param wifiList
 * @param password
 */
public void connectToHotpot(String ssid, List<ScanResult> wifiList, String password) {
    if (ssid == null || password.equals("") || !ssid.equals(Global.HOTPOT_NAME)) {
        Log.d(TAG, "WIFI ssid is null or ");
        mWifiBroadCastOperator.disPlayWifiConnResult(false, null);
        return;
     }
     if (ssid.equalsIgnoreCase(mSSID) && isConnecting) {
        Log.d(TAG, "same ssid is  connecting!");
        mWifiBroadCastOperator.disPlayWifiConnResult(false, null);
        return;
     }
    if (!checkCoonectHotIsEnable(ssid, wifiList)) {
        Log.d(TAG, "ssid is not in the wifiList!");
        mWifiBroadCastOperator.disPlayWifiConnResult(false, null);
        return;
    }
    if (!wifiIsOpen()) {
        //listen to ssid wifi
        registerWifiStateBroadcast(ssid);
        mWifiStateReceiver.setOperationsType(OperationsType.CONNECT);
        
        //open wifi
        openWifi();
    } else {
        // real connecting
        enableNetwork(ssid, password);
    }
}
  • enableNetwork()

/**
 * connect wifi hot really by thread
 * 
 * @param ssid
 * @param password
 */
private void enableNetwork(final String ssid, final String password) {
    // delete more conneted wifi
    deleteMoreCon(ssid);
    registerWifiConnectBroadCast();
    
    new Thread(new Runnable() {
        @Override
        public void run() {
             WifiConfiguration config = WifiHotConfigAdmin.createWifiNoPassInfo(ssid,             password);
            // if connect is successful
            isConnecting = connectHotSpot(config); 
            mSSID = ssid;
            if (!isConnecting) {
                Log.i(TAG, "into enableNetwork(WifiConfiguration wifiConfig) isConnecting             =" + isConnecting);
                return;
            }
        }
    }).start();
}
  • connectHotSpot()

    /**
     * connect wifi hot if successful
     * 
     * @param wifiConfig
     * @return
     */
    private boolean connectHotSpot(WifiConfiguration wifiConfig) {
        Log.i(TAG, "into enableNetwork(WifiConfiguration wifiConfig)");
       
        //the ID of the newly created network description
        int wcgID = wifiManager.addNetwork(wifiConfig);
        Log.i(TAG, "into enableNetwork(WifiConfiguration wifiConfig) wcID = "+ wcgID);
        if (wcgID < 0) {
            return false;
        }
        boolean flag = wifiManager.enableNetwork(wcgID, true);
        Log.i(TAG, "out enableNetwork(WifiConfiguration wifiConfig)");
        return flag;
    }

說明:連接熱點(diǎn)的過程實(shí)質(zhì)上就是獲取熱點(diǎn)配置信息,之后將其添加到自己的網(wǎng)絡(luò)信息中同時(shí)使其可用。


【移動(dòng)開發(fā)】WIFI熱點(diǎn)通信(一)

  

  

【移動(dòng)開發(fā)】WIFI熱點(diǎn)通信(一)



    至此,WIFI熱點(diǎn)通信的前期工作已經(jīng)完成,連接的手機(jī)端已在同一局域網(wǎng)內(nèi),若再有手機(jī)連接進(jìn)來會(huì)自動(dòng)為其分配該網(wǎng)段內(nèi)的IP地址,接下來我們要做的就是在IP地址上實(shí)現(xiàn)數(shù)據(jù)的傳輸通信。在下一章中準(zhǔn)備實(shí)現(xiàn)一個(gè)多人聊天室功能,希望能夠幫助到大家!


×××:http://down.51cto.com/data/1812897



向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI