本博客倡导开放源代码,在此公布之程序源代码如无特别声明均采用GNU通用公共 许可证(GPL)

乐在其中

分享学习Linux的乐趣

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  23 随笔 :: 0 文章 :: 401 评论 :: 0 Trackbacks
Linux内核提供了一种机制,使得有热插拔事件(比如插入或拔出U盘)发生时可以执行一个程序,在本文中我称之为hotplug程序。内核在调用hotplug程序时会传递一个命令行参数,这个参数是发生热插拔事件的子系统名称,常见的有usb, module, drivers, net等。此外内核在调用hotplug程序是还会设置一些环境变量,如SUBSYSTEM, ACTION, PRODUCT, TYPE, INTERFACE, DEVPATH等。

下面是一系列实际的热插拔事件的例子,每一行表示hotplug程序被调用一次:
 1 SUBSYSTEM=net, ACTION=linkup, PRODUCT=, TYPE=, INTERFACE=eth0, DEVPATH=/class/net/eth0
 2 SUBSYSTEM=module, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/module/ehci_hcd
 3 SUBSYSTEM=platform, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/devices/platform/ehci_hcd
 4 SUBSYSTEM=drivers, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/bus/platform/drivers/ehci_hcd
 5 SUBSYSTEM=usb_host, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/class/usb_host/usb1
 6 SUBSYSTEM=usb, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/devices/platform/ehci_hcd/usb1
 7 SUBSYSTEM=module, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/module/ohci_hcd
 8 SUBSYSTEM=platform, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/devices/platform/ohci_hcd
 9 SUBSYSTEM=drivers, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/bus/platform/drivers/ohci_hcd
10 SUBSYSTEM=usb_host, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/class/usb_host/usb2
11 SUBSYSTEM=usb, ACTION=add, PRODUCT=0/0/206, TYPE=9/0/1, INTERFACE=9/0/0, DEVPATH=/devices/platform/ehci_hcd/usb1/1-0:1.0
12 SUBSYSTEM=usb, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/devices/platform/ohci_hcd/usb2
13 SUBSYSTEM=scsi_host, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/class/scsi_host/host0
14 SUBSYSTEM=usb, ACTION=add, PRODUCT=18a5/216/112, TYPE=0/0/0, INTERFACE=8/6/80, DEVPATH=/devices/platform/ehci_hcd/usb1/1-1/1-1:1.0
15 SUBSYSTEM=usb, ACTION=add, PRODUCT=0/0/206, TYPE=9/0/0, INTERFACE=9/0/0, DEVPATH=/devices/platform/ohci_hcd/usb2/2-0:1.0
16 SUBSYSTEM=usb, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/devices/platform/ehci_hcd/usb1/1-1
17 SUBSYSTEM=scsi_generic, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/class/scsi_generic/sg0
18 SUBSYSTEM=scsi_device, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/class/scsi_device/0:0:0:0
19 SUBSYSTEM=scsi, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/devices/platform/ehci_hcd/usb1/1-1/1-1:1.0/host0/target0:0:0/0:0:0:0
20 SUBSYSTEM=block, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/block/sda
21 SUBSYSTEM=module, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/module/ufsd
22 SUBSYSTEM=block, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/block/sda/sda1

系统默认的热插拔处理程序是/sbin/hotplug。在MP800H上/sbin/hotplug用的是diethotplug-0.4,在华硕公开的源码中有它的源代码。这是一个瘦身版的hotplug程序,它的主要工作是在usb存储设备插入时进行自动挂载,挂载目录在/tmp/usbmounts下面,如/tmp/usbmounts/sda1。

我们可以通过修改/proc/sys/kernel/hotplug来重新指定hotplug程序,通过定制hotplug程序,我们可以按我们希望的方式来处理热插拔事件,比如插入无线网卡时自动连接无线网。下面我将给出一个实现此功能的程序实例。

程序由两个shell脚本和一个配置文件组成:hotplug脚本是我们定制的hotplug程序,wifi_monitor脚本是无线网络监控程序,它们都放在/usr/local/sbin下。wifi.conf是无线网络配置文件,放在/usr/local/etc下。

首先用我们的hotplug程序替换系统默认的/sbin/hotplug
1 # echo /usr/local/sbin/hotplug > /proc/sys/kernel/hotplug

