android 2.3 wifi (一)

Android/安卓开发之WIFI的基本应用 本文没有涉及到连接WIFI之后进行通讯,若有这方面的想法(例如两个客户端连接至同一WIFI后进行通讯),请关注后续文章一起讨论。 其实关于WIFI的开发的文章也非常的多,但是大部分只是简单的例子,不够全面,我这里是想写一个比较完整的WIFI应用,主要功能: 1.能够打开/关闭WIFI 2.能够扫面wifi并获取扫描结果 3.能够连接wifi,无论是什么加密方式 4.能够监听连接状态,如正... 阅读详情

1.       Wifi扫盲

Access point: 也叫hotspot(热点), 家里的无线路由就是ap。

SoftAp:软ap, 用无线网卡模拟ap的功能。

Wifi网络有两种模式:

  • Infrastructure mode, in which wireless clients are connected to an access point. This is generally the default mode for 802.11b cards.
  • Ad hoc mode, in which clients are connected to one another without any access point.

请参考http://en.kioskea.net/contents/wifi/wifimodes.php3

我们既可以通过Ad hoc也可以通过SoftAp方式来实现共享网络(例如手机可以通过笔记本访问internet), 但是原理不同。

这里只是简单的概括, 详细的解释请google或百度。

 

2.       Android Wifi框架的结构图



    上图只是wifi工作于station模式时的图, 当工作于soft ap模式时最基本的不同是不通过wpa_supplicant而是Framework层直接通过netd daemon来控制驱动。

3.       wpa_supplient

    虽然本文不关心JNI层以下的部分, 但wpa_supplient是什么需要解释一下。 WPA是WiFi Protected Access的缩写, wpa_supplicant是“WiFi网络安全存取认证”的意思。Android是用的wpa_supplicant的修改版本。

       在Android wifi框架里, wpa_supplcant起着承上启下的作用。 它向上提供netlink socket接口, 向下依赖wifi驱动的wireless extention标准接口。 也就是说驱动必须支持wireless extention才可以。wireless extention其实是一个将要过时的标准, Android也将向nl80211标准过度, 采用未修改的wpa_supplicant。

请参见http://wireless.kernel.org/en/developers/Documentation/Android。

       本节以下部分摘自《Android平台上无线网卡自动扫描并关联AP的实现》:http://hi.baidu.com/xyp86/blog/item/d371a1d78d4162d7a144dfd3.html。 

       Android平台使用的WiFi控制框架是基于大名鼎鼎的wpa_supplicant,它是一个安全中间件,为各种无线网卡提供统一的安全机制,如下图所示:


       客户端程序,包括wpa_cli命令行或java图形界面程序,通过unix本地socket与
wpa_supplicant daemon服务通信,发送命令并接收结果;wpa_supplicant daemon服务,对应上述中间部分,功能是“上传下达”。所有客户端通过它控制硬件网卡,通过发送字符串命令控制是否扫描AP,提取扫描结果和是否关联AP等操作,同时将驱动的执行状态发送给用户。该服务是设计支持多种无线网卡芯片,因此各个厂商共同提供了一个通用接口给wpa_supplicant调用

4.       Netd

Netd是android的一个守护进程, 是专门为Android开发的。 它功能很广, 包括设置nat, usb tethering, wifi tethering, soft ap设置, 还有网络接口add, remove, change事件的通知。 在FrameWork有NetworkManagementService负责和netd通信,framework代码可以通过 NetworkManagementService利用netd的全部功能。Netd的代码位于“android sources”/system/netd。

5.       FrameWork层架构


6.       情景分析

