android wifi設備連接通信,通過wifi與設備進行通信(Android)

通過wifi與設備進行通信(Android)

[復制鏈接]

本帖最后由 灞波兒奔 于 2019-2-17 21:40 編輯

通過wifi與設備進行通信(Android)

最近leader決定把app與設備之間的通信改為wifi,通過http協議實現設備之間的通信。

相對與之前的藍牙通信,的確簡單不少,但實際編碼當中也有坑。現在分享出來,希望能給需要的鞋童以幫助,有啥問題大家也可以討論一下。

切換手機wifi到指定wifi熱點

在baidu或者google輸入以上內容搜索,會出現很多相關資料,但是點開之后,才發現大多都是一樣,那么實用性怎么樣,于是我驗證了一下。

大致思路是,首先創建WifiConfiguration,按照wifi加密方式分為無密碼,有密碼(WEP,WPA)。

// 創建 WifiConfiguration

public WifiConfiguration CreateWifiInfo(String ssid, String password, int type) {

WifiConfiguration config = new WifiConfiguration();

config.SSID = "\"" + ssid + "\"";

WifiConfiguration tempConfig = this.IsExsits(ssid);

if(tempConfig != null) {

mWifiManager.removeNetwork(tempConfig.networkId);

}

if(Type == 1) //WIFICIPHER_NOPASS {

此處省略……

}

if(Type == 2) //WIFICIPHER_WEP {

此處省略……

}

if(Type == 3) //WIFICIPHER_WPA {

此處省略……

}

return config;

}

從代碼中看,之中還判斷ssid是否存在,如果存在就用removeNetwork將此ssid的wifi從已配置信息wifi列表中remove掉。這一步是必要的,因為ssid就是手機wifi列表中wifi的名稱。具有相同ssid的wifi可能并不是同一wifi,如果使用了上次保留的配置信息,就可能到導致自動連接wifi失敗。但此代碼因為是很早之前寫的,所以在android6.0版本上并不適用。android6.0新特性加強了對手機權限控制,同時在wifi模塊也不再允許對已保存的wifi配置列表進行更新和刪除,這將會導致removeNetwork操作失敗。

下面看一下添加切換手機到指定wifi熱點的代碼

// 更改前寫法

public boolean addNetwork(WifiConfiguration wcg) {

int wcgID = mWifiManager.addNetwork(wcg);

boolean b = mWifiManager.enableNetwork(wcgID, true);

return b;

}

此代碼的確能使部分手機成功切換到指定wifi,但其實代碼并不規范,這將會導致在部分手機中切換失敗。下面介紹正確寫法

//更改后寫法

public boolean addNetwork(WifiConfiguration wifiConfiguration) {

mWifiManager.disconnect();

int networkId = mWifiManager.addNetwork(wifiConfiguration);

boolean res = mWifiManager.enableNetwork(networkId, true);

mWifiManager.saveConfiguration();

mWifiManager.reconnect();

return res;

}

指定通過wifi進行http請求

不要以為這樣就完了,還有個大坑在等我們

在測試過程中,突然發現,在手機wifi和數據流量同時存在時,部分手機會直接使用數據流量進行通信,這樣就導致手機與設備之間無法通信,因為手機與設備只有處在同一局域網下才能正常通信。

這可麻煩了,于是到處到解決辦法,終于在WifiManager 這個類找到一個方法enableNetwork上面有一大段英文,我們一起看一下。

/**

* Allow a previously configured network to be associated with. If

* disableOthers is true, then all other configured

* networks are disabled, and an attempt to connect to the selected

* network is initiated. This may result in the asynchronous delivery

* of state change events.

*

* Note: If an application's target SDK version is

* {@link android.os.Build.VERSION_CODES#LOLLIPOP} or newer, network

* communication may not use Wi-Fi even if Wi-Fi is connected; traffic may

* instead be sent through another network, such as cellular data,

* Bluetooth tethering, or Ethernet. For example, traffic will never use a

* Wi-Fi network that does not provide Internet access (e.g. a wireless

* printer), if another network that does offer Internet access (e.g.

* cellular data) is available. Applications that need to ensure that their

* network traffic uses Wi-Fi should use APIs such as

* {@link Network#bindSocket(java.net.Socket)},

* {@link Network#openConnection(java.net.URL)}, or

* {@link ConnectivityManager#bindProcessToNetwork} to do so.

*

* @param netId the ID of the network in the list of configured networks

* @param disableOthers if true, disable all other networks. The way to

* select a particular network to connect to is specify {@code true}

* for this parameter.

* @return {@code true} if the operation succeeded

*/

