您好,登錄后才能下訂單哦!
之前調(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è)層次呀。。。,后來畢業(yè)設(shè)計(jì)選題干脆直接選擇了關(guān)于WIFI熱點(diǎn)通信方面的題目,調(diào)查和整理了一些資料,進(jìn)行了一段時(shí)間的學(xué)習(xí)算是彌補(bǔ)了自己的短板吧,主要還是希望自己能夠更加全面的掌握這方面的知識(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)行連接操作。
一.框架搭建
說明:
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)類圖:
二.模塊講解
接下來通過以下三個(gè)部分功能來逐一剖析,在此之前首先看一張最終的效果圖加深以下印象:
(由于本章講解的部分是我的整個(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í)序圖如下圖所示。
幾個(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列表。
幾個(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í)序圖如圖所示。
幾個(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í)使其可用。
至此,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
免責(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)容。