android中wifi的上下层的连接、命令发送

 

上层可调用的命令在JNINativeMethod gWifiMethods[]中,执行的方式大部分都相同,都是利用管道或socket等方式来传递,但在此之前要做一些准备:加载驱动,连接supplicant等。准备的方式就是访问wifi驱动的状态值,如若没有加载驱动就会执行insmod命令。在此之后的命令执行方式如下所述:

     Java首先要和wpa_supplicant取得联系:

wifi_connect_to_supplicantàwpa_ctrl_open打开conn-ctrlmonitor-ctrl通道。

   àwpa_ctrl_attachàwpa_ctrl_attach_helperàwpa_ctrl_requestàselect()

                        监听通道的状态是否为可读。如果可读,执行recv(),否则等待。

java层通过connectToSupplicant调用wifi_connect_to_supplicant函数,在该函数中,将通过wpa_ctrl_open

函数分别创建两个AF_UNIX地址族和数据报方式的socket,一个是ctrl_conn, 用于向wpa_supplicant

发送命令并接收response, 另一个是monitor_conn, 它一直阻塞等待从wpa_supplicant过来的event

最后,通过monitor_connwpa_supplicant发送命令ATTACH,用于将自己的socket信息注册到

wpa_supplicant, 由于socket是数据报方式的,这一步是必须的,对于存在于wpa_supplicant的服务器端,

它是所有客户端共享的,由于它需要主动向monitor_conn客户端发送事件,所以它必须先记录下

该客户端的详细信息,wpa_supplicant就可以将EVENT发向该socket
 

     Attach的目的是将wpa_supplicnatjava上层连接起来,之后的命令发送完全依靠该通道。

 scan为例

        { "scanCommand", "()Z", (void*) android_net_wifi_scanCommand },

        àresult = doBooleanCommand("SCAN", "OK");

        àdoCommand(cmd, reply, sizeof(reply)

        à::wifi_command(cmd, replybuf, &reply_len)

        àwifi_send_command(ctrl_conn, command, reply, reply_len)

        àwpa_ctrl_request(ctrl, cmd, strlen(cmd), reply, reply_len, NULL);

        àsend(ctrl->s, _cmd, _cmd_len, 0)

 

wpa_supplicant搜索的线索如下:

              wpa_supplicant_thread 

         à wpa_supplicant_init

àwpa_supplicant_global_ctrl_iface_init( )                      udp |socket|name_pipe

à wpa_supplicant_global_ctrl_iface_receive()                udp |socket|name_pipe

à wpa_supplicant_global_ctrl_iface_process()

à wpa_supplicant_global_iface_add

à wpa_supplicant_add_iface

à wpa_supplicant_init_iface

à wpa_supplicant_set_driver()                           完成驱动指定

 

wpa_supplicant_global_ctrl_iface_init() android_get_control_socket 可以与上层的通道对接。

在工作过程中上层java发送命令后wpa_supplicant的接收情况:

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值