<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Wi-Fi測試:自定義發送802.11幀(Beacon篇)

冬至子 ? 來源:Tao_blk1IT ? 作者:Tao_blk1IT ? 2023-10-23 11:43 ? 次閱讀

XR806是一款使用ARMv8-M的Wi-Fi BLE Combo MCU。本文使用XR806開發板以及基于FreeRTOS的XR806 SDK實現了自定義發送802.11 Beacon幀,并進行了無線抓包分析以及掃描測試來驗證幀的發送結果。

環境配置過程

環境搭建可以參考官方文檔開發環境搭建。本測試中使用的開發環境為Ubuntu 22.04。需要注意的是,在下載ARM Toolchain時,由于網站更新,文檔中鏈接已不可用,在其中找到對應的gcc-arm-none-eabi-8-2019-q3-update版本下載即可。

配置好環境后選取某個Demo或者Example進行編譯,在Ubuntu下,使用的燒錄工具為SDK中tools目錄下的phoenixMC可執行程序,示例的燒錄命令為

./phoenixMC -c /dev/ttyUSB0 -i ../out/xr_system.img

其他參數信息可以使用-h獲取。燒錄好后可以連接串口查看輸出,控制臺輸出可能會出現換行不對齊的情況,此時需要進行換行修正。在本次測試中使用的串口工具為picocom,需要將輸出的n轉為rn示例的連接串口命令為

picocom -b 115200 --imap lfcrlf /dev/ttyUSB0

在燒錄時需要讓開發板進入升級模式,如果當前程序支持upgrade命令,可以直接發送upgrade命令。若不支持,需要短接開發板上的兩個觸點或者使用Windows下的燒錄工具,在工具上勾選硬件復位燒寫模式。

測試過程

通過瀏覽XR806的SDK可以發現,在wlan.h中提供有APIint wlan_send_raw_frame(struct netif *netif, int type, uint8_t *buffer, int len);。該API可以支持發送自定義的802.11幀,只需要提供網絡接口,幀類型,數據幀和長度即可。受esp32-80211-tx啟發,在本測試中基于該API發送自定義的Beacon幀,達到同時存在多個AP的假象。在IBSS網絡架構中,AP每隔一段時間就會向外界發出一個Beacon幀用來宣告自己802.11網絡的存在。平時Wi-Fi的被動掃描也是基于Beacon幀進行。

使用API構造Beacon

進一步瀏覽SDK可以發現,SDK中提供了wlan_construct_beacon的API,這簡化了我們構造Beacon的過程。只要提供beacon的部分字段信息即可,如SA,DA,BSSID,Channel等。具體代碼如下:

#include < stdio.h >
#include < string.h >
#include "net/wlan/wlan.h"
#include "net/wlan/wlan_defs.h"
#include "net/wlan/wlan_ext_req.h"
#include "net/wlan/wlan_frame.h"
#include "common/framework/net_ctrl.h"
#include "common/framework/platform_init.h"
#include "lwip/inet.h"


#define CMD_WLAN_NETIF              wlan_netif_get(WLAN_MODE_NONE)


#define BEACON_FRAME_LEN 256
static uint8_t beacon_frame_buf[BEACON_FRAME_LEN];
typedef struct {
    uint8_t *data;
    uint32_t len;
} frame_data;

static uint8_t beacon_addr[6];
static char beacon_ssid[32];
static uint32_t beacon_len;
static frame_data beacon_frame;

char *ssids[] = {
    "1 Hello Wireless World",
    "2 from Allwinner XR806",
    "3 running on FreeRTOS",
    "4 for Jishu Community"    
};
uint8_t bssid[4][6] = {
    {0xba, 0xde, 0xaf, 0xfe, 0x00, 0x06},
    {0xba, 0xde, 0xaf, 0xfe, 0x00, 0x07},
    {0xba, 0xde, 0xaf, 0xfe, 0x00, 0x08},
    {0xba, 0xde, 0xaf, 0xfe, 0x00, 0x09},
};

#define TOTAL_LINES (sizeof(ssids) / sizeof(char *))

uint8_t line = 0;

