在线课堂:https://www.100ask.net/index(课程观看)
论  坛:http://bbs.100ask.net/(学术答疑)
开 发 板:https://100ask.taobao.com/ (淘宝)
     https://weidongshan.tmall.com/(天猫)
交流群一:QQ群:869222007(鸿蒙开发/Linux/嵌入式/驱动/资料下载)
交流群二:QQ群:536785813(单片机-嵌入式)
公 众 号:百问科技


版本 日期 作者 说明
V1 2020 韦东山 技术文档

本文所用开发板:tiny4412,当然也可以在jz2440上实现。

嵌入式中设备想要联网,无非就 有线和无线 两种方式。

有线就插上网线,没什么好说的;无线的话一种是将WIFI模块集成焊接在板子上,另一种是WIFI模块以USB的方式接到板子上。

本次使用的就是USB接口的WIFI无线网卡,实现开发板使用WIFI无线网卡访问互联网和作为个人热点。

1.准备工作

1.2 WIFI基础知识

WIFI网卡有两种工作模式,
一种是无线终端模式(STA),也就是手机日常使用的模式,通过该模式连接网络上网;
一种是无线热点模式(AP),也就是手机的个人热点模式,通过该模式提供热点供其它设备上网;

无线网络的安全性由两部分组成:认证加密

认证: 使得只有允许的设备才能连接到无线网络;
加密: 确保数据的保密性和完整性,即数据在传输过程中不会被篡改;

  • 常用的认证算法有:开放认证、共享秘钥认证、802.11x认证、PSK认证
    其中802.11x认证和PSK认证安全性较高,分别应用于企业和个人的环境;

  • 常用的加密算法有:WEB加密、TKIP加密、CCMP加密算法
    其中WEB加密和TKIP加密都是RC4的加密算法,安全性较低;CCMP加密采用AES对称加密算法,安全性较高。

安全策略 认证方式 加密方式 备注
Open open open 开放WiFi,无任何加密
open WEP 开放WiFi,仅数据加密
WEP WEP WEP 共享密钥认证,容易破解
WAP 802.11X TKIP/WEP 比较安全,用于企业
PSK TKIP/WEP 比较安全,用于个人
WAP2 802.11X CCMP/TKIP/WEP 目前最安全,用于个人
PSK CCMP/TKIP/WEP 目前最安全,用于个人

连入超市、商场等公共WIFI的时候,不需要输入密码,但要通过网页输入手机号,使用验证码验证,也就是采用802.11X进行的验证,通过服务器完成的验证。

使用手机开个人热点的时候,可以选择安全性OPEN、WEP、WAP、WAP2,也就对应不同的安全等级。

我手里的MIX2S,MIUI10个人热点里面就仅OPEN和WAP2两个选项,感觉这是个趋势,要么最简单的OPEN,要么就最安全的WAP2(WAP2是向下兼容的),逐渐扔掉历史的包袱。

1.2 选择无线网卡

首先是选择合适的无线网卡,选取的原则是根据WIFI无线网卡的VIDPID判断内核是否支持该无线网卡。

  • 1.获取无线网卡ID
    将无线网卡插入Windows电脑,打开设备管理器,选中无线网卡,右键“属性”,切换到“详细信”息选项卡,在“属性”下拉栏中选择"硬件ld",即可得到无线网卡的ID:

    我的无线网卡VID0x148FPID0x3070

  • 2.查询内核是否支持
    可以从wireless.kernel.org得到支持的设备列表。
    可以从列表中搜到前面的VIDPID,因此说明内核是支持现在使用的无线网卡。此外,还可以得知对应的驱动应该为rt2800usbrt2870sta

1.3 移植WIFI驱动

  • 前面根据ID得到了对应的网卡驱动名字,但还不是很靠谱,建议直接在驱动中搜索ID,更靠谱:
grep "0x3070" drivers/net/wireless/ -nr

