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

感想

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

目录
相关文章
|
23天前
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
65 2
|
28天前
|
Ubuntu Shell 网络安全
安装了ubuntu虚拟机后发现shell无法连接 ubuntu开启ssh连接
【8月更文挑战第23天】安装了ubuntu虚拟机后发现shell无法连接
85 6
|
22天前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
37 0
|
16天前
|
Android开发 UED 开发者
Android经典实战之WindowManager和创建系统悬浮窗
本文详细介绍了Android系统服务`WindowManager`,包括其主要功能和工作原理,并提供了创建系统悬浮窗的完整步骤。通过示例代码,展示了如何添加权限、请求权限、实现悬浮窗口及最佳实践,帮助开发者轻松掌握悬浮窗开发技巧。
33 1
|
23天前
|
Java 物联网 Android开发
移动应用与系统:技术演进与未来展望探索安卓应用开发:从新手到专家的旅程
【8月更文挑战第28天】本文将深入探讨移动应用开发的技术演进、移动操作系统的发展历程以及未来的发展趋势。我们将通过实例和代码示例,展示如何利用最新的技术和工具来开发高效、可靠的移动应用。无论你是初学者还是经验丰富的开发者,这篇文章都将为你提供有价值的信息和见解。 【8月更文挑战第28天】在这个数字时代,掌握安卓应用的开发技能不仅是技术人员的追求,也成为了许多人实现创意和梦想的途径。本文将通过深入浅出的方式,带领读者从零基础开始,一步步走进安卓开发的奇妙世界。我们将探讨如何配置开发环境,理解安卓应用的核心组件,以及如何通过实际编码来构建一个功能完整的应用。无论你是编程新手还是希望提升自己的开发者
|
25天前
|
分布式计算 资源调度 Hadoop
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
|
29天前
|
存储 安全 物联网
Android经典实战之跳转到系统设置页面或其他系统应用页面大全
本文首发于公众号“AntDream”,关注获取更多技巧。文章总结了Android开发中跳转至系统设置页面的方法,包括设备信息、Wi-Fi、显示与声音设置等,并涉及应用详情与电池优化页面。通过简单的Intent动作即可实现,需注意权限与版本兼容性。每日进步,尽在“AntDream”。
98 2
|
30天前
|
Ubuntu 网络安全 数据安全/隐私保护
ubuntu server连接wifi教程
本文提供了一个简化Ubuntu Server在Raspberry Pi系统上配置过程的脚本"config_ubuntu_server",包括自动和手动两种方法来设置root权限、SSH配置,并连接WiFi,同时支持无密码SSH访问,适合初学者和高级用户。
48 3
|
1月前
|
分布式计算 Hadoop Shell
使用Shell命令操作HDFS
【8月更文挑战第5天】使用Shell命令操作HDFS。
42 5
|
21天前
|
安全 Android开发 iOS开发
安卓与iOS的终极对决:哪个系统更适合你?
在智能手机的世界里,安卓和iOS两大操作系统如同两座巍峨的山峰,各自拥有庞大的用户群体。本文将深入浅出地探讨这两个系统的优缺点,并帮助你找到最适合自己的那一款。让我们一起揭开这场技术盛宴的序幕吧!