static void beacon_frame_create(void)
{
    wlan_ap_config_t config;
    memset(&config, 0, sizeof(config));
    config.field = WLAN_AP_FIELD_SSID;
    if (wlan_ap_get_config(&config) != 0) {
        printf("get config failedn");
        return;
    }
    printf("ssid:%s,ssid_len: %dn", ssids[line], strlen(ssids[line]));
    memcpy(beacon_ssid, ssids[line], strlen(ssids[line]));
    memcpy(beacon_addr, bssid[line], IEEE80211_ADDR_LEN);
    beacon_len = wlan_construct_beacon(beacon_frame_buf, BEACON_FRAME_LEN, beacon_addr, NULL, beacon_addr,
                                       (uint8_t *)beacon_ssid, strlen(ssids[line]), 1);
    if (++line >= TOTAL_LINES)
    {
        line = 0;
    }
    beacon_frame.data = beacon_frame_buf;
    beacon_frame.len = beacon_len;
    printf("beacon_len %dn", beacon_len);
    int ret = 0;
    ret = wlan_send_raw_frame(CMD_WLAN_NETIF, IEEE80211_FC_STYPE_AUTH, beacon_frame.data, beacon_frame.len);
    printf("Send beacon frame: %dn", ret);
}


int main(void)
{
    platform_init();
    net_switch_mode(WLAN_MODE_HOSTAP);
    while(1)
    {
        OS_MSleep(100 / TOTAL_LINES);
        beacon_frame_create();
    }
    return 0;
}

代碼的基本邏輯為:首先預定義好需要發送的SSID及其對應的BSSID,然后在主函數中先初始化AP模式,然后每100ms發送一次所有的Beacon。發送Beacon前需要填充好Beacon幀的內容。

測試效果如下:

在代碼中我們使用的SSID列表為

"1 Hello Wireless World",
    "2 from Allwinner XR806",
    "3 running on FreeRTOS",
    "4 for Jishu Community"

上電后程序啟動,使用手機掃描Wi-Fi便可以查看到這些AP信息

7954df741268c7dfb6f92fe8532c8eb.jpg

其中AP-XRADIO為默認的AP名稱。

不使用API構造Beacon

我們也可以不使用相關API,而直接填充內容。為了演示,在這里將參考項目的實現遷移過來,具體代碼如下:

#include < stdio.h >
#include < string.h >
#include "net/wlan/wlan.h"
#include "net/wlan/wlan_defs.h"
#include "net/wlan/wlan_ext_req.h"
#include "net/wlan/wlan_frame.h"
#include "common/framework/net_ctrl.h"
#include "common/framework/platform_init.h"
#include "lwip/inet.h"


#define CMD_WLAN_NETIF              wlan_netif_get(WLAN_MODE_NONE)


uint8_t beacon_raw[] = {
    0x80, 0x00,                            // 0-1: Frame Control
    0x00, 0x00,                            // 2-3: Duration
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff,                // 4-9: Destination address (broadcast)
    0xba, 0xde, 0xaf, 0xfe, 0x00, 0x06,                // 10-15: Source address
    0xba, 0xde, 0xaf, 0xfe, 0x00, 0x06,                // 16-21: BSSID
    0x00, 0x00,                            // 22-23: Sequence / fragment number
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,            // 24-31: Timestamp (GETS OVERWRITTEN TO 0 BY HARDWARE)
    0x64, 0x00,                            // 32-33: Beacon interval
    0x31, 0x04,                            // 34-35: Capability info
    0x00, 0x00, /* FILL CONTENT HERE */                // 36-38: SSID parameter set, 0x00:length:content
    0x01, 0x08, 0x82, 0x84,    0x8b, 0x96, 0x0c, 0x12, 0x18, 0x24,    // 39-48: Supported rates
    0x03, 0x01, 0x01,                        // 49-51: DS Parameter set, current channel 1 (= 0x01),
    0x05, 0x04, 0x01, 0x02, 0x00, 0x00,                // 52-57: Traffic Indication Map
    
};

char *rick_ssids[] = {
    "01 Never gonna give you up",
    "02 Never gonna let you down",
    "03 Never gonna run around",
    "04 and desert you",
    "05 Never gonna make you cry",
    "06 Never gonna say goodbye",
    "07 Never gonna tell a lie",
    "08 and hurt you"
};

#define BEACON_SSID_OFFSET 38
#define SRCADDR_OFFSET 10
#define BSSID_OFFSET 16
#define SEQNUM_OFFSET 22
#define TOTAL_LINES (sizeof(rick_ssids) / sizeof(char *))

