Android系统中通过shell命令实现wifi的连接控制

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/75213206 简介工作中遇到一个“变态”的需求,在android系统中不通过java层控制wifi的连接(主要是修改ap的essid和password),而是需要通过native层实现对wifi的控制。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/75213206

简介

工作中遇到一个“变态”的需求,在android系统中不通过java层控制wifi的连接(主要是修改ap的essid和password),而是需要通过native层实现对wifi的控制。

How

  • 接到这个需求时,第一个想法是如何找到Android native层对应的wifi控制接口(也就是一些c层的接口),由于c层的接口都是android framework层的接口,属于内部接口,android系统在设计之初就没想暴露太多这层的接口,所以并没有相关的文档说明(其实我也没花太多时间去搜索,所以暂且认为没有官方文档吧,不过我估计对android wifi模块有深入研究的人,应该会比较熟悉这方面的接口)
  • 分析wpa_supplicant service参数,wifi的控制逃不开wpa相关的服务,通过ps查看了wpa_supplicant的启动参数发现androd系统是通过解析/data/misc/wifi/wpa_supplicant.conf 这个conf文件来控制连接哪个ap,所以我么只需要修改这个conf文件,然后重启wpa_supplicant这个服务即可。
  • 基于前面的分析,貌似该问题很容易解决,但是对wpa_supplicant服务的启停,遇到问题,kill掉后,重启wpa_supplicant无效,在没有查明问题原因的时候,发现了svc wifi enable/disable命令,这个命令实现了wpa_supplicant的启停而不用关心参数的设置。
  • 有了svc wifi这个命令,一切都简单多了,但是调试过程中,仍然遇到了问题,比如我输入错误的password,android会尝试多次重现连接ap,最后显示无法连接,然后我们修改wpa_supplicant.conf输入正确的password后,通过svc wifi启停wpa_supplicant服务,android系统不会尝试重新连接,仍然显示之前的错误状态,甚至重启系统,仍然不会重新连接。
  • 在反复尝试确定前面的现象后,又陷入了一个僵局,一直找不到通过shell触发重新连接的方式。在试过各种情况后,已经想不到其他尝试的方式后,安静下来,思考了下,突然意识到这个状态一定是缓存了,而且不是缓存在代码层面(内存),而是缓存在文件上,否则重启应该不会再记录之前的状态。所以无目的的查看了/data/misc/wifi目录下的文件,发现networkHistory.txt这么个文件,直觉上感觉就是它了,删除之,通过svc wifi重启wpa_supplicant服务,立马触发连接。

总结

通过上面的分析,通过shell命令实现wifi的连接控制只需要:

  • 通过svc wifi disable关闭wifi
  • 修改/data/misc/wifi/wpa_supplicant.conf配置文件
  • 删除/data/misc/wifi/networkHistory.txt文件
  • 通过svc wifi enable打开wifi

由于对该“变态”的需求没有太多的兴趣,所以导致连看看networkHistory.txt的内容都没有,更没有去深入研究这个文件对连接的影响,想想自己探究问题本质的欲望怎么越来越小了呢。由于笔者换了技术方向,近期也没时间深入研究这个了,写这个篇文章时大概搜索了下,发现了一篇文章貌似讲到了这个连接过程的,有兴趣的朋友可以继续看看http://www.itnose.net/detail/6637117.html

感想

有时解决问题,需要一点点灵感,一下子的灵光乍现也能解决一些问题,但总感觉很虚,我更喜欢循序渐进的构建知识体系,感觉这样更踏实些。

目录
相关文章
|
安全 数据安全/隐私保护 Windows
如何在Windows 10系统中查看已连接WiFi密码-亲测可用-优雅草卓伊凡
如何在Windows 10系统中查看已连接WiFi密码-亲测可用-优雅草卓伊凡
1288 16
如何在Windows 10系统中查看已连接WiFi密码-亲测可用-优雅草卓伊凡
|
9月前
|
Linux 测试技术 语音技术
【车载Android】模拟Android系统的高负载环境
本文介绍如何将Linux压力测试工具Stress移植到Android系统,用于模拟高负载环境下的CPU、内存、IO和磁盘压力,帮助开发者优化车载Android应用在多任务并发时的性能问题,提升系统稳定性与用户体验。
756 6
|
9月前
|
Java 数据库 Android开发
基于Android的电子记账本系统
本项目研究开发一款基于Java与Android平台的开源电子记账系统,采用SQLite数据库和Gradle工具,实现高效、安全、便捷的个人财务管理,顺应数字化转型趋势。
|
人工智能 搜索推荐 物联网
Android系统版本演进与未来展望####
本文深入探讨了Android操作系统从诞生至今的发展历程,详细阐述了其关键版本迭代带来的创新特性、用户体验提升及对全球移动生态系统的影响。通过对Android历史版本的回顾与分析,本文旨在揭示其成功背后的驱动力,并展望未来Android可能的发展趋势与面临的挑战,为读者呈现一个既全面又具深度的技术视角。 ####
|
安全 搜索推荐 Android开发
Android系统SELinux安全机制详解
如此看来,SELinux对于大家来说,就像那位不眠不休,严阵以待的港口管理员,守护我们安卓系统的平安,维护这片海港的和谐生态。SELinux就这样,默默无闻,却卫士如山,给予Android系统一份厚重的安全保障。
477 18
|
网络协议 Shell 网络安全
面试官想听的不仅是命令——如何结构化回答“容器无Shell时如何测试外网”?
“说说看,如果一个Pod的容器没有Shell,如何测试它能否访问外网?”
面试官想听的不仅是命令——如何结构化回答“容器无Shell时如何测试外网”?
|
存储 Unix Shell
Shell 输出命令完全指南:echo 与 printf 的深度剖析
本文深入解析了 Shell 编程中 `echo` 和 `printf` 两个核心输出命令的用法与区别。`echo` 简单易用,适合基础输出;`printf` 功能强大,支持复杂格式化。文章从语法、转义序列、高级技巧到实际应用场景(如日志记录、进度显示)逐一讲解,并对比两者的性能与适用场景,帮助开发者根据需求灵活选择。最后通过进阶技巧和常见问题解答,进一步提升对两者的掌握程度。
834 1
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
10343 2
|
运维 Shell 数据库
Python执行Shell命令并获取结果:深入解析与实战
通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。
537 20
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
1178 38