Android Wifi工作流程
Android终端连接无线信号上网的详细设置步骤_终端信号道标
Android终端连接无线信号上网的详细设置步骤_终端信号道标 Android终端连接无线信号上网的详细设置步骤:
Android终端连接无线信号上网的详细设置步骤第一步:在手机桌面上找到并点击设置图标
,如下图所示:
注意:不同厂商的界面风格有所差异,本文介绍Android原生态的设置项。
Android终端连接无线信号上网的详细设置步骤第二步:在设置菜单中,找到无线和网络,点击 WLAN,如下图所示:
Android终端连接无线信号上网的详细设置步骤第三步:打开 WLAN 无线开关后,在显示的信号列表中找到并点击路由器的信号。
如下图所示:
注意:信号名为已设置的SSID,如果不确认该信号名,需通过有线电脑连接路由器,通过浏览器进入管理界面,点击无线设置 >>基本设置查看SSID,点击无线设置 >> 无线安全设置查看无线密码。
Android终端连接无线信号上网的详细设置步骤第四步:输入无线密码,点击连接。
为避免输入密码错误,建议勾选显示密码。
如下图所示:
Android终端连接无线信号上网的详细设置步骤第五步:在WLAN列表中找到该无线信号,显示已连接。
如下图所示:
表明手机无线已连接成功,此时可尝试上网。
感谢您的阅读,祝您生活愉快。
转:android WIFI开发流程
Android wifi开发楼主发表于 2012-2-24 09:55:33 |查看: 781|回复: 8 这里给出一篇基本的wifi开发流程,希望对涉及到利用wifi进行网络传输的应用有一定帮助1 Android Manifest.xml中配置1. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" >2.</uses-permission>3.<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >4.</uses-permission>5.<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >6.</uses-permission>7.<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >8.</uses-permission>9.<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" >10.</uses-permission>11.<uses-permission android:name="android.permission.INTERNET" >12.</uses-permission>复制代码2 获取wifi服务,并开启wifi1.if (wifiManager == null)2.wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);3.if (!wifiManager.isWifiEnabled()) {4.wifiManager.setWifiEnabled(true);5.}复制代码3 注册wifi扫描监听器,并开始扫描1.wifiNames = new ArrayList<String>();2.wifiDevices = new ArrayList<WifiConfiguration>();3.registerReceiver(wifiReceiver, new IntentFilter(4.WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));5.wifiManager.startScan();复制代码4 wifi扫描监听器1.private final BroadcastReceiver wifiReceiver = new BroadcastReceiver() {2.@Override3.public void onReceive(Context context, Intent intent) {4.List<WifiConfiguration> wcList = wifiManager5..getConfiguredNetworks();6.WifiConfiguration wc = null;7.wifiNames.clear();8.wifiDevices.clear();9.for (int i = 0, len = wcList.size(); i < len; i++) {10.wc = wcList.get(i);11.if (!wifiNames.contains(wc.SSID)) {12.wifiNames.add(wc.SSID);13.wifiDevices.add(wc);14.}15.}16.};复制代码5 获取到周围wifi列表后,让手机连上该wifi。
Android之wifi分析(上)
NETWORK_STATE_CHANGED_ACTION EVENT_NETWORK_STATE_CHANGED EVENT_SUPPLICANT_STATE_CHANGED
WifiStateTracker
WifiService
notify WifiMonitor
WifiNative JNI
android_wifi_net_Wifi
第二步、启动supplicant服务
WifiService 负责启动关闭 wpa_supplicant、启动关闭 WifiMonitor 监视线程和把命令下发
Page 2
给 wpa_supplicant 第三步、启动MonitorThread线程,以下代码就是启动此线程
Sheet1
开始运行线程后先请求连接Suppliant,通过调用WifiStateTracker函数connectToSupplicant然后通过wifi_mtk.c的wifi_connect_to_supplicant 接着向wpa_ctrl的wpa_ctrl_open,然后通过CreateFile函数向wpa_supplicant读取数据。 连接成功后会发送EVENT_SUPPLICANT_CONNECTION消息启动获取DHCP地址线程阻塞调用(当连接上AP的时候,该线程会被执行起来 获取IP地址),并记录自己的MAC地址(因为MAC地址不会改变 ,所以请求一次即可) 接着开启一个死循环处理wpa_supplicant发送的事件。
Page 3
再到WifiStateTracker.java文件里scan
Sheet1
最后通过JNI调用到android_net_wifi_Wifi.cpp
所有的的消息下发来后都通过wifi_common.c文件里的send_command函数发给守护进程supplicant 函数wpa_ctrl_request()文件wpa_ctrl.c里就是负责把这些command发送到supplicant去,由supplicant负责去和wifi的driver打交道完成相应功能设置。 当 wpa_supplicant 处理完 SCAN 命令后,它会向控制通道发送事件通知扫描完成,从而wifi_wait_for_event 函数会接收到该事件 由此 WifiMonitor 中的 MonitorThread 会被执行来处理接扫描结果事件。此线程通过WifiStateTracker 广播 SCAN_RESULTS_AVAILABLE_ACTION这个Intent。 而WifiSettings注册了接收此Intent,最终由其相应函数updateAccessPoints将AP列表,以GUI的形式列出来。 WifiMonitor.java
Androidwifi调试详解及简单实例
Androidwifi调试详解及简单实例
Android wifi 调试
前⾔:
做android开发的时候,经常遇到的⼀个问题就是真机调试次数多了,会导致usb⼝,损坏,⽽且长期给⼿机充电也会损坏⼿机,所以我想了想是否可以拿usb调试,⽹上找了下,还真可以,但都写的⽐较繁琐,今天我们就使⽤3条命令完成任务
⾸先我们需要使⽤的⼯具是adb,它基于tcp协议之上
1.开始我们需要给⼿机开启tcpip模式,这个时候需要usb线连接⼿机
adb tcpip 端⼝号(随便写个⼤点的⽐如:5555)
写完这个之后,usb就没⽤了
2.你需要查看你⼿机的ip地址,⽅法很多
如果想使⽤命令的话(如果使⽤命令查看,usb还不能拔,查完再拔)
adb shell ifconfig wlan0
如果不使⽤的话,⼿机上也可以查到
查到Ip后,就可以连接了
3.连接⼿机
adb connect ⼿机ip
4.如果想断开连接的话
adb disconnect ⼿机ip
⼤功告成,注意⼿机和PC应该在同⼀wifi下,实际你只要PC能ping通⼿机ip就没问题,如果没有路由器怎么办?你电脑⾥⾯的360wifi是⼲什么的?
补充:
如果想切换回usb模式
adb usb
如果切换回去的话,下次连接还需要数据线开启tcpip,如果不切换的话,以后调试就再也不⽤数据线了
感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。
101016andriod无线应用wifi
Wifi模块的初始化:
o 在 SystemServer 启动的时候,会生成一个 ConnectivityService 的实例, o try { Log.i(TAG, "Starting Connectivity Service."); ServiceManager.addService(Context.CONNECTIVITY_SE RVICE, new ConnectivityService(context)); } catch (Throwable e) { Log.e(TAG, "Failure starting Connectivity Service", e); }
mmc_rescan分析
ü ü 当检测初始化好了, 发送cmd52复位,(读写寄存器和CIS(卡信息结构)表) mmc_send_io_op_cond(host, 0, &ocr),CMD5发送,只有当SDIO卡收到 cmd5之后,才会返回R4寄存器(询问和设置卡的电压范围),当没接受到 cmd5命令时,不会对任何命令作出反应。 接着进入sdio卡初始化mmc_sdio_init_card() mmc_alloc_card()分配卡结构体,然后发送CDM3,CMD7命令,相应取得卡相 关地址,然后以CMD3返回来的地址RCA作为CMD7的参数,使卡进入命令状态 或是准备状态,如果卡设定已分配到的RCA地址后,将从stand-by状态转化到 command状态,并将回应以后的读取指令及其他指令。如果给卡设定RCA以处 的地址和RCA=000h时,卡将转换到stand-by状态。然后读命令状态寄存器 CCCR与CIS,设置卡速度。
WIFI的基本框架
硬件特性
o 88w8686特性
AndroidWiFi扫描流程分析(wpa_supplicant)
AndroidWiFi扫描流程分析(wpa_supplicant)void wpa_supplicant_req_scan(struct wpa_supplicant *wpa_s, int sec, int usec){int res;if (wpa_s->p2p_mgmt) {wpa_dbg(wpa_s, MSG_DEBUG,"Ignore scan request (%d.%06d sec) on p2p_mgmt interface",sec, usec);return;}res = eloop_deplete_timeout(sec, usec, wpa_supplicant_scan, wpa_s,NULL);if (res == 1) {wpa_dbg(wpa_s, MSG_DEBUG, "Rescheduling scan request: %d.%06d sec",sec, usec);} else if (res == 0) {wpa_dbg(wpa_s, MSG_DEBUG, "Ignore new scan request for %d.%06d sec since an earlier request is scheduled to trigger sooner",sec, usec);} else {wpa_dbg(wpa_s, MSG_DEBUG, "Setting scan request: %d.%06d sec",sec, usec);eloop_register_timeout(sec, usec, wpa_supplicant_scan, wpa_s, NULL);}}static void wpa_supplicant_scan(void *eloop_ctx, void *timeout_ctx){struct wpa_supplicant *wpa_s = eloop_ctx;struct wpa_ssid *ssid;int ret, p2p_in_prog;struct wpabuf *extra_ie = NULL;struct wpa_driver_scan_params params;struct wpa_driver_scan_params *scan_params;size_t max_ssids;int connect_without_scan = 0;wpa_s->ignore_post_flush_scan_res = 0;// 接⼝未使能if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {wpa_dbg(wpa_s, MSG_DEBUG, "Skip scan - interface disabled");return;}if (wpa_s->disconnected && wpa_s->scan_req == NORMAL_SCAN_REQ) {wpa_dbg(wpa_s, MSG_DEBUG, "Disconnected - do not scan");wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);return;}// 如果正在扫描, 推迟本次扫描if (wpa_s->scanning) {/** If we are already in scanning state, we shall reschedule the* the incoming scan request.*/wpa_dbg(wpa_s, MSG_DEBUG, "Already scanning - Reschedule the incoming scan req");wpa_supplicant_req_scan(wpa_s, 1, 0);return;}// 查看是否有使能的ssidif (!wpa_supplicant_enabled_networks(wpa_s) &&wpa_s->scan_req == NORMAL_SCAN_REQ) {wpa_dbg(wpa_s, MSG_DEBUG, "No enabled networks - do not scan");wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);return;}if (wpa_s->conf->ap_scan != 0 &&(wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED)) {wpa_dbg(wpa_s, MSG_DEBUG, "Using wired authentication - ""overriding ap_scan configuration");wpa_s->conf->ap_scan = 0;wpas_notify_ap_scan_changed(wpa_s);}if (wpa_s->conf->ap_scan == 0) {wpa_supplicant_gen_assoc_event(wpa_s);return;}ssid = NULL;if (wpa_s->scan_req != MANUAL_SCAN_REQ &&wpa_s->connect_without_scan) {connect_without_scan = 1;for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {if (ssid == wpa_s->connect_without_scan)break;}}p2p_in_prog = wpas_p2p_in_progress(wpa_s);if (p2p_in_prog && p2p_in_prog != 2 &&(!ssid ||(ssid->mode != WPAS_MODE_AP && ssid->mode != WPAS_MODE_P2P_GO))) {wpa_dbg(wpa_s, MSG_DEBUG, "Delay station mode scan while P2P operation is in progress"); wpa_supplicant_req_scan(wpa_s, 5, 0);return;}/** Don't cancel the scan based on ongoing PNO; defer it. Some scans are* used for changing modes inside wpa_supplicant (roaming,* auto-reconnect, etc). Discarding the scan might hurt these processes.* The normal use case for PNO is to suspend the host immediately after* starting PNO, so the periodic 100 ms attempts to run the scan do not* normally happen in practice multiple times, i.e., this is simply* restarting scanning once the host is woken up and PNO stopped.*/if (wpa_s->pno || wpa_s->pno_sched_pending) {wpa_dbg(wpa_s, MSG_DEBUG, "Defer scan - PNO is in progress");wpa_supplicant_req_scan(wpa_s, 0, 100000);return;}if (wpa_s->conf->ap_scan == 2)max_ssids = 1;else {max_ssids = wpa_s->max_scan_ssids;if (max_ssids > WPAS_MAX_SCAN_SSIDS)max_ssids = WPAS_MAX_SCAN_SSIDS;}wpa_s->last_scan_req = wpa_s->scan_req;wpa_s->scan_req = NORMAL_SCAN_REQ;// 如果设置了connect_without_scan, 连接之前选择的⽹络,不进⾏扫描,直接关联if (connect_without_scan) {wpa_s->connect_without_scan = NULL;if (ssid) {wpa_printf(MSG_DEBUG, "Start a pre-selected network ""without scan step");wpa_supplicant_associate(wpa_s, NULL, ssid);return;}}os_memset(¶ms, 0, sizeof(params));// 设置状态为扫描wpa_s->scan_prev_wpa_state = wpa_s->wpa_state;if (wpa_s->wpa_state == WPA_DISCONNECTED ||wpa_s->wpa_state == WPA_INACTIVE)wpa_supplicant_set_state(wpa_s, WPA_SCANNING);/** If autoscan has set its own scanning parameters*/if (wpa_s->autoscan_params != NULL) {scan_params = wpa_s->autoscan_params;goto scan;}if (wpa_s->last_scan_req == MANUAL_SCAN_REQ &&wpa_set_ssids_from_scan_req(wpa_s, ¶ms, max_ssids)) {wpa_printf(MSG_DEBUG, "Use specific SSIDs from SCAN command");goto ssid_list_set;}....../* Find the starting point from which to continue scanning */// 查找开始扫描的ssidssid = wpa_s->conf->ssid;// 从这⾥看,应该是链表⾥⾯下⼀个ssidif (wpa_s->prev_scan_ssid != WILDCARD_SSID_SCAN) {while (ssid) {if (ssid == wpa_s->prev_scan_ssid) {ssid = ssid->next;break;}ssid = ssid->next;}}if (wpa_s->last_scan_req != MANUAL_SCAN_REQ &&#ifdef CONFIG_AP!wpa_s->ap_iface &&#endif /* CONFIG_AP */wpa_s->conf->ap_scan == 2) {wpa_s->connect_without_scan = NULL;wpa_s->prev_scan_wildcard = 0;wpa_supplicant_assoc_try(wpa_s, ssid);return;} else if (wpa_s->conf->ap_scan == 2) {/** User-initiated scan request in ap_scan == 2; scan with* wildcard SSID.*/ssid = NULL;} else if (wpa_s->reattach && wpa_s->current_ssid != NULL) { // 实⾏单信道,单个ssid扫描。
Android开发入门_WiFi_代码
Android开发入门——WIFI网络操作一.什么是WIFIWIFI 就是一种无线联网技术,常见的一个就是无线路由器。
那么在这个无线路由器的电波覆盖的有效范围内都可以采用WIFI 连接的方式进行联网。
如果无线路由器连接了一个ADLS线路或者别的联网线路,则又被称为“热点”。
流程:初始化---》使能wifi-→查找ap-→配置ap参数-→连接-→配置ip地址1、wifi网卡有以下几种状态:2、要对wifi进行操作,首先要在AndroidMenifest.xml中取得权限的,如下:<!-- 以下是使用wifi访问网络所需要的权限--><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission> //修改网络状态的权限<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> //修改wifi状态的权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> //访问网络权限<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> //访问wifi权限3、对wifi网卡进行操作需要通过WifiManger对象来进行,获取该对象的方法如下:WifiManger wifiManger =(WifiManger)Context.getSystemService(Service.WIFI_SERVICE);打开wifi网卡Wifimanger.setWifiEnabled(true);关闭wifi网卡wifiManger.setWifiEnablee(false);获取网卡的当前的状态wifiManger.getWifiState();========================================主要代码如下=============================================JAVA CODE :No Title Code1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package mars .wifi ;import android.app.Activity ;import android.content.Context ;import .wifi.WifiManager ;import android.os.Bundle ;import android.view.View ;import android.view.View.OnClickListener ;import android.widget.Button ;import android.widget.Toast ;public class WifiActivity extends Activity {/** Called when the activity is first created. */private Button startButton = null ;private Button stopButton = null ;private Button checkButton = null ;private WifiManager wifiManager = null ;@Overridepublic void onCreate (Bundle savedInstanceState ) {super .onCreate (savedInstanceState );setContentView (R .layout .main );startButton = (Button )findViewById (R .id .startWifi );stopButton = (Button )findViewById (R .id .stopWifi );checkButton = (Button )findViewById (R .id .checkWifi );startButton .setOnClickListener (new StartWifiListener ()); stopButton .setOnClickListener (new StopWifiListener ());checkButton .setOnClickListener (new CheckWifiListener ()); }class StartWifiListener implements OnClickListener {@Overridepublic void onClick (View v ) {wifiManager =34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 (WifiManager )WifiActivity .this .getSystemService (Context .WIFI_SERVICE ); wifiManager .setWifiEnabled (true );System .out .println ("wifi state --->" + wifiManager .getWifiState ()); Toast .makeText (WifiActivity .this , "当前Wifi 网卡状态为" +wifiManager .getWifiState (), Toast .LENGTH_SHORT ).show ();}}class StopWifiListener implements OnClickListener {@Overridepublic void onClick (View arg0) {// TODO Auto-generated method stubwifiManager =(WifiManager )WifiActivity .this .getSystemService (Context .WIFI_SERVICE ); wifiManager .setWifiEnabled (false );System .out .println ("wifi state --->" + wifiManager .getWifiState ()); Toast .makeText (WifiActivity .this , "当前Wifi 网卡状态为" +wifiManager .getWifiState (), Toast .LENGTH_SHORT ).show ();}}class CheckWifiListener implements OnClickListener {@Overridepublic void onClick (View v ) {wifiManager =(WifiManager )WifiActivity .this .getSystemService (Context .WIFI_SERVICE ); System .out .println ("wifi state --->" + wifiManager .getWifiState ()); Toast .makeText (WifiActivity .this , "当前Wifi 网卡状态为" +wifiManager .getWifiState (), Toast .LENGTH_SHORT ).show ();}}}1. StringBuffer sb = new StringBuffer();2. sb.append("Wifi 信息\n");3. sb.append("MAC 地址:" + wifiInfo.getMacAddress() + "\n");4. sb.append("接入点的BSSID :" + wifiInfo.getBSSID() + "\n");5. sb.append("IP 地址(int ):" + wifiInfo.getIpAddress() + "\n");6. sb.append("IP 地址(Hex):" + Integer .toHexString(wifiInfo.getIpAddress()) + "\n"); sb.append("IP地址:" + ipIntToString(wifiInfo.getIpAddress()) + "\n");7.sb.append("网络ID:" + wifiInfo.getNetworkId() + "\n");WifiInfo.setText(sb.toString());61.143.168.192。
android wifi原理
android wifi原理在Android设备中,Wifi技术被广泛应用于无线网络连接。
Wifi是一种基于无线局域网(WLAN)技术,通过无线信号进行数据传输。
下面将介绍Android Wifi的工作原理。
Wifi连接分为两个主要的角色:Wifi客户端和Wifi接入点(AP)。
Wifi客户端可以是Android手机、平板电脑或其他支持Wifi连接的设备。
Wifi接入点通常是无线路由器。
当启动Wifi功能时,Android设备将会搜索附近的Wifi网络。
这个搜索过程使用的是Wifi扫描机制,设备会广播请求附近的Wifi接入点响应,从而获取可用网络列表。
通过比较网络信号强度和其他网络参数,设备将选择一个最佳的网络连接。
通过用户选择列表中的网络,设备将尝试和所选的Wifi接入点建立连接。
连接过程可以通过以下步骤完成:1. 设备将向Wifi接入点发送连接请求,并传递设备的唯一身份标识符(即MAC地址)以进行身份验证。
2. Wifi接入点接收到连接请求后,会验证设备的身份。
这通常涉及到密码的验证,以确保只有具有正确凭据的设备可以连接到网络。
3. 如果设备通过了身份验证,Wifi接入点将向设备分配一个IP地址。
通过这个IP地址,设备将能够在Wifi网络上进行数据传输和通信。
4. 连接建立后,设备和Wifi接入点之间会建立一个稳定的通信链路,允许设备在网络上发送和接收数据。
一旦Wifi连接建立,Android设备将自动管理Wifi连接状态。
它会尝试保持和所选Wifi接入点的连接,直到另一个更好的网络出现或用户手动断开连接。
总之,Android Wifi的工作原理涉及到设备的Wifi扫描、连接请求、身份验证和IP地址分配等步骤。
通过这些步骤,Android设备能够和所选的Wifi接入点建立连接,并在无线网络上进行数据传输和通信。
androidwifi
一:Wifi介绍1.概述WIFI就是一种无线联网的技术,以前通过网线连接电脑,而现在则是通过无线电波来连网;常见的就是一个无线路由器,那么在这个无线路由器的电波覆盖的有效范围都可以采用WIFI连接方式进行联网,如果无线路由器连接了一条ADSL线路或者别的上网线路,则又被称为“热点”。
2.运作原理Wi-Fi 的设置至少需要一个Access Point(ap)和一个或一个以上的client(hi)。
AP每100ms将SSID(Service Set Identifier)经由beacons(信号台)封包广播一次,beacons封包的传输速率是1 Mbit/s,并且长度相当的短,所以这个广播动作对网络效能的影响不大。
因为Wi-Fi规定的最低传输速率是1 Mbit/s ,所以确保所有的Wi-Fi client端都能收到这个SSID广播封包,client 可以借此决定是否要和这一个SSID的AP连线。
使用者可以设定要连线到哪一个SSID。
Wi-Fi系统总是对用户端开放其连接标准,并支援漫游,这就是Wi-Fi的好处。
但亦意味着,一个无线适配器有可能在性能上优于其他的适配器。
由于Wi-Fi通过空气传送信号,所以和非交换以太网有相同的特点。
近两年,出现一种WIFI over cable的新方案。
此方案属于EOC (ethernet over cable)中的一种技术。
通过将2.4G wifi射频降频后在cable中传输。
此种方案已经在中国大陆小范围内试商用。
3.模块及对应源码总览(1)通用模块No 文件功能位置2 framework.jar wifi管理,wifi状态监视,变更/system/framework/3 services.jar wifi Service /system/framework/4 framework-res.apk framework层用到的资源定义/system/framework/5 libandroid_runtime.so wifi JNI /system/lib/Libnetutils dhcp client,发出DHCP请求,等待DHCP结果。
[VIP专享]安卓手机做无线路由器教程、留着用、随时随地上WIFI
Android无线网络共享设置指南 Android手机的崛起可谓是空前的,而Android 2.2系统的重大革新之一也就是原生支持WiFi网络共享功能。
针对目前众多机器仍没有获得Android 2.2系统的升级,所以下面会分两部分跟大家介绍:1、Android 2.2系统下的设置 由于Android 2.2系统原生便支持无线路由功能,所以我们打开设置菜单,在“无线和网络”里面就可以找到“绑定与便携式热点”功能。
进去后如下:2、Android 2.1或以下手机的设置 由于Android 2.1或以前的系统并不预装了WiFi共享软件,所以要安装第三方的程序。
不过,Android系统要安装这种涉及到比较底层的程序时也往往需要手机本生已经获得了管理员权限,也就是已经Root了。
我们先介绍一下Root的方法:目前已经有很多一键Root的apk软件,例如z4root或者Universal Androot。
这些一键Root的软件大大简化了手机获取权限的过程,不过也并非全部机型都能够成功的。
如果你的手机无法使用这些软件进行Root,那么还要往其他方向去找。
安装与软件界面↑系统版本设置与Root的过程↑ 一键Root之后,软件会提示你是否成功,如果成功了则可以进行下一步的操作了。
安装wireless_tether软件↑提示捐助,错误提示↑ 比较遗憾的是,并非每台手机都会很顺利地使用上这个软件,如果提示报错或者手机没有Root 的话,要重新来过。
也有些手机已经Root 了,但是还是不成功。
关键一点还是在于Android 手机的系统和硬件上的不统一,使得难度十分大。
软件功能演示↑设置菜单 另外,还有一个aNetshare的软件也可以共享,但是英文的操作界面并不容易操作:aNetshare界面 以上的资源可以通过互联网轻易获得,不过Android 2.1系统或者以下的朋友只能抱着尝试的态度去,因为不是每台手机都支持的。
android wifi原理
android wifi原理Android Wi-Fi原理Wi-Fi(Wireless Fidelity)是一种无线网络技术,它使用无线电波进行数据传输,广泛应用于移动设备和电脑之间的无线连接。
Android作为目前最流行的移动操作系统之一,自然也支持Wi-Fi 连接。
本文将介绍Android Wi-Fi的原理及其相关知识。
1. Wi-Fi工作原理Wi-Fi是基于IEEE 802.11标准的无线局域网技术,它使用无线电波在2.4GHz或5GHz频段进行数据传输。
Wi-Fi网络由一个无线路由器和多个无线设备组成,无线路由器负责接收和发送无线信号,而无线设备则通过Wi-Fi模块接收和发送信号。
通过Wi-Fi连接,无线设备可以与互联网进行数据交换。
2. Android Wi-Fi模块Android设备通常配备有Wi-Fi模块,该模块负责与无线路由器进行通信。
在Android系统中,Wi-Fi模块由驱动程序和一系列系统服务组成。
驱动程序负责控制Wi-Fi硬件,而系统服务则提供了Wi-Fi配置、连接管理和网络协议支持等功能。
3. Wi-Fi扫描Android设备在连接Wi-Fi网络之前,需要先进行Wi-Fi扫描,以搜索附近的无线网络。
Wi-Fi扫描通过监听无线信道,获取周围无线网络的信息,包括网络名称(SSID)、信号强度和加密方式等。
Android系统会将扫描到的网络信息存储在一个列表中,供用户选择连接。
4. Wi-Fi连接一旦用户选择了要连接的Wi-Fi网络,Android设备会与该网络建立连接。
在连接过程中,Android系统会与无线路由器进行握手,交换安全密钥或证书,并建立一个安全的通信通道。
一旦连接成功,Android设备就可以通过Wi-Fi网络与互联网进行数据交换。
5. Wi-Fi管理Android系统提供了多种方式来管理Wi-Fi连接。
用户可以通过设置界面手动连接或断开Wi-Fi网络,也可以设置Wi-Fi自动连接开关。
Android之Wifi学习教程
在Android中对Wifi操作,android本身提供了一些有用的包,在.wifi包下面。
简单介绍一下:大致可以分为四个主要的类ScanResult,wifiConfiguration,WifiInfo,WifiManager(1)ScanResult,主要是通过wifi 硬件的扫描来获取一些周边的wifi 热点的信息。
(2)wifiConfiguration 在我们连通一个wifi 接入点的时候,需要获取到的一些信息。
大家可以跟我们有线的设备进行对比一下。
(3)WifiInfo 在我们的wifi 已经连通了以后,可以通过这个类获得一些已经连通的wifi 连接的信息获取当前链接的信息,这里信息就比较简单了,这里简单介绍一下这里的方法: getBSSID() 获取BSSIDgetDetailedStateOf() 获取客户端的连通性getHiddenSSID() 获得SSID 是否被隐藏getIpAddress() 获取IP 地址getLinkSpeed() 获得连接的速度getMacAddress() 获得Mac 地址getRssi() 获得802.11n 网络的信号getSSID() 获得SSIDgetSupplicanState() 返回具体客户端状态的信息(4)wifiManager 这个不用说,就是用来管理我们的wifi 连接,这里已经定义好了一些类,可以供我们使用。
这里来说相对复杂,里面的内容比较多,但是通过字面意思,我们还是可以获得很多相关的信息。
这个类里面预先定义了许多常量,我们可以直接使用,不用再次创建。
介绍完了,开始写一个Demo吧。
程序已启动效果图如下:看代码,其中有注释,我就不多说了。
布局文件代码:1.2.<scrollviewxmlns:android="/apk/res/android"3. android:id="@+id/mScrollView"android:layout_width="fill_parent"4. android:layout_height="wrap_content"android:scrollbars="vertical">5.<linearlayoutxmlns:android="/apk/res/android"6. android:orientation="vertical"7. android:layout_width="fill_parent"8. android:layout_height="fill_parent"9. >10.<textview11. android:id="@+id/allNetWork"12. android:layout_width="fill_parent"13. android:layout_height="wrap_content"14. android:text="当前没有扫描到Wifi网络"15. />16.<button17. android:id="@+id/scan"18. android:layout_width="wrap_content"19. android:layout_height="wrap_content"20. android:text="扫描网络"21. />22.<button23. android:id="@+id/start"24. android:layout_width="wrap_content"25. android:layout_height="wrap_content"26. android:text="打开Wifi"27. />28.<button29. android:id="@+id/stop"30. android:layout_width="wrap_content"31. android:layout_height="wrap_content"32. android:text="关闭Wifi"33. />34.<button35. android:id="@+id/check"36. android:layout_width="wrap_content"37. android:layout_height="wrap_content"38. android:text="Wifi状态"39. />40.</button41.</button42.</button43.</button44.</textview45.46.47.复制代码上面布局文件中的ScrollView用来在Activity中显示右侧滚动条,如果数据多的话,则可以往下滑动继续显示未显示完的数据。
android wifi 代理 原理
android wifi 代理原理Android中的WiFi代理原理是通过设置系统的网络配置来实现的。
当用户在Android设备上设置了WiFi代理,所有通过WiFi连接的应用程序都会使用该代理服务器进行网络请求。
Android设备上的网络配置包括全局代理和WiFi代理两种类型。
全局代理是应用于所有网络连接,而WiFi代理只应用于通过WiFi连接的网络请求。
在Android系统中,当用户设置了WiFi代理时,系统会自动创建一个本地的HTTP代理服务器,该代理服务器监听特定端口(默认为8888)。
当设备上的应用程序发起网络请求时,请求会先发送给该本地代理服务器,然后由代理服务器根据用户设置的代理规则进行转发或处理。
具体而言,当Android设备连接到一个WiFi网络时,系统会自动获取该网络的代理设置。
如果用户在WiFi设置中手动配置了代理服务器,系统将使用该代理服务器进行网络请求。
如果用户没有配置代理服务器,则系统不会使用任何代理进行网络请求。
通过设置WiFi代理,用户可以实现以下功能:1. 监控和分析网络流量:用户可以使用代理服务器捕获和分析设备上的网络请求,以便调试和优化应用程序。
2. 绕过网络限制:如果用户所连接的WiFi网络存在某些限制(如防火墙、内容过滤等),通过设置代理服务器,用户可以绕过这些限制,访问被封锁的网站或服务。
3. 篡改请求和响应:通过代理服务器,用户可以修改请求和响应的内容,以达到某些特定的目的,如劫持广告、修改页面内容等。
需要注意的是,WiFi代理只会应用于通过WiFi连接的网络请求,对于使用移动数据连接的网络请求不会生效。
另外,Android设备上的WiFi代理设置仅适用于当前用户的配置,不会影响其他用户的网络连接。
android wifi框架简介
一、wifi 组建原理:WIFI就是一种无线联网的技术,以前通过网线连接电脑,而现在则是通过无线电波来连网;常见的就是一个无线路由器,那么在这个无线路由器的电波覆盖的有效范围都可以采用WIFI连接方式进行联网,如果无线路由器连接了一条ADSL线路或者别的上网线路,则又被称为“热点”。
一般架设无线网络的基本配备就是无线网卡及一个AP(无线接入点)。
有了AP,就像一般有线网络的Hub一般,无线工作站可以快速且轻易地与网络相连。
特别是对于宽带的使用,WiFi更显优势,有线宽带网络(ADSL、小区LAN等)到户后,连接到一个AP,然后在电脑中安装一块无线网卡即可上网。
普通的家庭有一个AP已经足够,甚至用户的邻里得到授权后,则无需增加端口,也能以共享的方式上网。
二、=================== android WIFI 框架=======================---------------------------------------------------------------------------------------------------三、Android平台Wifi 编译前基本代码路径及文件名(根文件系统的源码下)1、Wifi setting 部分(Java应用层)位于packages/apps/Settings/src/com/android/settings/wifi/WifiSettings.java&WifiEnabler.java2、JAVA Framework部分位于frameworks/base/services/java/com/android/server/WifiService.jav a&Wifi Watchdog Service.java位于frameworks/base/wifi/java/android/net/wifi/WifiManager.java&WifiMonitoer.java&WifiStateTracker.java&WifiNative.java3. Wifi的JNI部分位于frameworks/base/core/jni/android_net_wifi_Wifi.cpp4. Wifi的HAL层代码(wpa_supplicant适配器层)位于hardware/libhardware_legary/wifi/wifi.c5. Wpa_supplicant程序的源码部分(tools)位于external/wpa_supplicant_6/external/wpa_supplicant/生成库libwpa_client.so 和守护进程wpa_supplicant6.kernel (wifi 驱动*.ko)位于 net/wireless drivers/wlan_sd8688 arch/arm/mach-pxa/wlan_pm.c 四、每一层编译后的所在位置Java应用层-- Settings, Wifi Switcher等应用--> /system/app/Java Framework层-->/system/framework/services.jarJNI层--> /system/framework/framework.jarwpa_supplicant 适配器层--> /system/lib/libhardware_legacy.sowpa_supplicant 程序--> /system/bin/wpa_supplicant/system/lib/libwpa_client.soKernel层-- kernel network drivers===================== android WIFI 框架end ====================================Wifi 网卡状态1. WIFI_STATE_DISABLED: WIFI网卡不可用2. WIFI_STATE_DISABLING: WIFI正在关闭3. WIFI_STATE_ENABLED:WIFI网卡可用4. WIFI_STATE_ENABLING:WIFI网卡正在打开5. WIFI_STATE_UNKNOWN:未知网卡状态Rootfs中关于wpa_supplicant的配置1) /device/amlogic/f08refe1/BoardConfig.mk//wpa_supplicant版本,driver WPA_SUPPLICANT_VERSION := VER_0_6_XBOARD_WPA_SUPPLICANT_DRIVER := WEXT2) root/init.rc //wpa_supplicant servicesetprop wifi.interface wlan0service wpa_supplicant /system/bin/wpa_supplicant -Dwext -iwlan0 -d -c/data/misc/wifi/wpa_supplicant.confsocket wpa_wlan0 dgram 0666 wifi wifi3) /system/etc/wifi/wpa_supplicant.conf//config for wpa_supplicant service update_config=1ctrl_interface=wlan0eapol_version=1ap_scan=1fast_reauth=1---------------------android-wifi 原理1. Wifi 模块框图:2.Wifi工作步骤:a.wifi启动b.扫描c.显示扫描的APd.配置连接APe.获取IP地址f.正常上网3.模块细解:【WifiService】由SystemServer启动的时候生成的ConnecttivityService创建,负责启动关闭wpa_supplicant,启动和关闭WifiMonitor线程,把命令下发给wpa_supplicant以及跟新WIFI的状态WifiMonitor 负责从wpa_supplicant接收事件通知【Wpa_supplicant】执行过程1、读取配置文件2、初始化配置参数,驱动函数3、让驱动scan当前所有的bssid4、检查扫描的参数是否和用户设置的想否5、如果相符,通知驱动进行权限认证操作6、连上AP4.Wifi模块代码:Wifi Application代码packages/apps/Settings/src/com/android/settings/wifiWifi Frameworkframeworks/base/wifi/java/android/net/wififrameworks/base/services/java/com/android/serverWifi JNIframeworks/base/core/jni/android_net_wifi_Wifi.cppWifi toolexternal/wpa_supplicantWifi kernelnet/wireless drivers/wlan_sd8688 arch/arm/mach-pxa/wlan_pm.cWifi Hardwarehardware/libhardware_legacy/wifi/wifi.c5.WIFI的基本运行单元流程:【休眠设置】由于WIFI模块是用电大户,所有为了省电,android的WIFI加了一个休眠策略,可以设置永远不断开,充电时不断开和锁屏时断开。
Android settings之Wifi学习
Android wifi模块学习wifi相关的文件位置:WIFI Settings应用程序位于packages/apps/Settings/src/com/android/settings/wifi/JAVA部分:frameworks/base/services/java/com/android/server/frameworks/base/wifi/java/android/net/wifi/JNI部分:frameworks/base/core/jni/android_net_wifi_Wifi.cppwifi管理库。
hardware/libhardware_legary/wifi/wifi用户空间的程序和库:external/wpa_supplicant/生成库libwpaclient.so和守护进程wpa_supplicant。
Wifi 网卡状态1. WIFI_STATE_DISABLED: WIFI网卡不可用2. WIFI_STATE_DISABLING: WIFI正在关闭3. WIFI_STATE_ENABLED:WIFI网卡可用4. WIFI_STATE_ENABLING:WIFI网卡正在打开5. WIFI_STATE_UNKNOWN:未知网卡状态WIFI 访问网络需要的权限<uses-permissionandroid:name=“android.permission.CHANGE_NETWORK_STATE”> </uses-permission>网络状态改变的权限<uses-permissionandroid:name=“android.permission.CHANGE_WIFI_STATE”></uses-permission>修改WIFI状态的权限<uses-permissionandroid:name=“android.permission.ACCESS_NETWORK_STATE”> </uses-permission>访问网络权限<uses-permissionandroid:name=“android.permission.ACCESS_WIFI_STATE”></uses-permission>访问WIFI权限Android提供了frameworks/base/wifi/java/android/net/wifi包供我们操作WiFi。
Android WiFi工作原理
Android Wi-Fi工作原理刘洋第一部分Android概述在介绍Wi-Fi之前,先简要介绍一下Android系统,主要分析一下Android的按层实现的原理。
Android层次结构是整个Android体系中所有应用实现的基础框架,而Android源代码结构则与Wi-Fi的实现细节有关。
1.1 基础知识Android是一款当前最为流行的手机操作系统,它本身的开放性加上Google 公司的大力推广,使其获得了大量手机生产厂商、科研院校、软件公司以及个人开发者的青睐,它属于一个全开放的平台,因此开发者可以得到整个系统的源代码,并能对其进行修改,修改的结果可以通过互联网上传到Android官方网站,倘若被审核通过,就能加入到Android的源代码中,这绝对是一件令人兴奋的事情。
1.2 Android层次结构Android系统是在Linux系统的基础上,经过了层层封装,最终提供给开发者的是大量的Java API,在这里被叫做Android API,于是,开发者就可以像开发一般的Java程序那样开发Android应用程序,这样的设计不仅降低了开发Android 应用程序的难度,还增加了Android系统的界面友好度。
和一般的操作系统一样,Android也是对硬件进行了多层的封装,使得应用程序的开发者和用户能轻松地操作硬件,完成他们所希望完成的事情。
Android 所针对的硬件就是手机,这里主要指智能手机,这种智能手机与传统的手机相比电话功能被弱化,而更偏向于一台笔记本电脑,因此它的CPU、内存等硬件配置要比传统的手机高。
它需要提供给用户一些电脑所拥有的功能,比如说Wi-Fi上网、鼠标或触屏控制的界面、收发电子邮件、玩大型游戏等,但同时又必须拥有传统手机所支持的电话、摄像头、蓝牙等功,这些挑战都增加了Android的设计难度。
Android从下至上可以分为这样几个层次:(1)Linux内核及驱动层(C实现);(2)本地库(C库和C++库)和Java运行时环境层(主要由C、C++实现);(3)Java框架层(主要由Java实现);(4)Java应用程序层(Java实现)。
android wifi管理(An-Beer 工作室)
Android Wifi简单管理与操作因为需要一直在弄网络的问题,今天看了一下Wifi的操作,经过整理,做出来了一个类,可能不全,但是个人感觉已经完全能够满足需要了,当然,里面的方法也有可能是错误的或者是不全的,这个类我没有进行完整的测试,只测试了其中的一些方法。
其实操作Wifi也是很简单的,主要使用以下几个对象或变量:private WifiManager wifiManager;// 声明管理对象OpenWifiprivate WifiInfo wifiInfo;// Wifi信息private List<ScanResult> scanResultList; // 扫描出来的网络连接列表private List<WifiConfiguration> wifiConfigList;// 网络配置列表private WifiLock wifiLock;// Wifi锁其实这些不写成一个单独的类也是可以操作的,介理这里为了使用方便,写了一个统一的类对Wifi进行操作,通过这些方法,基本上可以得到所有操作的数据下面把代码给大家,如果需要可以做为一个参考:代码package com.wifitest;import java.util.List;import android.content.Context;import .wifi.ScanResult;import .wifi.WifiConfiguration;import .wifi.WifiInfo;import .wifi.WifiManager;import .wifi.WifiManager.WifiLock;public class WifiManageClass {private WifiManager wifiManager;// 声明管理对象private WifiInfo wifiInfo;// Wifi信息private List<ScanResult> scanResultList; // 扫描出来的网络连接列表private List<WifiConfiguration> wifiConfigList;// 网络配置列表private WifiLock wifiLock;// Wifi锁public WifiManageClass(Context context) {this.wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);// 获取Wifi服务// 得到Wifi信息this.wifiInfo = wifiManager.getConnectionInfo();// 得到连接信息}public boolean getWifiStatus(){return wifiManager.isWifiEnabled();// 打开/关闭 wifipublic boolean openWifi() {if (!wifiManager.isWifiEnabled()) {return wifiManager.setWifiEnabled(true);} else {return false;}}public boolean closeWifi() {if (!wifiManager.isWifiEnabled()) {return true;} else {return wifiManager.setWifiEnabled(false);}}// 锁定/解锁wifi// 其实锁定WiFI就是判断wifi是否建立成功,在这里使用的是held,握手的意思acquire 得到!public void lockWifi() {wifiLock.acquire();public void unLockWifi() {if (!wifiLock.isHeld()) {wifiLock.release(); // 释放资源}}// 我本来是写在构造函数中了,但是考虑到不是每次都会使用Wifi锁,所以干脆自己建立一个方法!需要时调用,建立就OKpublic void createWifiLock() {wifiLock = wifiManager.createWifiLock("flyfly"); //创建一个锁的标志}// 扫描网络public void startScan() {wifiManager.startScan();scanResultList = wifiManager.getScanResults(); // 扫描返回结果列表wifiConfigList = wifiManager.getConfiguredNetworks (); // 扫描配置列表}public List<ScanResult> getWifiList() {return scanResultList;}public List<WifiConfiguration> getWifiConfigList() { return wifiConfigList;}// 获取扫描列表public StringBuilder lookUpscan() {StringBuilder scanBuilder = new StringBuilder();for (int i = 0; i < scanResultList.size(); i++) { scanBuilder.append("编号:" + (i + 1));scanBuilder.append(scanResultList.get(i).toStri ng()); //所有信息scanBuilder.append("\n");}return scanBuilder;}//获取指定信号的强度public int getLevel(int NetId){return scanResultList.get(NetId).level;}// 获取本机Mac地址public String getMac() {return (wifiInfo == null) ? "" : wifiInfo.getMacAddr ess();}public String getBSSID() {return (wifiInfo == null) ? null : wifiInfo.getBSSID ();}public String getSSID() {return (wifiInfo == null) ? null : wifiInfo.getSSID ();}// 返回当前连接的网络的IDpublic int getCurrentNetId() {return (wifiInfo == null) ? null : wifiInfo.getNetwo rkId();}// 返回所有信息public String getwifiInfo() {return (wifiInfo == null) ? null : wifiInfo.toString ();}// 获取IP地址public int getIP() {return (wifiInfo == null) ? null : wifiInfo.getIpAdd ress();}// 添加一个连接public boolean addNetWordLink(WifiConfiguration config) {int NetId = wifiManager.addNetwork(config);return wifiManager.enableNetwork(NetId, true);}// 禁用一个链接public boolean disableNetWordLick(int NetId) {wifiManager.disableNetwork(NetId);return wifiManager.disconnect();}// 移除一个链接public boolean removeNetworkLink(int NetId) {return wifiManager.removeNetwork(NetId);}//不显示SSIDpublic void hiddenSSID(int NetId){wifiConfigList.get(NetId).hiddenSSID=true;}//显示SSIDpublic void displaySSID(int NetId){wifiConfigList.get(NetId).hiddenSSID=false;}}当然在操作Wifi的时候也需要相应的权限,个人感觉这个是使用权限最多的,当然操作Wifi不能在模拟器中进行,必须要放到带有Wifi的真机上进行,还有此类没有对可能存在的错误进行相应的捕获与处理,希望参考的朋友注意这一点,否则可能容易被突然出来的错误误导,也找不到问题,我在开发的时候就遇到过这样的问题!因此对可能存在的问题,一定要进行相应的处理!下面是操作这些所需要的权限,当然根据操作的内容不同,可能权限也不同,下面的权限仅供参考:代码<uses-permission android:name="android.permission.ACCESS_ WIFI_STATE"></uses-permission><uses-permission android:name="adnroid.permission.ACCESS_ CHECKIN_PROPERTTES"></uses-permission><uses-permission android:name="android.permission.WAKE_LO CK"></uses-permission><uses-permission android:name="android.permission.INTERNE T"></uses-permission><uses-permission android:name="adnroid.permission.CHANGE_ WIFI_STATE"></uses-permission><uses-permission android:name="android.permission.MODIFY_ PHONE_STATE"></uses-permission>如果你发现这些代码中有错误或者是不完整的话,希望发消息给我,进行完善!只有相互交流才能进步!。
android wifi一般操作集合
一.WifiManager状态判断在Android手机上单击"Menu"按钮,再单击"设置"(Settings),有一个设置"无线控制"(管理WiFi、蓝牙、红外模式及移动电话网络)的功能(英文版本为Wireless Controls),以及一个"CheckBox",可以通过它控制无线网络的打开与关闭,本范例即是实现此Checkbox 对WiFi无线网络打开与关闭(WiFi on/ WiFi Off)的范例程序。
为了掌握其WiFi打开的Flag、Status等逻辑判断,本范例的Layout尽可能简单,只有一个CheckBox以及一个TextView。
在WiFi打开或关闭的过程中,包含了表5-6所示的WifiManager状态(Status)。
效果图:程序将针对上述的状态事件进行逻辑判断,并判断CheckBox上的文字是"打开"还是"关闭",再配合WiFi当下的状态,将可否顺利打开或关闭WiFi,以TextView文字显示于画面中。
当User单击CheckBox的同时,发现WiFi正在打开过程中或已打开,则显示无法再一次打开WiFi或已打开的提示;又或者当WiFi处于关闭过程中或已关闭,则提示无法关闭或已关闭的信息提示。
在这个程序练习,Android手机需要至少支持WiFi模块,否则在模拟器中,只会一直显示打开中或无法关闭的信息。
效果图:主程序中包含了所有WiFi连接状态的判断,并针对不同状态的结果,决定是否要打开或关闭WiFi服务。
在Activity的onCreate事件中,设计了一个CheckBox与其OnClickListener,并在User单击此CheckBox时,先判断CheckBox的状态(勾选或取消勾选),在勾选状态下即打开WiFi服务的事件;取消勾选的状态下,即运行取消WiFi服务的事件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android Wifi的工作流程一、WIFI工作相关部分Wifi 网卡状态1. WIFI_STATE_DISABLED: WIFI网卡不可用2. WIFI_STATE_DISABLING: WIFI正在关闭3. WIFI_STATE_ENABLED:WIFI网卡可用4. WIFI_STATE_ENABLING:WIFI网卡正在打开5. WIFI_STATE_UNKNOWN:未知网卡状态WIFI 访问网络需要的权限"android.permission.CHANGE_NETWORK_STATE">修改网络状态的权限android:name="android.permission.CHANGE_WIFI_STATE">修改WIFI状态的权限"android.permission.ACCESS_NETWORK_STATE">访问网络权限"android.permission.ACCESS_WIFI_STATE">访问WIFI权限WIFI 核心模块n WifiService由SystemServer启动的时候生成的ConnecttivityService创建,负责启动关闭wpa_supplicant,启动和关闭WifiMonitor线程,把命令下发给wpa_supplicant以及跟新WIFI的状态n WifiMonitor负责从wpa_supplicant接收事件通知n Wpa_supplicant1、读取配置文件2、初始化配置参数,驱动函数3、让驱动scan当前所有的bssid4、检查扫描的参数是否和用户设置的想否5、如果相符,通知驱动进行权限认证操作6、连上APn Wifi驱动模块厂商提供的source,主要进行load firmware和kernel的wireless进行通信n Wifi电源管理模块主要控制硬件的GPIO和上下电,让CPU和Wifi模组之间通过sdio接口通信二、Wifi工作步骤1 Wifi模块初期化2 Wifi启动3 查找热点(AP)4 配置AP5 配置AP参数6 Wifi连接7 IP地址配置三、WIFI的架构和流程1、WIFI的基本架构1、wifi用户空间的程序和库:external/wpa_supplicant/生成库libwpaclient.so和守护进程wpa_supplicant2、hardware/libhardware_legary/wifi/是wifi管理库3、JNI部分:frameworks/base/core/jni/android_net_wifi_Wifi.cpp4、JAVA部分:frameworks/base/services/java/com/android/server/frameworks/base/wifi/java/android/net/wifi/5、WIFI Settings应用程序位于:packages/apps/Settings/src/com/android/settings/wifi/6、WIFI 驱动模块 wlan.kowpa_supplicant通过wireless_ext 接口和驱动通信7、WIFI 硬件模块2、WIFI在Android中如何工作Android使用一个修改版wpa_supplicant作为daemon来控制WIFI,代码位于external/wpa_supplicant。
wpa_supplicant是通过socket与hardware/libhardware_legacy/wifi/wifi.c通信。
UI通过.wifi package (frameworks/base/wifi/java/android/net/wifi/)发送命令给wifi.c。
相应的JNI实现位于frameworks/base/core/jni/android_net_wifi_Wifi.cpp。
更高一级的网络管理位于frameworks/base/core/java/android/net。
3、配置Android支持WIFI在BoardConfig.mk中添加:BOARD_HAVE_WIFI := trueBOARD_WPA_SUPPLICANT_DRIVER := WEXT这将在external/wpa_supplicant/Android.mk设置WPA_BUILD_SUPPLICANT为true,默认使用驱动driver_wext.c。
如果使用定制的wpa_supplicant驱动(例如wlan0),可以设置:BOARD_WPA_SUPPLICANT_DRIVER := wlan04、使能wpa_supplicant调试信息默认wpa_supplicant设置为MSG_INFO,为了输出更多信息,可修改:1、在common.c中设置wpa_debug_level = MSG_DEBUG;2、在common.c中把#define wpa_printf宏中的if ((level) >= MSG_INFO)改为if ((level) >= MSG_DEBUG)5、配置wpa_supplicant.confwpa_supplicant是通过wpa_supplicant.conf中的ctrl_interface=来指定控制socket的,应该在AndroidBoard.mk中配置好复制到$(TARGET_OUT_ETC)/wifi(也就是/system/etc/wifi/wpa_supplicant.conf)这个位置会在init.rc中再次检测的。
一般的wpa_supplicant.conf配置为:ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=wifiupdate_config=1fast_reauth=1有时,驱动需要增加:ap_scan=1如果遇到AP连接问题,需要修改ap_scan=0来让驱动连接,代替wpa_supplicant。
如果要连接到non-WPA or open wireless networks,要增加:network={key_mgmt=NONE}6、配置路径和权限Google修改的wpa_supplicant要运行在wifi用户和组下的。
代码可见wpa_supplicant/os_unix.c中的os_program_init()函数。
如果配置不对,会出现下面错误:E/WifiHW ( ): Unable to open connection to supplicant on"/data/system/wpa_supplicant/wlan0": No such file or directory will appear.确认init.rc中有如下配置:mkdir /system/etc/wifi 0770 wifi wifichmod 0770 /system/etc/wifichmod 0660 /system/etc/wifi/wpa_supplicant.confchown wifi wifi /system/etc/wifi/wpa_supplicant.conf# wpa_supplicant socketmkdir /data/system/wpa_supplicant 0771 wifi wifichmod 0771 /data/system/wpa_supplicant#wpa_supplicant control socket for android wifi.cmkdir /data/misc/wifi 0770 wifi wifimkdir /data/misc/wifi/sockets 0770 wifi wifichmod 0770 /data/misc/wifichmod 0660 /data/misc/wifi/wpa_supplicant.conf如果系统的/system目录为只读,那应该使用路径/data/misc/wifi/wpa_supplicant.conf。
7、运行wpa_supplicant和dhcpcd在init.rc中确保有如下语句:service wpa_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant -dd-Dwext -iwlan0 -c /data/misc/wifi/wpa_supplicant.confuser rootgroup wifi inetsocket wpa_wlan0 dgram 660 wifi wifioneshotservice dhcpcd /system/bin/logwrapper /system/bin/dhcpcd -d -B wlan0disabledoneshot根据所用的WIFI驱动名字,修改wlan0为自己驱动的名字。
8、编译WIFI驱动为modul e或kernel built in1、编译为module在BoardConfig.mk中添加:WIFI_DRIVER_MODULE_PATH := "/system/lib/modules/xxxx.ko"WIFI_DRIVER_MODULE_ARG := "" #for example nohwcryptWIFI_DRIVER_MODULE_NAME := "xxxx" #for example wlan0WIFI_FIRMWARE_LOADER := ""2、编译为kernel built in1)在hardware/libhardware_legacy/wifi/wifi.c要修改interface名字,2)在init.rc中添加:setprop wifi.interface "wlan0"3)在hardware/libhardware_legacy/wifi/wifi.c中当insmod/rmmod时,直接return 0。
9、WIFI需要的firmwareAndroid不使用标准的hotplug binary,WIFI需要的firmware要复制到/etc/firmware。
或者复制到WIFI驱动指定的位置,然后WIFI驱动会自动加载。
10、修改WIFI驱动适合AndroidGoogle修改的wpa_supplicant要求SIOCSIWPRIV ioctl发送命令到驱动,及接收信息,例如signal strength, mac address of the AP, link speed等。