int main(void)
{
    platform_init();
    net_switch_mode(WLAN_MODE_HOSTAP);
    uint8_t line = 0;
    // Keep track of beacon sequence numbers on a per-songline-basis
    uint16_t seqnum[TOTAL_LINES] = { 0 };

    int ret = 0;
    while (1) 
    {
        OS_MSleep(100 / TOTAL_LINES);

        // Insert line of Rick Astley's "Never Gonna Give You Up" into beacon packet
        printf("%i %i %srn", strlen(rick_ssids[line]), TOTAL_LINES, rick_ssids[line]);

        uint8_t beacon_rick[200];
        memcpy(beacon_rick, beacon_raw, BEACON_SSID_OFFSET - 1);
        beacon_rick[BEACON_SSID_OFFSET - 1] = strlen(rick_ssids[line]);
        memcpy(&beacon_rick[BEACON_SSID_OFFSET], rick_ssids[line], strlen(rick_ssids[line]));
        memcpy(&beacon_rick[BEACON_SSID_OFFSET + strlen(rick_ssids[line])], &beacon_raw[BEACON_SSID_OFFSET], sizeof(beacon_raw) - BEACON_SSID_OFFSET);

        // Last byte of source address / BSSID will be line number - emulate multiple APs broadcasting one song line each
        beacon_rick[SRCADDR_OFFSET + 5] = line;
        beacon_rick[BSSID_OFFSET + 5] = line;

        // Update sequence number
        beacon_rick[SEQNUM_OFFSET] = (seqnum[line] & 0x0f) < < 4;
        beacon_rick[SEQNUM_OFFSET + 1] = (seqnum[line] & 0xff0) > > 4;
        seqnum[line]++;
        if (seqnum[line] > 0xfff)
            seqnum[line] = 0;

        // esp_wifi_80211_tx(WIFI_IF_AP, beacon_rick, sizeof(beacon_raw) + strlen(rick_ssids[line]), false);
        ret = wlan_send_raw_frame(CMD_WLAN_NETIF, IEEE80211_FC_STYPE_AUTH, beacon_rick, sizeof(beacon_raw) + strlen(rick_ssids[line]));
        printf("Send beacon: %dn", ret);
        if (++line >= TOTAL_LINES)
            line = 0;
    }
    
    return 0;
}

測試效果如下:
使用Netspot工具獲取無線AP列表

image.png

可以看到我們定義的SSID列表(Never gonna give you up:)),同時和默認的AP名稱AP-XRADIO。

對XR806的Beacon進行無線抓包分析,如圖所示

image.png

可以看出XR806所支持的速率和其他特性。

總結

本次測試發送了自定義的Beacon幀,實際上XR806還支持發送其他類型的幀,后續可以進一步探索。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FreeRTOS
    +關注

    關注

    12

    文章

    474

    瀏覽量

    61475
  • Wi-Fi技術
    +關注

    關注

    0

    文章

    58

    瀏覽量

    8288
  • ARMv8
    +關注

    關注

    1

    文章

    35

    瀏覽量

    14079
  • Beacon技術
    +關注

    關注

    0

    文章

    6

    瀏覽量

    6228
  • xr806
    +關注

    關注

    0

    文章

    14

    瀏覽量

    1274