得到:
drivers/net/wireless/ralink/rt2x00/rt2800usb.c:1091: { USB_DEVICE(0x148f, 0x3070) },
知道了对应的驱动文件是rt2800usb.c

  • 再查看对应路径的Makfeile:
cat  drivers/net/wireless/ralink/rt2x00/Makefile

得到:
obj-$(CONFIG_RT2800USB) += rt2800usb.o
知道了对应的宏是CONFIG_RT2800USB

  • 进入内核目录,执行:
make menuconfig

搜索CONFIG_RT2800USB,得知其依赖:
Depends on: NETDEVICES [=y] && WLAN [=y] && WLAN_VENDOR_RALINK [=y] && RT2X00 [=n] && USB [=y]
可以知道RT2X00 [=n]没有打开,再搜索它,如此循环,直到
RT2800USB [=y]

这里有个注意的就是,当开启的上层的某个依赖,下层的某个选项可能会多出来许多选项,而这些选项原来是没有的,不要固化思维。

最后重新编译内核即可。

1.4 使用buildroot移植应用

想要使用无线网卡,需要用到四个软件:

  • **iw:**可用于OPEN、WEP这两种"认证/加密",以及扫描WIFI热点等;
    **- wpa_supplicant:**可用于前面4种"认证/加密";
  • **hostapd:**能够使得无线网卡切换为AP模式;
  • dhcp: STA模式使WIFI网卡动态获取IP,AP模式分配IP;

也就是需要移植这四个软件,目前的方法有:
**1.**逐个下载源码,交叉编译,配置,可以还需要相关依赖库,缺点是费时费力;

**2.**使用Yocto等工具,制作发行版的根文件系统,例如Ubuntu16.04,里面有apt-get,可以自动下载安装,缺点是制作发行版根文件系统比较麻烦,且体积较大;

**3.**使用buildroot制作根文件系统,选择需要的软件,自动生成根文件系统,相对简单,体积也较小;

本次就以buildroot为例,制作包含应用程序的根文件系统。

  • 首先从GitHub下载针对Tiny4412修改后的buidroot
git clone -b board_tiny4412 https://github.com/hceng/buildroot.git
  • 查看支持的board
cd buildroot/
make list-defconfigs

得知tiny4412对应的配置文件:
tiny4412_defconfig - Build for tiny4412

  • 配置提供的配置文件
make tiny4412_defconfig
  • 添加自己所需软件
    执行:
make menuconfig

对应勾选所需软件:

Target packages  --->Networking applications  --->[*] dhcp (ISC)                                                [*]   dhcp server                                      [*]     Enable delayed ACK feature                     [*]   dhcp relay                                       [*]   dhcp client ……[*] hostapd                                                     [*]   Enable ACS (NEW)                                      [*]   Enable EAP                                            [*]   Enable WPS ……[*] iw……[*] wpa_supplicant                                               [*]   Enable nl80211 support                                  [*]   Enable AP mode                                           [ ]   Enable EAP                                                  [ ]   Enable HS20                                                 [ ]   Enable syslog support                                       [ ]   Enable WPS                                                  [*]   Install wpa_cli binary                                      [*]   Install wpa_client shared library                           [*]   Install wpa_passphrase binary     
  • 修改主机名、欢迎语、root密码等
