版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Android網(wǎng)絡(luò)程序設(shè)計(jì)嵌入式系統(tǒng)開(kāi)發(fā)與設(shè)計(jì)網(wǎng)絡(luò)通信基礎(chǔ)計(jì)算機(jī)網(wǎng)絡(luò)計(jì)算機(jī)網(wǎng)絡(luò)相互連接的、自治的計(jì)算機(jī)集合,以共享資源為目的互聯(lián)網(wǎng)由多個(gè)計(jì)算機(jī)網(wǎng)絡(luò)相互連接而成,而不論采用何種協(xié)議與技術(shù)的網(wǎng)絡(luò)無(wú)線(xiàn)網(wǎng)采用無(wú)線(xiàn)傳輸介質(zhì)(無(wú)線(xiàn)電、紅外線(xiàn)等)的網(wǎng)絡(luò)包括遠(yuǎn)距離無(wú)線(xiàn)連接和近距離無(wú)線(xiàn)連接前者的代表是2G網(wǎng)絡(luò)后者的代表是紅外線(xiàn)和射頻3InternetInternet因特網(wǎng)由那些使用公用語(yǔ)言互相通信的計(jì)算機(jī)連接而成的全球網(wǎng)絡(luò)Internet的特點(diǎn)連接范圍廣泛,是全球性的網(wǎng)絡(luò)內(nèi)容豐富,具有海量的資源采用TCP/IP協(xié)議棧,具有靈活多樣的接入方式能夠?qū)π畔⑦M(jìn)行快捷的檢索與共享4無(wú)線(xiàn)網(wǎng)絡(luò)無(wú)線(xiàn)局域網(wǎng)(WLAN)工作于2.5GHz或5GHz頻段,以無(wú)線(xiàn)方式構(gòu)成的局域網(wǎng)Wifi全稱(chēng)wirelessfidelity基于IEEE802.11標(biāo)準(zhǔn)的無(wú)線(xiàn)網(wǎng)絡(luò)品牌目前WLAN的主流無(wú)線(xiàn)城域網(wǎng)(WMAN)IEEE802.16標(biāo)準(zhǔn)及其擴(kuò)展標(biāo)準(zhǔn)覆蓋面積較大無(wú)線(xiàn)廣域網(wǎng)(WWAN)IEEE802.20標(biāo)準(zhǔn)以比城域網(wǎng)更大范圍內(nèi)的無(wú)線(xiàn)連接為目標(biāo)5無(wú)線(xiàn)網(wǎng)絡(luò)(2)3G第三代移動(dòng)通信網(wǎng)絡(luò)支持語(yǔ)音和數(shù)據(jù)傳輸,尤其是高速數(shù)據(jù)傳輸3G標(biāo)準(zhǔn)WCDMA歐洲版本3G,由中國(guó)聯(lián)通采用CDMA2000美國(guó)版本3G,由中國(guó)電信采用TD-SCDMA中國(guó)版本3G,由中國(guó)移動(dòng)采用6Android支持的網(wǎng)絡(luò)7Android網(wǎng)絡(luò)接口基于Linux內(nèi)核的Android包含一組優(yōu)秀的聯(lián)網(wǎng)功能Android平臺(tái)有3種網(wǎng)絡(luò)接口.*(標(biāo)準(zhǔn)Java接口)org.apache(Apache接口).*(Android網(wǎng)絡(luò)接口)J.*(標(biāo)準(zhǔn)java接口)提供與聯(lián)網(wǎng)有關(guān)的類(lèi)包括流和數(shù)據(jù)包套接字,Internet協(xié)議,常見(jiàn)HTTP協(xié)議處理,比如創(chuàng)建URL以及URLConnection/HttpURLConnection對(duì)象設(shè)置連接參數(shù),連接到服務(wù)器,向服務(wù)器謝數(shù)據(jù),從服務(wù)器讀取數(shù)據(jù)等通信8Android網(wǎng)絡(luò)接口(2)org.apache(Apache接口)Android平臺(tái)引入ApacheHttpClientHttpClient是ApacheJakartaCommon下的子項(xiàng)目可以用來(lái)提供高效的、最新的、功能豐富的支持HTTP協(xié)議的客戶(hù)端編程工具包,并且支持HTTP協(xié)議最新的版本和建議提供針對(duì)ApacheHttpClient的封裝和擴(kuò)展例如設(shè)置缺省的HTTP超時(shí)和緩存大小等Android平臺(tái)用的版本是HttpClient4.0對(duì)于HttpClient類(lèi),可以使用HttpPost和HttpGet類(lèi)以及HttpResponse來(lái)進(jìn)行網(wǎng)絡(luò)連接9Android網(wǎng)絡(luò)接口(3).*(Android網(wǎng)絡(luò)接口)實(shí)際上是通過(guò)對(duì)Apache中HttpClient的封裝來(lái)實(shí)現(xiàn)的一個(gè)HTTP編程接口提供HTTP請(qǐng)求隊(duì)列管理以及HTTP連接池管理提高并發(fā)請(qǐng)求情況下(如轉(zhuǎn)載網(wǎng)頁(yè)時(shí))的處理效率包括其他相關(guān)的接口網(wǎng)絡(luò)狀態(tài)監(jiān)視等接口網(wǎng)絡(luò)訪問(wèn)的Socket常用的Uri類(lèi)有關(guān)WiFi相關(guān)的類(lèi)等等10Android藍(lán)牙Android藍(lán)牙協(xié)議棧Android藍(lán)牙協(xié)議棧BlueZ支持GAP,SDP和RFCOMM規(guī)范是SIG認(rèn)證的藍(lán)牙協(xié)議棧BluezGPL許可Android的框架內(nèi)與用戶(hù)空間的bluez代碼通過(guò)D-BUS進(jìn)程通訊進(jìn)行交互,以避免專(zhuān)有代碼Headset和Handsfree(v1.5)規(guī)范在Android框架中實(shí)現(xiàn)的與PhoneApp緊密耦合是SIG認(rèn)證的12Android藍(lán)牙協(xié)議棧(2)以庫(kù)為導(dǎo)向的藍(lán)牙棧視圖13Android藍(lán)牙協(xié)議棧(3)以進(jìn)程為導(dǎo)向視圖14Android藍(lán)牙協(xié)議棧(4)RFCOMM協(xié)議簡(jiǎn)單傳輸協(xié)議基于歐洲電信標(biāo)準(zhǔn)協(xié)會(huì)ETSI07.10規(guī)程的串行線(xiàn)性仿真協(xié)議針對(duì)如何在兩個(gè)不同設(shè)備上的應(yīng)用之間保證一條完整的通信路徑,并在它們之間保持一通信段提供RS232控制和狀態(tài)信號(hào),為上層業(yè)務(wù)(如傳統(tǒng)的串行線(xiàn)纜應(yīng)用)提供了傳送能力如基帶上的損壞,CTS以及數(shù)據(jù)信號(hào)等藍(lán)牙協(xié)議棧需要提供與有線(xiàn)串口一致的通信接口而開(kāi)發(fā)出的協(xié)議RFCOMM協(xié)議提供對(duì)基于L2CAP協(xié)議的串口仿真可支持在兩個(gè)BT設(shè)備之間同時(shí)保持高達(dá)60路的通信連接。RFCOMM只針對(duì)直接互連設(shè)備之間的連接,或者是設(shè)備與網(wǎng)絡(luò)接入設(shè)備之間的互連15Android藍(lán)牙開(kāi)發(fā)Android中有關(guān)藍(lán)牙的類(lèi)和接口位于android.bluetooth包中藍(lán)牙API的主要功能范圍允許應(yīng)用程序連接和斷開(kāi)藍(lán)牙耳機(jī)、掃描儀和其他藍(lán)牙設(shè)備編寫(xiě)和修改本地服務(wù)的SDP協(xié)議數(shù)據(jù)庫(kù)查詢(xún)其他藍(lán)牙設(shè)備上的SDP協(xié)議數(shù)據(jù)庫(kù)在Android上建立RFCOMM協(xié)議的連接并連接到其他指定設(shè)備上16Android藍(lán)牙開(kāi)發(fā)(2)Android藍(lán)牙BluetoothAdapter:藍(lán)牙適配器(代表本地藍(lán)牙適配器)BluetoothClass:藍(lán)牙類(lèi)(主要包括服務(wù)和設(shè)別)BluetoothClass.Device:藍(lán)牙設(shè)備類(lèi)BluetoothClass.藍(lán)牙設(shè)備管理BluetoothClass.Service:有關(guān)藍(lán)牙服務(wù)的類(lèi)BluetoothDevice:藍(lán)牙設(shè)備(主要指遠(yuǎn)程藍(lán)牙設(shè)備)BluetoothServerSocket:監(jiān)聽(tīng)藍(lán)牙連接的類(lèi)BluetoothSocket:藍(lán)牙連接類(lèi)17Android藍(lán)牙開(kāi)發(fā)(3)BluetoothAdapter類(lèi)本地的藍(lán)牙適配器是所有藍(lán)牙交互的的入口點(diǎn)通過(guò)該類(lèi)可以發(fā)現(xiàn)其他藍(lán)牙設(shè)備,查詢(xún)綁定了的設(shè)備,使用已知的MAC地址實(shí)例化一個(gè)藍(lán)牙設(shè)備和建立一個(gè)BluetoothServerSocket(作為服務(wù)器端)來(lái)監(jiān)聽(tīng)來(lái)自其他設(shè)備的連接BluetoothDevice類(lèi)遠(yuǎn)端的藍(lán)牙設(shè)備用來(lái)請(qǐng)求遠(yuǎn)端藍(lán)牙設(shè)備連接或者獲取遠(yuǎn)端藍(lán)牙設(shè)備的名稱(chēng)、地址、種類(lèi)和綁定狀態(tài)其信息是封裝在BluetoothSocket中18Android藍(lán)牙開(kāi)發(fā)(4)BluetoothSocket類(lèi)藍(lán)牙套接字的接口(類(lèi)似于TCP中的套接字)應(yīng)用程序通過(guò)輸入、輸出流與其他藍(lán)牙設(shè)備通信的連接點(diǎn)。BlueboothServerSocket類(lèi)代表打開(kāi)服務(wù)連接來(lái)監(jiān)聽(tīng)可能到來(lái)的連接請(qǐng)求(屬于server端)為了連接兩個(gè)藍(lán)牙設(shè)備必須有一個(gè)設(shè)備作為服務(wù)器打開(kāi)一個(gè)服務(wù)套接字當(dāng)遠(yuǎn)端設(shè)備發(fā)起連接連接請(qǐng)求的時(shí)候,并且已經(jīng)連接到了的時(shí)候,BlueboothServerSocket類(lèi)將會(huì)返回一個(gè)BluetoothSocketBluetoothClass類(lèi)描述藍(lán)牙設(shè)備的一般特點(diǎn)和能力其只讀屬性集定義了設(shè)備的主、次設(shè)備類(lèi)和一些相關(guān)服務(wù)沒(méi)有準(zhǔn)確地描述所有該設(shè)備所支持的藍(lán)牙文件和服務(wù),而是作為對(duì)設(shè)備種類(lèi)來(lái)說(shuō)的暗示19Android藍(lán)牙開(kāi)發(fā)(5)BluetoothAdapter主要方法cancelDiscovery():取消正在進(jìn)行的藍(lán)牙設(shè)備搜索disable():關(guān)閉藍(lán)牙enable():打開(kāi)藍(lán)牙這個(gè)方法打開(kāi)藍(lán)牙不會(huì)彈出提示提示用戶(hù)的方法20Intentenabler=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enabler,reCode);//同startActivity(enabler);Android藍(lán)牙開(kāi)發(fā)(6)BluetoothAdapter主要方法getAddress():獲取本地藍(lán)牙地址getDefaultAdapter():獲取默認(rèn)BluetoothAdapter的唯一方法getName():獲取本地藍(lán)牙名稱(chēng)getRemoteDevice(Stringaddress):根據(jù)藍(lán)牙地址獲取遠(yuǎn)程藍(lán)牙設(shè)備getState():獲取本地藍(lán)牙適配器當(dāng)前狀態(tài)isDiscovering():判斷當(dāng)前是否正在查找設(shè)備,是則返回trueisEnabled():判斷藍(lán)牙是否打開(kāi),已打開(kāi)返回true,否則返回falselistenUsingRfcommWithServiceRecord(Stringname,UUIDuuid):根據(jù)名稱(chēng)創(chuàng)建UUID并返回BluetoothServerSocket創(chuàng)建BluetoothSocket服務(wù)器端的第一步startDiscovery():開(kāi)始搜索搜索的第一步21Android藍(lán)牙開(kāi)發(fā)(7)BluetoothDevice主要方法createRfcommSocketToServiceRecord(UUIDuuid):根據(jù)UUID創(chuàng)建并返回一個(gè)BluetoothSocket其他方法與BluetoothAdapter相似BluetoothServerSocket主要方法只有三個(gè)方法兩個(gè)重載的accept(),accept(inttimeout)兩者的區(qū)別在于后面的方法指定了過(guò)時(shí)時(shí)間執(zhí)行這兩個(gè)方法的時(shí)候,直到接收到了客戶(hù)端的請(qǐng)求(或是過(guò)期之后)都會(huì)阻塞線(xiàn)程,應(yīng)該放在新線(xiàn)程里運(yùn)行這兩個(gè)方法都返回一個(gè)BluetoothSocket,最后的連接也是服務(wù)器端與客戶(hù)端的兩個(gè)BluetoothSocket的連接close():關(guān)閉22Android藍(lán)牙開(kāi)發(fā)(8)BluetoothSocket主要方法5個(gè)方法是客戶(hù)端,與BluetoothServerSocket相對(duì)close():關(guān)閉connect():連接getInptuStream():獲取輸入流getOutputStream():獲取輸出流getRemoteDevice():獲取遠(yuǎn)程設(shè)備指的是獲取bluetoothSocket指定連接的那個(gè)遠(yuǎn)程藍(lán)牙設(shè)備23Android藍(lán)牙開(kāi)發(fā)(9)藍(lán)牙設(shè)備使用啟動(dòng)藍(lán)牙功能查找設(shè)備查詢(xún)匹配設(shè)備掃描設(shè)備使能被發(fā)現(xiàn)連接設(shè)備服務(wù)端連接客戶(hù)端連接管理連接24Android藍(lán)牙開(kāi)發(fā)(10)啟動(dòng)藍(lán)牙功能首先通過(guò)調(diào)用靜態(tài)方法getDefaultAdapter()獲取藍(lán)牙適配器BluetoothAdapter之后可以使用該對(duì)象如果返回為空,則無(wú)法繼續(xù)執(zhí)行然后調(diào)用isEnabled()來(lái)查詢(xún)當(dāng)前藍(lán)牙設(shè)備的狀態(tài)如果返回為false,表示藍(lán)牙設(shè)備沒(méi)有開(kāi)啟然后封裝一個(gè)ACTION_REQUEST_ENABLE請(qǐng)求到intent里面調(diào)用startActivityForResult()方法使能藍(lán)牙設(shè)備25Android藍(lán)牙開(kāi)發(fā)(11)查找設(shè)備使用BluetoothAdapter類(lèi)里的方法,可以查找大約十米內(nèi)的遠(yuǎn)端設(shè)備或者查詢(xún)?cè)谀闶謾C(jī)上已經(jīng)匹配的其他手機(jī)如果對(duì)方藍(lán)牙設(shè)備打開(kāi),則可以初始化連接第一次連接其他藍(lán)牙設(shè)備配對(duì)的請(qǐng)求會(huì)自動(dòng)顯示給用戶(hù)當(dāng)設(shè)備匹配好之后,其一些基本信息(主要是名字和MAC)被保存下來(lái)并可以使用藍(lán)牙的API來(lái)讀取使用已知的MAC地址就可以對(duì)遠(yuǎn)端的藍(lán)牙設(shè)備發(fā)起連接請(qǐng)求匹配好的設(shè)備和連接上的設(shè)備的區(qū)別匹配好說(shuō)明對(duì)方設(shè)備發(fā)現(xiàn)了本地設(shè)備的存在,并擁有一個(gè)共同的識(shí)別碼,并且可以連接連接上表示當(dāng)前設(shè)備共享一個(gè)RFCOMM信道并且兩者之間可以交換數(shù)據(jù)藍(lán)牙設(shè)備在連接之前必須已經(jīng)配對(duì)好26Android藍(lán)牙開(kāi)發(fā)(12)查詢(xún)匹配好的設(shè)備在建立連接之前必須先查詢(xún)匹配好的藍(lán)牙設(shè)備集來(lái)提供候選連接設(shè)備建立一個(gè)藍(lán)牙連接只需要MAC地址掃描設(shè)備調(diào)用startDiscovery()方法掃描的過(guò)程大概持續(xù)是12秒應(yīng)用程序?yàn)榱薃CTION_FOUND動(dòng)作需要注冊(cè)一個(gè)BroadcastReceiver來(lái)接受設(shè)備掃描到的信息對(duì)于每一個(gè)設(shè)備,系統(tǒng)都會(huì)廣播ACTION_FOUND動(dòng)作掃描過(guò)程很耗費(fèi)資源一旦找到需要的設(shè)備之后,在發(fā)起連接請(qǐng)求之前,確保程序調(diào)用cancelDiscovery()方法停止掃描如果已經(jīng)連接上一個(gè)設(shè)備,啟動(dòng)掃描會(huì)減少通信帶寬27Android藍(lán)牙開(kāi)發(fā)(13)使能被發(fā)現(xiàn)如果希望使設(shè)備能夠被其他設(shè)備發(fā)現(xiàn),需要進(jìn)行封裝將ACTION_REQUEST_DISCOVERABLE動(dòng)作封裝在intent中并調(diào)用startActivityForResult(Intent,int)方法將在不使應(yīng)用程序退出的情況下使設(shè)備能夠被發(fā)現(xiàn)缺省情況下使能時(shí)間為120秒可以通過(guò)添加EXTRA_DISCOVERABLE_DURATION字段來(lái)改變使能時(shí)間出于信息安全考慮,最大不超過(guò)300秒如果準(zhǔn)備對(duì)該遠(yuǎn)端設(shè)備發(fā)現(xiàn)一個(gè)連接,不需要開(kāi)啟使能設(shè)備被發(fā)現(xiàn)功能28Android藍(lán)牙開(kāi)發(fā)(14)連接設(shè)備建立兩個(gè)藍(lán)牙設(shè)備之間的連接必須實(shí)現(xiàn)客戶(hù)端和服務(wù)器端的代碼任何一個(gè)設(shè)備都必須可以作為服務(wù)端或者客戶(hù)端一個(gè)開(kāi)啟服務(wù)來(lái)監(jiān)聽(tīng),一個(gè)發(fā)起連接請(qǐng)求(使用服務(wù)器端設(shè)備的MAC地址)當(dāng)它們都擁有一個(gè)藍(lán)牙套接字在同一RFECOMM信道上的時(shí)候,可以認(rèn)為他們之間已經(jīng)連接上了服務(wù)端和客戶(hù)端通過(guò)不同的方式或其他們的藍(lán)牙套接字當(dāng)一個(gè)連接監(jiān)聽(tīng)到的時(shí)候,服務(wù)端獲取到藍(lán)牙套接字當(dāng)客戶(hù)可打開(kāi)一個(gè)FRCOMM信道給服務(wù)器端的時(shí)候,客戶(hù)端獲取到藍(lán)牙套接字連接過(guò)程中如果兩個(gè)藍(lán)牙設(shè)備還沒(méi)有配對(duì)好的,android系統(tǒng)會(huì)通過(guò)一個(gè)通知或者對(duì)話(huà)框的形式來(lái)通知用戶(hù)RFCOMM連接請(qǐng)求會(huì)在用戶(hù)選擇之前阻塞29Android藍(lán)牙開(kāi)發(fā)(15)服務(wù)端的連接要連接兩臺(tái)設(shè)備時(shí),一個(gè)必須作為服務(wù)端(通過(guò)持有一個(gè)打開(kāi)的BluetoothServerSocket),目的是監(jiān)聽(tīng)外來(lái)連接請(qǐng)求當(dāng)監(jiān)聽(tīng)到以后提供一個(gè)連接上的BluetoothSocket給客戶(hù)端,當(dāng)客戶(hù)端從BluetoothServerSocket得到BluetoothSocket以后就可以銷(xiāo)毀BluetoothServerSocket如果需要監(jiān)聽(tīng)更多的連接請(qǐng)求,則不必銷(xiāo)毀客戶(hù)端的連接為了初始化一個(gè)與遠(yuǎn)端設(shè)備的連接,需要先獲取代表該設(shè)備的一個(gè)BluetoothDevice對(duì)象通過(guò)BluetoothDevice對(duì)象來(lái)獲取BluetoothSocket并初始化連接30Android藍(lán)牙開(kāi)發(fā)(16)管理連接當(dāng)設(shè)備連接上以后,每個(gè)設(shè)備都擁有各自的BluetoothSocket可以實(shí)現(xiàn)設(shè)備之間數(shù)據(jù)的共享通過(guò)調(diào)用getInputStream()和getOutputStream()方法來(lái)獲取輸入輸出流然后通過(guò)調(diào)用read(byte[])和write(byte[]).方法來(lái)讀取或者寫(xiě)數(shù)據(jù)讀取和寫(xiě)操作都是阻塞調(diào)用需要建立一個(gè)專(zhuān)用線(xiàn)程來(lái)進(jìn)行管理31AndroidWi-FiAndroidWifiAndroidWifi開(kāi)發(fā)Android為WiFi編程提供了一些重要的包這些包在.wifi包中33AndroidWifi(2)canResult主要用來(lái)描述已經(jīng)檢測(cè)出的接入點(diǎn)包括接入點(diǎn)的地址,接入點(diǎn)的名稱(chēng),身份認(rèn)證,頻率,信號(hào)強(qiáng)度等信息WifiConfigurationWifi網(wǎng)絡(luò)的配置,包括安全設(shè)置等WifiInfowifi無(wú)線(xiàn)連接的描述包括接入點(diǎn),網(wǎng)絡(luò)連接狀態(tài),隱藏的接入點(diǎn),IP地址,連接速度,MAC地址,網(wǎng)絡(luò)ID,信號(hào)強(qiáng)度等信息WifiManager用來(lái)管理wifi連接提供管理WiFi連接的大部分API34AndroidWifi(3)WifiInfo的主要方法getBSSID():
獲取BSSIDgetDetailedStateOf():
獲取客戶(hù)端的連通性getHiddenSSID():獲得SSID是否被隱藏getIpAddress():獲取IP地址getLinkSpeed():獲得連接的速度getMacAddress():獲得Mac地址getRssi():獲得802.11n網(wǎng)絡(luò)的信號(hào)getSSID():獲得SSIDgetSupplicanState():返回具體客戶(hù)端狀態(tài)的信息35AndroidWifi(4)Wifi網(wǎng)卡狀態(tài)由一系列的整形常量表示W(wǎng)IFI_STATE_DISABLEDWIFI網(wǎng)卡不可用(1)WIFI_STATE_DISABLINGWIFI網(wǎng)卡正在關(guān)閉(0)WIFI_STATE_ENABLEDWIFI網(wǎng)卡可用(3)WIFI_STATE_ENABLINGWIFI網(wǎng)正在打開(kāi)(2)(WIFI啟動(dòng)需要一段時(shí)間)WIFI_STATE_UNKNOWN未知網(wǎng)卡狀態(tài)36AndroidWifi(5)Wifi初始化SystemServer啟動(dòng)時(shí)生成一個(gè)ConnectivityService實(shí)例ConnectivityService的構(gòu)造函數(shù)創(chuàng)建WifiServiceWifiStateTracker創(chuàng)建WifiMonitor接收來(lái)自底層的事件WifiService和WifiMonitor是整個(gè)模塊的核心WifiService負(fù)責(zé)啟動(dòng)關(guān)閉wpa_supplicant、啟動(dòng)關(guān)閉WifiMonitor監(jiān)視線(xiàn)程和把命令下發(fā)給wpa_supplicantWifiMonitor則負(fù)責(zé)從wpa_supplicant接收事件通知37AndroidWifi(6)使能WIFIWirelessSettings在初始化的時(shí)候配置了由WifiEnabler來(lái)處理Wifi按鈕當(dāng)用戶(hù)按下Wifi按鈕后,Android調(diào)用WifiEnabler的onPreferenceChange再由WifiEnabler調(diào)用WifiManager的setWifiEnabled接口函數(shù)通過(guò)AIDL實(shí)際調(diào)用WifiService的setWifiEnabled函數(shù)WifiService接著向自身發(fā)送一條MESSAGE_ENABLE_WIFI消息在處理該消息的代碼中做真正的使能工作首先裝載WIFI內(nèi)核模塊,該模塊的位置硬編碼為”/system/lib/modules/wlan.ko”然后啟動(dòng)wpa_supplicant,配置文件硬編碼為”/data/misc/wifi/wpa_supplicant.conf”再通過(guò)WifiStateTracker來(lái)啟動(dòng)WifiMonitor中的監(jiān)視線(xiàn)程38AndroidWifi(7)使能成功使能成功后廣播發(fā)送WIFI_STATE_CHANGED_ACTION相應(yīng)的Intent通知外界WIFI已經(jīng)成功使能WifiEnabler創(chuàng)建時(shí)向Android注冊(cè)接收WIFI_STATE_CHANGED_ACTION收到該Intent,從而開(kāi)始掃描查找AP掃描的入口函數(shù)是WifiService的startScan向wpa_supplicant發(fā)送SCAN命令當(dāng)wpa_supplicant處理完SCAN命令后向控制通道發(fā)送事件通知掃描完成從而wifi_wait_for_event函數(shù)會(huì)接收到該事件
WifiMonitor中的MonitorThread被執(zhí)行來(lái)處理該事件WifiStateTracker接著廣播發(fā)送SCAN_RESULTS_AVAILABLE_ACTION39AndroidWifi(8)查找APWifiLayer相關(guān)處理函數(shù)handleScanResultsAvailable會(huì)被調(diào)用WfiLayer注冊(cè)了接收SCAN_RESULTS_AVAILABLE_ACTION這個(gè)Intent該函數(shù)先取得SCAN的結(jié)果,通過(guò)向wpa_supplicant發(fā)送SCAN_RESULT命令并讀取返回值來(lái)實(shí)現(xiàn)對(duì)每一個(gè)掃描返回的APWifiLayer調(diào)用WifiSettings的onAccessPointSetChanged函數(shù)最終把該AP加到GUI顯示列表中40AndroidWifi(9)配置AP參數(shù)當(dāng)用戶(hù)在WifiSettings界面上選擇了一個(gè)AP后,顯示配置AP參數(shù)的一個(gè)對(duì)話(huà)框連接當(dāng)用戶(hù)在AcessPointDialog中選擇好加密方式和輸入密鑰之后,再點(diǎn)擊連接按鈕,Android就會(huì)去連接這個(gè)APWifiLayer先檢測(cè)這個(gè)AP是不是之前被配置過(guò)通過(guò)向wpa_supplicant發(fā)送LIST_NETWORK命令并且比較返回值來(lái)實(shí)現(xiàn)如果wpa_supplicant沒(méi)有這個(gè)AP的配置信息,則會(huì)向wpa_supplicant發(fā)送ADD_NETWORK命令來(lái)添加該APADD_NETWORK命令返回一個(gè)IDWifiLayer用這個(gè)返回的ID作為參數(shù)向wpa_supplicant發(fā)送ENABLE_NETWORK命令,從而讓wpa_supplicant去連接該AP41AndroidWifi(10)配置IP地址當(dāng)wpa_supplicant成功連接上AP之后向控制通道發(fā)送事件通知連接上APwifi_wait_for_event函數(shù)接收到該事件
WifiMonitor中的MonitorThread會(huì)被執(zhí)行來(lái)處理該事件WifiMonitor調(diào)用WifiStateTracker的notifyStateChangeWifiStateTracker接著往自身發(fā)送EVENT_DHCP_START消息來(lái)啟動(dòng)DHCP去獲取IP地址然后再?gòu)V播發(fā)送NETWORK_STATE_CHANGED_ACTION這個(gè)IntentWifiLayer相關(guān)處理函數(shù)handleNetworkStateChanged會(huì)被調(diào)用注冊(cè)接收NETWORK_STATE_CHANGED_ACTION這個(gè)Intent當(dāng)DHCP拿到IP地址之后,再發(fā)送EVENT_DHCP_SUCCEEDED消息WifiLayer處理EVENT_DHCP_SUCCEEDED消息再次廣播發(fā)送NETWORK_STATE_CHANGED_ACTION這個(gè)Intent帶上完整的IP地址信息42AndroidInternet程序設(shè)計(jì)AndroidInternet移動(dòng)智能設(shè)備是Internet的重要接入設(shè)備接入設(shè)備種類(lèi)豐富接入方式多樣無(wú)線(xiàn)移動(dòng)寬帶網(wǎng)提供了較高的接入帶寬Android
Internet通信方式httpURLConnetction
(J)httpClient(org.apache)Socket通信方式WebView44httphttp(HypertextTransferProtocol)超文本傳送協(xié)議詳細(xì)規(guī)定了瀏覽器和萬(wàn)維網(wǎng)服務(wù)器之間互相通信的規(guī)則,通過(guò)因特網(wǎng)傳送萬(wàn)維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議位于應(yīng)用層,是移動(dòng)智能設(shè)備聯(lián)網(wǎng)常用的協(xié)議Http采用請(qǐng)求/響應(yīng)模型客戶(hù)端向服務(wù)器發(fā)送請(qǐng)求請(qǐng)求內(nèi)容包含:請(qǐng)求的方法、URL、協(xié)議版本、請(qǐng)求修飾符、客戶(hù)信息和內(nèi)容的消息結(jié)構(gòu)服務(wù)器端以一個(gè)狀態(tài)行作為響應(yīng)響應(yīng)的內(nèi)容包括消息協(xié)議的版本、成功或者錯(cuò)誤編碼、服務(wù)器信息、實(shí)體元信息以及可能的實(shí)體內(nèi)最顯著的特點(diǎn)客戶(hù)端發(fā)送的每次請(qǐng)求都需要服務(wù)器回送響應(yīng)請(qǐng)求結(jié)束后會(huì)主動(dòng)釋放連接45http(2)http協(xié)議是無(wú)狀態(tài)協(xié)議無(wú)狀態(tài)是指協(xié)議對(duì)于連接沒(méi)有記憶能力意味著如果后續(xù)處理需要前面的信息必須重傳可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大http1.1穩(wěn)定的http版本http1.1主要技術(shù)特征支持持久連接請(qǐng)求方法有8個(gè)OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECThttp1.0是3個(gè)提供身份認(rèn)證、狀態(tài)管理和緩存(Cache)等相關(guān)的請(qǐng)求頭和響應(yīng)頭46http(3)http請(qǐng)求格式http://host[":"port][abs_path]http使用http作為通訊協(xié)議以定位網(wǎng)絡(luò)資源host合法的Internet主機(jī)域名或者IP地址端口指定訪問(wèn)的主機(jī)端口號(hào)默認(rèn)為80訪問(wèn)地址指定訪問(wèn)的主機(jī)資源URI47http(4)http的請(qǐng)求方法GET請(qǐng)求獲取Request-URI所標(biāo)識(shí)的資源;POST在Request-URI所標(biāo)識(shí)的資源后附加新的數(shù)據(jù);HEAD請(qǐng)求獲取由Request-URI所標(biāo)識(shí)的資源的響應(yīng)消息報(bào)頭PUT請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源,并用Request-URI作為其標(biāo)識(shí)DELETE請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源;TRACE請(qǐng)求服務(wù)器回送收到的請(qǐng)求信息,主要用于測(cè)試或診斷CONNECT保留將來(lái)使用OPTIONS請(qǐng)求查詢(xún)服務(wù)器的性能,或者查詢(xún)與資源相關(guān)的選項(xiàng)和需求48httpURLConnectionhttpURLConnectionJavaAPI標(biāo)準(zhǔn)接口在包中主要操作創(chuàng)建URL以及HttpURLConnection對(duì)象連接參數(shù)設(shè)置連接到服務(wù)器向服務(wù)器寫(xiě)數(shù)據(jù)從服務(wù)器讀取數(shù)據(jù)49httpURLConnection(2)httpURLConnection繼承自URLConnection類(lèi)URLConnection和httpURLConnection是抽象類(lèi),無(wú)法直接實(shí)例化對(duì)象其對(duì)象主要通過(guò)URL的openConnection方法獲得http使用最多的是Get和Post方法Get請(qǐng)求可以獲取靜態(tài)頁(yè)面或者可以把參數(shù)放在URL字串后面?zhèn)鬟f給服務(wù)器Post參數(shù)放在http請(qǐng)求數(shù)據(jù)中與Get方法不同50httpURLConnection(3)創(chuàng)建httpURLConnection連接openConnection方法只創(chuàng)建URLConnection或者HttpURLConnection實(shí)例不進(jìn)行真正的鏈接操作每次openConnection創(chuàng)建一個(gè)新的實(shí)例在連接前需要對(duì)一些屬性進(jìn)行設(shè)置,比如超時(shí)時(shí)間等51URLurl=newURL("/");HttpURLConnection
urlConn=(HttpURLConnection)url.openConnection();httpURLConnection(4)對(duì)httpURLConnection實(shí)例的屬性設(shè)置52//設(shè)置輸入/輸出流
connection.setDoOutput(true);connection.setDoInput(true);//設(shè)置http請(qǐng)求方式為POSTconnnection.setRequestMethod("POST");//設(shè)置Post請(qǐng)求不使用緩存
connnection.setUseCache(false);httpURLConnection(5)httpURLConnection默認(rèn)使用Get方式使用setRequestMethod()方法設(shè)置為POST方式同樣使用setRequestMethod()方法可以設(shè)置為GET方式連接的關(guān)閉53//關(guān)閉HttpURLConnection連接
urlConn.disconnect();connection.setRequestMethod(“GET”);httpClienthttpClient對(duì)類(lèi)進(jìn)行的封裝和抽象適用于Android系統(tǒng)上的網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)httpClient的ClientConnectionManager接口客戶(hù)端連接管理接口,提供的抽象方法包括ClientConnectionManager關(guān)閉所有無(wú)效、超時(shí)的連接closeIdleConnection關(guān)閉空閑的連接releaseConnection釋放一個(gè)連接requestConnection請(qǐng)求一個(gè)新的連接Shutdown關(guān)閉管理器并釋放資源54httpClient(2)DefaultHttpClient默認(rèn)http客戶(hù)端用來(lái)創(chuàng)建一個(gè)http連接HttpResponsehttp連接響應(yīng)執(zhí)行一個(gè)http連接后會(huì)返回一個(gè)HttpResponse通過(guò)HttpResponse可以得到響應(yīng)信息55HttpClient
httpclient=newDefaultHttpClient();HttpResponsehttpResponse=httpclient.execute(httpRequeset);if(httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){//連接成功}httpClient(3)httpClient的初始化在進(jìn)行初始化過(guò)程中URL地址的設(shè)置可以將預(yù)先定義的字符串作為構(gòu)造函數(shù)的參數(shù)傳入或者創(chuàng)建好HttpGet實(shí)例后采用request..setURL()的方法設(shè)置Get方式可以以帶參數(shù)和不帶參數(shù)兩種方式訪問(wèn)主機(jī)56HttpClientclient=newDefaultHttpClient();
HttpGetrequest=newHttpGet();httpClient(4)httpClient的POST方式比GET方式復(fù)雜通過(guò)HttpPost構(gòu)建POST請(qǐng)求使用NameValuePair保存需要傳遞的參數(shù)可以使用BasicNameValuePair來(lái)構(gòu)造要被傳遞的參數(shù)再通過(guò)add方法將該參數(shù)添加到NameValuePair中57Stringhttpurl=“”HttpPosthttppost=newHttpPost(url);//使用NameValuePair保存需要傳遞的參數(shù)List<NameValuePair>params=newArrayList<NameValuePair>();//添加將需要傳遞的參數(shù)params.add(newBasicNameValuePair(valuename,value));httpClient(5)POST方式需要設(shè)置所使用的字符集其他的連接處理POST方式與GET方式?jīng)]有多少差別通過(guò)HttpClient來(lái)請(qǐng)求連接、返回并響應(yīng)處理58//設(shè)置POST方式所使用的字符集HttpEntityhttpentity=newUrlEncodedFormEntity(params,“gb2312”);SocketSocket套接字用于描述IP地址和端口,是通信鏈的句柄應(yīng)用程序通過(guò)Socket發(fā)出網(wǎng)絡(luò)請(qǐng)求或應(yīng)答網(wǎng)絡(luò)請(qǐng)求應(yīng)用程序與TCP/IP協(xié)議進(jìn)行交互的接口Socket的優(yōu)點(diǎn)服務(wù)器端與客戶(hù)端可以互相主動(dòng)發(fā)送數(shù)據(jù)保持客戶(hù)端與服務(wù)器端數(shù)據(jù)的實(shí)時(shí)與同步與http相比http在請(qǐng)求結(jié)束時(shí)主動(dòng)釋放連接59Socket(1)Socket通信必須包含的5種信息連接使用的協(xié)議(TCP/UDP)本地主機(jī)的IP地址本地進(jìn)程的協(xié)議端口遠(yuǎn)程主機(jī)的IP地址遠(yuǎn)程進(jìn)程的協(xié)議端口Socket的傳輸模式面向連接的傳輸無(wú)連接的傳輸60Socket(2)面向連接的Socket操作使用TCP協(xié)議連接必須在發(fā)送數(shù)據(jù)之前建立好并保持穩(wěn)定數(shù)據(jù)到達(dá)順序是固定的連接建立后可以使用流接口進(jìn)行打開(kāi)、讀、寫(xiě)、關(guān)閉操作所有發(fā)送的信息都會(huì)在另一端以同樣的順序被接受無(wú)連接的Socket操作使用UDP協(xié)議不保證發(fā)出數(shù)據(jù)的達(dá)到不保證發(fā)出數(shù)據(jù)按照發(fā)出順序達(dá)到目的地面向連接的操作比無(wú)連接操的效率低,數(shù)據(jù)的安全性高61Socket(3)Socket構(gòu)造Java在包中提供了兩個(gè)類(lèi)Socket和ServerSocket分別用來(lái)表示雙向連接的客戶(hù)端和服務(wù)端每一個(gè)端口提供一種特定的服務(wù)需要給出正確的端口,才能獲得相應(yīng)的服務(wù)0-1023的端口為系統(tǒng)保留在選擇端口時(shí)最好選擇大于1023端口,以防止放生沖突建立SOCKET連接至少需要一對(duì)套接字其中一個(gè)運(yùn)行于客戶(hù)端,稱(chēng)為ClientSocket另一個(gè)運(yùn)行于服務(wù)器端,稱(chēng)為ServerSocket62Socket(4)Socket和ServerSocket類(lèi)Socket(InetAddressaddress,intport);Socket(InetAddressaddress,intport,booleanstream);Socket(Stringhost,intport);Socket(Stringhost,intport,booleanstream);Socket(SocketImplimpl);Socket(Stringhost,intport,InetAddresslocalAddr,intlocalPort);Socket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort);ServerSocket(intport);ServerSocket(intport,intbacklog);ServerSocket(intport,intbacklog,InetAddressbindAddr);63Socket(5)參數(shù)含義address:雙相連接中另一方的IP地址host:雙相連接中另一方的主機(jī)名port:雙相連接中另一方的端口號(hào)stream:指明Socket是流Socket還是數(shù)據(jù)報(bào)SocketlocalPort:表示本地主機(jī)的端口號(hào)localAddr:本地機(jī)器的地址(ServerSocket的主機(jī)地址)bindAddr:本地機(jī)器的地址(ServerSocket的主機(jī)地址)Impl:Socket的父類(lèi)可以用來(lái)創(chuàng)建ServerSocket或者可以用來(lái)創(chuàng)建Socket64Socket(6)常用的構(gòu)造函數(shù)Socket(InetAddressaddr,intport)Socket(Stringhost,intport)創(chuàng)建基于Socket的連接服務(wù)器端的流套接字創(chuàng)建時(shí)的異常創(chuàng)建Socket如果發(fā)生錯(cuò)誤產(chǎn)生異常IOException程序中必須進(jìn)行處理創(chuàng)建時(shí)必須捕獲或拋出異常創(chuàng)建Socket和ServerSocket都需要65Socket(7)創(chuàng)建客戶(hù)端Socket在客戶(hù)端創(chuàng)建Socket注意異常的捕獲或拋出66try{//指明的IP地址:是IP地址//指明的端口:12110Socketsocket=newSocket("10",12110);}catch(IOExceptione){}Socket(8)創(chuàng)建服務(wù)器端Socket在服務(wù)器端創(chuàng)建Socket67try{//其端口號(hào)要與跟它通信的客戶(hù)端端口一致ServerSocketserver=ServerSocket(12110);}catch(IOExceptione){}try{//等待來(lái)自客戶(hù)端的請(qǐng)求,直到有客戶(hù)端以相同端口Socketsocket=server.accept();}catch(IOExceptione){}Socket(9)ServerSocket創(chuàng)建后不定位具體的客戶(hù)端套接字處于等待連接的狀態(tài)實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài),等待客戶(hù)端的連接請(qǐng)求ServerSocket在指定端口監(jiān)聽(tīng)來(lái)自客戶(hù)端的請(qǐng)求在應(yīng)用程序中是循環(huán)接收通過(guò)創(chuàng)建服務(wù)線(xiàn)程來(lái)服務(wù)新的客戶(hù)請(qǐng)求accept()阻塞函數(shù)調(diào)用后等待客戶(hù)請(qǐng)求,直到有對(duì)應(yīng)的正確請(qǐng)求到達(dá)再返回對(duì)應(yīng)的Socekt,建立Socket連接68Socket(10)Socket輸入(出)流使用getInputStream()和getOutputStream()進(jìn)行分別返回InputStream和OutputStream類(lèi)對(duì)象DataInputStream、DataOutputStream或PrintStream類(lèi)對(duì)象在返回的輸入/輸出流對(duì)象中所建立的過(guò)濾流便于讀寫(xiě)數(shù)據(jù)。文本方式流對(duì)象采用InputStreamReader、OuputStreamWriter、PrintWirter等處理69PrintStreamos=newPrintStream(newBufferedOutputStream(socket.getOutputStream()));DataInputStreamdis=newDataInputStream(socket.getInputStream());PrintWirterpw=newPrintWirter(socket.getOutputStream(),true);BufferedReaderbr=newBufferedReader(newInputStreamReader(socket.getInputStream()));Socket(11)關(guān)閉Socket和流任何Socket對(duì)象的存在都會(huì)占用一定的資源在Socket對(duì)象使用完畢需要關(guān)閉操作關(guān)閉Socket可以調(diào)用Socket的close()方法在關(guān)閉Socket之前,先關(guān)閉與Socket相關(guān)的所有輸入(出)流以釋放所有資源關(guān)閉順序?yàn)槭紫汝P(guān)閉與Socket相關(guān)的所有輸入/輸出流然后關(guān)閉Socket70os.close();is.close();Socket.close();Socket(12)創(chuàng)建Socket服務(wù)器指定端口實(shí)例化一個(gè)ServerSocket調(diào)用ServerSocket的accept()以在等待連接期間造成阻塞獲取位于該底層Socket的流以進(jìn)行讀寫(xiě)操作將數(shù)據(jù)封裝成流對(duì)Scoket進(jìn)行讀寫(xiě)關(guān)閉打開(kāi)流Socket客戶(hù)端實(shí)現(xiàn)通過(guò)IP地址和端口實(shí)例化Socket,請(qǐng)求連接服務(wù)器獲取Socket上的流以進(jìn)行讀寫(xiě)把流包裝進(jìn)BufferedReader/PrintWriter的實(shí)例對(duì)Socket進(jìn)行讀寫(xiě)關(guān)閉打開(kāi)的流71WebViewAndroid內(nèi)置webkit內(nèi)核瀏覽器Webkit是開(kāi)源瀏覽器網(wǎng)頁(yè)排版引擎支持觸摸屏、高級(jí)圖形顯示、上網(wǎng)WebKit由3個(gè)模塊組成JavaScriptCore:JavaScript解釋器WebCore:核心,用來(lái)實(shí)現(xiàn)Render引擎、Web頁(yè)面解析等WebKit:項(xiàng)目名稱(chēng),APIAndroidSDK中封裝為WebView組件開(kāi)發(fā)具有瀏覽器功能的程序72WebView(2)WebView的使用webview的XML定義Manifest文件中權(quán)限的設(shè)定73<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/><uses-permissionandroid:name="android.permission.INTERNET"/>WebView(3)通過(guò)We
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 石河子大學(xué)《醫(yī)學(xué)統(tǒng)計(jì)學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《食品貯藏與保鮮》2022-2023學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《結(jié)構(gòu)力學(xué)一》2022-2023學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《復(fù)變函數(shù)》2022-2023學(xué)年第一學(xué)期期末試卷
- 智慧高速解決方案
- 沈陽(yáng)理工大學(xué)《審計(jì)學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 2018年四川內(nèi)江中考滿(mǎn)分作文《我心中的英雄》13
- 沈陽(yáng)理工大學(xué)《化工工藝設(shè)計(jì)》2022-2023學(xué)年第一學(xué)期期末試卷
- 沈陽(yáng)理工大學(xué)《產(chǎn)品仿生學(xué)應(yīng)用設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣州海珠區(qū)法院判決繼續(xù)履行勞動(dòng)合同的案例
- 國(guó)家開(kāi)放大學(xué)《中文學(xué)科論文寫(xiě)作》形考任務(wù)1-4參考答案
- 配電柜的維護(hù)、管理、保養(yǎng)方案
- 2024年廣東佛山市三水海江建設(shè)投資有限公司招聘筆試參考題庫(kù)含答案解析
- 大學(xué)生職業(yè)生涯發(fā)展展示
- 兒科護(hù)理風(fēng)險(xiǎn)管理
- 鼻飼的常見(jiàn)并發(fā)癥及處理醫(yī)學(xué)
- 中國(guó)古代文學(xué)中的海洋意象與文化內(nèi)涵探究
- 小學(xué)教育的教師角色與素質(zhì)
- 慢性胃炎胃鏡報(bào)告
- 子宮腺肌病病例分析報(bào)告
- 犯罪心理學(xué)-第五章不同犯罪類(lèi)型的心理學(xué)分析課件
評(píng)論
0/150
提交評(píng)論