收藏 人收藏

    評論

    相關推薦

    羅德與施瓦茨發布基于博通芯片的802.11ax Wi-Fi測試方案

    了基于博通MaxWi-Fi系列芯片,業界第一個完整的802.11ax Wi-Fi設備生態系統的測試方案。通過與博通公司的合作,羅德與施瓦茨成功的證明了CMW
    發表于 02-28 18:11 ?2080次閱讀

    802.11be是什么 802.11be與Wi-Fi6的對比分析

    ),是繼Wi-Fi 6(802.11ax)之后提出的新的WLAN標準,也是坊間傳聞甚廣的Wi-Fi 7。其實,Wi-Fi聯盟到目前還沒有把802.1
    的頭像 發表于 12-02 13:55 ?1.4w次閱讀

    基于德州儀器的Wi-Fi 6 和 802.11be 多通道測試方案

    ),是繼 Wi-Fi 6(802.11ax)之后提出的新的 WLAN 標準,也是坊間傳聞甚廣的 Wi-Fi 7。其實,Wi-Fi 聯盟到目前還沒有把
    的頭像 發表于 03-01 11:14 ?3655次閱讀

    全志XR806芯片Wi-Fi測試自定義發送802.11Beacon

    XR806是一款使用ARMv8-M的Wi-Fi BLE Combo MCU。本文使用XR806開發板以及基于FreeRTOS的XR806 SDK實現了自定義發送802.11
    發表于 01-26 14:01

    全志XR806芯片Wi-Fi測試自定義發送802.11Beacon

    XR806是一款使用ARMv8-M的Wi-Fi BLE Combo MCU。本文使用XR806開發板以及基于FreeRTOS的XR806 SDK實現了自定義發送802.11
    發表于 01-26 14:01

    wi-fi認證基本知識

    ;  802.11n標準草案2.0版產品經過業內可互操作性認證、擁有最新安全保護及針對傳統Wi-Fi產品的向后兼容性測試,將大大簡化消費者的購買流程。<br/>  Gartner市場
    發表于 10-10 13:22

    推出的802.11ac Wi-Fi聯盟的認證程序

    Wi-Fi聯盟宣布其Wi-Fi認證的交流認證計劃,其目的是保證的802.11ac功能的設備的互操作性,無論他們的硬件供應商或客戶類型。新的802.11ac
    發表于 06-27 10:01

    Wi-Fi CERTIFIED?交流會的Wi-Fi?技術的性能提升到新的高度

    %的受訪者表示,在他們的家比電視中斷,更具破壞性的Wi-Fi停運。Wi-Fi認證的AC產品帶來額外的容量,性能和魯棒性來支持今天和明天的應用連接,在家里,在公共場所,在企業網絡中的一致好評。技術定義
    發表于 06-27 10:25

    Wi-Fi 認證--華夏準測

    及應用,使經Wi-Fi認證的產品和服務行程一個不斷發展的全球市場,影響且幫助定義技術,標準,服務和應用等各方面的策略性發展要求測試項目Wi-Fi 8
    發表于 03-10 17:52

    IEEE 802.11ad 60GHz Wi-Fi詳細介紹

    )、Wi-Fi聯盟要求所有WiGig CERTIFIED產品必須支持單載波調制方案;(2)、IEEE 802.11ad的MAC能根據設備的實際流量負荷來實時地進行電源管理;(3)、協議適配(目前定義了A/V協議
    發表于 06-17 08:14

    5G Wi-Fi(802.11ac)標準與技術

    本專題為你介紹5G Wi-Fi(802.11ac)標準與技術,包括什么是5G Wi-Fi、802.11ac標準、802.11ac協議、5G
    發表于 01-17 16:23
    5G <b class='flag-5'>Wi-Fi</b>(<b class='flag-5'>802.11</b>ac)標準與技術

    支持802.11ax Wi-Fi技術的Wi-Fi 6出臺,主要用于設備與Wi-Fi網絡的連接

    據外媒報道,Wi-Fi聯盟日前宣布,推出了支持802.11ax Wi-Fi技術的Wi-Fi 6。
    發表于 10-11 16:46 ?2222次閱讀

    Wi-Fi HaLow 和傳統 Wi-Fi 的區別是什么

    Wi-Fi 就像我們互聯世界的氧氣。它是當今使用最廣泛的無線網絡協議,承載了所有互聯網一半以上的流量?!?b class='flag-5'>Wi-Fi”是一個包羅萬象的術語,用于描述不斷發展的 802.11 協議家族,這些協議已經發展
    發表于 06-18 17:35 ?931次閱讀

    Wi-Fi標準簡介:Wi-Fi 6和Wi-Fi 7

    Wi-Fi 6 是 IEEE 802.11ax 的公開名稱。Wi-Fi 6 于 2021 年初獲得全面批準,得益于 802.11 協議二十多年的累積改進,
    的頭像 發表于 03-24 09:20 ?3644次閱讀

    羅德與施瓦茨聯合通用測試完成Wi-Fi 7的OTA測試

    進行了集成,最新的測試方案已實現IEEE 802.11be(Wi-Fi 7)的OTA測試。同時,該方案也可支持Wi-Fi 6/6E,
    的頭像 發表于 05-29 14:21 ?141次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>