6.1.      情景1

       当前系统正连接了以太网, Wifi是未使能的, 有无密码的Wifi信号存在, Wifi的优先级高于以太网。 此时在Settings使能Wifi, 系统就会连接到Wifi网络, 那么整个过程是怎样的呢?

       下面是整个过程的UML序列图。


    当在settings使能Wifi后, 首先会调用WifiService.setApEnabled(false), 也就是禁止Wifi模块的作为Ap(Access Point, 即一个接入点)的功能。需要了解的是, 现在的硬件Wifi模块即支持去连接附近的Ap, 也可以作为Ap供其它设备接入。那么给其它设备接入有什么用处呢? 那就是tethering, 即网络共享。 假设你的设备当前可以通过以太网访问因特网, 当在Wifi上使能Ap功能时, 其它连入的设备就可以通过这台设备访问因特网。 当然在同一时刻, 只能有一种身份。

       接着会调用WifiService.setWifiEnabled(true), 去加载wifi适配层, 启动supplient守护进程, 启动MonitorThread开始监听supplient的事件。

       首先 MonitorThread会收到DRIVER_STATE事件, 意味着硬件启动成功。 接着会调用到WifiNative.scanCommand()向supplient发送搜索Ap的命令。然后MonitorThread又进入等待事件的状态。

       当supplient搜索Ap结束时, MonitorThread会收到SCAN_RESULTS事件。 接下来会调用WifiNative. setScanResultHandlingCommand(NormalMode)来让supplient自行决定去连接到哪个Ap, supplient会挑选信号最强并且没有密码的Ap进行连接。同时WifiSettings会收到WifiManager.SCAN_RESULTS_AVAILABLE_ACTION广播,调用mWifiManager.getScanResults()得到扫描到得ap列表。 ScanResult里包含如下信息:

 

    public String SSID;

   

    public String BSSID;

   

    public String capabilities;

   

    public int level;

   

    public int frequency;

下面是几个ScanResult的例子:

SSID=”Exotica”

FEATURES=”[WPA2-PSK-CCMP]”

FREQ=2422

LEVEL=-40

BS=”01:02:03:04:05:06”

 

SSID=”Exotica”

FEATURES=”[WEP]”

FREQ=2432

LEVEL=-50

BS=”02:03:04:05:06:07”

 

       当supplient连接到一个Ap时, MonitorThread会收到CONNECTED事件。 接下来就会尝试配置IP地址, 如果IP地址配置成功就会发送EVENT_STATE_CHANGED给ConnectivityService,ConnectivityService就会根据网络优先级决定关掉以太网而通过Wifi联网的决定。这里要区分网络接口的disconnect和disable的不同之处, disconnected的接口依然可能enable, disable是指硬件上的。 在pc上当切换到其他网络只是disconnected以前的网络, 而Android为了省电, 是disable以前网络的。

6.2.      情景2

    系统启动时, Wifi和Ethernet都处于使能状态, 并且附近有没有密码的Wifi信号, Ethernet也是通的。系统启动后就会自动连接到Wifi网络, 那么系统启动时如何决定连接到哪个网络呢?

       在上一篇《Android的网络支持和管理(一)---以太网》中, 我们分析了从网线插上到以太网通畅的全过程。 这过程中驱动层一共向上发出了两个信号, 第一个代表硬件连接上了, 第二个代表网络连接上了(即IP地址配置成功)。

        刚才我们又分析了当使能Wifi到Wifi通畅的全过程。 这过程中驱动层一共向上发了三个信号, 第一个代表硬件使能成功,第二个代表搜索Ap完毕, 第三个代表网络连接上了(即IP地址配置成功)。

        在IP地址配置成功以前, 以太网和Wifi都是默默做着自己的工作, 丝毫没有参与网络管理。 当即IP地址配置成功后, 能够确保各自网络通畅时, 才通知ConnectivityManager。

        当启动时,如果以太网使能的话, 不管有没有网线连接都会去尝试根据保存的设置配置IP地址, 如果IP地址配置成功就会通知ConnectivityManager。同样, 如果Wifi使能的话, 就会加载Wifi驱动和启动wpa_supplient, 然后搜索AP并尝试连接, 接下来配置IP地址, 如果成果的话就会通知 ConnectivityManager。(注:WifiService.startWifi函数会在ConnectivityManager的构造函数里面调用去判断是不是要使能Wifi)无论ConnectivityManager先收到Wifi发出的信号还是以太网发出的信号, 最后的结果都是一样的, 当收到第二个信号时就会禁掉优先级小的以太网。

6.3.      情景3