原來解決辦法在 ConnectivityManager 這個類的方法 requestNetwork 可以指定使用 wifi 或者蜂窩數據等訪問網絡。如果要指定用蜂窩數據進行通信,將 addTransportType 設置為TRANSPORT_CELLULAR即可。在有可用指定傳輸類型連接上后,onAvailable方法就會調用,其實主要就是獲取到 Network 。 Network 通過 openConnection 得到 HttpURLConnection ,相信大家對HttpURLConnection十分熟悉,直接用它發起網絡請求就可以了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532216.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532216.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532216.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

工作匯報ppt案例_【贈書】開工大吉!今年一定要干過寫PPT的!

不知不覺,春節就過去了,新年開工,朋友圈里曬滿了開工紅包,領了開工禮就意味著真正新的一年開始了。雖然假期的慵懶安逸留下了倦怠的后遺癥,但狀態依舊切換到工作模式,畢竟每年都希望能比過去更進一步&#…

android webview 長按復制,Android webview 點擊或長按有蒙層 – 熱愛改變生活

Android 使用 webview 加載本地 html,在本地 html 上面點擊的時候會有一層橙色的蒙層,使用下面的代碼可以去掉。body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquo…

postscript打印機什么意思_漲知識|你不知道的關于打印機的打印過程和打印機驅動的那些事...

以前一直以為打印很簡單,不就是編輯好文件按個“打印”就行了?但其實打印過程可以復雜到你分分鐘“懷疑人生”。你以為的打印過程可能是這樣的 ↓。我們看到的打印過程然而,真正的打印過程是這樣的 ↓。實際上的打印過程打印機打印一頁文件或…

python dicom圖像分割_python讀取DICOM頭文件的實例

這篇文章主要介紹了關于python 讀取DICOM頭文件的實例,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下 用dicompyler軟件打開dicom圖像,頭文件如圖所示:當然也可以直接讀取: ds dicom.read_…

索尼android電視圖片輪播,電視投屏居然還能這樣玩?

原標題:電視投屏居然還能這樣玩?現如今,投屏幾乎成為大家日常生活必不可少的一種觀影方式,通過電視投屏可以帶來更清晰的畫面效果,成為追劇黨以及各類球賽愛好者的不二之選。那么今天小智就以索尼電視為例,…

python源碼多平臺編譯_提升Python程序運行效率的6個方法

Python是一個很酷的語言,因為你可以在很短的時間內利用很少的代碼做很多事情。不僅如此,它還能輕松地支持多任務,比如多進程等。Python批評者有時會說Python執行緩慢。本文將嘗試介紹6個技巧,可加速你的Python應用程序。 1.讓關鍵…

android 高并發彈幕,高并發實時直播彈幕研發實踐

高并發實時直播彈幕研發實踐直播間特點聊天室限制人數的原因應對萬級以上的實時互動跨服務器是為了解決單一服務器接入數量限制、發布消息吞吐限制等問題;多進程并發則是為了充分利用多核CPU以及減小一個循環規模從而達到降低延遲的目的。云巴實時系統的設計云巴是基…

linux python3_在Linux上安裝Python 3

在Linux上安裝Python 3這份文檔描述了如何在Ubuntu Linux機器上安裝Python 3.6。 想要獲取已安裝的Python 3版本號,可以通過終端運行命令: $ python3 --version 如果您使用的是Ubuntu 16.10或更新,可以通過以下命令簡單地安裝Python 3.6: $ s…

android手機電話鈴聲設置,安卓手機鈴聲怎么設置

網上有很多安卓手機鈴聲的設置教程,說什么SD卡里建立這個那個的文件夾,那問題是怎么才能進到SD卡里去建立文件夾啊?手機里哪個選項里進去呢?這里小編告訴你,可以通過電腦連接數據線管理SD卡。下面介紹兩種簡單的設置安…

