【Android源码 栏目提醒】:网学会员为需要Android源码 的朋友们搜集整理了【Android系统原理与开发要点详解】11_Android的连接部分 - 操作系统相关资料,希望对各位网友有所帮助!
第一部分 WIFI部分第二部分 蓝牙部分第三部分 GPS和定位部分 WifiWireless Fidelity是使用了IEEE的802.11协议的无线局域网Wlan技术。
在
android中Wifi包括kernel的支持和用户空间的程序和库两个部分。
1.1 WIFI的基本架构1.2 WIFI的本地实现1.3 WIFI的JNI和JAVA层次1.4 Setting中的WIFI设置1.5 WIFI的流程 Wifi用户空间的程序和库external/wpa_supplicant 生成库libwpaclient.so 生成守护进程wpa_supplicant Wifi管理库hardware/libhardware_legacy/wifi/
Android的WIFI系统的JNI的部分frameworks/base/core/jni/
android_net_wifi_Wifi.cpp WIFI系统的的JAVA部分实现代码frameworks/base/services/java/com/
android/server/frameworks/base/wifi/java/
android/net/wifi/ Wifi特定驱动wpa_supplicant程序守护进程WPA适配层C框架层
android.net.wifi包JAVA框架层JAVA应用层Settings WifiSwitcher等内核空间WIFI的JNIWifi协议Wlan网络设备数据通道配置文件wpa_supplicant.conf协议驱动协议驱动协议驱动
Android的WiFi本地实现部分主要包括wpa_supplicant以及wpa_supplicant适配层。
WPA是WiFi Protected Access的缩写中文含义为“WiFi网络安全存取”。
WPA是一种基于标准的可互操作的WLAN安全性增强解决方案可大大增强现有以及未来无线局域网系统的数据保护和访问控制水平。
wpa_supplicant wpa_supplicant适配层是通用的wpa_supplicant的封装在
Android中作为WIFI部分的硬件抽象层来使用。
wpa_supplicant适配层主要用于封装与wpa_supplicant守护进程的通信以提供给
Android框架使用。
它实现了加载控制和消息监控等功能。
wpa_supplicant适配层的头文件如下所示hardware/libhardware_legacy/include/hardware_legacy/wifi.h wpa_supplicant适配层是通用的wpa_supplicant的封装在
Android中作为WIFI部分的硬件抽象层来使用。
wpa_supplicant适配层主要用于封装与wpa_supplicant守护进程的通信以提供给
Android框架使用。
它实现了加载控制和消息监控等功能。
wpa_supplicant适配层的头文件如下所示hardware/libhardware_legacy/include/hardware_legacy/wifi.h WifiNativeWifiMonitorClientWifiStateTrackerWifiManagerWifiWatchdogServiceIWifiManager.StubIWifiManager.Stub.ProxyIWifiManagerConnectivityServiceWifiServiceWiFi系统Java部分的核心是根据IWifiManager接口所创建的Binder服务器端和客户端服务器端是WifiService客户端是WifiManager。
Android的Settings应用程序对WiFi的使用是典型的WiFi应用方式也是用户可见的
Android WiFi管理程序。
这部分的实现代码在以下的目录中packages/apps/Settings/src/com/
android/settings/wifi/Settings里的WiFi部分是用户可见的设置界面提供WiFi开关、扫描AP、连接/断开等基本功能。
另外通过实现WifiLayer.Callback接口提供了一组回调函数用以响应用户关心的WiFi状态的变化。
WifiManagerWifiStateTrackerWifiLayer.CallbackWifiLayerWifiEnableWifiSettings 1开启WiFi 用户在设置界面开启WiFi调用Settings应用程序的WifiEnabler.setWifiEnabled然后调用WifiManager.setWifiEnabled。
WifiManager.setWifiEnabled通过Binder机制调用WifiService.setWifiEnabled。
这里的WifiService也就是WiFi的Java层的内容。
WifiService.setWifiEnabled将MESSAGE_ENABLE_WIFI消息发送到自己的消息队列。
WifiService通过WifiHandler的handleMessage处理MESSAGE_ENABLE_WIFI。
另外它还完成一些初始工作如设置当前状态、加载WiFi驱动、开启wpa_supplicant、开启WifiStateTracker、注册BroadcastReceiver监视WifiStateTracker的消息等。
由于WifiEnabler初始化时注册了BroadcastReceiver因此它会获得这个通知消息进入handleWifiStateChanged处理一些内部状态以及显示。
WifiLayer也同样获得了这个通知消息至此WiFi开启完成。
随后它的做法是查找AP。
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来完成这一发送过程。
至此命令发送成功。
命令的最终响应由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查找完成也完成了一次典型的自上而下、再自下而上的情景。
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.2 Bluez2.3 Bluez的适配层2.3 蓝牙的JNI和JAVA部分 蓝牙Bluetooth技术实际上是一种短距离无线电技术。
在
Android中蓝牙除了kernel的支持还需要用户空间的bluez的支持。
external/bluez/
Android 蓝牙设备管理的库system/bluetooth/ 分别生成libbluetooth.so和libbluedroid.so。
Bluetooth的JNI到上层的接口目录frameworks/base/core/jni/中的
android_bluetooth_.cppBluetooth的JAVA类frameworks/base/core/java/
android/bluetooth 内核空间用户空间C框架层
android.bluetooth包中的各个类JAVA框架层JAVA应用层蓝牙Settings蓝牙协议层bluezbluez适配层Headset/Handsfree电话相关D-BUSScoRfcomm Socket蓝牙驱动UART USB..HCI等socket
Android所采用的蓝牙用库空间的库是bluez。
它是一套Linux平台的蓝牙协议栈完整开源实现广泛用在各linux发行版并被移植到众多移动平台上。
在
Android中bluez提供了很多分散的应用包括守护进程和一些工具。
bluez通过D-BUS IPC机制来提供应用层接口。
bluez在
Android中使用需要经过
Android的bluez适配层的封装bluez适配层源代码及头文件路径如下所示system/bluetooth/ 该目录除了包含生成适配层库libbluedroid.so的
源码之外还包含bluez头文件bluez配置文件等目录。
由于bluez使用D-BUS作为与上层沟通的接口适配层构造比较简单封装了蓝牙的开关功能以及射频开关。
在
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/bluetooth BluetoothDeviceServiceBluetoothDeviceandroid.blutoothIBluetoothDeviceBluetoothEventLoopD-BUSbluez适配层BluetoothDeviceServiceJNIBluetoothDeviceServiceJNIbluezD-BUS BluetoothDeviceServiceBluetoothEventLoop核心组件BluetoothDeviceandroid.blutoothIBluetoothDevicePhoneBluetoothHeadsetHeadbaseBTAudioGatewayHeadbaseBTAudioGatewayJNIbluezD-BUSRfcommSocketAT相关类BluetoothHeadsetServiceBluetoothHandsfreeBluetoothAtPhonebookIBluetoothHeadset耳机及免提服务 BluetoothDeviceServiceBluetoothEventLoop核心组件BluetoothDeviceandroid.blutoothIBluetoothDevicebluezD-BUSBluetoothA2dpServiceBluetoothA2dpIBluetoothA2dpD-BUS A2DP服务 在目前的手机平台上定位系统有着十分重要的地位
Android也是如此。
定位系统的最常见设备如GPSGlobal Position System 全球定位系统另外还包括利用基站Cell定位的AGPS等设备。
它们在提供基本定位功能的同时也为很多新奇的应用提供了基础。
3.1 定位系统基本架构3.2 定位系统驱动层3.3 GPS本地实现3.4 GPS JNI实现3.5 定位系统Java实现 GPS驱动GPS定位适配层libhardware_legacy.soC框架层
android.locationJAVA框架JAVA应用定位相关应用GoogleMapTab4Me...CellWIFI定位相关驱动Network定位适配层RILWIFI提供Network定位组件虚构内核空间GPS定位的JNINetwork定位JNI
Android在定位系统方面有着比较系统的架构让各种定位设备可以方便地集成进来也让基于定位的应用开发变得更加容易。
Android定位系统的主要数据来源有两个分别是GPS定位和Network定位基于Cell或WiFi热点的定位。
在Network定位中Cell定位已经相当常见WiFi热点定位现在即使在国外也不是很普及。
对
Android的
源码来说GPS相关部分是开源项目的一部分而Network定位部分只在开源代码中提供了接口。
两者虽然底层技术实现不同但作为定位数据的提供方都有着很多共同的地方并使用同一套框架。
GPS本地实现部分主要是GPS驱动适配层头文件路径为hardware/libhardware_legacy/include/hardware_legacy/gps.hGPS部分的源代码在以下的目录中hardware/libhardware_legacy/gps/GPS部分的JNI的本地部分实现
源码为以下路径frameworks/base/core/jni/
android_location_GpsLocationProvider.cppGPS部分的JAVA层的实现代码在frameworks/base/location/java/
android/location GPS本地实现部分主要是GPS驱动适配层头文件路径为hardware/libhardware_legacy/include/hardware_legacy/gps.hGPS部分的源代码在以下的目录中hardware/libhardware_legacy/gps/typedef struct / 定义标准的GPS接口的结构体 / int init GpsCallbacks callbacks / 初始化GPS提供回调函数实现 / int start void / 开始导航 / int stop void / 停止导航 / void set_fix_frequency int frequency / 设置请求频率定点 / void cleanup void / 关闭接口 / int inject_timeGpsUtcTime time / 置入当前的时间 / int64_t timeReference int uncertainty void delete_aiding_dataGpsAidingData flags/ 删除帮助信息 / int set_position_modeGpsPositionMode mode int fix_frequency / 设置位置模式 / const void get_extensionconst char name / 获得扩展信息的指针 / GpsInterfaceGpsInterface的内容 GPS硬件设备分为硬GPS和软GPS。
硬GPS一般是功能独立的模块一般不需要特别多的控制上电就可以运行直接输出NMEA数据驱动十分简单。
软GPS一般需要主控芯片控制其运行状态输出的大多是裸卫星数据需要主控方进行计算才能得到最终的NMEA数据。
两者的共同点是最终的输出都是NMEA数据。
NMEANational Marine Electronics Association国际海洋电子协会一般是指NMEA0183这是一套工业标准的接收机信号输出协议。
http://www.nmea.org/ INetworkLocationManagerNetworkLocationProvicerGpsLocationProvicerLocationProvicerImplLocationProvicerLocationListenerGeocoderLocationManagerServiceINetworkLocationProviderILocationManagerILocationManager.StubILocationManager.Stub.ProxyLocationManager