文档章节

Linux中WIFI功能工具与操作

水海云
 水海云
发布于 2017/09/09 13:47
字数 3190
阅读 204
收藏 19
点赞 0
评论 0

wifi模块驱动

使用系统wifi功能的第一步是确定设备wifi模块的型号并安装相应的驱动程序。在嵌入式开发中,一般是需要获取到wifi模块的驱动源码,然后进行交叉编译来构建驱动模块并使用insmod命令进行安装。

一般而言,WIFI模块具有两种工作模式:

  • Station Mode: 工作站模式,用来接入路由器等AP
  • AP Mode: 接入点模式,用来被接入使用

不同模式的wifi驱动代码可能不一样,所以也许会需要安装两个驱动模块,分别来支持这两种模式功能,具体请参考对应wifi模块的手册与指南文档。

主要工具

Linux系统中主要使用的wifi配置工具有两种:

  • wireless tools: 包含iwconfig,iwlist,iwspy,iwpriv等工具,主要配置wep加密wifi
  • wpa_supplicant:包含wpa_cli,wpa_supplicant等工具,主要配置wpa加密wifi

因为目前常用的wifi网络大部分都是使用的wpa协议进行加密,所以wpa_supplicant工具使用的比较多,但是在wifi接口的管理方面,wireless tools工具依然还是很有用的。

wireless tools

该工具包是Linux Wireless Extensions(LWE)的用户层配置工具之一。LWE是Linux下对无线网络配置的工具,包括内核的支持、用户层配置工具和驱动接口的支持三部分。目前很多无线网卡都支持LWE,而且主流的Linux发布版本,比如Redhat Linux、Ubuntu Linux都已经带了这个配置工具。

编译构建之后会生成命令:iwconfg,iwlist,iwspy,iwpriv等,这些命令的使用依赖于生成的动态库文件:libiw.so.29,因此拷贝这些命令到目标机器上时,记得将该库文件一起拷贝到系统的lib目录下面,否则会提示找不到库文件。