系统中只有Wifi, 附近有好几个有密码的Ap, 当在Settings里使能Wifi后, 会搜索到这些Ap并显示出来。 我们选择一个Ap后会弹出WifiDialog要求输入密码, 输入密码后点确定。 下面是随后的过程。

       


       我们在WifiDialog中配置的信息可以用WifiConfigure来表示, 它包含的信息如下:

 

    public int networkId;

 

   

    public int status;

   

    public String SSID;

   

    public String BSSID;

 

   

    public String preSharedKey;

   

    public String[] wepKeys;

 

   

    public int wepTxKeyIndex;

 

   

    public int priority;

 

   

    public boolean hiddenSSID;

 

   

    public BitSet allowedKeyManagement;

   

    public BitSet allowedProtocols;

   

    public BitSet allowedAuthAlgorithms;

   

    public BitSet allowedPairwiseCiphers;

   

    public BitSet allowedGroupCiphers;

       ScanResult是Ap广播的信息,而WifiConfigure是wpa_supplicant用来尝试和Ap进行连接的信息。ScanResult说“窗前明月光”, WifiConfigure只有说“疑是地上霜”才能匹配。 WifiConfigure和wpa_supplicant配置文件里保存的信息格式是对应的, 关于wpa_supplicant更详细的介绍请看源码下的readme 。 可以说wpa_supplicant实现了所有我们需要的功能, 包括ap搜索, 连接,甚至设置的保存。Settings界面通过WifiManager来和wpa_supplicant通信。


【 Android11 WiFi开发 一 】WiFi列表获取与展示 最近在Android11上开发了WiFi相关功能,涉及到WiFi列表的获取、连接有密码的WiFi、连接已保存的WiFi、忘记连接的WiFi、添加其他WiFi。涉及到的知识点较多作以分篇记录,本篇将介绍WiFi列表的获取与展示。 阅读详情

相关推荐

SDIO_WiFi驱动学习之安卓WLAN架构介绍及调用流程分析

一、引言 上一篇博客大概介绍了MMC子系统和SDIO相关知识及架构,这一篇博客则大致分析安卓的WLAN架构及上层如何调用WLAN驱动的流程。 虽然我工作的开发环境是安卓系统,但由于我不是专业的安卓应用/框架开发工程师,所以对安卓层的一些代码并不是特别熟悉,只能大致梳理流程,不专业的地方请谅解。 本文部分内容摘抄自网络,若有侵权,请联系删除。 二、安卓WLAN架构 1、应用框架(Application framework) 在应用程序框架级别是应用程序代码,它使用各种android.net..

陈子陌的博客 5088

Patch android wifi to enable IBSS/WEP support

Only To developers. wpa_supplicant 0.8.x, wpa_supplicant_drvier nl80211, wifi chip bcm4330. 转载请注明出处:http://blog.csdn.net/zirconsdu/article/details/8571260  最后修改版,能连接使用ADHOC,能显示信号强度; Patch 修改Set

zirconsdu的专栏 6624

Android4.4.2源码分析之WiFi模块(一)

由对Androidsetting的源码分析之WiFi模块的界面fragment为WiFisettings.java,关于setting模块的源码分析可以参考 Android系统源码剖析(一)---Settings 已经写了几篇关于Android源码的,源码代码量太大,所以如果想分析某个模块可能不知如何下手,说一下思路 1,分析源码英文阅读能力要够,想要分析某个模块一般找模块对应的英文

fanfan 7720

5wpa_supplicant程序 --详解

目前可以使用wireless-tools或wpa_supplicant工具来配置无线网络。请记住重要的一点是,对无线网络的配置是全局性的,而非针对具体的接口。 wpa_supplicant是一个较好的选择,但缺点是它不支持所有的驱动。请浏览wpa_supplicant网站获得它所支持...

2491

安卓广播监听WiFi信号强弱的变化