程序是这样工作的:热插拔事件发生时,内核执行我们的hotplug程序,即/usr/local/sbin/hotplug。hotplug程序先调用/sbin/hotplug,让它完成它该做的工作。然后判断该事件是否为usb无线网卡插入事件,如果是则执行wifi_monitor,如果是无线网络连接事件则通过DHCP获取IP地址。wifi_monitor根据wifi.conf配置文件尝试连接无线网络。它先扫描可用无线网络,如果找到指定的网络则进行连接,否则等5秒钟再重新扫描。如果扫描3次都没有找到,则等待10秒钟后重新读入配置文件再次开始扫描循环。wifi_monitor还可以处理无线网络断线的情况,即发现无线网络断开时重新开始扫描循环。

/usr/local/sbin/hotplug
#!/bin/sh

# let /sbin/hotplug 
do the dirty work first
/sbin/hotplug $1

#define log file. set to /dev/null if you want to suppress logging
LOG=/var/log/hotplug.log

# log the 
event
echo "[`date`] hotplug SUBSYSTEM=$SUBSYSTEM, ACTION=$ACTION, PRODUCT=$PRODUCT, TYPE=$TYPE, INTERFACE=$INTERFACE, DEVPATH=$DEVPATH" >> $LOG

EVENT="$SUBSYSTEM.$INTERFACE.$ACTION";
if [ "$EVENT" = "net.wlan0.add" ] ; then
  # start wifi monitor
  /usr/local/sbin/wifi_monitor $INTERFACE &
elif [ "$EVENT" = "net.wlan0.linkup" ] ; then
  /sbin/udhcpc -i $INTERFACE -t 15 -b -q -s /etc/udhcpc.script >> $LOG 2>&1

fi

/usr/local/sbin/wifi_monitor
#!/bin/sh
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin
WPA_CTRL_INTERFACE=/var/lock/wpa_supplicant
WPA_SUPPLICANT_PID=/var/lock/wpa_supplicant.pid
WPA_SUPPLICANT_CONF=/tmp/wpa_supplicant.conf
WIFI_CONF=/usr/local/etc/wifi.conf

if [ -z "$1" ] ; then
  echo "Usage: wifi_monitor <interface>"
  exit 1
fi

IFACE=$1
PIDFILE=/var/lock/wifi_monitor.$IFACE.pid
SYSFS="/sys/class/net/$IFACE"

if [ -e $PIDFILE ] && grep -q wifi_monitor /proc/`cat $PIDFILE`/cmdline ; then
  echo "wifi_monitor: another instance is running, quiting..."
  exit
fi

read_conf() {
  for v in ESSID SECURITY WEP_AUTH WEP_KEYINDEX WEP_KEY WPA_PASSPHRASE ; do unset CONF_$v ; done
  for line in `grep -E '^ *[A-Z_]+ *= *[^ #]+' $WIFI_CONF|sed -e 's/#.*//' -e 's/ *//g'` ; do eval CONF_$line ; done
}

reload() {
  echo "wifi_monitor: reloading..."
  ifconfig $IFACE down
  iwconfig $IFACE essid off
}

quit() { exit; }

cleanup() {
  [ -e $WPA_SUPPLICANT_PID ] && pkill -x wpa_supplicant
  rm -f $WPA_SUPPLICANT_PID
  rm -rf $WPA_CTRL_INTERFACE
  rm -f $PIDFILE
}

setup_wifi() {
  [ -n "$CONF_ESSID" ] || { echo "Error: ESSID not defined!" ; return; }
  # scan for AP
  ifconfig $IFACE up
  local count=0
  until [ $count -ge 3 ] || iwlist $IFACE scanning|grep -q $CONF_ESSID ;
  do
    echo "AP $CONF_ESSID not found, sleeping...";
    sleep 5;
    let 'count=count+1';
  done

  if [ $count -lt 3 ] ; then
    [ "x$CONF_SECURITY" != "xWPA" ] && [ -e $WPA_SUPPLICANT_PID ] && kill `cat $WPA_SUPPLICANT_PID`
    case "$CONF_SECURITY" in
      NONE)
        iwconfig $IFACE key off
        iwconfig $IFACE essid "$CONF_ESSID"
        ;;
      WEP)
        [ -n "$CONF_WEP_KEY" ] || { echo "Error: WEP_KEY not defined!" ; return; }
        if [ -n "$CONF_WEP_KEYINDEX" ] ; then
          iwconfig $IFACE key $CONF_WEP_AUTH [$CONF_WEP_KEYINDEX] "$CONF_WEP_KEY"
        else
          iwconfig $IFACE key $CONF_WEP_AUTH "$CONF_WEP_KEY"
        fi
        iwconfig $IFACE essid "$CONF_ESSID"
        ;;
      WPA)
        [ -n "$CONF_WPA_PASSPHRASE" ] || { echo "Error: WPA_PASSPHRASE not defined!" ; return; }
        if [ ! -e $WPA_SUPPLICANT_PID ] || ! pgrep -x wpa_supplicant > /dev/null ; then
          # generate the wpa_supplicant.conf
          if [ "x$LAST_WPA_PASSPHRASE" != "x$CONF_ESSID.$CONF_WPA_PASSPHRASE" ] ; then
                WPA_PSK=`wpa_passphrase "$CONF_ESSID" "$CONF_WPA_PASSPHRASE"|grep -o 'psk=[0-9a-z]\{64\}'`
                LAST_WPA_PASSPHRASE="$CONF_ESSID.$CONF_WPA_PASSPHRASE"
          fi
          cat >$WPA_SUPPLICANT_CONF<<-EOF
                ctrl_interface=$WPA_CTRL_INTERFACE

                network={
                        ssid="$CONF_ESSID"
                        scan_ssid=1
                        proto=WPA RSN
                        key_mgmt=WPA-PSK
                        pairwise=CCMP TKIP
                        group=CCMP TKIP
                        $WPA_PSK
                }
                EOF
          wpa_supplicant -B -Dwext -i$IFACE -c$WPA_SUPPLICANT_CONF -P$WPA_SUPPLICANT_PID
        fi
        ;;
    esac
  fi
}