iwconfig是LWE最主要的工具,可以对无线网卡的大部分参数进行配置。具体的命令参数与选项可以通过help命令来查看了解。其中一些参数的解释如下:

  • essid:设置无线网卡的ESSID(Extension Service Set ID)。通过ESSID来区分不同的无线网络,正常情况下只有相同ESSID的无线站点才可以互相通讯,除非想监听无线网络。其后的参数为双引号括起的ESSID字符串,或者是any/on/off,如果ESSID字符串中包含any/no/off,则需要在前面加"--"。

  • mode:设置无线网卡的工作模式,可以是

    • Ad-hoc:不带AP的点对点无线网络
    • Managed:通过多个AP组成的网络,无线设备可以在这个网络中漫游
    • Master:设置该无线网卡为一个AP
    • Repeater:设置为无线网络中继设备,可以转发网络包
    • Secondary:设置为备份的AP/Repeater
    • Monitor:监听模式
    • Auto:由无线网卡自动选择工作模式
  • freq/channel:设置无线网卡的工作频率或者频道,小于1000的参数被认为是频道,大于10000的参数被认为是频率。频率单位为Hz,可以在数字后面附带k, M, G来改变数量级,比如2.4G。频道从1开始。使用iwlist工具可以查看无线网卡支持的频率和频道。参数off/auto指示无线网络自动挑选频率。 注意:如果是Managed模式,AP会指示无线网卡的工作频率,因此该设置的参数会被忽略。Ad-hoc模式下只使用该设定的频率初始无线网络,如果加入已经存在的Ad-hoc网络则会忽略该设置的频率参数。

  • ap:连接到指定的AP或者无线网络,后面的参数可以是AP的MAC地址,也可以是iwlist scan出来的标识符。如果是Ad-hoc,则连接到一个已经存在的Ad-hoc网络。使用off参数让无线网卡不改变当前已连接的AP下进入自动模式。any/auto参数,无线网卡自动选择最好的AP。 注意:如果无线信号低到一定程度,无线网络会进入自动选择AP模式。

  • rate/bit:如果无线网卡支持多速率,则可以通过该命令设置工作的速率。小于1000的参数由具体的无线网卡驱动定义,一般是传输速率的索引值,大于1000的为速率,单位bps,可以在数字后面附带k, M, G来指定数量级。auto参数让无线网卡自动选择速率fixed参数让无线网卡不使用自动速率模式。

  • txpower:如果无线网卡支持多发射功率设定,则使用该参数设定发射,单位为dBm,如果指定为W(毫瓦),则转换公式为: dBm=30+log(W)。参数on/off可以打开和关闭发射单元,auto和fixed指定无线是否自动选择发射功率。

  • sens:设置接收灵敏度的下限,在该下限之下,无线网卡认为该无线网络信号太差,不同的网卡会采取不同的措施,一些现代的无线网卡会自动选择新的AP。正的参数为raw data,直接传给无线网卡驱动处理,一般认为是百分比。负值表示dBm值。

  • retry:设置无线网卡的重传机制。limit ‘value’ 指定最大重传次数;lifetime ‘value’指定最长重试时间,单位为秒,可以附带m和u来指定单位为毫秒和微秒。如果无线网卡支持自动模式,则在limit和lifetime之前还可以附加min和max来指定上下限值。

  • rts:指定RTS/CTS握手方式,使用RTS/CTS握手会增加额外开销,但如果无线网络中有隐藏无线节点或者有很多无线节点时可以提高性能。 后面的参数指定一个使用该机制的最小包的大小,如果该值等于最大包大小,则相当于禁止使用该机制。可以使用auto/off/fixed参数。

  • frag:设置发送数据包的分片大小。设置分片会增加额外开销,但在噪声环境下可以提高数据包的到达率。一般情况下该参数小于最大包大小,有些支持Burst模式的无线网卡可以设置大于最大包大小的值来允许Burst模式。还可以使用auto/fixed/off参数。

  • key/enc[ryption]:设置无线网卡使用的加密密钥,此处为设置WEP模式的加密key,如果要使用WPA,需要wpa_supplicant工具包。 密钥参数可以是 XXXX-XXXX-XXXX-XXXX 或者 XXXXXXXX 格式的十六进制数值,也可以是s:xxxxxx的ASCII字符。如果在密钥参数之前加了[index],则只是设置该索引值对应的密钥,并不改变当前的密钥。直接指定[index]值可以设置当前使用哪一个密钥。指定on/off可以控制是否使用加密模式。open/restricted指定加密模式,取决于不同的无线网卡,大多数无线网卡的open模式不使用加密且允许接收没有加密的数据包,restricted模式使用加密。可以使用多个key参数,但只有最后一个生效。 WEP密钥可以是40bit,用10个十六进制数字或者5个ASCII字符表示,也可以是128bit,用26个十六进制数字或者13个ASCII字符表。

  • power:设置无线网卡的电源管理模式。period ‘value’ 指定唤醒的周期,timeout ‘value’指定进入休眠的等待时间,这两个参数之前可以 加min和max修饰,这些值的单位为秒,可以附加m和u来指定毫秒和微秒。off/on参数指定是否允许电源管理,all/unicast/multicast指定允许唤醒的数据包类型。

  • commit:提交所有的参数修改给无线网卡驱动。有些无线网卡驱动会先缓存无线网卡参数修,使用这个命令来让无线网卡的参数修改生效。不过一般不需要使用该命令,因为无线网卡驱动最终都会是参数的修改生效,一般在debug时会用到。

