Chinaunix首页 | 论坛 | 博客
  • 博客访问: 396052
  • 博文数量: 53
  • 博客积分: 1910
  • 博客等级: 中尉
  • 技术积分: 1130
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-10 14:56
文章分类

全部博文(53)

文章存档

2013年(1)

2012年(17)

2011年(33)

2010年(2)

分类: Python/Ruby

2012-05-23 08:55:30

   简单介绍下 Wi-Fi Direct 的功能:

       就是实现在没有AP 情况下的P2P(peer to peer)连接 .

具体可以看下:

网上对该技术很看好,感觉对BT的冲击比较大.

 

  好象目前android 4.0 已经支持了,但是没有见过真机,所以没办法亲自体验,最近手上有两台2.3的测试机,虽然不是4.0,但是wpa_supplicant 是0.8,已经支持p2p了,就通过adb拍命令试验了下 :

 

     1.  修改/system/etc/wifi/wpa_supplicant.conf 和 /data/misc/wifi/wpa_supplicant.conf =>

       注释掉最后3行

##### wpa_supplicant configuration file template #####
update_config=1
ctrl_interface=wlan0:0
#eapol_version=1
#ap_scan=1
#fast_reauth=1

 

       
     2. load wifi sdio module =>  insmod /system/lib/modules/wl12xx_sdio.ko
    

     3.  启动wpa_supplicant demon

         chmod 777 /data/misc/wifi/sockets

         chmod 777 /data/misc/wifi/wpa_supplicant.conf
         /system/bin/wpa_supplicant -d -Dnl80211 -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf -B &

 

     4. wlan up

        A机 => ifconfig wlan0 192.168.3.3 netmask 255.255.255.0 up
        B机 => ifconfig wlan0 192.168.3.4 netmask 255.255.255.0 up

 

     5.  chmod 777 wlan0:0
         wpa_cli -i wlan0 -p /data/misc/wifi/wlan0:0
      

     6.  通过wpa_cli 输入 p2p_find ,p2p_peers命令发现peer端及其mac 地址

      输入p2p_find 输出类似下面info:
OK
<3>P2P-DEVICE-FOUND d4:94:a1:ea:93:07 p2p_dev_addr=d4:94:a1:ea:93:07 pri_dev_typ
e=0-00000000-0 name='' config_methods=0x188 dev_capab=0x21 group_capab=0x9

      

 

     7. A机 => p2p_connect 44:c1:5c:55:6f:6d pbc auth go_intent=7
        B机 => p2p_connect d4:94:a1:ea:93:07 pbc

到这步应该就可以连上了,通过ping 192.168.3.3 测试可以ping 通:

 

感觉不过瘾,再写个socket 玩下:

使用SL4A (具体见 http://blog.chinaunix.net/uid-20514606-id-3023485.html)

python 的socket 部分没什么区别,网上找了段代码,修改了下:

Server端:

 

点击(此处)折叠或打开

  1. import android
  2. import socket, struct


  3. droid=android.Android()
  4. droid.makeToast('Running...')

  5. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6. #droid.makeToast('1')
  7. sock.bind(('192.168.3.3', 8001))
  8. #droid.makeToast('2')
  9. sock.listen(5)
  10. #droid.makeToast('3')
  11. while True:
  12.   droid.makeToast('start listen')
  13.   connection,address = sock.accept()
  14.   droid.makeToast('accept connect')
  15.   try:
  16.     connection.settimeout(5)
  17.     buf = connection.recv(1024)
  18.     if buf == '1':
  19.       #droid.makeToast('someone pick wifi direct')
  20.       connection.send('welcome to server!')
  21.     else:
  22.       connection.send('please go out!')
  23.      connection.close()
  24.      return
  25.   except socket.timeout:
  26.     droid.makeToast('time out')
  27.     connection.close()


 Client 端:

 

点击(此处)折叠或打开

  1. import android
  2. import socket, struct
  3. import time

  4. droid=android.Android()
  5. droid.makeToast('Running...')

  6. droid.dialogCreateAlert("wifi direct test")
  7. droid.dialogSetItems(['pick server', 'close server'])
  8. droid.dialogShow()
  9. response = droid.dialogGetResponse().result

  10. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  11. ipaddr = '192.168.3.3'
  12. droid.dialogDismiss()
  13. if response.has_key("item"):
  14.   result=response["item"]
  15.   print result
  16.   if result==0:
  17.     #sock.connect(('192.168.3.3', 8001))
  18.     sock.connect((ipaddr, 8001))
  19.     #droid.makeToast('2')
  20.     time.sleep(2)
  21.     sock.send('1')
  22.     buf=sock.recv(1024)
  23.     droid.makeToast(buf)

  24.     
  25.   elif result==1:
  26.     #sock.connect(('192.168.3.3', 8001))
  27.     sock.connect((ipaddr, 8001))
  28.     #droid.makeToast('2')
  29.     time.sleep(2)
  30.     sock.send('2')
  31.     buf=sock.recv(1024)
  32.     droid.makeToast(buf)

  33.   else:
  34.        print "Unknown response=",response


  35. droid.makeToast('close client')
  36. sock.close()


 

A机执行server.py, B机执行client.py 出现alter dialog,点 pick server ,可以收到A机发来的:

“someone pick wifi direct”

点close server ,关闭A机server 程序

测试正常

 

最后提几个wifi direct 的手机应用:

   1. wifi 对讲机

   2. wifi camera

   3. 代替BT 应用

   4. wifi out door 输入设备,远程控制

   5. wifi out door 资料同步

等等,结束

阅读(11340) | 评论(6) | 转发(1) |
给主人留下些什么吧!~~

liu0902012-07-05 16:51:03

driver firmware 支持p2p 吗?

土豆和地瓜2012-07-05 14:27:09

NL80211_ATTR_FRAME_MATCH
A binary attribute which typically must contain at least one byte, currently used with NL80211_CMD_REGISTER_FRAME

土豆和地瓜2012-07-05 14:05:11

所以在if (nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]) < 1)
这里总是出错返回,望指教啊

土豆和地瓜2012-07-05 14:03:10

nl80211_register_frame函数中有,NLA_PUT(msg, NL80211_ATTR_FRAME_MATCH, match_len, match);而调用函数最后一参数为0.在内核中
static int nl80211_register_action(struct sk_buff *skb, struct genl_info *info)
{
struct cfg80211_registered_device *rdev;
struct net_device *dev;
int err;

printk("%s()-%d: enter !\n", __FUNCTION__, __LINE__);
if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
{
printk("%s()-%d: NL80211_ATTR_FRAME_MATCHc ERRO

土豆和地瓜2012-07-05 14:01:42

自己分析了下出现错误是
static int wpa_driver_nl80211_probe_req_report(void *priv, int report)
{
        if (nl80211_register_frame(drv, drv->nl_handle_preq,
                                   (WLAN_FC_TYPE_MGMT << 2) |
                                   (WLAN_FC_STYP