【零知ESP8266】教程:WiFiScan库的使用-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4578|回复: 1

【零知ESP8266】教程:WiFiScan库的使用

[复制链接]
发表于 2019-6-10 14:10 | 显示全部楼层 |阅读模式
本帖最后由 lz-esp-link 于 2019-6-19 10:58 编辑

概述
无线网络提供的WiFi热点,大部分都开放了SSID广播,Scan WiFi的功能就是扫描出所有附近的WiFi热点的SSID信息,这样一来,客户端就可以根据需要选择不同的SSID连入对应的无线网络中。
Scan WiFi库提供了两种方式实现扫描过程:
  • 同步扫描:通过单个函数在一次运行中完成,需要等待完成所有操作才能继续运行下面的操作。
  • 异步扫描:把上面的过程分成几个步骤,每个步骤由一个单独函数完成,我们可以在扫描过程中执行其他任务。
  • ESP8266WiFiScan库
  • ESP8266WiFiScan库,使用的时候只需要引入:
  • [mw_shl_code=arduino,true]#include<ESP8266WiFi.h>[/mw_shl_code]
  • 扫描操作方法1.scanNetworks —— 同步扫描周边有效wifi网络
    函数说明:
  • [mw_shl_code=arduino,true]/**
    * Start scan WiFi networks available
    * @param async         run in async mode(是否启动异步扫描)
    * @param show_hidden   show hidden networks(是否扫描隐藏网络)
    * @param channel       scan only this channel (0 for all channels)(是否扫描特定通道)
    * @param ssid*         scan for only this ssid (NULL for all ssid's)(是否扫描特定的SSID)
    * @return Number of discovered networks
    */int8_t scanNetworks(bool async = false, bool show_hidden = false, uint8 channel = 0, uint8* ssid = NULL);
    [/mw_shl_code]
  • 2.scanNetworks(async ) —— 异步扫描周边有效wifi网络
    函数说明
  • [mw_shl_code=arduino,true]/**
    * Start scan WiFi networks available
    * @param async         run in async mode(是否启动异步扫描)
    * @param show_hidden   show hidden networks(是否扫描隐藏网络)
    * @param channel       scan only this channel (0 for all channels)(是否扫描特定通道)
    * @param ssid*         scan for only this ssid (NULL for all ssid's)(是否扫描特定的SSID)
    * @return Number of discovered networks
    */int8_t scanNetworks(bool async = false, bool show_hidden = false, uint8 channel = 0, uint8* ssid = NULL);[/mw_shl_code]
  • 3.scanNetworksAsync —— 异步扫描周边wifi网络,并回调结果
    函数说明:
  • [mw_shl_code=arduino,true]/**
    * Starts scanning WiFi networks available in async mode
    * @param onComplete    the event handler executed when the scan is done
    * @param show_hidden   show hidden networks
      */void scanNetworksAsync(std::function<void(int)> onComplete, bool show_hidden = false);[/mw_shl_code]
  • 4. scanComplete —— 检测异步扫描的结果
    函数说明:
  • [mw_shl_code=arduino,true]/**
    * called to get the scan state in Async mode(异步扫描的结果函数)
    * @return scan result or status
    *          -1 if scan not find
    *          -2 if scan not triggered
    */
    int8_t scanComplete();[/mw_shl_code]
  • 5.scanDelete —— 从内存中删掉最近扫描结果
    函数说明:
  • [mw_shl_code=arduino,true]/**
    * delete last scan result from RAM(从内存中删除最近的扫描结果)
    */void scanDelete();[/mw_shl_code]
  • 扫描结果方法1. SSID —— 获取wifi网络名字
    函数说明:
  • [mw_shl_code=arduino,true]/**
    * Return the SSID discovered during the network scan.
    * @param i     specify from which network item want to get the information
    * @return       ssid string of the specified item on the networks scanned list
    */String SSID(uint8_t networkItem);[/mw_shl_code]
  • 2.RSSI —— 获取wifi网络信号强度
    函数说明:
  • [mw_shl_code=arduino,true]/**
    * Return the RSSI of the networks discovered during the scanNetworks(信号强度)
    * @param i specify from which network item want to get the information
    * @return  signed value of RSSI of the specified item on the networks scanned list
    */int32_t RSSI(uint8_t networkItem);[/mw_shl_code]
  • 3. encryptionType —— 获取wifi网络加密方式
    函数说明:
  • [mw_shl_code=arduino,true]/**
    * Return the encryption type of the networks discovered during the scanNetworks(加密方式)
    * @param i specify from which network item want to get the information
    * @return  encryption type (enum wl_enc_type) of the specified item on the networks scanned list
    * ............ Values map to 802.11 encryption suites.....................
    *    AUTH_OPEN          ---->     ENC_TYPE_WEP  = 5,
    *    AUTH_WEP           ---->     ENC_TYPE_TKIP = 2,
    *    AUTH_WPA_PSK       ---->     ENC_TYPE_CCMP = 4,
    * ........... except these two, 7 and 8 are reserved in 802.11-2007.......
    *    AUTH_WPA2_PSK      ---->     ENC_TYPE_NONE = 7,
    *    AUTH_WPA_WPA2_PSK  ---->     ENC_TYPE_AUTO = 8
    */uint8_t encryptionType(uint8_t networkItem);[/mw_shl_code]
  • 4. BSSID —— 获取wifi网络mac地址
    函数说明:
  • [mw_shl_code=arduino,true]/**
    * return MAC / BSSID of scanned wifi (物理地址)
    * @param i specify from which network item want to get the information
    * @return uint8_t * MAC / BSSID of scanned wifi
    */uint8_t * BSSID(uint8_t networkItem);
    /**
    * return MAC / BSSID of scanned wifi (物理地址)
    * @param i specify from which network item want to get the information
    * @return uint8_t * MAC / BSSID of scanned wifi
    */String BSSIDstr(uint8_t networkItem);[/mw_shl_code]
  • 5.getNetworkInfo —— 获取整体网络信息,名字,信号强度等
    函数说明:
  • [mw_shl_code=arduino,true]/**
    * loads all infos from a scanned wifi in to the ptr parameters
    * @param networkItem uint8_t
    * @param ssid  const char**
    * @param encryptionType uint8_t *
    * @param RSSI int32_t *
    * @param BSSID uint8_t **
    * @param channel int32_t *
    * @param isHidden bool *
    * @return (true if ok)
    */        bool getNetworkInfo(uint8_t networkItem, String &ssid, uint8_t &encryptionType, int32_t &RSSI, uint8_t* &BSSID, int32_t &channel, bool &isHidden);[/mw_shl_code]
  • 6. channel —— 获取wifi网络通道号
    函数说明:
  • [mw_shl_code=arduino,true]/**
    * return channel of scanned wifi(通道号)
    */int32_t channel(uint8_t networkItem);[/mw_shl_code]
  • 7. isHidden —— 判断wifi网络是否是隐藏网络
    函数说明:
  • [mw_shl_code=arduino,true]/**
    * return if the scanned wifi is Hidden (no SSID)(判断扫描到的wifi是否是隐藏wifi)
    * @param networkItem specify from which network item want to get the information
    * @return bool (true == hidden)
    */bool isHidden(uint8_t networkItem);[/mw_shl_code]
  • 测试demo:
  • [mw_shl_code=arduino,true]/**
    * Demo:
    *    STA模式下,演示同步扫描Scan wifi功能
    * @author 云上上云
    * @date 2019/06/01
    */#include <ESP8266WiFi.h>
    //以下三个定义为调试定义#define DebugBegin(baud_rate)    Serial.begin(baud_rate)#define DebugPrintln(message)    Serial.println(message)#define DebugPrint(message)    Serial.print(message)
    void setup() {  //设置串口波特率,以便打印信息
      DebugBegin(115200);  //延时5s 为了演示效果
      delay(5000);  // 我不想别人连接我,只想做个站点
      WiFi.mode(WIFI_STA);  //断开连接
      WiFi.disconnect();
      delay(100);
      DebugPrintln("Setup done");
    }
    void loop() {
      DebugPrintln("scan start");  // 同步扫描,等待返回结果
      int n = WiFi.scanNetworks();
      DebugPrintln("scan done");  if (n == 0){
        DebugPrintln("no networks found");
      }else{
        DebugPrint(n);
        DebugPrintln(" networks found");    for (int i = 0; i < n; ++i){
          DebugPrint(i + 1);
          DebugPrint(": ");      //打印wifi账号
          DebugPrint(WiFi.SSID(i));
          DebugPrint(",");
          DebugPrint(String("Ch:")+WiFi.channel(i));
          DebugPrint(",");
          DebugPrint(WiFi.isHidden(i)?"hide":"show");
          DebugPrint(" (");      //打印wifi信号强度
          DebugPrint(WiFi.RSSI(i));
          DebugPrint("dBm");
          DebugPrint(")");      //打印wifi加密方式
          DebugPrintln((WiFi.encryptionType(i) == ENC_TYPE_NONE)?"open":"*");
          delay(10);
        }
      }
      DebugPrintln("");  // 延时5s之后再次扫描
      delay(5000);
    }[/mw_shl_code]
  • 测试结果(附近潜在的WiFi热点):
  • 结果.png
  • 更多详细资料可到零知实验室官网免费获取。



发表于 2019-7-30 21:09 | 显示全部楼层
请问这个怎么获取指定的rssi值呀
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 04:44 , Processed in 0.078004 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表