trap 'reload' HUP
trap 'quit' INT QUIT TERM
trap 'cleanup' EXIT
echo $$ > $PIDFILE

# wait until the kernel structure is ready. FIXME: Is this really necessary?
until [ -d $SYSFS ] ; do sleep 1; done

while [ -d $SYSFS ] ; do
  carrier=`cat $SYSFS/carrier 2>/dev/null`
  if [ "x$carrier" != "x1" ] ; then
    # reload configuration
    read_conf
    setup_wifi
  fi
  sleep 10
done

/usr/local/etc/wifi.conf - WEP实例
ESSID=MYESSID
# wireless security: NONE, WEP or WPA
SECURITY
=WEP
# WEP security mode: open or restricted
WEP_AUTH
=restricted
WEP_KEYINDEX
=1                        
WEP_KEY
="06af3154902d96506b3cbe6bae"

/usr/local/etc/wifi.conf - WPA实例
ESSID=MYESSID
# wireless security: NONE, WEP or WPA
SECURITY
=WPA
WPA_PASSPHRASE
="testtest"

posted on 2010-03-26 18:04 gouzhuang 阅读(7557) 评论(50)  编辑 收藏 引用 所属分类: 嵌入式Linux

评论

# re: hotplug应用实例:自动连接无线网 2010-03-27 22:01 www.2427586.com
看不懂,楼主好厉害啊  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-03-29 16:44 老顽童
那么可以试试键盘鼠标咯?  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-03-31 14:33 gouzhuang
@老顽童
编译内核时可以加入键盘鼠标支持。问题是在播放机上用键盘鼠标可以做什么呢?  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-04-09 12:52 老顽童
加上键盘鼠标当个完整的LINUX玩咯  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-04-15 15:31 老顽童
LZ能不能从内核里, 解决下USB挂接EXT2文件系统的问题?
如果可以将解决optware 安装问题呢.  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-04-23 14:08 老顽童
M890没有自带电视模块, 想起有USB TV tuner 卖, 这个东东能不能插在M890里面呢?
那就不需要电视机的调谐器了. 老实说还不知道怎么用M890里面的节目扫描功能呢

http://forums.whirlpool.net.au/forum-replies-archive.cfm/997883.html

又想, 要是能控制USB web camera, 是不是等于给家里装个自动监控系统啊?
  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-04-23 15:10 gouzhuang
@老顽童
USB TV tuner我不了解,但我觉得支持它有些困难。只要有源码,安装驱动应该不是问题,困难在于上层应用如何将电视画面输出到屏幕上,这需要了解播放机的视频输出接口。

usb camera应该不成问题,我听说有人给他的NAS接上摄像头,可以在办公室监控家里。  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-04-24 00:24 iamcatcher
@gouzhuang
请教楼主是否在播放器里面使用成功smartctl?
想检测一下外挂sata硬盘的状态,一直不能成功,小弟是个菜鸟。  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-04-26 17:25 gouzhuang
@iamcatcher
smartctl我没用过。你在台式机上试过吗?  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-04 10:34 老顽童
这个无线实例好, 正好回去实验下!  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-05 21:58 老顽童
插上 Darkhorse USB camera dmesg 输出:

usb 1-1.4: new full speed USB device using ehci_hcd and address 5
###################################################################
[cfyeh-test] usb_set_configuration(1454)
Don't support this usb device or don't insert correct module yet!!!
bus_id 1-1.4:1.0 (config #1, interface 0)
###################################################################
usb 1-1.4: 60mA over 100mA budget!
usb 1-1.4: USB disconnect, address 5
  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-06 09:13 gouzhuang
@老顽童
有驱动程序源码吗?  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-06 22:06 老顽童
没啊,CD上只有win9x的驱动软件, 应该是比较老的家伙吧, 2006年的产品  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-10 16:18 gouzhuang
@老顽童
在PC上用ubuntu能驱动吗?如果可以,请找出是由哪个模块驱动的。  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-13 13:54 老顽童
我那个摄像头,别产家说, LINUX 2.6.18以后不用驱动, 估计kernel包含了源码, 回去看看才知道那个模块,

换个公司里的摄像头看看:

[274308.856901] usb 1-1: new full speed USB device using uhci_hcd and address 4
[274309.073425] usb 1-1: configuration #1 chosen from 1 choice
[274309.104376] /build/buildd/linux-ubuntu-modules-2.6.24-2.6.24/debian/build/build-generic/media/gspcav1/gspca_core.c: USB GSPCA camera found.(ZC3XX)
webmstr@ubuntu804d:~$
webmstr@ubuntu804d:~$ uname -a
Linux ubuntu804d 2.6.24-16-generic #1 SMP Thu Apr 10 13:23:42 UTC 2008 i686 GNU/Linux


  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-13 14:02 老顽童
刚才是在同事VMware上看的, 在我本机上

Linux melbak01 2.6.28-11-server #42-Ubuntu SMP Fri Apr 17 02:45:36 UTC 2009 x86_64 GNU/Linux

应该是这个模块:

/lib/modules/2.6.28-11-server/kernel/drivers/media/video/gspca/gspca_zc3xx.ko  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-13 20:43 laowantong
darkhorse 211 PC camera

[ 391.668048] usb 2-1: new full speed USB device using uhci_hcd and address 2
[ 391.865206] usb 2-1: configuration #1 chosen from 1 choice
[ 393.924948] Linux video capture interface: v2.00
[ 393.995009] gspca: main v2.6.0 registered
[ 394.004259] gspca: probing 0ac8:307b
[ 394.807069] zc3xx: probe 2wr ov vga 0x7648
[ 394.807075] zc3xx: probe sensor -> 7648
[ 394.807079] zc3xx: Find Sensor OV7648
[ 394.809178] gspca: probe ok
[ 394.809205] usbcore: registered new interface driver zc3xx
[ 394.809210] zc3xx: registered
linux9:~$ uname -a
Linux linux9 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:04:26 UTC 2009 i686 GNU/Linux


seem same gspca zc3xx  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-14 09:54 gouzhuang
@laowantong
OK, I'll look into that later.  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-16 16:30 gouzhuang
@laowantong
我先尝试了一下从2.6.31的内核backport驱动程序,发现内核已发生了很大的变化,移植难度太大。只好退而求其次,找了一个比较老的版本http://mxhaard.free.fr/spca50x/Download/gspcav1-20071224.tar.gz, 编译成功了。

模块gspca.ko依赖于videodev.ko,另外两个模块v4l1-compat.ko,v4l2-common.ko没有依赖关系,可能是提供应用程序接口的,我也一起打包了。

下载地址:http://www.cnitblog.com/Files/gouzhuang/gspca.tar.zip
  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-17 17:32 老顽童
可怜我的M890还没上路返修. 等朋友带回去, 呵呵.
先谢谢了!  回复  更多评论
  

# 楼主很弓虽大! 2010-05-21 10:43 801H
感谢楼主执着进取的探索和努力。

如果可以处理无线网卡的热插拔,那么是否可以接usb 光驱呢?

一直很关心这个问题,请楼主关注下吧。

再次感谢  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-21 11:24 gouzhuang
@801H
谢谢鼓励!usb光驱已有人成功用手工方式挂载(请参考:http://www.kboox.com/viewthread.php?tid=5585&page=1#pid22519),所以驱动不是问题。你是希望实现自动挂载吧?
我看了一下hotplug程序的源码,发现支持光驱的代码被有意屏蔽了(代码还在,只是在编译时被忽略)。最简单的办法就是解除屏蔽重新编译hotplug。如果你愿意尝试,我很乐意为你编译。  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-25 14:06 801H
@gouzhuang
谢谢楼主的回复。手工加载光驱的方法有点麻烦了,如果开电脑,就没必要用高清播放器了。所以还是希望能自动加载,楼主要是能解决这个问题,真是太好了。  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网[未登录] 2010-05-25 23:04 李晓枫
@gouzhuang
谢谢!先下来用用!运行这个gspca.ko这个模块跟内核有关系吗?  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-26 08:41 gouzhuang
@801H
用这个http://www.cnitblog.com/Files/gouzhuang/hotplug.zip 替换/sbin/hotplug,然后按下面的步骤测试:

usb光驱先不连接播放机,在光驱中放入光盘,然后将光驱连接到播放机。  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-26 08:43 gouzhuang
@李晓枫
>运行这个gspca.ko这个模块跟内核有关系吗?
这个模块可以在原厂内核上加载。  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-05-28 08:54 801H
@gouzhuang
试一试,谢谢啦  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-06-09 14:27 jackboy
不知道摄像头是否可以接上  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-07-07 15:33 lurry
问老大一个简单的问题,请恕小弟无知:

在用下面的命令后,我们的hotplug程序替换系统默认的/sbin/hotplug

1 # echo /usr/local/sbin/hotplug > /proc/sys/kernel/hotplug

如果希望恢复使用系统原来的hotplug,用什么命令能还原呢?

谢谢。
  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-07-08 10:05 gouzhuang
@lurry
echo /sbin/hotplug > /proc/sys/kernel/hotplug 可恢复系统默认的hotplug程序  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-07-14 10:46 lurry
@gouzhuang
谢谢  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-09-06 16:40 ccbcfan
TO gouzhuang:

一直比较关注楼主的进展,最近好像很少更新了?

老玩童:

usb webcam ZC3XX,是中芯微ZC3XX 芯片驱动包!
只要能挂上,应用也可以想办法解决的!

可以参照openwrt下挂载USB webcam、cd 、声卡等!
openwrt的源里提供了很多驱动和应用的源代码,可以在交叉编译环境中重新编译使用的!
  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-03 23:58 ccbcfan
ZD1211b.ko加载后,按楼主的教程和程序(hotplug、wifi_monitor、wifi.conf),无线网卡还是连不上AP(开放式未加密)!
vi /usrl/local/wifi.conf
ESSID=OpenWrt
# wireless security: NONE, WEP or WPA
SECURITY=NONE
# WEP security mode: open or restricted
#WEP_AUTH=restricted
#WEP_KEYINDEX=1
#WEP_KEY="06af3154902d96506b3cbe6bae"
#WPA_PASSPHRASE="testtest"

直接运行:
~ # echo /usr/local/sbin/hotplug > /proc/sys/kernel/hotplug
~ # /usr/local/sbin/hotplug
手工运行:
~ # /usr/local/sbin/wifi_monitor wlan0
/usr/local/sbin/wifi_monitor: /usr/local/sbin/wifi_monitor: 115: Syntax error: )
~ #

不知道是什么原因连不上AP?  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-04 00:16 ccbcfan
~ # /usr/local/sbin/wifi_monitor wlan0
/usr/local/sbin/wifi_monitor: /usr/local/sbin/wifi_monitor: 115: Syntax error: end of file unexpected (expecting "fi")

手工运行:可以DHCP得到IP了:
# /sbin/udhcpc -i wlan0 -t 15 -b -q -s /etc/udhcpc.script >> /var/log/hotplug.log
2>&1

# ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr 00:02:72:5A:CF:B7
inet addr:192.168.3.103 Bcast:192.168.3.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:112 errors:0 dropped:0 overruns:0 frame:0
TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:6336 (6.1 KiB) TX bytes:2588 (2.5 KiB)


现在有两个问题需要解决:
1是插入USB网卡后,无法自动连接AP;
2是ZD1211B无线网卡还无法在DvdPlayer中调用和配置使用!

  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-05 21:51 gouzhuang
@ccbcfan
请将wifi_monitor第90行的EOF前的所有空格全部删除再试试。如果还不行,请在第2行加入set -x打开trace。

这个脚本我是在busybox 1.15.3下测试过的。你用的是什么版本?

>现在有两个问题需要解决:
>1是插入USB网卡后,无法自动连接AP;
>2是ZD1211B无线网卡还无法在DvdPlayer中调用和配置使用!
第1个问题需要解决wifi_monitor的问题。如果第1个问题解决了,就没有必要在DvdPlayer中配置无线网卡了。我的播放机的DvdPlayer本身就不支持无线网卡配置。  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-05 23:01 usli
能帮忙看看怎么接usb打印机吗?多谢。在装了tomato的Asus WL-520GU上可以识别:

Linux unknown 2.4.37.9 #2 2010-09-03 23:44:51 EDT mips GNU/Linux

usb.c: USB disconnect on device 00:03.1-1 address 3
hub.c: new USB device 00:03.1-1, assigned address 4
printer.c: usblp0: USB Bidirectional printer dev 4 if 1 alt 0 proto 2 vid 0x04A9 pid 0x26A3
printer.c: usblp1: USB Bidirectional printer dev 4 if 2 alt 0 proto 2 vid 0x04A9 pid 0x26A3

但是在PBO上不行:

Linux Venus 2.6.12.6-VENUS #10 Tue Sep 21 07:53:32 CST 2010 mips unknown

usb 1-2: new high speed USB device using ehci_hcd and address 2
###################################################################
[cfyeh-test] usb_set_configuration(1454)
Don't support this usb device or don't insert correct module yet!!!
bus_id 1-2:1.0 (config #1, interface 0)
###################################################################
###################################################################
[cfyeh-test] usb_set_configuration(1454)
Don't support this usb device or don't insert correct module yet!!!
bus_id 1-2:1.1 (config #1, interface 1)
###################################################################
###################################################################
[cfyeh-test] usb_set_configuration(1454)
Don't support this usb device or don't insert correct module yet!!!
bus_id 1-2:1.2 (config #1, interface 2)
###################################################################  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-06 01:55 ccbcfan
@gouzhuang
1、将wifi_monitor第90行的EOF前的所有空格全部删除后,wifi_monitor可以正常启动工作了。但开机或插上USB网卡还是无法自连接指定AP。

我是这样设置的:
/usr/local/etc/wifi.conf :
[code]ESSID=dd-wrt_vap
# wireless security: NONE, WEP or WPA
SECURITY=NONE
# WEP security mode: open or restricted
#WEP_AUTH=restricted
#WEP_KEYINDEX=1
#WEP_KEY="06af3154902d96506b3cbe6bae"
#WPA_PASSPHRASE="testtest"[/code]
/usr/local/etc/rcS( 添加):
[code]# mystart
mount -o remount,rw /
echo /usr/local/sbin/hotplug > /proc/sys/kernel/hotplug
insmod /usr/local/etc/zd1211b.ko
ifconfig wlan0 up
#/usr/local/sbin/wifi_monitor wlan0 &
#sleep 5
#iwconfig wlan0 essid "dd-wrt_vap"
#/sbin/udhcpc -i wlan0 -t 15 -b -q -s /etc/udhcpc.script >> /var/log/hotplug.log 2>&1 [/code]
启动后,wlan0已UP,但没有得到IP。ps显示进程wifi_monitor存在。
440 root 2440 S /sbin/udhcpc -p /var/lock/udhcpc_eth0.pid -t 15 -b -s
456 root 2448 S < /bin/sh /usr/local/sbin/wifi_monitor wlan0
483 root 1516 S /opt/sbin/dropbear -p 222

/usr/log/hotplug.log:
[code][Mon May 10 00:00:05 UTC 2010] hotplug SUBSYSTEM=module, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/module/zd1211b
[Mon May 10 00:00:05 UTC 2010] hotplug SUBSYSTEM=drivers, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/bus/usb/drivers/zd1211b
[Mon May 10 00:00:05 UTC 2010] hotplug SUBSYSTEM=module, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/module/libata
[Mon May 10 00:00:05 UTC 2010] hotplug SUBSYSTEM=module, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/module/sata_mars
[Mon May 10 00:00:05 UTC 2010] hotplug SUBSYSTEM=SATA_BUS, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/devices/SATA_DEV
[Mon May 10 00:00:05 UTC 2010] hotplug SUBSYSTEM=drivers, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/bus/SATA_BUS/drivers/SATA_DRV
[Mon May 10 00:00:06 UTC 2010] hotplug SUBSYSTEM=scsi_host, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/class/scsi_host/host0
[Mon May 10 00:00:04 UTC 2010] hotplug SUBSYSTEM=module, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/module/ehci_hcd
[Mon May 10 00:00:04 UTC 2010] hotplug SUBSYSTEM=platform, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/devices/platform/ehci_hcd
[Mon May 10 00:00:04 UTC 2010] hotplug SUBSYSTEM=drivers, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/bus/platform/drivers/ehci_hcd
[Mon May 10 00:00:04 UTC 2010] hotplug SUBSYSTEM=usb_host, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/class/usb_host/usb1
[Mon May 10 00:00:04 UTC 2010] hotplug SUBSYSTEM=usb, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/devices/platform/ehci_hcd/usb1
[Mon May 10 00:00:04 UTC 2010] hotplug SUBSYSTEM=module, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/module/ohci_hcd
[Mon May 10 00:00:04 UTC 2010] hotplug SUBSYSTEM=platform, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/devices/platform/ohci_hcd
[Mon May 10 00:00:04 UTC 2010] hotplug SUBSYSTEM=drivers, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/bus/platform/drivers/ohci_hcd
[Mon May 10 00:00:04 UTC 2010] hotplug SUBSYSTEM=usb, ACTION=add, PRODUCT=0/0/206, TYPE=9/0/1, INTERFACE=9/0/0, DEVPATH=/devices/platform/ehci_hcd/usb1/1-0:1.0
[Mon May 10 00:00:05 UTC 2010] hotplug SUBSYSTEM=usb_host, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/class/usb_host/usb2
[Mon May 10 00:00:05 UTC 2010] hotplug SUBSYSTEM=usb, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/devices/platform/ehci_hcd/usb1/1-1
[Mon May 10 00:00:05 UTC 2010] hotplug SUBSYSTEM=usb, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/devices/platform/ohci_hcd/usb2
[Mon May 10 00:00:05 UTC 2010] hotplug SUBSYSTEM=usb, ACTION=add, PRODUCT=5e3/608/7764, TYPE=9/0/1, INTERFACE=9/0/0, DEVPATH=/devices/platform/ehci_hcd/usb1/1-1/1-1:1.0
[Mon May 10 00:00:05 UTC 2010] hotplug SUBSYSTEM=usb, ACTION=add, PRODUCT=0/0/206, TYPE=9/0/0, INTERFACE=9/0/0, DEVPATH=/devices/platform/ohci_hcd/usb2/2-0:1.0
[Mon May 10 00:00:06 UTC 2010] hotplug SUBSYSTEM=usb, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/devices/platform/ehci_hcd/usb1/1-1/1-1.1
[Mon May 10 00:00:06 UTC 2010] hotplug SUBSYSTEM=usb, ACTION=add, PRODUCT=ace/1215/4810, TYPE=255/255/255, INTERFACE=255/0/0, DEVPATH=/devices/platform/ehci_hcd/usb1/1-1/1-1.1/1-1.1:1.0
[Mon May 10 00:00:07 UTC 2010] hotplug SUBSYSTEM=net, ACTION=add, PRODUCT=, TYPE=, INTERFACE=wlan0, DEVPATH=/class/net/wlan0
[Mon May 10 00:00:22 UTC 2010] hotplug SUBSYSTEM=scsi_host, ACTION=add, PRODUCT=, TYPE=, INTERFACE=, DEVPATH=/class/scsi_host/host1

2、我使用的是BusyBox v1.10.3 ;

  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-06 01:56 ccbcfan
我还试过直接按以下设置中启动连接AP,也是
/usr/local/etc/rcS( 添加):
# mystart
mount -o remount,rw /
echo /usr/local/sbin/hotplug > /proc/sys/kernel/hotplug
insmod /usr/local/etc/zd1211b.ko
ifconfig wlan0 up
iwconfig wlan0 essid "dd-wrt_vap"
/sbin/udhcpc -i wlan0 -t 15 -b -q -s /etc/udhcpc.script >> /var/log/hotplug.log 2>&1

还是得不到IP,好像最后一句:/sbin/udhcpc...没有正常运行!
直接在shell中运行“/sbin/udhcpc -i wlan0 -t 15 -b -q -s /etc/udhcpc.script >> /var/log/hotplug.log 2>&1 ”可以正常取得IP。取得IP后,在DvdPlayer中是无法配置此ZD1211无线网卡的,但可以正常联网使用!!


  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-06 02:19 ccbcfan
最后注意到:
log中只有ACTION=add,没有ACTION=linkup
hotplug SUBSYSTEM=net, ACTION=add, PRODUCT=, TYPE=, INTERFACE=wlan0, DEVPATH=/class/net/wlan0

将hotplug中以下一句注释掉,暂时可以开机或中途插入网卡自动连接到AP了!!
#elif [ "$EVENT" = "net.wlan0.linkup" ] ; then
  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-06 13:49 gouzhuang
@ccbcfan
我的Netcore NW336网卡在与AP成功连接时会产生linkup事件。似乎你的无线网卡不会产生linkup event。

无线网卡扫描无线网络以及连接到AP需要一定的时间,所以你的mystart脚本应该在iwconfig之后稍微等待一下再启动dhcpc,如下:

ifconfig wlan0 up
iwconfig wlan0 essid "dd-wrt_vap"
sleep 5
/sbin/udhcpc -i wlan0 -t 15 -b -q -s /etc/udhcpc.script >> /var/log/hotplug.log 2>&1

如果修改wifi_monitor,也建议你的注释掉elif那一行后加入一个5秒的sleep

#elif [ "$EVENT" = "net.wlan0.linkup" ] ; then
sleep 5
/sbin/udhcpc -i $INTERFACE -t 15 -b -q -s /etc/udhcpc.script >> $LOG 2>&1
  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-06 21:42 ccbcfan
@gouzhuang
谢谢你的指导,zd1211网卡由于自已改装原因,信号变得很不稳定了!想测试一下另一款瑞银INVENTEL UR054G USB(gw3887)无线网卡,不知你能否再帮忙编译一个驱动模块?

瑞银INVENTEL UR054G 是采用的prism54(gw3887)的芯片,2.6以上LINUX内核树都已经内含prism54驱动模块,能否将它单独编译成模块加载?
详见:http://lekernel.net/prism54/
  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-07 11:13 gouzhuang
@usli
关于USB打印机,2.6.12的内核还不支持。只有把高版本内核的驱动反向移植(back port)过来。tomato支持说明驱动已经被反向移植到2.4内核了。  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-08 09:43 ccbcfan
@gouzhuang
我想按照你的教程试着自已编译-瑞银INVENTEL UR054G网卡驱动,我的网卡在设备支持列表中,但不知该下哪一个驱动包来进行编译了:
http://lekernel.net/prism54/newdrivers.html

  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-08 09:49 ccbcfan
“2.6以上LINUX内核树都已经内含prism54驱动模块,能否将它单独编译成模块加载?” ,

今天才发现:http://jbnote.free.fr/prism54usb/index.html
“Kernel
The basic requirements are the same as for the prism54 main driver, that is : hotplug. Additionally, only kernel 2.6 is supported at the moment.

You need at least kernel version 2.6.13 for the driver to compile. 2.6.14 is preferred, 2.6.15 should be fine. ”

巧的是1073 内核正好是2.6.12 ,可能内核就没有包含prism54驱动了吧?
  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-08 10:36 gouzhuang
@ccbcfan
我也注意到这个了。2.6.12的内核有prism54驱动,但似乎只支持PCI卡。所有要用usb,就必须把新的驱动back port到2.6.12,这个任务并不简单。  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-09 08:27 ccbcfan
@gouzhuang

昨天使用你的hda.img在XP下完成了Qemu编译环境的搭建,才知道prism54驱动不能直接编译,不知还有希望不?等你的好消息!  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-09 13:55 gouzhuang
@ccbcfan
我有空了会尝试一下。  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-11 13:33 usli
@gouzhuang

Tomato 的固件和源可以下载http://tomatousb.org/download,能从里面把usb驱动移植到播放器上吗?没搞过这个,恳请帮助。  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2010-10-19 23:42 ccbcfan
@gouzhuang
测试了gspca.tar.zip:
/tmp/usbmounts/sda4 # insmod /tmp/usbmounts/sda4/gspca/gspca.ko
/tmp/usbmounts/sda4 # insmod /tmp/usbmounts/sda4/gspca/videodev.ko
/tmp/usbmounts/sda4 # lsmod
Module Size Used by Tainted: PF
gspca 644128 0
videodev 9952 1 gspca
ohci_hcd 25200 0
ehci_hcd 46592 0
ufsd_lbd 446320 0
sata_mars 26944 0
libata 60976 1 sata_mars
zd1211b 332208 0
/tmp/usbmounts/sda4 # ls /dev/v4l/v*
/dev/v4l/video0
/tmp/usbmounts/sda4 # /tmp/usbmounts/sda4/toolchain-root/build/servfox/servfox -d /dev/v4l/video0
servfox version: 1.1.2 date: 07:10:2005 (C) mxhaard@magic.fr
ERROR opening V4L interface
/tmp/usbmounts/sda4 #

测试gspca.ko可以挂载,但无法正常工作!
cat /dev/v4l/video0 > /tmp/1.jpg 无法生成图片!

servfox是我自已编译的一个webcam 采集程序。  回复  更多评论
  

# re: hotplug应用实例:自动连接无线网 2016-01-05 18:17 严康
楼主,你太吊了,能给个QQ吗,想加你好友@ccbcfan
  回复  更多评论
  

只有注册用户登录后才能发表评论。