安卓开发过程中,有可能会遇到监听WiFi信号强弱的需求,比如:一些应用隐藏掉手机自带的状态栏,就需要自己实现监听WiFi信号的强弱,还有电池电量,还有时间的变化;废话不多说,下面看图,自己实现的状态栏: 下面是获取WiFi信号并设置相对应图标的代码: /** * 获取WIFI信号的强弱 */ public void getWifiStrength(fin

赵小贱的博客 3854

RK系列Android AP6xxx WiFi BT Patch

RK系列Android AP6xxx WiFi BT Patch调试代码和相关文档资料

wpa_supplicant 移植

到官方下载个 http://hostap.epitest.fi/wpa_supplicant/ 最新版到 http://www.openssl.org/source/ 下载个 /wpa_supplicant-0.6.9/patches 有对应补丁的源码首先先编译openssl打对应的补丁后./Configure linux-elf-mips -DB_ENDIAN linux:mipsel

lyoyou的专栏 4182

Android2.3.5 softap开启流程及框架

这篇文档主要讲解了Android2.3.5系统中softap是如何启动以及实现的,由于网上这种资料比较少,整理以下,大家互相学习。

Android10连接WiFi时遇到的问题

存在的问题:在真机测试时,我的手机安卓9,在使用addNetwork()方法时功能是正常的,当换一个手机的时候(Android10)时发现连接WiFi的功能无法使用,在网上查阅资料,后发现安卓9和安卓10的连接WiFi的方法不一样,文档链接(https://developer.android.google.cn/guide/topics/connectivity/wifi-bootstrap#ja...

nn690960430的博客 1万+

Aspen Plus下载教程Aspen Plus V14 保姆级安装步骤(附安装包)

26、在WlmAdmin界面中,依次点击【Subnet Servers】、【admin】、【Add Feature】、【From a File】、【To Server and its File】。35、在产品选择页面,勾选需要安装的所有产品(重要:不要勾选【Aspen Online(Plant Data)】),然后点击【File Location】。回到桌面,点击任务栏的【开始菜单】,在【所有应用】中找到【Aspen Plus V14】软件图标,将其拖到桌面上创建快捷方式。9、这里可以更改软件的安装位置。

ps_xiaowang的博客 1万+

VSCode+ESP-IDF开发环境搭建:从零开始创建你的第一个物联网项目(2024最新版)

本文详细介绍了如何在2024年使用VSCode和ESP-IDF搭建物联网开发环境,从零开始创建第一个物联网项目。内容包括环境准备、ESP-IDF配置、项目创建与结构解析、构建烧录步骤以及高级技巧和常见问题解决方案,帮助开发者快速上手ESP32开发。

weixin_29165725的博客 330

如何通过WiFi将文件从安卓设备传输到电脑

以上五种方法可以帮助通过 WiFi 将文件从安卓设备传输到电脑。由于方法二存在云存储限制,以及方法三、四、五的操作较为复杂。它可以通过 WiFi 或 USB 在三个步骤内快速完成传输。如果你有任何问题,请在下方评论,我们会尽力帮助你!

Digitally的博客 1704

一文带你看懂SAP-HANA的基本架构与原理

创作不易,希望大家一键三连支持!!!♥♥♥创作不易,希望大家一键三连支持!!!♥♥♥创作不易,希望大家一键三连支持!!!♥♥♥。

丷江南南的博客 5076

Android WiFi(一)

Android WiFi WiFi相关的知识点,我是第一次接触,所以比较零碎 WiFi Scan 官方文档对WiFi扫描的说明: WLAN 扫描功能概览 比较完整的例子,可参考: Develop a WiFi Scanner for Android 按照官方文档,大致的步骤: 1.为 SCAN_RESULTS_AVAILABLE_ACTION 注册一个广播监听器,系统会在完成扫描请求时调用此监听器,提供其成功/失败状态 2.使用 WifiManager.startScan() 请求扫描 3.使用 W

了凡 2813

华为2021年天线工程师笔试题目回忆总结(持续更新)

1. 判定长线和短线 所谓长线是指传输线的几何长度和线上传输电磁波的波长的比值(即电长度)大于或接近于1。反之称为短线。是相对于波长而言的。 1000m的传输线,对于频率为50hz(即波长为6000km)的交流电来说,仍远小于波长,应视为短线。长线和短线的区别还在于:长线为分布参数电路,而短线是集总参数电路。 2. 判定传输线的容性和感性 传输线上的输入阻抗具有以下特点: 1/4波长变换性:感性负载与容性负载变换,开路与短路变换; 1/2波长重复性:相距1/2波长的整数倍的两个点输入阻抗都相等。1/4开路传

ludashi3的博客 9530

基于ESP32和OV5640的目标检测系统

本文详细介绍了基于ESP32-S3和OV5640摄像头构建目标检测系统的完整方案。系统采用YOLOv8-Nano轻量级模型,通过INT8量化实现边缘部署,在UXGA分辨率下达到25fps帧率。文章从硬件选型、图像采集优化、模型量化部署、实时推理流水线构建等维度展开,重点解决了内存管理、电源稳定性和异常处理等嵌入式系统关键问题。该方案在资源受限条件下实现了150ms以内的端到端延迟,为物联网视觉应用提供了低成本、低功耗的解决方案,适用于智能家居、工业检测等多个场景。

reset2021的博客 329

android wifi 详解

http://ppmiao.com/csdn/31387 最近研究Wifi模块,查了不少的相关资料,但发现基本上是基于android2.0版本的的分析,而现在研发的android移动平台基本上都是2.3的版本,跟2.0版本的差别,在Wifi模块上也是显而易见的。2.3版本Wifi模块没有了WifiLayer,之前的WifiLayer主要负责一些复杂的Wifi功能,如AP选择等以提

lwpping的专栏 2901

低代码组件开发——OpenClaw智能助手的组件设计与开发(2026技术版)

OpenClaw智能助手的低代码组件开发平台采用分层架构设计,包含组件定义、注册、配置、渲染和生命周期管理等核心模块。该系统支持UI、功能、数据和集成四种组件类型,强调可重用性、可配置性和可扩展性。组件定义通过TypeScript、React等技术实现组件结构和行为的描述,组件注册中心基于Node.js和MongoDB管理组件版本。该平台通过React、Redux等技术实现组件渲染和状态管理,并提供完整的生命周期管理机制。这种架构设计显著提升了智能助手应用的开发效率和质量。

一键难忘的博客 407

android wifi模块分析

声明:本文纯属网上资料收集,版权归源作者所有,转载时请标明为转载文章 现在对android平台的wifi模块了解了一段时间,现在做一些简要总结,以便以后查阅和与修正,上正文。 【Wifi模块学习流程】 最近研究Wifi模块,查了不少的相关资料,但发现基本上是基于android2.0版本的的分析,而现在研发的android移动平台基本上都是2.3的版本,跟2.0版本的差别,在Wifi模块上

Antonius的专栏 1万+

2026年软考高级网络规划设计师第三版备考笔记

删除了所有已退出主流应用、行业淘汰的技术内容,如 HDLC、xDSL、WiMAX、HSRP/GLBP 等,让教材内容更聚焦当下一线网络工程实际场景,剔除无效考点。

鹿鸣天涯 1214

安装 miniconda linux

安装 miniconda linux

jacke121的专栏 1万+

Android13 Wifi启动流程分析

本文对Android13 wifi 开启流程进行梳理,有需要的可以看看。如果遇到wifi 打不开问题,可以依照这个流程进行分析,看看具体是哪个流程出现问题。如果后续需要分析比Android13 更新的代码可以对比参考,毕竟Android11的代码变动比较大。本文最后有流程总结,代码分析过程还有最大一个亮点,每个类的流程分析都标志了数字,避免读着读着就迷路了。最后还有wifi开关相关日志过程分析。

wenzhi的博客 5928

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android wifi bssid是什么意思,安卓如何得到WiFi SSID,BSSID,及其区别。

今天踩了个坑,可能也是本身看文档不够认真,产生了一点点SSID,BSSID的认知偏差,当时百度查看了一篇文档,在文档中提取了统称SSID之类的字眼,在脑海中生成了错误的信息既SSID内包含了BSSID,小记一下。codeSSID:WIFI名称对象BSSID:MAC物理地址文档安卓如何获得这些。以下,其WiFi信息大体都在,WiFiinfo这个对象中。get/*** 获取当前链接WIFI的SSID*...

weixin_36269733的博客 2972

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android14 WPA2和WPA3 类型的WiFi网络连接

Android WiFi网络类型常用就是WPA/PA2,Android10之后很多手机支持了WPA3 网络的连接和热点WPA3类型设置。开发过程中是有遇到WPA3网络无法连接的问题,之前方案WPA3网络是可以用WPA2的配置连接成功的,但是Android14的MTK方案上不行了。本文的分析处理事对自己设置应用上的优化,原生设置应用是可以正常连接WPA3 网络。

wenzhi的博客 3447

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: 通过mk文件编译android4.0.3系统app源码后覆盖安装失败解决办法(android odex文件)
下一篇: 修改build.prop文件,可更改新浪微博尾巴显示
androidboy365
博客等级 码龄16年 35粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值