目录
———————————————————————————————————————
主机操作系统:Centos 6.7
交叉编译器环境:arm-linux-gcc-4.5.4
开发板平台: FL2440
Linux内核版本: linux-3.0
开发模块: SIM900 WiFI-STA模式
邮箱:leiyuxing205@gmail.com
———————————————————————————————————————
=====================================================================
而我想要的是板子自己去动态随机获取IP联网,这样可以不用给wlan0指定IP。接下我们来完成这个功能。
=====================================================================
一、station模式
1、概念
ESP32是一款支持WiFi通信的开发板,在WiFi功能中支持的模式有STA(Station)模式、AP(Access Point)模式、STA+AP模式和P2P(Peer-to-Peer)模式。
STA模式是ESP32作为一个WiFi客户端连接到其他WiFi网络的模式。在该模式下,ESP32可以连接到其他的WiFi网络并获取网络的IP地址,用于与其他设备进行通讯。
在STA模式中,ESP32通常会连接到一个路由器或WiFi接入点,并获取路由器或接入点分配的IP地址。一旦连接成功,ESP32就可以通过WiFi与其他设备进行通信,如发送和接收数据。
2、特点
Station模式是一种无线网络工作模式,其特点如下:
-
客户端角色:Station模式设备通常作为客户端连接到无线网络中,以获取网络连接和数据传输的服务。
-
无线接收和传输:Station模式设备可以接收和传输无线信号,以建立和维护与无线网络的连接。
-
有限覆盖范围:Station模式设备的覆盖范围通常比较有限,通常只能覆盖一个小区域,不像其他无线网络模式那样可以覆盖整个城市或更大的区域。
-
稳定性:由于Station模式设备连接到无线网络中,因此它的连接和传输通常比其他无线网络模式更稳定和可靠。
-
数据安全性:Station模式设备连接到无线网络时,需要进行身份验证和加密以确保数据安全性和保密性。
-
可扩展性:Station模式可以扩展到多个设备,以提供更好的网络覆盖和数据传输服务。
3、动态获取IP地址步骤
动态获取IP地址的过程,在station模式下,主要包括以下几个步骤:
-
打开wifi网卡,进行初始化设置。
-
开始扫描周围的wifi信号,确定要连接的wifi热点。
-
连接wifi热点,并进行身份验证,获取到IP地址和网关地址。
-
配置网络参数,将IP地址和网关等信息写入网卡寄存器,完成网络设置。
-
使用网络功能,进行数据的传输和交互。
下面是一个实现动态获取IP地址的代码示例:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <netdb.h>
#include <pthread.h>
#include <sys/ioctl.h>
#include "rtw_wifi_util.h"
#include "rtw_wifi.h"
int main(int argc, char *argv[])
{
int sock_fd;
struct sockaddr_in serv_addr;
char buf[1024];
int ret;
// 初始化wifi网卡
rtw_wifi_init();
// 开始扫描周围的wifi信号
rtw_wifi_scan();
// 连接wifi热点
ret = rtw_wifi_connect("ssid", "password");
if (ret < 0) {
printf("connect wifi failed\n");
goto exit;
}
// 获取IP地址和网关地址
ret = rtw_wifi_get_ip_address(&serv_addr.sin_addr.s_addr, &serv_addr.sin_gateway.s_addr);
if (ret < 0) {
printf("get ip address failed\n");
goto exit;
}
// 配置网络参数
sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock_fd < 0) {
printf("create socket failed\n");
goto exit;
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(80);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
ret = bind(sock_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
if (ret < 0) {
printf("bind socket failed\n");
goto exit;
}
ret = listen(sock_fd, 10);
if (ret < 0) {
printf("listen socket failed\n");
goto exit;
}
// 使用网络功能
while (1) {
int conn_fd = accept(sock_fd, NULL, NULL);
if (conn_fd < 0) {
printf("accept socket failed\n");
goto exit;
}
memset(buf, 0, sizeof(buf));
ret = recv(conn_fd, buf, sizeof(buf), 0);
if (ret <= 0) {
printf("recv data failed\n");
goto exit;
}
printf("recv data: %s\n", buf);
ret = send(conn_fd, "Hello World", strlen("Hello World"), 0);
if (ret < 0) {
printf("send data failed\n");
goto exit;
}
close(conn_fd);
}
exit:
rtw_wifi_disconnect();
rtw_wifi_deinit();
return 0;
}
在这个代码示例中,我们通过调用rtw_wifi_init()函数来初始化wifi网卡,然后调用rtw_wifi_scan()函数开始扫描周围的wifi信号。接着,我们调用rtw_wifi_connect()函数连接指定的wifi热点,并通过rtw_wifi_get_ip_address()函数获取到IP地址和网关地址。
在获取到网络参数之后,我们使用socket、bind、listen等函数来配置网络参数,并使用accept、recv、send等函数来进行数据传输和交互。
在程序结束时,我们调用rtw_wifi_disconnect()函数来断开wifi连接,然后调用rtw_wifi_deinit()函数来释放资源。
二、动态获取配置
要支持动态获取的话,你需要在内核中和制作文件系统的内核部分和bysybox部分选中必要的选项
1. 内核部分
Networking --->
Networking support
Networking options --->
Packet socket //添加.配置CONFIG_PACKET
[ * ] IP: DHCP support //添加
[ * ] Network packet filtering (replaces ipchains)
2.busybox部分
[*]udhcp server(udhcpd)
[*]udhcp client(udhcpc)都选上
udhcpd就是终端设备作为DHCP服务器 ;udhcpc就是终端设备作为DHCP客户端
Networking Utilities --->
[*] udhcp client for DHCPv6 (udhcpc6)
[*] udhcp server (udhcpd) //生成udhcpc命令
make
sudo make install
三、动态获取地址
从busybox的examples/udhcp/下copy好simple.script文件到开发板/usr/share/udhcpc/下,并重命名为default.script.注意更改default.script的权限!!!
>: chmod a+x default.script
连接你的路由器:
>: wpa_supplicant -Dwext -iwlan0 -c/apps/etc/wireless/wpa_supplicant.conf &
>: phy0 -> rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'.
phy0 -> rt2x00lib_request_firmware: Info - Firmware detected - version: 0.36.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 0 - CWmin: 3, CWmax: 4, Aifs: 2, TXop: 102.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 1 - CWmin: 4, CWmax: 5, Aifs: 2, TXop: 188.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 2 - CWmin: 5, CWmax: 10, Aifs: 3, TXop: 0.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 3 - CWmin: 5, CWmax: 10, Aifs: 7, TXop: 0.
Trying to associate with d4:ee:07:22:6b:5c (SSID='HiWiFi_LingYun' freq=2412 MHz)
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 2 - CWmin: 5, CWmax: 10, Aifs: 3, TXop: 0.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 3 - CWmin: 4, CWmax: 10, Aifs: 7, TXop: 0.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 1 - CWmin: 3, CWmax: 4, Aifs: 2, TXop: 94.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 0 - CWmin: 2, CWmax: 3, Aifs: 2, TXop: 47.
Associated with d4:ee:07:22:6b:5c
WPA: Key negotiation completed with d4:ee:07:22:6b:5c [PTK=CCMP GTK=CCMP]
CTRL-EVENT-CONNECTED - Connection to d4:ee:07:22:6b:5c completed (auth) [id=0 id_str=]
动态获取IP地址:
>: udhcpc -i wlan0
udhcpc (v1.20.2) started
Setting IP address 0.0.0.0 on wlan0
Sending discover...
Sending select for 192.168.199.245...
Lease of 192.168.199.245 obtained, lease time 43200
Setting IP address 192.168.199.245 on wlan0
Deleting routers
route: SIOCDELRT: No such process
Adding router 192.168.199.1
Recreating /etc/resolv.conf
Adding DNS server 192.168.199.1
>: ping 4.2.2.2
PING 4.2.2.2 (4.2.2.2): 56 data bytes
64 bytes from 4.2.2.2: seq=0 ttl=43 time=277.500 ms
64 bytes from 4.2.2.2: seq=1 ttl=43 time=363.115 ms
64 bytes from 4.2.2.2: seq=2 ttl=43 time=381.084 ms
64 bytes from 4.2.2.2: seq=3 ttl=43 time=400.133 ms
64 bytes from 4.2.2.2: seq=4 ttl=43 time=419.020 ms
64 bytes from 4.2.2.2: seq=5 ttl=43 time=370.071 ms
64 bytes from 4.2.2.2: seq=6 ttl=43 time=354.070 m
--- 4.2.2.2 ping statistics ---
16packets transmitted, 7 packets received, 5% packet loss
round-trip min/avg/max = 277.500/386.415/449.047 ms
>: ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=6 ttl=39 time=88.134 ms
64 bytes from 8.8.8.8: seq=12 ttl=39 time=89.959 ms
64 bytes from 8.8.8.8: seq=13 ttl=39 time=84.943 ms
64 bytes from 8.8.8.8: seq=15 ttl=39 time=95.898 ms
--- 8.8.8.8 ping statistics ---
16 packets transmitted, 4 packets received, 75% packet loss
round-trip min/avg/max = 84.943/89.733/95.898 ms
>: ping www.baidu.com
PING www.baidu.com (119.75.218.70): 56 data bytes
64 bytes from 119.75.218.70: seq=0 ttl=53 time=26.076 ms
64 bytes from 119.75.218.70: seq=1 ttl=53 time=65.218 ms
64 bytes from 119.75.218.70: seq=2 ttl=53 time=65.232 ms
64 bytes from 119.75.218.70: seq=3 ttl=53 time=66.166 ms
64 bytes from 119.75.218.70: seq=4 ttl=53 time=66.125 ms
64 bytes from 119.75.218.70: seq=5 ttl=53 time=25.296 ms
64 bytes from 119.75.218.70: seq=6 ttl=53 time=65.288 ms
64 bytes from 119.75.218.70: seq=7 ttl=53 time=70.324 ms
--- www.baidu.com ping statistics ---
8 packets transmitted, 8 packets received, 0% packet loss
round-trip min/avg/max = 25.296/56.215/70.324 ms
查看相关网关信息
>: route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default Hiwifi.lan 0.0.0.0 UG 0 0 0 wlan0
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
192.168.199.0 * 255.255.255.0 U 0 0 0 wlan0
四、Rt3070芯片动态获取IP地址常遇问题及处理
-
确认网络环境是否正常:请确保网络连接正确,网络环境正常,路由器或网络设备IP地址分配是否正确。
-
确认无线网卡设置是否正确:请检查无线网卡的SSID、加密方式、密码等设置是否正确。
-
确认DHCP服务是否启动:请确保DHCP服务已经开启,可以在路由器的管理页面中进行设置。
-
重置网络连接:尝试重置网络连接,可以通过以下步骤实现:打开命令行界面,依次输入“ipconfig/release”、“ipconfig/flushdns”和“ipconfig/renew”命令,然后重启系统。
-
更新无线网卡驱动程序:请尝试更新无线网卡驱动程序,确保使用最新版本的驱动程序。
-
检查防火墙设置:请检查电脑上的防火墙设置,确保无线网卡有足够的权限通信。
-
检查IP地址冲突:请确保无线网卡的IP地址没有与其他设备冲突,可以通过命令行输入“ipconfig/all”命令查看。
如果以上方法都无法解决问题,请尝试重新安装无线网卡驱动程序,或者联系网络管理员进行帮助。