安裝squid_「首席推薦」設置Squid轉發代理或者正向代理

如果您正在閱讀這篇文章,您可能會因為缺少與Squid相關的信息而感到沮喪,Squid是一種非常流行的轉發代理。這些令人沮喪的事情包括:在小的軟件修訂之后出現的重大的可用性變化,對幕后發生的事情的誤解,以及真正糟糕的文檔。這是一個…

android壓縮圖片質量,Android 圖片質量壓縮有關問題

Android 圖片質量壓縮問題本帖最后由 u013064347 于 2014-01-13 10:22:47 編輯網上看到一個圖片質量壓縮法,傳入1M以內圖片能正常壓縮,但是傳入2M多的圖片就報內存溢出,應該怎么解決?附上代碼Bitmap imagesBitmapFactory.decodeFi…

python標準庫os_Python基礎--人們一些最愛的標準庫(sys os fileinput)

這篇博客就介紹介紹常見的、人們鐘愛的python中的標準庫。 sys 從字面上也能看出來,是system的縮寫。這個模塊能夠訪問與python解析器緊密聯系的變量和函數。 argv 命令行參數 exit 退出當前程序 modules 映射模塊名到載入模塊的字典 path 目錄 platform 平臺標識符…

android區域截圖app,【干貨】最新App應用市場截圖尺寸大全

今天給大家分享最新的干貨,剛好碰上這段時間設計市場截圖,所以給各位設計新人,分享本人整合的尺寸大全,希望對你們的設計之路有所幫助。一、IOS App Store尺寸尺寸(機型) 大小(px)3.5寸(iphone4/4s)…

python如何運行一個python程序_在python中,如何運行一個命令行程序,它在發送Ctrl+D之前不會返回...

由于沒有人提供任何代碼來幫助解決這個問題,我將做如下的事情。結果發現pexpect非常強大,而且您不需要signal模塊。在import os import sys import pexpect def run_server(): server_dir /path/to/server/root current_dir os.path.abspath(os.curdir…

android app外喚起,Android 喚起app的多種方式

方式一(通過Intent喚起):我們自己的app代碼:ComponentName componetName new ComponentName("com.lh.jimtrency.webviewdemo","com.lh.jimtrency.webviewdemo.MainActivity");//(另外一個應用程序的包名,要啟動的Activi…

2018python做圖形界面哪個庫簡單_2018年常見的python編程開發庫都有哪些類型

python編程開發可以說是目前比較熱門的一項編程開發語言了,而今天我們就一起來了解一下,關于python編程都有哪些常見的python庫可以使用。1、TensorFlow “TensorFlow是一個使用數據流圖進行數值計算的開源軟件庫。圖形節點表示數學運算,而圖…

android條形圖,MPAndroid組條形圖未顯示

這個問題已經在這里有了答案:????????????>????????????How to check if activity is in foreground or in visible background?????????????????????????????????????22個這是我用于使用MPAndroi…

c++ socket線程池_java 網絡編程,Socket編程

Java的網絡編程主要涉及到的內容是Socket編程,那么什么是Socket呢?簡單地說,Socket,套接字,就是兩臺主機之間邏輯連接的端點。TPC/IP協議是傳輸層協議,主要解決數據如何在網絡中傳輸,而HTTP是應…

android簽名忘記密碼,修改Android簽名證書keystore的密碼、別名alias以及別名密碼

之前在測試Eclipse ADT的Custom debug Eclipse ADT的Custom debug keystore所需證書規格,提到過自定義調試證書的密碼和1. 首先當然是先復制一份正式證書出來作為要修改為的臨時調試證書。2. 修改keystore密碼的命令(keytool為JDK帶的命令行工具):keytoo…

python列表轉換成數字_Python中列表元素轉為數字的方法分析

本文實例講述了Python中列表元素轉為數字的方法。分享給大家供大家參考,具體如下: 有一個數字字符的列表: numbers [1, 5, 10, 8] 想要把每個元素轉換為數字: numbers [1, 5, 10, 8] 用一個循環來解決: new_numbers …