System configuration  --->(tiny_4412) System hostname  (Welcome to hceng's board.) System banner  ……[*] Enable root login with password(123456) Root password
  • 生成根文件系统
    执行:
make

buildroot会自动下载相关源码包,整个过程时间比较久,最后生成buildroot/output/images/rootfs.tar,解压到SD卡rootfs分区即可。

1.5 添加firmware

此时开发板启动Linux后,使用ifconfig wlan0 up启动无线网卡,提示:

ieee80211 phy0: rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'
rt2800usb 2-2.2:1.0: Direct firmware load for rt2870.bin failed with error -2
ieee80211 phy0: rt2x00lib_request_firmware: Error - Failed to request Firmware
ifconfig: SIOCSIFFLAGS: No such file or directory

提示需要firmware文件rt2870.bin

继续通过网站wireless.wiki.kernel.org去下载该固件。

得到rt2870.bin后,拷贝到单板/lib/firmware/下即可。

1.6 启动WIFI网卡

注意:
双网卡的单板的两个网卡IP不能设置为同一网段。原因参考:(https://www.zhihu.com/question/41331151)。

也就是先把有线网卡IP设置为其它网段,比如:

ifconfig eth0 192.168.2.220

然后启动WIFI网卡,并设置IP(路由器IP为192.168.1.1):

ifconfig wlan0 up
ifconfig wlan0 192.168.1.220

此时效果如下:

2.无线终端模式——STA

完成前面的准备工作后,就可以通过软件使用无线网卡了。

2.1 iw的使用

  • 列出WIFI网卡的性能:
iw list
  • 扫描WIFI热点
iw dev wlan0 scan
iw dev wlan0 scan | grep SSID:
  • 连接到开放AP
iw wlan0 connect hceng
  • 查看连接状态
iw dev wlan0 link
  • 断开WIFI连接
 iw wlan0 disconnect

还可以连接加密的WEP,这里就不研究了。

注意:
1.如果连接的不是路由器(IP为192.168.1.1),而是Android手机热点(IP一般为192.168.43.1),那么要将WIFI网卡IP设置为43网段,如:192.168.43.10,才能ping通192.168.43.1
 
2.此时只能ping路由器和局域网设备,如果要联外网,还需要如下操作:
①修改/etc/resolv.conf,添加DNS:nameserver 192.168.1.1,如果是手机热点为nameserver 192.168.43.1
②设置网关,输入命令:route add default gw 192.168.1.1,如果是手机热点为route add default gw 192.168.43.1

2.2 wpa_supplicant的使用

wpa_supplicant本是开源项目,被谷歌修改后加入android移动平台,它主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的。

wpa_supplicant是一个连接、配置WIFI的工具,它主要包含wpa_supplicant(命令行模式)与wpa_cli(交互模式)两个程序。

通常情况下,可以通过wpa_cli来进行WIFI的配置与连接,如果有特殊的需要,可以编写应用程序直接调用wpa_supplicant的接口直接开发。

记得以前想查看Android手机连接过的WIFI热点密码时,就直接使用RE文件管理器查看/data/misc/wifi/wpa_supplicant.conf即可(需ROOT),里面有所有连接过的WIFI名字和密码。

从这里可以看出,最后WIFI名字和密码,都会被保存到一个配置文件里,在Linux中,路径就是/etc/wpa_supplicant.conf

  • 连接开放网络
    /etc/wpa_supplicant.conf加入:
network={ssid="hceng"key_mgmt=NONE
}

初始化wpa_supplicant,执行:

wpa_supplicant -B -d -i wlan0 -c /etc/wpa_supplicant.conf

查看连接状态:

wpa_cli -iwlan0 status

断开连接:

wpa_cli -iwlan0 disconnectkillall wpa_supplicant

重新连接:

wpa_cli -iwlan0 reconnect

  • 连接加密网络(WAP2)
    /etc/wpa_supplicant.conf加入:
network={ssid="hceng_test"psk="12345678"
}

初始化wpa_supplicant,执行:

wpa_supplicant -B -d -i wlan0 -c /etc/wpa_supplicant.conf

至于WEP和WAP方式,也就是配置文件的不同,这里就不去深究了,以后遇到了再说。

2.3 dhclient的使用

至此,已经可以连接WIFI了,但还有一些问题。

就如前面,需要手动设置设备的IP,且要根据热点的网段设置,还可能与同网段的设备IP冲突。
为了解决这个问题,引入了DHCP,自动分配IP地址。

就像家里的设备连接到路由器一样,除了输入名字,密码,其它都不用操作,而且还不会出现IP冲突的情况。

连接好WIFI后,输入:

dhclient wlan0

实现自动获取分配的IP,并设置。

2.4 自动脚本

现在已经从功能上实现了WIFI无线网卡的使用,但使用过程步骤比较多,相对麻烦。
理想的效果无论何时插上WIFI无线网卡,都自动连接WIFI,且自动获取IP地址。

这就要用到USB的热拔插机制,很久以前写过一篇U盘自动挂载的文章,用的就是这个机制。

  • 1.首先修改/etc/mdev.conf配置文件
    加入WIFI无线网卡的热拔插事件:
# hceng add for wifi
wlan0           root:root 660 * /sbin/auto_wifi.sh

其中*表示插拔都执行后面的脚本。

  • 2.自动连接脚本/sbin/auto_wifi.sh
    但检测到USB网卡插拔后,就会执行该脚本:
#!/bin/sh
if [ $ACTION = "add" ];
thenecho --------usb wifi connect--------- > /dev/consolewpa_supplicant -B -d -i wlan0 -c /etc/wpa_supplicant.confwpa_cli -B -i wlan0 -a/sbin/auto_dhcp.sh
elseecho --------usb wifi disconnect--------- > /dev/consolekillall wpa_supplicantkillall wpa_clikillall dhclient
fi

如果是插入USB无线网卡,将执行wpa_supplicant -B -d -i wlan0 -c /etc/wpa_supplicant.conf连接wifi,再执行wpa_cli -B -i wlan0 -a/sbin/auto_dhcp.sh调用dhcp的脚本;

如果是拔出USB无线网卡,将清除所有相关进程;

  • 3.自动dhcp脚本/sbin/auto_dhcp.sh
#!/bin/sh
IFNAME=$1
CMD=$2
if [ "$CMD" = "CONNECTED" ]; thenecho ========connect $IFNAME, dhclient for it======= > /dev/consoledhclient $IFNAME
fi
if [ "$CMD" = "DISCONNECTED" ]; thenecho ========disconnect $IFNAME, kill dhclient for it======= > /dev/consolekillall dhclient
fi

如果是连接,将调用dhclient分配IP,反之清除dhclient进程。

  • 4.为脚本加上可执行权限
chmod +x /sbin/auto_wifi.sh
chmod +x /sbin/auto_dhcp.sh

最后便可实现自动连接WIFI,且自动获取IP地址。

3.无线热点模式——AP

无线热点模式共需要两步操作,先使用hostapd将无线网卡切换成AP模式,再使用dhcpd分配IP。

3.1 hostapd的使用

先清除前面STA模式的所有操作,重新启动单板。

  • 创建/etc/hostapd.conf配置文件

1.OPEN模式:

ctrl_interface=/var/run/hostapdssid=hceng
channel=1
interface=wlan0
driver=nl80211

2.WAP/WAP2模式:

ctrl_interface=/var/run/hostapdssid=hceng
#hw_mode=g
channel=1
interface=wlan0
#bridge=br0
driver=nl80211
macaddr_acl=0
#accept_mac_file=/etc/hostapd.accept
#deny_mac_file=/etc/hostapd.denyauth_algs=1
wpa=3
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

注释:
ctrl_interface:为了后面hostapd_cli链接上hostapd
ssid:无线热点名字;
hw_mode:指定802.11协议,其中a=IEEE 802.11ab=IEEE 802.11bg=IEEE 802.11g
channel:设定无线信道;
interface:指定使用哪一个无线网卡;
bridge:指定所处网桥,对于一个同时接入公网、提供内部网和无线接入的路由器来说,设定网桥很有必要;
driver:指定无线驱动;
macaddr_acl:指定MAC地址过滤规则:
       0表示允许除禁止列表外的设备;
       1表示只允许在允许列表的设备;
       2表示使用外部RADIUS服务器;
accept_mac_file:指定允许MAC列表文件所在路径;
deny_mac_file:指定禁止MAC列表文件所在路径;
auth_algs:指定采用哪种认证算法,采用位域(bit fields)方式来制定;
      1表示使用WPA;
      2表示使用WEP;
      3表示使用WPA/WEP;
wpa:指定WPA类型,采用位域(bit fields)方式来制定;
   1表示使用WPA;
   2表示使用WPA2;
   3表示使用WPA2/WPA;
wpa_passphrase:WIFI的密钥;
wpa_key_mgmt:PSK为个人AP,不使用服务器认证;
wpa_pairwise:指定WPA的加密方式;
rsn_pairwise:指定WPA2的加密方式;

3.2 dhcpd的使用

如果此时启动热点,实测手机一直卡在获取IP地址,无法连接到热点,因此热点还需自动分配IP地址。

  • 编辑/etc/dhcpcd.conf配置文件
    将原来的/etc/dhcpcd.conf复制备份,再修改[配置文件](https://wiki.archlinux.org/index.php/Dhcpd_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)如下:
subnet 192.168.2.0 netmask 255.255.255.0 {range 192.168.2.10 192.168.2.100;option domain-name-servers 192.168.2.1;option routers 192.168.2.1;
}

指定了子网IP起始地址、子网掩码、动态分配的IP范围、DNS服务器、路由。

3.3 启动热点

  • 1.启动无线网卡,并设置IP
ifconfig wlan0 up
ifconfig wlan0 192.168.2.1
  • 2.启动AP和DHCP
    启动命令:
hostapd -B /etc/hostapd.conf
dhcpd -cf /etc/dhcpcd.conf wlan0

对应的停止命令:

killall hostapd
killall dhcpd
  • 3.其它操作
    查看热点状态:
hostapd_cli all_sta

查看热点配置:

hostapd_cli get_config

查看已连接的设备:

iw dev wlan0 station dump

3.4 自动脚本

和前面的一样,假如希望实现USB无线网卡的热拔插,自动进入AP模式,只需如下操作:

  • 1.首先修改/etc/mdev.conf配置文件
    加入WIFI无线网卡的热拔插事件:
# hceng add for wifi
#wlan0           root:root 660 * /sbin/auto_wifi.sh
wlan0           root:root 660 * /sbin/auto_wifi_ap.sh
  • 2.自动AP脚本/sbin/auto_wifi_ap.sh
    但检测到USB网卡插拔后,就会执行该脚本:
#!/bin/sh
if [ $ACTION = "add" ];
then                                echo --------usb wifi connect--------- > /dev/consolehostapd -B /etc/hostapd.confifconfig wlan0 192.168.2.1dhcpd -cf /etc/dhcpcd.conf wlan0else                     echo --------usb wifi disconnect--------- > /dev/consolekillall hostapdkillall dhcpd
fi
  • 3.为脚本添加可执行权限
    执行:
chmod +x /sbin/auto_wifi_ap.sh

之后插上无线网卡,自动启动热点;拔掉无线网卡,自动关闭热点。

参考教程:韦东山第3期视频之WiFi网卡移植

嵌入式Linux开发板_WIFI无线网卡驱动移植相关推荐

  1. 正点原子Linux开发板 spi内核驱动 0.96寸ips屏教程

    正点原子Linux开发板 spi内核驱动 0.96寸ips屏教程 首先选择模块 设备树配置 spi驱动程序(用的spi_driver) app 最近做下底层SPI驱动来驱动IPS屏,本来想实现这种效果 ...

  2. 嵌入式Linux开发板上NFS文件系统的使用【ZT】

    本文转载于http://www.dz863.com/RTOS/Embedded-linux/Linux-NFS.htm 本文描述了在开发嵌入式linux系统时调试程序的一个方法,本文以深圳远峰的YF2 ...

  3. 嵌入式linux开发板USB功能测试 Sigmstar星辰科技SD222D

    一.内核配置 首先需要配置内核,进入kernel文件夹,执行指令make menuconfig 进入图形化界面 Devices Drivers--->[*]USB supprot----> ...

  4. 嵌入式linux开发,openssl-0.9.8d移植

    在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份.这个包广泛被应用在互联网的网页服务器上. 一.下载 /source ...

  5. 任何的Linux开发板+ADB+fastboot驱动-----真实有效!

    目录 1:ADB安装 2:fastboot驱动安装 1:ADB安装 这个可以在CSDN查,不讲 2:fastboot驱动安装 (1条消息) 解决Win10 /Win11 Fastboot驱动问题_si ...

  6. 嵌入式linux开发板使用pulseaudio连接蓝牙耳机播放音频文件

    pulseaudio基于a2dp音频架构,其使用流程如下: 首先需要一直bluez5及pulseaudio,此处关于一直pulseaudio详见其他博客. 配置使用流程: 1.开启蓝牙设备 //此处与 ...

  7. 嵌入式Linux开发——系统移植篇回顾

    前言: 最近在学习正点原子Linux开发板u-boot.内核移植,根文件系统构建的相关内容,本文旨在起到一个流程梳理.宏观地把握整个移植u-boot.kernel,构建文件系统过程的作用,像Makef ...

  8. 嵌入式Linux开发——解决uboot无法使用nfs服务从ubuntu中下载文件(TTT、cannot mount等错误)

    前言: 最近在学习正点原子嵌入式Linux开发板uboot的移植实验,移植完之后想测试网络部分的驱动能否工作正常.最后经过测试发现tftp可以正常下载,nfs却一直报错无法下载文件,最后也是折磨了两天 ...

  9. ubuntu20.04.1 64位搭建嵌入式linux开发环境

    目录 背景 开发环境的搭建 1.交叉编译工具的安装 2.开发工具和依赖库的安装 2.1. 必需部分 2.2.可选部分 ubuntu20.04.1 64位配置和编译Linux3.0内核 背景 市面上的嵌 ...

最新文章

  1. 我妈妈的优点:做事情特别细致
  2. E820-DTU与昆仑通态组态软件联机
  3. 史上最烂代码_历史上最大的代码库
  4. Spring Cloud实战小贴士:健康检查
  5. 马云:格局不够大,人生成就再高也有限!
  6. html抓取成xml,使用XML包将html表抓取到R数据帧中
  7. 备份恢复:如何让xtrabackup恢复速度提升20倍?
  8. 若依前后端分离集成Mybatis-Plus
  9. Java Matcher源码学习记录
  10. php表单美化,使用css美化html表单控件详细示例(表单美化)_HTML/Xhtml_网页制作
  11. C语言代码绘制,利用数组输出 0-2Π之间的 sin 函数图像和 cos 函数图像,实验报告及代码。
  12. 在Excel中统计出指定区域的空单元格个数和非空单元格个数
  13. 本科挣 30 万,秋招大厂提前批offer,大学四年,帅地做对了什么?(附所有知识清单)
  14. mac 终端 配置代理
  15. USB的红绿黑白线详解
  16. 51单片机入门学习 第六天
  17. AutoCAD .NET: 遍历模型空间
  18. 手机kakao聊天能自动翻译 WhatsApp翻译 实时翻译
  19. springboot接口统一加密解密
  20. uTorrent及PT进阶功能篇(转载)

热门文章

  1. 解决网盘下载速度慢的问题
  2. NoSQL Scylla Open Source 3.0食量比Cassandra大
  3. 债券收益率预测模型_证券盈利预测模型
  4. html 字幕文件怎么打开,srt文件怎么打开
  5. 安霸Ambarella_海思Hisilicon_AI芯片参数对比
  6. godaddy 服务器位置,GoDaddy DNS服务器地址 | Godaddy美国主机中文指南
  7. vue项目如何真机测试
  8. 初学单片机:Proteus介绍、Proteus与Keil联调(Windows10环境下)
  9. Java Day24
  10. Whitted光线追踪