Android SoftAp支持 (一)
来源:互联网 发布:注册域名哪个网站好 编辑:程序博客网 时间:2024/06/10 21:41
SoftAP 打开时调用的相关函数解析
Softap字面意思是用软件实现AP的功能,让你的移动设备可以作为一个路由,让别的站点链接。比如让别人的手机连上你的已经打开AP功能的手机,玩联机游戏或者上网等等
但事实上此功能是需要硬件以及驱动的支持才能真正的实现的。
Softap打开流程。
在Android系统的Setting界面的wireless配置项中会看到一个“Portable Wi-Fi hotspot” 跟一个"Configure Wi-Fi hotspot setting"选项,可以进入系统配置AP的名称,加密方式,密码等。 如下图
当你做完这些设置,系统接受的AP设置界面变化打开的响应,从此开启了整个Android SoftAP的序幕。
首先./packages/apps/Settings/src/com/android/settings/TetherSettings.java 的onPreferenceChange 函数接收到Softap状态改变信息
Softap开启时,enable 为真,因而执行startProvisioningIfNecessary(WIFI_TETHERING);
isProvisioningNeeded 用来检测是否需要进行一些准备工作
如果无需准备工作则执行startTethering 大戏即将上演了 期待ing
这里 mTetherChoice == WIFI_TETHERING 所以继而执行WiFiApEnable.java中的setSoftapEnabled(true)函数
也从此处也跳出了Setting的代码 跳入了Android WIFI 子系统的framework层
./packages/apps/Settings/src/com/android/settings/wifi/WifiApEnabler.java
上面的代码中我们看到了Google人的考虑事情的周全。首先检测Wifi当前状态如果正在打开或者已经打开则关闭WIFI并将此状态记录下来,以便关闭softap时它能自动恢复到之前打开wifi的状态。 Android代码不愧牛X,这些都能想到... 崇拜那些大牛。
这里调用mWifiManager.setWifiApEnabled(null, enable) "frameworks/base/wifi/java/android/net/wifi/WifiManager.java"
转向服务层的 setWifiApEnabled "frameworks/base/services/java/com/android/server/WifiService.java"
从而调用到最基础的也是最重要的Wifi状态机中的 setWifiApEnabled 实例 其实我真搞不懂为什么Android代码要嵌套这么多层去调用,为了安全、方便... 哪个牛人解释一下。
"frameworks/base/wifi/java/android/net/wifi/WifiStateMachine.java"
发送CMD_LOAD_DRIVER状态迁移到mDriverLoadingState 加载AP对应的驱动 这里把WIFI的驱动跟 AP的驱动做了区分,可见SoftAP不仅仅是软件实现的,需要硬件驱动的相应支持。
加载驱动成功后 系统迁移到mDriverLoadedState 状态
接收到 CMD_START_AP消息 状态又被迁移至mSoftApStartingState
SoftApStartingState 会检测上层传下的参数的有效性并调用startSoftApWithConfig 配置、打开SoftAP
获取SoftAp的网络配置AP名称 加密方式密码....
进行系统驱动(硬件)的配置。
这里调用到了"frameworks/base/services/java/com/android/server/NetworkManagementService.java" 中的startAccessPoint函数
函数如下:
1、下载AP对应的 firmware
wifiFirmwareReload(wlanIface, "AP");
2、设置ap的ssid 加密方式 以及密码
mConnector.execute("softap", "set", wlanIface, wifiConfig.SSID, getSecurityType(wifiConfig), wifiConfig.preSharedKey);
3、运行softap
mConnector.execute("softap", "startap");
这里通过一个NativeDaemonConnector的实例mConnector 调用c++程序 具体的实现我是没看懂 但是知道最后实际调用的函数, 想深入了解可以找一些其他的资料看
实际调用到了 "./system/netd/CommandListener.cpp" 中的CommandListener::SoftapCmd::runCommand
首先是"set“ 命令, 调用到c = sSoftapCtrl->setSoftap(argc, argv); 来配置网络
配置即将所有上层的网络设置写到HOSTAPD_CONF_FILE[] = "/data/misc/wifi/hostapd.conf" 中
("system/netd/SoftapController.cpp")
然后是"startap"命令调用rc = sSoftapCtrl->startSoftap(); 真正开启Softap
在startSoftap函数中调用了
execl("/system/bin/hostapd", "/system/bin/hostapd", "-e", WIFI_ENTROPY_FILE, HOSTAPD_CONF_FILE, (char *) NULL)
这里hostapd就是softap的deamon 程序 类似于wifi的的wpa_supplicant
至此所有wifi子系统从界面打开softap 到如何运行调用到deamon程序打开Softap的流程就是这样的
之后会介绍到Setting 界面"Portable Wi-Fi"的开启 以及 Hostapd 的一些东东
分类: LINUX
安卓相关的网络配置
=====================================================
=====================================================
hostapd 配置命令
=====================================================
/system/bin/hostapd -e/data/misc/wifi/entropy.bin /data/misc/wifi/hostapd.conf &
=====================================================
wpa_supplicant -iwlan0 -Dwext -c/system/etc/wifi/wpa_supplicant.conf -dd -B
wpa_supplicant -iwlan0 -Dnl80211 -c/system/etc/wifi/wpa_supplicant.conf -B
wpa_supplicant -iwlan0 -Dwext -c/data/misc/wifi/wpa_supplicant.conf -dd -B
wpa_supplicant -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -dd -B
=====================================================
=====================================================
wpa_cli -iwlan0 scan
wpa_cli -iwlan0 scan_results
wpa_cli -iwlan0 remove_network 0
wpa_cli -iwlan0 add_network
wpa_cli -iwlan0 set_network 0 ssid '"henryking"'
wpa_cli -iwlan0 set_network 0 key_mgmt WPA-PSK
wpa_cli -iwlan0 set_network 0 key_mgmt NONE
wpa_cli -iwlan0 set_network 0 psk '"12345678"'
wpa_cli -iwlan0 set_network 0 wep_key0 123456
wpa_cli -iwlan0 set_network 0 wep_tx_keyidx 0
wpa_cli -iwlan0 select_network 0
wpa_cli -iwlan0 save_config
wpa_cli -iwlan0 list_networks
wpa_cli -iwlan0 add_network;wpa_cli -iwlan0 set_network 0 ssid '"82883008"';wpa_cli -iwlan0 set_network 0 psk '"12345678"';wpa_cli -iwlan0 select_network 0
=====================================================
wpa_cli -irausb0 scan
wpa_cli -irausb0 scan_results
wpa_cli -irausb0 add_network
wpa_cli -irausb0 set_network 0 ssid '"henry"'
wpa_cli -irausb0 set_network 0 psk '"12345678"'
wpa_cli -irausb0 set_network 0 key_mgmt WPA-PSK
wpa_cli -irausb0 set_network 0 key_mgmt NONE
wpa_cli -irausb0 select_network 0
wpa_cli -irausb0 enable_network 0
wpa_cli -irausb0 ap_scan '"1"'
wpa_cli -irausb0 save_config
=====================================================
=====================================================
=====================================================
=====================================================
iwpriv 配置网络
=====================================================
WPA/WPA2
=====================================================
iwpriv rausb0 set NetworkType=Infra
iwpriv rausb0 set AuthMode=WPA2PSK
iwpriv rausb0 set EncrypType=AES
iwpriv rausb0 set SSID="sabre"
iwpriv rausb0 set WPAPSK="12345678"
iwpriv rausb0 set NetworkType=Infra;iwpriv rausb0 set AuthMode=WPA2PSK;iwpriv rausb0 set EncrypType=AES;iwpriv rausb0 set WPAPSK="12345678";iwpriv rausb0 set SSID="henryking";
iwpriv rausb0 set NetworkType=Infra;iwpriv rausb0 set AuthMode=WPAPSK;iwpriv rausb0 set EncrypType=AES;iwpriv rausb0 set SSID="82883008";iwpriv rausb0 set WPAPSK="12345678"
iwpriv rausb0 set NetworkType=Infra;iwpriv wlan0 set AuthMode=WPAPSK;iwpriv wlan0 set EncrypType=AES;iwpriv wlan0 set WPAPSK="12345678";iwpriv wlan0 set SSID="henryking";
=====================================================
WEP
=====================================================
iwpriv rausb0 set AuthMode=SHARED
iwpriv rausb0 set EncrypType=WEP
iwpriv rausb0 set DefaultKeyID=1
iwpriv rausb0 set Key1="1111222233"
iwpriv rausb0 set SSID="sabre"
=====================================================
iwconfig wlan0 essid "sabre"
iwconfig wlan0 key 1111222233
=====================================================
=====================================================
mstar wifi配置
=====================================================
wpa_supplicant -Dwext -iwlan0 -c /usr/bin/wpa_0_8.conf -B
ifconfig wlan0 up
wpa_cli -iwlan0 -p/var/run/wpa_supplicant scan
wpa_cli -iwlan0 -p/var/run/wpa_supplicant scan_results
wpa_cli -iwlan0 -p/var/run/wpa_supplicant ap_scan 1
wpa_cli -iwlan0 -p/var/run/wpa_supplicant add_network
wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 ssid '"henryking"'
wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 key_mgmt WPA-PSK
wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 proto WPA2
wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 pairwise CCMP
wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 group CCMP
wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 psk '"12345678"'
wpa_cli -iwlan0 -p/var/run/wpa_supplicant select_network 0
=====================================================
=====================================================
=====================================================
wpa_supplicant.conf
=====================================================
linux下格式:
=====================================================
update_config=1
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="henry"
psk="12345678"
key_mgmt=WPA-PSK
}
=====================================================
Android下格式:
=====================================================
update_config=1
ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=wifi
eapol_version=1
ap_scan=1
fast_reauth=1
=====================================================
- Android SoftAp支持 (一)
- Android SoftAp支持 (一)
- Android SoftAp支持 (一)
- Android SoftAp支持 (二)
- Android SoftAp支持 (二)
- Android SoftAp支持 (二)
- Android SoftAp支持
- Android WiFi之SoftAP
- Android Softap启动分析
- Android WiFi之SoftAP
- Porting WLAN SoftAP to Android
- Android 中SoftAP架构研究
- Android Softap开启流程分析
- 为Android添加对WML的支持 (一)
- Android应用多语言支持实现(方法一)
- Android ADB 完美支持中文 详细讲解(一)
- Android support library支持包常用控件介绍(一)
- softAP控制
- 【OpenCV入门教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
- 我们工作很忙
- 四十七 停电与打牌(上) 我在软件园的那些日子里
- Spring BeanWrapper分析
- Eclipse中的编码问题
- Android SoftAp支持 (一)
- handler解释
- java知识点:读万卷书,行万里路(一)
- android 的 setTag
- 插入排序
- 磁传感器AKM8975驱动和中间层
- 关于Java控制小数位数的问题
- 啊哈C——学习3.4练习
- java知识点:读万卷书,行万里路(二)