【安信可BW16-Kit】4、WIFI热点连接测试
## 1、WPA和WEP之间的区别
| 特征 | WPA | WEP |
|---|---|---|
| 安全级别 | 更安全 | 不安全 |
| 加密算法 | TKIP、AES | RC4 |
| 密钥长度 | 128 位、256 位 | 64 位、128 位 |
| 认证协议 | 802.1x、PSK | 开放系统认证、共享密钥认证 |
| 数据完整性保护 | MIC | CRC |
| 重放攻击保护 | 重放计数器 | 无 |
| 密钥管理 | 由认证服务器管理 | 由用户管理 |
| 兼容性 | 与大多数现代设备兼容 | 与旧设备兼容 |
| 速度 | 比 WEP 慢 | 比 WPA 快 |
| 成本 | 比 WEP 贵 | 比 WPA 便宜 |
## 2、设置
需要在手机端开启一个热点,热点的名称和密码符合要求即可。
## 3、运行程序
使用Arduino WiFi库连接到WiFi网络,并在成功连接后打印出网络的详细信息,包括IP地址、MAC地址、SSID、BSSID、信号强度(RSSI)和加密类型。在setup()函数中,程序检查WiFi模块是否存在,然后尝试连接到WiFi网络。程序将允许用户通过串口手动输入SSID和密码。在loop()函数中,程序定期打印当前网络的状态。此外,printWifiData()和printCurrentNet()函数用于输出与WiFi连接相关的详细信息。
```cpp
#include <WiFi.h> // 引入WiFi库,用于处理WiFi功能。
#ifdef MANUAL_INPUT
// 如果定义了MANUAL_INPUT,允许通过串口手动输入SSID和密码。
String str_ssid, str_pass;
#endif
char ssid[] = "xxss"; // 预定义的WiFi网络SSID。
char pass[] = "999999999"; // 预定义的WiFi密码。
int status = WL_IDLE_STATUS; // 设置WiFi连接的初始状态为IDLE。
void setup() {
Serial.begin(115200); // 开始串口通信,设置波特率为115200。
while (!Serial) { // 等待串口连接。
; // 空操作,确保串口准备就绪。
}
if (WiFi.status() == WL_NO_SHIELD) { // 检查WiFi模块是否安装。
Serial.println("WiFi shield not present"); // 如果没有WiFi模块,打印消息。
while (true); // 无限循环,停止执行。
}
while (status != WL_CONNECTED) { // 循环直到连接到WiFi网络。
#ifdef MANUAL_INPUT
// 如果启用了手动输入,通过串口读取SSID和密码。
Serial.println("Enter your ssid");
while (Serial.available() == 0) {} // 等待输入。
str_ssid = Serial.readString(); // 读取SSID。
str_ssid.trim(); // 去除SSID字符串两端的空格。
Serial.print("SSID entered: ");
Serial.println(str_ssid); // 打印输入的SSID。
Serial.println("Enter your password");
while (Serial.available() == 0) {} // 等待输入密码。
str_pass = Serial.readString(); // 读取密码。
str_pass.trim(); // 去除密码字符串两端的空格。
if (str_pass.length() != 0) { // 如果输入了密码。
while (str_pass.length() <8 ) { // 检查密码长度是否小于8。
Serial.println("Password cannot be less than 8 characters! Try again");
while (Serial.available() == 0) {}
str_pass = Serial.readString(); // 重新读取密码。
str_pass.trim(); // 去除密码字符串两端的空格。
}
Serial.print("Password entered: ");
Serial.println(str_pass); // 打印输入的密码。
}
#endif
Serial.print("Attempting to connect to WPA SSID: ");
#ifndef MANUAL_INPUT
// 如果没有启用手动输入,使用预定义的SSID和密码尝试连接。
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
#else
// 如果启用了手动输入,将String转换为char数组,并连接WiFi。
char ssid_cust;
char pass_cust;
strcpy(ssid_cust, str_ssid.c_str());
strcpy(pass_cust, str_pass.c_str());
Serial.println(str_ssid.c_str()); // 打印SSID。
status = WiFi.begin(ssid_cust, pass_cust); // 使用转换后的凭据连接WiFi。
str_ssid = str_pass = ""; // 清空凭据字符串,准备下一次连接(如果需要)。
#endif
delay(10000); // 等待10秒后重试(如果未能连接)。
}
// 连接成功后,打印网络信息。
Serial.println();
Serial.print("You're connected to the network");
printCurrentNet(); // 打印当前连接的网络信息。
printWifiData(); // 打印WiFi模块的数据。
}
void loop() {
// 每10秒检查一次网络连接状态。
delay(10000);
printCurrentNet(); // 打印当前网络状态。
}
void printWifiData() {
// 打印WiFi盾的IP地址。
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// 打印MAC地址。
byte mac;
WiFi.macAddress(mac);
Serial.print("MAC address: ");
// 以十六进制格式打印每个字节,并用冒号分隔。
for (int i = 0; i < 6; ++i) {
if (mac < 16) Serial.print("0");
Serial.print(mac, HEX);
if (i < 5) Serial.print(":");
}
Serial.println();
}
void printCurrentNet() {
// 打印当前连接的WiFi网络SSID。
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// 打印BSSID。
byte bssid;
WiFi.BSSID(bssid);
Serial.print("BSSID: ");
// 以十六进制格式打印,用冒号分隔。
for (int i = 5; i >= 0; --i) {
if (bssid < 16) Serial.print("0");
Serial.print(bssid, HEX);
if (i > 0) Serial.print(":");
}
Serial.println();
// 打印信号强度(RSSI)。
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
// 打印加密类型。
byte encryption = WiFi.encryptionType();
Serial.print("Encryption Type:");
Serial.println(encryption, HEX);
Serial.println();
}
```
## 4、效果
页:
[1]