这些工具命令的常用使用示例:

  1. 扫描可用的无线网络

     iwlist [wifi-name] scanning
    

    其中wifi-name为无线网卡的名字,比如网卡eth0就是系统默认的网卡名字, wifi-name可以用ifconfig查看,一般为ra0(无线网卡),不过需要ifconfig ra0 up。

  2. 扫描网络信息

    iwlist ra0 scan
    ===<rt_ioctl_giwscan.11(11) BSS returned, data-<length = 1427
    ra0      Scan completed :
    Cell 01 - Address:C4:CA:D9:1D:9E:A0
    Protocol:802.11b/g/n
    ESSID:""
    Mode:Managed
    Frequency:2.412 GHz(Channel 1)
    Quality=7/100  Signal level=-87 dBm  Noise level=-82 dBm
    Encryption key:off
    Bit Rates:54 Mb/s
    

    如上:ESSID项的值即为无线网络的名字,如上的“TXJ”等。如果值为空,说明在无线路由勾选了隐藏ESSID的选项。ESSID是很关键的,如果被隐藏了,也不是不能连接,而是需要破解,用到其他的工具,非常麻烦。

  3. 设置要连接的网络类型

     iwpriv ra0 set NetworkType=Infra
    
  4. 设置要连接的无线网络的安全模式

     iwpriv ra0 set AuthMode=WPA2PSK
    
  5. 设置网络加密方式:(CCMP即为AES)

     iwpriv ra0 set EncrypType=TKIP
    
  6. 设置连接时的密码

     iwprivra0 set WPAPSK=*******  //********为加密网络的密码
    
  7. 连接该网络:有两种方式:

     iwpriv ra0 set SSID=TXJ
     iwconfig ra0 essid TXJ
    

    至此,如果密码正确,就可以连接上网络TXJ了。

  8. 查看状态

     iwpriv ra0 connStatus
    

    当然,你也可以用iwconfig命令查看状态。

wpa_supplicant

wpa_supplicant是目前常用的工具之一,但缺点是它不支持所有的驱动。请浏览wpa_supplicant网站获得它所支持的驱动列表。wpa_supplicant目前只能连接到那些你已经配置好ESSID的无线网络。wireless-tools支持几乎所有的无线网卡和驱动,但它不能连接到那些只支持WPA的AP。

经过编译后的wpa_supplicant源程序可以看到两个主要的可执行工具:wpa_supplicant和wpa_cli。wpa_supplicant是核心程序,它和wpa_cli的关系就是服务端和客户端的关系:后台运行wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。

使用wpa_supplicant来连接wifi的具体步骤主要是:

  1. 启动wpa_supplicant后台服务程序:

    /sbin/wpa_supplicant -d -Dwext -iwlan0 -c /etc/wpa_supplicant.conf

    其中:

     -d :增加调试信息
     -Dwext :wext,驱动名称
     -iwlan0 :wlan0,网络接口名称
     /etc/wpa_supplicant.conf :配置文件
    

    配置文件的内容大致如下:

       ctrl_interface=/var/run/wpa_supplicant  
       ctrl_interface_group=wheel  
       update_config=1
       network={  
            ssid="test-ap"
            scan_ssid=1
            psk=37bca5cf24a345f514d319211822f568bba28f8f0b74c894e7644
            proto=RSN  
            key_mgmt=WPA-PSK  
            pairwise=CCMP  
            auth_alg=OPEN  
       }  
    

    network里面的内容就是接入AP的配置,wpa_supplicant启动时会以该配置去连接wifi。几个选项的介绍如下,更多的解释可以参考官方的配置文件注释。

    • ssid 接入点名称
    • scan_ssid=1 如果你的无线接入点是隐藏的,那么这个就是必须的。
    • psk=xx 是加密后的密码,用wpa_passphrase自动生成的
    • proto=RSN WPA2只是RSN的一个别名,支持WPA和WPA2

    关于psk加密的生成,使用wpa_passphrase命令如下:

    $ wpa_passphrase TPLINK 12345678
     network={  
         ssid="TPLINK"
         #psk="12345678"
         psk=992194d7a6158009bfa25773108291642f28a0c32a31ab2556a15dee97ef0dbb
     } 
    

    这里表示名为TPLINK的接入点,密码是12345678,输出就是该接入点在wpa_supplicant.conf里面的配置内容。

  2. 执行wpa_cli工具进行搜索和连接

     wpa_cli -i wlan0
    

    wlan0是wifi接口名称,以上名列会进入交互模式,然后进行具体的动作。具体支持的命令可以通过help命令来查看,以下进介绍常用的几个命令。

    • scan 扫描当前可以的WiFi列表
    • scan_result 查看上次scan的扫描结果
    • add_network 添加一个AP连接网络
    • set_network 设置连接网络的相关参数
    • get_network 获取连接网络的参数
    • remove_network 删除一个连接网络
    • enable_network 连接到指定的AP
    • disable_network 禁止一个网络
    • disconnet 端口当前的AP连接
    • status 查看当前的连接状态信息
    • save_config 保存配置

    一些交互连接的示例:

    • 连接无加密的AP

        add_network
        set_network 0 ssid "ap1"
        set_network 0 key_mgmt NONE
        enable_network 0
        quit
      
    • 连接WEP加密AP

        add_network
        set_network 1 ssid "ap2"
        set_network 1 key_mgmt NONE
        set_network 1 wep_key0 "your ap password"
        enable_network 1
      
    • 连接WPA-PSK/WPA2-PSK加密的AP

        add_network
        set_network 2 ssid "ap3"
        set_network 2 psk "your pre-shared key"
        enable_network 2
      

