xiyou2020eeeee 发表于 2024-2-11 21:28

【安信可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]
查看完整版本: 【安信可BW16-Kit】4、WIFI热点连接测试