2012年1月18日星期三

linux利用无线网卡做热点

这是一篇失败的文档,只留作记录,无太大参考价值。

操作系统:opensuse12.1 i586
内核:3.1.0-1.2-desktop
硬件: thinkpad x201i
网卡:Intel Corporation Centrino Advanced-N 6200
软件:hostapd-0.7.3

参考:http://linuxwireless.org/en/users/Documentation/hostapd
过程:

1 创建了最简单的一个配置文件 /tmp/hostapd.min.conf:
interface=wlan0
driver=nl80211
ssid=test
channel=1

2 启动hostapd,hostapd -dd /tmp/hostapd.min.conf,报错:
nl80211: Register Action command failed: ret=-114 (Operation already in progress)
nl80211: Register Action match - hexdump(len=1): 06
nl80211: Failed to register Action frame processing - ignore for now
nl80211: Add own interface ifindex 3
nl80211: Failed to set interface 3 to mode 3: -95 (Operation not supported)
nl80211: Failed to set interface 3 to mode 3: -95 (Operation not supported)
nl80211: Interface mode change to 3 from 0 failed
nl80211: Failed to set interface wlan0 into AP mode
nl80211 driver initialization failed.
ELOOP: remaining socket: sock=4 eloop_data=0x80c5958 user_data=0x80c5e38 handler=0x80751f0
ELOOP: remaining socket: sock=6 eloop_data=0x80c7ae0 user_data=(nil) handler=0x807f2f0

经 google 有人解答是linux驱动不支持AP,不清楚该如何验证这种说法。(理论依据?)基本死翘翘了,不再折腾了。

2012年1月13日星期五

android手机利用Linux主机的网络上网

PC利用android手机的网络联网,英语称为usb tethering;如果反过来,手机利用PC的网络上网,则称为reverse-tethering。如果PC为windows或者MAC,则在安装htc sync后,可以直接进行reverse-tethering;如果PC的操作系统为Linux,则有两种方案:
1 将Linux配置为路由器,利用NAT联网。
2 在Linux上启动bridge,然后联网。
本文简述利用NAT上网的办法,bridge方式与此大同小异。

思路:
1 利用usb线将root过的手机连接到PC上,并在PC上创建虚拟设备usb0
2 在android手机上设定usb0设备的IP地址,dns,路由信息
3 在PC上设定新创建的网卡usb0的IP地址(该地址即为android设备的网关地址)
4 在PC上打开ip_forward,并配置NAT

软硬件要求:
1 root过的android手机
2 Gscript(只为方便,非必须)

配置过程:
1 修改/sys/devices/platform/msm_hsusb/usb_function_switch 的值:
经测试,该文件中值的含义如下:

==== 1 ==== usb_mass_storage:enable
==== 2 ==== adb:enable
==== 4 ==== ether:enable
==== 8 ==== diag:enable
==== 16 ==== serial:enable
==== 32 ==== projector:enable
==== 128 ==== adb:enable
==== 256 ==== modem:enable
==== 512 ==== cdc_ethernet:enable
比如echo 1 >usb_function_switch,表示将android设备作为存储;echo 6>usb_function_switch,表示在PC上创建网卡usb0,并打开adb调试开关。为方便调试,最好将值修改为6,否则直接设定为4也可以。

2 利用setprop配置android的网络信息
dnsserver="8.8.8.8"
setprop net.usb0.ps.ip 192.168.99.1
setprop net.usb0.ps.mask 255.255.255.0
setprop net.usb0.ps.gw 192.168.99.254
setprop net.usb0.ps.dns $dnsserver
setprop net.dns1 $dnsserver
ifconfig usb0 192.168.99.1 netmask 255.255.255.0
ip route add default via 192.168.99.254 dev usb0

3 在Linux主机上,设置usb0的IP地址为192.168.99.254,掩码为24位。可利用ifconfig,或者直接在NetworkManager中设置,不再详述。

4 在Linux主机上设定NAT以及ip_forward
iptables -t nat -A POSTROUTING -j MASQUERADE
echo 1>/proc/sys/net/ipv4/ip_forward

经过以上操作后,android手机理论上就可以上网了。但经过测试,发现不是所有应用程序都可以连接网络,原因见该链接,但是没有解决方案 http://android.stackexchange.com/questions/14046/android-usb-reverse-tethering-how-to-fool-the-apps 。 可以连接网络的程序有:支付宝,电子市场,uc浏览器;无法连接网络的程序有:gtalk,新浪微博,安全隧道。

为方便输入以上命令,最好安装Gscript,创建一个脚本net.sh,内容如下:

#!/bin/sh
dnsserver="8.8.8.8"
echo 6 >/sys/devices/platform/msm_hsusb/usb_function_switch
sleep 3
setprop net.usb0.ps.ip 192.168.99.1
setprop net.usb0.ps.mask 255.255.255.0
setprop net.usb0.ps.gw 192.168.99.254
setprop net.usb0.ps.dns $dnsserver
setprop net.dns1 $dnsserver
ifconfig usb0 192.168.99.1 netmask 255.255.255.0
ip route add default via 192.168.99.254 dev usb0

附录:
如果需要将android手机设置成为硬盘,除了需要
echo 3  >/sys/devices/platform/msm_hsusb/usb_function_switch 以外,还需要设定存储设备的路径,对于我的手机,需要:
echo "/dev/block/vold/179:64" >/sys/devices/platform/usb_mass_storage/lun0/file
具体的值,可以先将手机挂载为硬盘设备,然后记录下 /sys/devices/platform/usb_mass_storage/lun0/file的内容,最后写个disk.sh 文件利用Gscript运行:

#!/bin/sh
echo 3  >/sys/devices/platform/msm_hsusb/usb_function_switch
echo "/dev/block/vold/179:64" >/sys/devices/platform/usb_mass_storage/lun0/file