您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 手机开发培训 11_Android的连接部分
Android的连接部分Android的连接部分第一部分WIFI部分第二部分蓝牙部分第三部分GPS和定位部分第一部分WIFI部分Wifi(WirelessFidelity),是使用了IEEE的802.11协议的无线局域网(Wlan)技术。在android中Wifi包括kernel的支持和用户空间的程序和库两个部分。第一部分WIFI部分1.1WIFI的基本架构1.2WIFI的本地实现1.3WIFI的JNI和JAVA层次1.4Setting中的WIFI设置1.5WIFI的流程1.1WIFI的基本架构Wifi用户空间的程序和库:external/wpa_supplicant生成库:libwpaclient.so生成守护进程:wpa_supplicantWifi管理库:hardware/libhardware_legacy/wifi/Android的WIFI系统的JNI的部分:frameworks/base/core/jni/android_net_wifi_Wifi.cppWIFI系统的的JAVA部分实现代码:frameworks/base/services/java/com/android/server/frameworks/base/wifi/java/android/net/wifi/1.1WIFI的基本架构Wifi特定驱动wpa_supplicant程序(守护进程)WPA适配层C框架层android.net.wifi包JAVA框架层JAVA应用层Settings,WifiSwitcher等内核空间WIFI的JNIWifi协议Wlan网络设备数据通道配置文件wpa_supplicant.conf协议驱动协议驱动协议驱动1.2WIFI的本地实现Android的WiFi本地实现部分主要包括wpa_supplicant以及wpa_supplicant适配层。WPA是WiFiProtectedAccess的缩写,中文含义为“WiFi网络安全存取”。WPA是一种基于标准的可互操作的WLAN安全性增强解决方案,可大大增强现有以及未来无线局域网系统的数据保护和访问控制水平。1.2WIFI的本地实现wpa_supplicant1.2WIFI的本地实现wpa_supplicant适配层是通用的wpa_supplicant的封装,在Android中作为WIFI部分的硬件抽象层来使用。wpa_supplicant适配层主要用于封装与wpa_supplicant守护进程的通信,以提供给Android框架使用。它实现了加载,控制和消息监控等功能。wpa_supplicant适配层的头文件如下所示:hardware/libhardware_legacy/include/hardware_legacy/wifi.h1.3WIFI的JNI和JAVA层次wpa_supplicant适配层是通用的wpa_supplicant的封装,在Android中作为WIFI部分的硬件抽象层来使用。wpa_supplicant适配层主要用于封装与wpa_supplicant守护进程的通信,以提供给Android框架使用。它实现了加载,控制和消息监控等功能。wpa_supplicant适配层的头文件如下所示:hardware/libhardware_legacy/include/hardware_legacy/wifi.h1.3WIFI的JNI和JAVA层次WifiNativeWifiMonitorClientWifiStateTrackerWifiManagerWifiWatchdogServiceIWifiManager.StubIWifiManager.Stub.Proxy接口IWifiManagerConnectivityServiceWifiServiceWiFi系统Java部分的核心是根据IWifiManager接口所创建的Binder服务器端和客户端,服务器端是WifiService,客户端是WifiManager。1.4Settings中的WiFi设置Android的Settings应用程序对WiFi的使用,是典型的WiFi应用方式,也是用户可见的AndroidWiFi管理程序。这部分的实现代码在以下的目录中:packages/apps/Settings/src/com/android/settings/wifi/Settings里的WiFi部分是用户可见的设置界面,提供WiFi开关、扫描AP、连接/断开等基本功能。另外,通过实现WifiLayer.Callback接口提供了一组回调函数,用以响应用户关心的WiFi状态的变化。WifiManagerWifiStateTracker接口WifiLayer.CallbackWifiLayerWifiEnableWifiSettings1.5WiFi工作流程实例1.开启WiFi用户在设置界面开启WiFi,调用Settings应用程序的WifiEnabler.setWifiEnabled,然后调用WifiManager.setWifiEnabled。WifiManager.setWifiEnabled通过Binder机制调用WifiService.setWifiEnabled。这里的WifiService也就是WiFi的Java层的内容。WifiService.setWifiEnabled将MESSAGE_ENABLE_WIFI消息发送到自己的消息队列。1.5WiFi工作流程实例WifiService通过WifiHandler的handleMessage处理MESSAGE_ENABLE_WIFI。另外,它还完成一些初始工作,如设置当前状态、加载WiFi驱动、开启wpa_supplicant、开启WifiStateTracker、注册BroadcastReceiver监视WifiStateTracker的消息等。由于WifiEnabler初始化时注册了BroadcastReceiver,因此它会获得这个通知消息,进入handleWifiStateChanged处理一些内部状态以及显示。WifiLayer也同样获得了这个通知消息,至此,WiFi开启完成。随后它的做法是查找AP。1.5WiFi工作流程实例2.查找APWiFi查找AP的过程如下所示:Settings应用程序的WifiLayer.attemptScan调用WifiManager.startScan。Settings应用程序的WifiManager.startScan通过Binder机制调用WifiService.startScan。WiFi服务层的WifiServiceWifiNative.scanCommand通过WifiNative发送扫描命令给wpa_supplicant,中间经过JNI实现中的doCommand,最终调用wap_supplicant适配层的wifi_command来完成这一发送过程。至此,命令发送成功。1.5WiFi工作流程实例命令的最终响应由wap_supplicant上报“SCAN-RESULTS”消息,WifiStateTracker开启的WifiMonitor的MonitorThread可以获取此消息并交由handleEvent处理。handleEvent的处理方式是调用WifiStateTracker.notifyScanResultsAvailable。在WifiStateTracker中,通过EVENT_SCAN_RESULTS_AVAILABLE完成消息传递,调用sendScanResultsAvailable将SCAN_RESULTS_AVAILABLE_ACTION通知消息广播出去。WifiLayer会最终获得这个通知消息,调用handleScanResultsAvailable继续处理。此函数会根据返回的AP数据建立对应的处理结构,并完成对应界面的绘制,以供用户操作AP列表。至此,AP查找完成,也完成了一次典型的自上而下、再自下而上的情景。1.5WiFi工作流程实例3.连接APWiFi连接AP的步骤如下所示:单击AP列表的某个项目后,会弹出AccessPointDialog对话框,单击“连接”按钮,将handleConnect转化为到WifiLayer.connectToNetwork的调用。在connectToNetwork中完成一些查找和配置,再通过managerEnableNetwork调用WifiManager.enableNetwork。连接的中间流程与查找AP的流程类似,都经过了WifiMonitor对“CONNECTED”消息响应的捕获,以及WifiStateTracker对EVENT_SUPPLICANT_STATE_CHANGED的处理。还有一个比较重要的步骤是WifiStateTracker通过对DHCP服务器的申请进行了IP地址分配。最终会广播NETWORK_STATE_CHANGED_ACTION消息,由WifiLayer响应。第二部分蓝牙部分2.1蓝牙部分的结构2.2Bluez2.3Bluez的适配层2.3蓝牙的JNI和JAVA部分2.1蓝牙部分的结构蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术。在Android中蓝牙除了kernel的支持,还需要用户空间的bluez的支持。external/bluez/Android蓝牙设备管理的库:system/bluetooth/分别生成libbluetooth.so和libbluedroid.so。2.4蓝牙的JNI和JAVA部分Bluetooth的JNI到上层的接口,目录frameworks/base/core/jni/中的android_bluetooth_*.cppBluetooth的JAVA类:frameworks/base/core/java/android/bluetooth2.1蓝牙部分的结构内核空间用户空间C框架层android.bluetooth包中的各个类JAVA框架层JAVA应用层蓝牙Settings蓝牙协议层bluezbluez适配层Headset/Handsfree电话相关D-BUSSco,RfcommSocket蓝牙驱动(UART,USB..)HCI等socket2.2BluezAndroid所采用的蓝牙用库空间的库是bluez。它是一套Linux平台的蓝牙协议栈完整开源实现,广泛用在各linux发行版,并被移植到众多移动平台上。在Android中,bluez提供了很多分散的应用,包括守护进程和一些工具。bluez通过D-BUSIPC机制来提供应用层接口。2.2Bluez2.2Bluez2.3Bluez的适配层bluez在Android中使用,需要经过Android的bluez适配层的封装,bluez适配层源代码及头文件路径如下所示:system/bluetooth/该目录除了包含生成适配层库libbluedroid.so的源码之外,还包含bluez头文件,bluez配置文件等目录。由于bluez使用D-BUS作为与上层沟通的接口,适配层构造比较简单,封装了蓝牙的开关功能,以及射频开关。2.4蓝牙的JNI和JAVA部分在Android中还定义了Bluetooth通过JNI到上层的接口,在目录frameworks/base/core/jni/中。android_bluetooth_BluetoothAudioGateway.cppandroid_bluetooth_common.cppandroid_bluetooth_Database.cppandroid_bluetooth_ScoSocket.cppandroid_bluetooth_RfcommSocket.cppandroid_bluetooth_HeadsetBase.cppBluetooth的JAVA类:frameworks/base/core/java/android/bluet
本文标题:手机开发培训 11_Android的连接部分
链接地址:https://www.777doc.com/doc-7211264 .html