© 著作权归作者所有

共有 人打赏支持
水海云
粉丝 50
博文 119
码字总数 99980
作品 0
深圳
程序员
如何在Linux的终端测试网速

学习如何在 Linux 终端使用命令行工具 测试网速,或者仅用一条 python 命令立刻获得网速的测试结果。 我们都会在连接到一个新的网络或者 WIFI 的时候去测试网络带宽。 为什么不用我们自己的服...

作者: Shrikant Lavhate ⋅ 04/19 ⋅ 0

玩转「Wi-Fi」系列之wpa_supplicant 介绍(七)

简介 wpa_supplicant是Linux BSD, Mac OSX和Windows的WPA的服务,支持WPA和WPA2(IEEE 802.11i/RSN),它适用于台式机/笔记本和嵌入式系统,Supplicant是在客户端站中使用的IEEE 802.1X/WPA组件...

程序手艺人 ⋅ 06/17 ⋅ 0

编译iw工具报错(已编译好依赖的libnl库)

我已经编译好了libnl库,并且将库和头文件都放入了工具链中(arm-none-linux-gnueabi/libc的armv4t的lib和usr的include中)。但是编译后,还是报了没编译libnl库之前的错。如下: 但是,我反...

坚强的程序员 ⋅ 05/20 ⋅ 0

APICloud 支持 Atom 编辑器,建立开发工具核心库

APICloud始终坚持多开发工具支持策略,开发者无论使用SublimeText3、Eclipse还是Webstorm,都可以在APICloud平台中找到适合的插件,进行App的开发。现如今,Atom编辑器插件上线,为喜欢Linux...

API_Cloud ⋅ 2016/11/07 ⋅ 9

APICloud 开发工具核心库--APICloud-Tools-Core

APICloud 开发工具核心库,支持新建页面模板,新建应用模板,WiFi同步等核心功能。 开发者可基于此核心库,定制各种编辑器插件或者将 APICloud 的开发调试功能与已有的自动化业务流程结合,提...

匿名 ⋅ 2016/10/31 ⋅ 0

浙江劢领智能科技有限公司/mylinks-m0m1-open-sdk_a2

mylinks-m0m1-open-sdk_a2 环境 M0M1系列WIFI模块SDK是基于 版本开发并实现的。 源代码:[下载] 虚拟机环境:[下载] linux:[iso]|[VMware安装压缩包] 编译器:[下载] 固件下载工具:[下载] 相关技...

浙江劢领智能科技有限公司 ⋅ 前天 ⋅ 0

如何在 Linux 中找到你的 IP 地址

每个网站都有一个独有的公开 IP 地址,可供任何人从任何地方访问。 互联网协议Internet Protocol(IP)不需要介绍 —— 我们每天都在使用它。即使你不直接使用它,当你在浏览器上输入 websit...

