【Android源码 栏目提醒】:网学会员为需要Android源码 的朋友们搜集整理了Android网络程序设计 - 毕业设计相关资料,希望对各位网友有所帮助!
Android武汉大学电子信息学院Android1. Android武汉大学Google Android 联合实验室Android蓝牙技术支持短距离通信≤10m的无线电技术常用于移动电话、PDA、无线耳机、笔记本电脑、相关外设等设备之间进行无线信息交换优点有效地简化移动终端设备之间的通信能够成功地简化移动终端设备与Internet之间的通信提高数据传输速度Android采用了蓝牙协议栈武汉大学Google Android 联合实验室Android2Android蓝牙使用BlueZ支持GAP SDP and RFCOMM规范是SIG认证的蓝牙协议栈Bluez 是GPL许可Android的框架内与用户空间的bluez代码通过D-BUS进程通讯进行交互以避免专有代码Headset和Handsfreev1.5规范在Android框架中实现的跟Phone App紧密耦合的这些规范也是SIG认证的武汉大学Google Android 联合实验室红色虚线部分为合作伙伴指定模块武汉大学Google Android 联合实验室武汉大学Google Android 联合实验室Android要操作蓝牙先要在AndroidManifest.xml里加入权限武汉大学Google Android 联合实验室Android所有可用的Bluetooth APIs都包含在android.bluetooth包BluetoothAdapter蓝牙适配器代表本地的蓝牙适配器 local Bluetooth adapter Bluetooth radio. BluetoothAdapter是所有蓝牙通信的入口点使用BluetoothAdapter能够探测其他蓝牙设备获得一个bonded已配对的设备列表使用一个知名的knowMAC地址实例化一个BluetoothDevice并创建一个BluetoothServerSocket来监听其他设备的通信直到建立bluetoothSocket连接之前都要不断操作它武汉大学Google Android 联合实验室Android2BluetoothAdapter里的方法enable打开蓝牙disable关闭蓝牙getAddress获取本地蓝牙地址getName获取本地蓝牙名称getRemoteDeviceString address根据蓝牙地址获取远程蓝牙设备getState获取本地蓝牙适配器当前状态等等武汉大学Google Android 联合实验室Android3BluetoothDevice代表一个远程蓝牙设备使用BluetoothSocket对另一个远程设备发出连接请求或者查询该远程设备的名字、地址、类和连接状态createRfcommSocketToServiceRecordUUIDuuid根据UUID创建并返回一个BluetoothSocket该方法也是获取BluetoothDevice的目的创建BluetoothSocket武汉大学Google Android 联合实验室Android4BluetoothServerSocket表示一个开放的服务器socket监听进入的连接请求类似于TCP的ServerSocket为了连接两个Android设备其中一个必须打开一个server socket当一个远程蓝牙设备发出一个连接请求并被接受时BluetoothServerSocket将返回一个已连接的BluetoothSocket武汉大学Google Android 联合实验室Android5BluetoothServerSocket里的方法两个重载的accept和acceptinttimeoutclose关闭Socketaccept和acceptinttimeout的区别后面的方法指定了超时时间执行这两个方法的时候直到接收到了客户端的请求或是过期之后都会阻塞线程应该放在新线程里运行武汉大学Google Android 联合实验室Android6BluetoothSocket代表一个蓝牙socket的接口类似于TCP socket这是应用程序通过InputStream或者OutputStream与其他蓝牙设备交换数据的连接点与BluetoothServerSocket相对应武汉大学Google Android 联合实验室Android7BluetoothSocket里的方法close关闭connect连接getInptuStream获取输入流getOutputStream获取输出流getRemoteDevice获取远程设备这里指的是获取bluetoothSocket指定连接的那个远程蓝牙设备武汉大学Google Android 联合实验室Android获取本地蓝牙适配器打开蓝牙BluetoothAdapter mAdapter BluetoothAdapter.getDefaultAdapterifmAdapter.isEnabled //弹出对话框提示用户是否需要打开Intent enabler new IntentBluetoothAdapter.ACTION_REQUEST_ENABLE startActivityForResultenable REQUEST_ENABLE //不做提示强行打开mAdapter.enable 武汉大学Google Android 联合实验室Android2搜索设备第一步mAdapter.startDiscovery 定义BroadcastReceiverBroadcastReceiver mReceiver new BroadcastReceiver public void onReceiveContext context Intent intent String action intent.getAction //找到设备if BluetoothDevice.ACTION_FOUND.equalsaction BluetoothDevice device intent.getParcelableExtraBluetoothDevice.EXTRA_DEVICE if device.getBondState BluetoothDevice.BOND_BONDED Log.vTAG find device: device.getName device.getAddress //搜索完成else if BluetoothAdapter.ACTION_DISCOVERY_FINISHED .equalsaction setTitle搜索完成 if mNewDevicesAdapter.getCount 0 Log.vTAGfind over //执行更新列表的代码 武汉大学Google Android 联合实验室Android3建立连接服务器端客户端BluetoothServerSocket serverSocket mAdapter. listenUsingRfcommWithServiceRecordserverSocketNameUUID serverSocket.accept BluetoothSocket clienSocketdcvice. createRfcommSocketToServiceRecordUUID clienSocket.connect 武汉大学Google Android 联合实验室蓝牙的驱动程序一般都通过标准的HCI控制实现蓝牙协议部分头文件include/net/bluetooth/hci_core.hinclude/net/bluetooth/bluetooth.h蓝牙协议源代码文件net/bluetooth/蓝牙驱动程序部分的文件drivers/bluetooth/2. Android WiFi 武汉大学Google Android 联合实验室Android WiFiWiFiWireless Fidelity使用了IEEE的802.11协议的无线局域网Wlan技术Android中的Wifi包括kernel的支持用户空间的程序和库武汉大学Google Android 联合实验室WiFiWifi用户空间的程序和库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/武汉大学Google Android 联合实验室武汉大学Google Android 联合实验室WiFiAndroid的WiFi本地实现部分主要包括wpa_supplicant以及wpa_supplicant适配层WPA是WiFi Protected Access的缩写中文含义为“WiFi网络安全存取”WPA是基于标准的可互操作的WLAN安全性增强解决方案可大大增强现有以及未来无线局域网系统的数据保护和访问控制水平武汉大学Google Android 联合实验室WiFi2武汉大学Google Android 联合实验室WiFi3wpa_supplicant适配层是通用的wpa_supplicant的封装在Android中作为WIFI部分的硬件抽象层来使用wpa_supplicant适配层主要用于封装与wpa_supplicant守护进程的通信以提供给Android框架使用实现了加载控制和消息监控等功能wpa_supplicant适配层的头文件如下所示hardware/libhardware_legacy/include/hardware_legacy/wifi.h武汉大学Google Android 联合实验室武汉大学Google Android 联合实验室WiFiJNIJAVAWiFi系统Java部分的核心是根据IWifiManager接口所创建的Binder服务器端和客户端服务器端是WifiService客户端是WifiManager武汉大学Google Android 联合实验室武汉大学Google Android 联合实验室SettingsWiFiAndroid的Settings应用程序对WiFi的使用是典型的WiFi应用方式也是用户可见的Android WiFi管理程序这部分的实现代码在以下的目录中packages/apps/Settings/src/com/android/settings/wifi/Settings里的WiFi部分是用户可见的设置界面提供WiFi开关、扫描AP、连接/断开等基本功能通过实现WifiLayer.Callback接口提供了一组回调函数用以响应用户关心的WiFi状态的变化武汉大学Google Android 联合实验室武汉大学Google Android 联合实验室在SystemServer 启动的时候会生成一个ConnectivityService 的实例try Log.iTAG Starting Connectivity Service.ServiceManager.addServiceContext.CONNECTIVITY_SERVICE new ConnectivityServicecontext catch Throwable e Log.eTAG Failure starting Connectivity Service e武汉大学Google Android 联合实验室2ConnectivityService 的构造函数会创建WifiServiceWifiStateTracker 会创建WifiMonitor 接收来自底层的事件WifiService 和WifiMonitor 是整个模块的核心WifiService 负责启动关闭wpa_supplicant、启动关闭WifiMonitor监视线程和把命令下发给wpa_supplicantWifiMonitor负责从wpa_supplicant接收事件通知if DBG Log.vTAG Starting Wifi Service.mWifiStateTracker new WifiStateTrackercontext handlerWifiService wifiService new WifiServicecontext mWifiStateTrackerServiceManager.addServiceContext.WIFI_SERVICE wifiService武汉大学Google Android 联合实验室AP-WiFi使能WiFiWirelessSettings 在初始化的时候配置了由WifiEnabler 来处理Wifi 按钮private void initToggles mWifiEnabler new WifiEnablerthisWifiManager getSystemServiceWIFI_SERVICECheckBoxPreference findPreferenceKEY_TOGGLE_WIFI武汉大学Google Android 联合实验室AP2-WiFi当用户按下Wifi 按钮后Android 会调用WifiEnabler 的onPreferenceChange再由WifiEnabler调用WifiManager 的setWifiEnabled 接口函数通过AIDL实际调用的是WifiService的setWifiEnabled函数WifiService 接着向自身发送一条MESSAGE_ENABLE_WIFI 消息在处理该消息的代码中做真正的使能工作首先装载WIFI 内核模块该模块的位置硬编码为“/system/lib/modules/wlan.ko” 然后启动wpa_supplicant 配置文件硬编码为“/data/misc/wifi/wpa_supplicant.conf”再通过WifiStateTracker 来启动WifiMonitor 中的监视线程武汉大学Google Android 联合实验室private booleansetWifiEnabledBlockingbooleanenable final inteventualWifiState enable WIFI_STATE_ENABLED : WIFI_STATE_DISABLEDupdateWifiStateenable WIFI_STATE_ENABLING : WIFI_STATE_DISABLINGif enable if WifiNative.loadDriver Log.eTAG Failed to load Wi-Fi driver.updateWifiStateWIFI_STATE_UNKNOWNreturn falseif WifiNative.startSupplicant WifiNative.unloadDriverLog.eTAG Failed to start supplicant daemon.updateWifiStateWIFI_STATE_UNKNOWNreturn falsemWifiStateTracker.startEventLoop// SuccesspersistWifiEnabledenableupdateWifiStateeventualWifiStatereturn true武汉大学Google Android 联合实验室AP3-WiFi当使能成功后会广播发送WIFI_STATE_CHANGED_ACTION 这个Intent 通知外界WIFI已经成功使能WifiEnabler 创建的时候就会向Android 注册接收WIFI_STATE_CHANGED_ACTION因此它会收到该Intent从而开始扫描private void handleWifiStateChangedint wifiState if wifiState WIFI_STATE_ENABLED loadConfiguredAccessPointsattemptScan武汉大学Google Android 联合实验室AP4-AP扫描的入口函数是WifiService 的startScan即往wpa_supplicant 发送SCAN 命令static jboolean android_net_wifi_scanCommandJNIEnv env jobject clazzjboolean result// Ignore any error from setting the scan mode.// The scan will still work.voiddoBooleanCommandDRIVER SCAN-ACTIVE OKresult doBooleanCommandSCAN OKvoiddoBooleanCommandDRIVER SCAN-PASSIVE OKreturn result武汉大学Google Android 联合实验室AP5-AP当wpa_supplicant 处理完SCAN 命令后会向控制通道发送事件通知扫描完成从而wifi_wait_for_event 函数会接收到该事件由此WifiMonitor 中的MonitorThread 会被执行来出来这个事件void handleEventint event String remainder case SCAN_RESULTS:mWifiStateTracker.notifyScanResultsAvailablebreak武汉大学Google Android 联合实验室AP6-APWifiStateTracker 则接着广播发送SCAN_RESULTS_AVAILABLE_ACTION 这个Intentcase EVENT_SCAN_RESULTS_AVAILABLE: mContext.sendBroadcastnewIntentWifiManager.SCAN_RESULTS_AVAILABLE_ACTION武汉大学Google Android 联合实验室AP7-APWifiLayer 注册了接收SCAN_RESULTS_AVAILABLE_ACTION 这个Intent它的相关处理函数handleScanResultsAvailable 会被调用在该函数中先会去获取SCAN 的结果最终是往wpa_supplicant 发送SCAN_RESULT 命令并读取返回值来实现的List list mWifiManager.getScanResults武汉大学Google Android 联合实验室AP8-AP对每一个扫描返回的APWifiLayer 调用WifiSettings 的onAccessPointSetChanged 函数从而最终把该AP 加到GUI 显示列表中public void onAccessPointSetChangedAccessPointState ap boolean added AccessPointPreference pref mAps.getapif added if pref null pref new AccessPointPreferencethis apmAps.putap pref else pref.setEnabledtruemApCategory.addPreferencepref武汉大学Google Android 联合实验室AP8-AP 当用户在WifiSettings 界面上选择了一个AP 后会显示配置AP 参数的一个对话框public boolean onPreferenceTreeClickPreferenceScreen preferenceScreen Preference preference if preference instanceof AccessPointPreference AccessPointState state AccessPointPreferencepreference.getAccessPointStateshowAccessPointDialogstate AccessPointDialog.MODE_INFO武汉大学Google Android 联合实验室AP9-当用户在AcessPointDialog 中选择好加密方式和输入密钥之后再点击连接按钮Android就会去连接这个APprivate void handleConnect String password getEnteredPasswordif TextUtils.isEmptypassword mState.setPasswordpasswordmWifiLayer.connectToNetworkmState武汉大学Google Android 联合实验室AP10-WifiLayer 会先检测这个AP 是不是之前被配置过这个是通过向wpa_supplicant 发送LIST_NETWORK 命令并且比较返回值来实现的// Need WifiConfiguration for the APWifiConfiguration config findConfiguredNetworkstate武汉大学Google Android 联合实验室AP11-如果wpa_supplicant 没有这个AP 的配置信息则会向wpa_supplicant 发送ADD_NETWORK命令来添加该APif config null // Connecting for the first time need to create itconfig addConfigurationstateADD_CONFIGURATION_ENABLEADD_CONFIGURATION_SAVE武汉大学Google Android 联合实验室AP12-ADD_NETWORK 命令会返回一个ID WifiLayer 再用这个返回的ID 作为参数向wpa_supplicant 发送ENABLE_NETWORK 命令从而让wpa_supplicant 去连接该AP// Make sure that network is enabled and disable othersmReenableApsOnNetworkStateChange trueif mWifiManager.enableNetworkstate.networkId true Log.eTAG Could not enable network ID state.networkIderrorR.string.error_connectingreturn false武汉大学Google Android 联合实验室AP13-IP 当wpa_supplicant 成功连接上AP 之后它会向控制通道发送事件通知连接上AP 了从而wifi_wait_for_event 函数会接收到该事件由此WifiMonitor 中的MonitorThread 会被执行来出来这个事件void handleEventint event String remainder case CONNECTED:handleNetworkStateChangeNetworkInfo.DetailedState.CONNECTEDremainderbreak…武汉大学Google Android 联合实验室AP14-IP WifiMonitor 再调用WifiStateTracker 的notifyStateChangeWifiStateTracker 则接着会往自身发送EVENT_DHCP_START 消息来启动DHCP 去获取IP 地址private void handleConnectedState setPollTimermLastSignalLevel -1if mHaveIPAddress mObtainingIPAddress mObtainingIPAddress truemDhcpTarget.obtainMessageEVENT_DHCP_START.sendToTarget武汉大学Google Android 联合实验室AP15-IP 然后再广播发送NETWORK_STATE_CHANGED_ACTION 这个Intentcase EVENT_NETWORK_STATE_CHANGED:if result.state DetailedState.DISCONNECTED mDisconnectPending intent newIntentWifiManager.NETWORK_STATE_CHANGED_ACTIONintent.putExtraWifiManager.EXTRA_NETWORK_INFOmNetworkInfoif result.BSSID nullintent.putExtraWifiManager.EXTRA_BSSID result.BSSIDmContext.sendStickyBroadcastintentbreak…武汉大学Google Android 联合实验室AP16-IP WifiLayer 注册了接收NETWORK_STATE_CHANGED_ACTION 这个Intent它的相关处理函数handleNetworkStateChanged 会被调用当DHCP 拿到IP 地址之后会再发送EVENT_DHCP_SUCCEEDED 消息private class DhcpHandler extends Handler public void handleMessageMessage msg switch msg.what case EVENT_DHCP_START:if NetworkUtils.runDhcpmInterfaceName mDhcpInfo event EVENT_DHCP_SUCCEEDED…上一篇:Android中级篇之区分系统程序和安装程序