* WifiManager WIFI编程入口,WIFI的多数功能都以该类的方法的形式提供
* WifiInfo 用于描述WIFI连接的状态
* ScanResult 用于描述一个AP,如SSID,信号强度,安全方式等
WifiStateMachine 是wifi功能的枢纽,几种不同模式下的控制流程都经它流下
WifiNative与wpa_supplicant交互 WifiNative定义了几个Native方法
WifiNative是system_server 和 wpa_supplicant 对话的窗口
android_net_wifi_WifiNative.cpp 并没有做多少实际工作,大多是直接调用 wifi.h wifi_maxtxpower.h 定义的函数:
wifi.h 的具体实现在 hardware/libhardware_legacy/wifi/wifi.c (会被编译为 libhardware_legacy.so)
wifi_maxtxpower.h 的具体实现在 hardware/qcom/wlan/libmaxtxpower/wifi_maxtxpower.c (会被编译为 libmaxtxpower.so)
Wifi HAL代码主要分布在:
hardware/libhardware_legacy/wifi
hardware/qcom/wlan/libmaxtxpower
分别被编译为:
hardware/libhardware_legacy/wifi -> libhardware_legacy.so
hardware/qcom/wlan/libmaxtxpower -> libmaxtxpower.so
一:
APP(WifiManager)-->system_server(WifiService->WifiStateMachine->【WifiNative #STA# || NetworkManagementService#AP#】)
WifiNative与wpa_supplicant交互 WifiNative定义了几个Native方法
WifiNative的几个native方法的具体实现在: frameworks/base/core/jni/android_net_wifi_WifiNative.cpp
二:
android_net_wifi_WifiNative.cpp 并没有做多少实际工作,大多是直接调用 wifi.h wifi_maxtxpower.h 定义的函数:
wifi.h 的具体实现在 hardware/libhardware_legacy/wifi/wifi.c (会被编译为 libhardware_legacy.so)
wifi_maxtxpower.h 的具体实现在 hardware/qcom/wlan/libmaxtxpower/wifi_maxtxpower.c (会被编译为 libmaxtxpower.so)
三:
wifi.c调用了wpa_ctrl.h定义的一些函数,而wpa_ctrl.h中的函数
在external/wpa_supplicant_8 wpa_supplicant 项目实现,并被编译为 libwpa_client.so
四:
wpa_supplicant(hostapd) 代码位于:
external/wpa_supplicant_8
该项目内包含两个互相相关的开源项目 wpa_supplicant 和 hostapd ,它们将会生成两个可执行文件:
wpa_supplicant和hostapd,分别为STA模式和AP模式时的守护进程。
wpa_ctrl.h 定义了与wpa_supplicant(或hostapd)进程通信的接口 (三与四通信,三就需要拿到这些通信接口):
wpa_ctrl_open 创建一个UNIX域socket 与 wpa_supplicant(或hostapd)进程相连,
wpa_ctrl_close 用于关闭wpa_ctrl_open创建的连接,
wpa_ctrl_request 用于向wpa_supplicant/hostapd发送控制命令,并阻塞, 直到wpa_supplicant/hostapd返回命令响应。
控制命令和响应都是ASCII字符串。
在wpa_supplicant目录下的
ctrl_iface_unix.c和ctrl_iface_udp.c内对应函数 wpa_supplicant_global_ctrl_iface_receive
负责分派上层发来的控制命令,进而调用具体处理函数:
五:
wpa_supplicant与内核通信
wpa_supplicant的运行模型是单进程单线程的 Reactor(IO multiplexing)。wpa_supplicant通过NETLINK socket与内核通信。
wpa_supplicant项目支持多种驱动编程接口,在Android上使用的是nl80211;
nl80211是新的802.11netlink接口公共头,与cfg80211一同组成了Wireless-Extensions的替代方案。
cfg80211是Linux 802.11配置API, nl80211用于配置cfg80211设备,同时用于内核到用户空间的通信。
实际使用nl80211时,只需要在程序中包含头文件wireless module(in kernel)
代码位于: kernel/net/wireless
nl80211.c 中的 nl80211_init 使用genl_register_family_with_ops 注册了响应应用程序的 struct genl_ops nl80211_ops[]
该数组定义了响应NETLINK消息的函数。
static struct genl_ops nl80211_ops[] = {
{
.cmd = NL80211_CMD_TRIGGER_SCAN,
.doit = nl80211_trigger_scan,
.policy = nl80211_policy,
.flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL,
},
{
.cmd = NL80211_CMD_GET_SCAN,
.policy = nl80211_policy,
.dumpit = nl80211_dump_scan,
}
.....
}
wlan driver 代码位于:vendor/qcom/opensource/wlan/prima
模块初始化(module_init),模块退出(module_exit):
CORE/HDD/src/wlan_hdd_main.c
Wifi五种工作模式
1.热点模式(Access Point) 就像打开电脑360Wifi 只需配置账号密码
2.无线路由模式(Router) 配置无线路由 需要配置wifi账号密码 还需要配置ADSL的用户名密码 拨号连接 PPPoE
3.中继模式(Repeater)
4.桥接模式(Bridge)
5. 客户端模式(Client)
1.热点模式(Access Point)
这种模式是WiFi无线路由早期的典型工作模式。这种模式下WiFi无线路由的配置比较简单,只需配置无线SSID和安全策略即可。
此时本机不具备路由功能,纯粹只相当于一个带无线接入功能的交换机。它能实现有线和无线多个设备的局域网接入。
为了避免和前端网络设备的DHCP冲突,通常会关闭本机的DHCP功能。用户设备的IP地址和DNS地址需要手动配置或通过前端的DHCP自动分配。
这种模式下的有线接口为LAN口。此模式适用于:商务、酒店、学校等环境的无线接入。
2.无线路由模式(Router)
这种模式是WiFi无线路由在家庭的典型工作模式。在这种模式下机器除具有接入交换机功能外还具备路由功能。
此时有线口中应该有一个为WAN口,用于和ADSLModem或小区有线宽带相接。WAN口能使用PPPoE协议自动登录进入ISP提供的Internet接入。
多个用户设备可通过无线或有线接入本机网络,共享Internet连接。这种模式下需要配置无线SSID、无线安全策略、WAN口连接方式。
通常本机的DHCP功能需要开启,所有接入用户设备的IP地址和DNS地址等通过本机的DHCP自动分配。
这种模式适用于:家庭、公寓等环境的Internet共享。
3.中继模式(Repeater)
这种模式用于扩展热点AP接入或无线路由接入模式的无线信号覆盖范围。
这种模式需要设备支持WDS(Wireless Distribution System即无线分布式系统)。
它是利用设备的无线接力功能,实现无线信号的【中继和放大】,并形成新的无线覆盖区域,最终达到延伸无线网络的覆盖范围的目的。
此时SSID、安全策略和通讯信道都必须保持和前端无线路由【一致】,网内有线、无线的接入控制基本由前端无线路由确定。
相当于是将前端无线路由器的无线或有线接入范围进行了物理距离上的延长。
如果前端路由器同时支持WDS的话,甚至可以实现无线网络的无缝漫游。
当然开启WDS功能后无线连接的带宽将减半。为了避免和前端无线路由的DHCP冲突,通常会关闭本机的DHCP功能。
用户设备的IP地址和DNS地址需要手动配置或通过前端的DHCP自动分配。
这种模式适用于:单个无线路由不能覆盖的大面积场所等。
4.桥接模式(Bridge)
这种模式同样用于扩展热点AP接入或无线路由接入模式的无线信号覆盖范围。这种模式需要设备支持WDS。
它利用设备的桥接功能,首先设备与前端无线网络建立无线连接,然后自身发出无线信号,形成新的无线覆盖范围,
可以有效的解决信号弱及信号盲点等无线覆盖问题。这同样相当于将前端无线路由器的无线或有线接入范围进行了物理距离的延长。
唯与中继模式不同的是此模式下本机的SSID及安全策略都可以是和前端无线路由的SSID及安全策略【不一样】,
但通讯信道仍需一致。这种模式相当于将两个不同SSID的无线网络桥接到一起并同时仍然提供无线AP接入服务。
这样的功能使无线组网方式变的简单实用,当然这样也会让无线接入的带宽损失一半。
为了避免和前端无线路由的DHCP冲突,通常会关闭本机的DHCP功能。
用户设备的IP地址和DNS地址需要手动配置或通过前端的DHCP自动分配。这种模式适用于:单个无线路由不能覆盖的大面积场所等
5.客户端模式(Client) 相当于把无线路由当做网卡使用, 能通过该网卡搜索到其他的网络。可以让台式电脑连上Wifi
这种模式相当于一个不需要驱动的无线网卡。可用于不具有无线网卡的用户设备用来连接无线AP或无线路由。
从某种意义上讲这种情况其实就是单方面的桥接。
这种情况下本机不再提供无线AP功能。
为了避免和前端网络的DHCP冲突,通常会关闭本机的DHCP功能。用户设备的IP地址和DNS地址需要手动配置或通过前端的DHCP自动分配。
这种模式适用于:网络多媒体播放器、互联网电视或仅有有线接入功能的用户设备通过无线方式接入网络。
http://blog.csdn.net/xusiwei1236/article/details/48495485
* WifiInfo 用于描述WIFI连接的状态
* ScanResult 用于描述一个AP,如SSID,信号强度,安全方式等
WifiStateMachine 是wifi功能的枢纽,几种不同模式下的控制流程都经它流下
WifiNative与wpa_supplicant交互 WifiNative定义了几个Native方法
WifiNative是system_server 和 wpa_supplicant 对话的窗口
android_net_wifi_WifiNative.cpp 并没有做多少实际工作,大多是直接调用 wifi.h wifi_maxtxpower.h 定义的函数:
wifi.h 的具体实现在 hardware/libhardware_legacy/wifi/wifi.c (会被编译为 libhardware_legacy.so)
wifi_maxtxpower.h 的具体实现在 hardware/qcom/wlan/libmaxtxpower/wifi_maxtxpower.c (会被编译为 libmaxtxpower.so)
Wifi HAL代码主要分布在:
hardware/libhardware_legacy/wifi
hardware/qcom/wlan/libmaxtxpower
分别被编译为:
hardware/libhardware_legacy/wifi -> libhardware_legacy.so
hardware/qcom/wlan/libmaxtxpower -> libmaxtxpower.so
一:
APP(WifiManager)-->system_server(WifiService->WifiStateMachine->【WifiNative #STA# || NetworkManagementService#AP#】)
WifiNative与wpa_supplicant交互 WifiNative定义了几个Native方法
WifiNative的几个native方法的具体实现在: frameworks/base/core/jni/android_net_wifi_WifiNative.cpp
二:
android_net_wifi_WifiNative.cpp 并没有做多少实际工作,大多是直接调用 wifi.h wifi_maxtxpower.h 定义的函数:
wifi.h 的具体实现在 hardware/libhardware_legacy/wifi/wifi.c (会被编译为 libhardware_legacy.so)
wifi_maxtxpower.h 的具体实现在 hardware/qcom/wlan/libmaxtxpower/wifi_maxtxpower.c (会被编译为 libmaxtxpower.so)
三:
wifi.c调用了wpa_ctrl.h定义的一些函数,而wpa_ctrl.h中的函数
在external/wpa_supplicant_8 wpa_supplicant 项目实现,并被编译为 libwpa_client.so
四:
wpa_supplicant(hostapd) 代码位于:
external/wpa_supplicant_8
该项目内包含两个互相相关的开源项目 wpa_supplicant 和 hostapd ,它们将会生成两个可执行文件:
wpa_supplicant和hostapd,分别为STA模式和AP模式时的守护进程。
wpa_ctrl.h 定义了与wpa_supplicant(或hostapd)进程通信的接口 (三与四通信,三就需要拿到这些通信接口):
wpa_ctrl_open 创建一个UNIX域socket 与 wpa_supplicant(或hostapd)进程相连,
wpa_ctrl_close 用于关闭wpa_ctrl_open创建的连接,
wpa_ctrl_request 用于向wpa_supplicant/hostapd发送控制命令,并阻塞, 直到wpa_supplicant/hostapd返回命令响应。
控制命令和响应都是ASCII字符串。
在wpa_supplicant目录下的
ctrl_iface_unix.c和ctrl_iface_udp.c内对应函数 wpa_supplicant_global_ctrl_iface_receive
负责分派上层发来的控制命令,进而调用具体处理函数:
五:
wpa_supplicant与内核通信
wpa_supplicant的运行模型是单进程单线程的 Reactor(IO multiplexing)。wpa_supplicant通过NETLINK socket与内核通信。
wpa_supplicant项目支持多种驱动编程接口,在Android上使用的是nl80211;
nl80211是新的802.11netlink接口公共头,与cfg80211一同组成了Wireless-Extensions的替代方案。
cfg80211是Linux 802.11配置API, nl80211用于配置cfg80211设备,同时用于内核到用户空间的通信。
实际使用nl80211时,只需要在程序中包含头文件wireless module(in kernel)
代码位于: kernel/net/wireless
nl80211.c 中的 nl80211_init 使用genl_register_family_with_ops 注册了响应应用程序的 struct genl_ops nl80211_ops[]
该数组定义了响应NETLINK消息的函数。
static struct genl_ops nl80211_ops[] = {
{
.cmd = NL80211_CMD_TRIGGER_SCAN,
.doit = nl80211_trigger_scan,
.policy = nl80211_policy,
.flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_NEED_RTNL,
},
{
.cmd = NL80211_CMD_GET_SCAN,
.policy = nl80211_policy,
.dumpit = nl80211_dump_scan,
}
.....
}
wlan driver 代码位于:vendor/qcom/opensource/wlan/prima
模块初始化(module_init),模块退出(module_exit):
CORE/HDD/src/wlan_hdd_main.c
Wifi五种工作模式
1.热点模式(Access Point) 就像打开电脑360Wifi 只需配置账号密码
2.无线路由模式(Router) 配置无线路由 需要配置wifi账号密码 还需要配置ADSL的用户名密码 拨号连接 PPPoE
3.中继模式(Repeater)
4.桥接模式(Bridge)
5. 客户端模式(Client)
1.热点模式(Access Point)
这种模式是WiFi无线路由早期的典型工作模式。这种模式下WiFi无线路由的配置比较简单,只需配置无线SSID和安全策略即可。
此时本机不具备路由功能,纯粹只相当于一个带无线接入功能的交换机。它能实现有线和无线多个设备的局域网接入。
为了避免和前端网络设备的DHCP冲突,通常会关闭本机的DHCP功能。用户设备的IP地址和DNS地址需要手动配置或通过前端的DHCP自动分配。
这种模式下的有线接口为LAN口。此模式适用于:商务、酒店、学校等环境的无线接入。
2.无线路由模式(Router)
这种模式是WiFi无线路由在家庭的典型工作模式。在这种模式下机器除具有接入交换机功能外还具备路由功能。
此时有线口中应该有一个为WAN口,用于和ADSLModem或小区有线宽带相接。WAN口能使用PPPoE协议自动登录进入ISP提供的Internet接入。
多个用户设备可通过无线或有线接入本机网络,共享Internet连接。这种模式下需要配置无线SSID、无线安全策略、WAN口连接方式。
通常本机的DHCP功能需要开启,所有接入用户设备的IP地址和DNS地址等通过本机的DHCP自动分配。
这种模式适用于:家庭、公寓等环境的Internet共享。
3.中继模式(Repeater)
这种模式用于扩展热点AP接入或无线路由接入模式的无线信号覆盖范围。
这种模式需要设备支持WDS(Wireless Distribution System即无线分布式系统)。
它是利用设备的无线接力功能,实现无线信号的【中继和放大】,并形成新的无线覆盖区域,最终达到延伸无线网络的覆盖范围的目的。
此时SSID、安全策略和通讯信道都必须保持和前端无线路由【一致】,网内有线、无线的接入控制基本由前端无线路由确定。
相当于是将前端无线路由器的无线或有线接入范围进行了物理距离上的延长。
如果前端路由器同时支持WDS的话,甚至可以实现无线网络的无缝漫游。
当然开启WDS功能后无线连接的带宽将减半。为了避免和前端无线路由的DHCP冲突,通常会关闭本机的DHCP功能。
用户设备的IP地址和DNS地址需要手动配置或通过前端的DHCP自动分配。
这种模式适用于:单个无线路由不能覆盖的大面积场所等。
4.桥接模式(Bridge)
这种模式同样用于扩展热点AP接入或无线路由接入模式的无线信号覆盖范围。这种模式需要设备支持WDS。
它利用设备的桥接功能,首先设备与前端无线网络建立无线连接,然后自身发出无线信号,形成新的无线覆盖范围,
可以有效的解决信号弱及信号盲点等无线覆盖问题。这同样相当于将前端无线路由器的无线或有线接入范围进行了物理距离的延长。
唯与中继模式不同的是此模式下本机的SSID及安全策略都可以是和前端无线路由的SSID及安全策略【不一样】,
但通讯信道仍需一致。这种模式相当于将两个不同SSID的无线网络桥接到一起并同时仍然提供无线AP接入服务。
这样的功能使无线组网方式变的简单实用,当然这样也会让无线接入的带宽损失一半。
为了避免和前端无线路由的DHCP冲突,通常会关闭本机的DHCP功能。
用户设备的IP地址和DNS地址需要手动配置或通过前端的DHCP自动分配。这种模式适用于:单个无线路由不能覆盖的大面积场所等
5.客户端模式(Client) 相当于把无线路由当做网卡使用, 能通过该网卡搜索到其他的网络。可以让台式电脑连上Wifi
这种模式相当于一个不需要驱动的无线网卡。可用于不具有无线网卡的用户设备用来连接无线AP或无线路由。
从某种意义上讲这种情况其实就是单方面的桥接。
这种情况下本机不再提供无线AP功能。
为了避免和前端网络的DHCP冲突,通常会关闭本机的DHCP功能。用户设备的IP地址和DNS地址需要手动配置或通过前端的DHCP自动分配。
这种模式适用于:网络多媒体播放器、互联网电视或仅有有线接入功能的用户设备通过无线方式接入网络。
http://blog.csdn.net/xusiwei1236/article/details/48495485