作者: Archit Modi ⋅ 05/27 ⋅ 0

Sublime、Webstorm,还有CLI、Atom,这些开发工具的更新你清楚吗?

APICloud App开发平台一直在不断升级开发工具库,这一年增加了众多开发工具。目的就是让开发者可以选择使用任何自己喜欢的HTML5开发工具去开发App。 那么2016年到现在,这些开发工具都有了哪...

达斯雷马 ⋅ 2016/12/15 ⋅ 0

通过扫描二维码将文件从计算机传输到移动设备

将文件从计算机传输到智能手机并不是什么大问题。你可以使用 USB 线将手机挂载到系统上,然后从文件管理器传输文件。此外,某些第三方应用程序(例如 KDE Connect 和 AirDroid)可帮助你轻松...

作者: Sk ⋅ 04/30 ⋅ 0

[AliOS-Things 之 MQTT] 接入阿里云物联网套件

阿里开发 AliOS-Things 的主要动机,应该就是让别的商家利用 AliOS-Things 快速接入阿里云平台,所以我们可以直接利用 AliOS-Things 提供的 mqttapp 示例进行快速接入。 关于 AliOS 的系列博...

行者武松 ⋅ 06/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JDK1.6和JDK1.7中,Collections.sort的区别,

背景 最近,项目正在集成测试阶段,项目在服务器上运行了一段时间,点击表格的列进行排序的时候,有的列排序正常,有的列在排序的时候,在后台会抛出如下异常,查询到不到数据,而且在另外一...

tsmyk0715 ⋅ 26分钟前 ⋅ 0

spring RESTful

spring RESTful官方文档:http://spring.io/guides/gs/rest-service/ 1. 可以这么去理解RESTful:其实就是web对外提供的一种基于URL、URI的资源供给服务。不是一个原理性知识点。是一个方法论...

BobwithB ⋅ 28分钟前 ⋅ 0

C++ 中命名空间的 5 个常见用法

相信小伙伴们对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。 命名空间在1995年被引入到 c++ 标准中,通常是这样定义的: 命名...

柳猫 ⋅ 31分钟前 ⋅ 0

@Conditional派生注解

@Conditional派生注解(Spring注解版原生的@Conditional作用) 作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效; @Conditional扩展注解 作用(判...

小致dad ⋅ 31分钟前 ⋅ 0

适配器模式

适配器模式 对象适配器 通过私有属性来实现的类适配器 通过继承来实现的接口适配器 通过继承一个默认实现的类实现的

Cobbage ⋅ 35分钟前 ⋅ 0

Java 限流策略

概要 在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃。此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速...

轨迹_ ⋅ 39分钟前 ⋅ 0

GridView和子View之间的间隙

默认的情况下GridView和子View之间会有一个间隙,原因是GridView为了在子View被选中时在子View周围显示一个框。去掉的办法如下: android:listSelector="#0000" 或 setSelector(new ColorDra...

国仔饼 ⋅ 42分钟前 ⋅ 0

idea插件开发

1 刷新页面要使用多线程 2 调试要使用restart bug 不要去关闭调试的idea 否则再次启动会卡住

林伟琨 ⋅ 42分钟前 ⋅ 0

Java 内存模型

物理机并发处理方案 绝大多数计算任务,并不是单纯依赖 cpu 的计算完成,不可避免需要与内存交互,获取数据。内存要拿到数据,需要和硬盘发生 I/O 操作。计算机存储设备与 cpu 之间的处理速度...

长安一梦 ⋅ 49分钟前 ⋅ 0

思路分析 如何通过反射 给 bean entity 对象 的List 集合属性赋值?

其实 这块 大家 去 看 springmvc 源码 肯定可以找到实现办法。 因为 spirngmvc 的方法 是可以 为 对象 参数里面的 list 属性赋值的。 我也没有看 具体的 mvc 源码实现,我这里只是 写一个 简...

之渊 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部