0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

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

環(huán)境配置過程

環(huán)境搭建可以參考官方文檔開發(fā)環(huán)境搭建。本測試中使用的開發(fā)環(huán)境為Ubuntu 22.04。需要注意的是,在下載ARM Toolchain時(shí),由于網(wǎng)站更新,文檔中鏈接已不可用,在其中找到對(duì)應(yīng)的gcc-arm-none-eabi-8-2019-q3-update版本下載即可。

配置好環(huán)境后選取某個(gè)Demo或者Example進(jìn)行編譯,在Ubuntu下,使用的燒錄工具為SDK中tools目錄下的phoenixMC可執(zhí)行程序,示例的燒錄命令為

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

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

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

在燒錄時(shí)需要讓開發(fā)板進(jìn)入升級(jí)模式,如果當(dāng)前程序支持upgrade命令,可以直接發(fā)送upgrade命令。若不支持,需要短接開發(fā)板上的兩個(gè)觸點(diǎn)或者使用Windows下的燒錄工具,在工具上勾選硬件復(fù)位燒寫模式。

測試過程

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

使用API構(gòu)造Beacon

進(jìn)一步瀏覽SDK可以發(fā)現(xiàn),SDK中提供了wlan_construct_beacon的API,這簡化了我們構(gòu)造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;
}

代碼的基本邏輯為:首先預(yù)定義好需要發(fā)送的SSID及其對(duì)應(yīng)的BSSID,然后在主函數(shù)中先初始化AP模式,然后每100ms發(fā)送一次所有的Beacon。發(fā)送Beacon前需要填充好Beacon幀的內(nèi)容。

測試效果如下:

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

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

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

7954df741268c7dfb6f92fe8532c8eb.jpg

其中AP-XRADIO為默認(rèn)的AP名稱。

不使用API構(gòu)造Beacon

我們也可以不使用相關(guān)API,而直接填充內(nèi)容。為了演示,在這里將參考項(xiàng)目的實(shí)現(xiàn)遷移過來,具體代碼如下:

#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:)),同時(shí)和默認(rèn)的AP名稱AP-XRADIO。

對(duì)XR806的Beacon進(jìn)行無線抓包分析,如圖所示

image.png

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

總結(jié)

本次測試發(fā)送了自定義的Beacon幀,實(shí)際上XR806還支持發(fā)送其他類型的幀,后續(xù)可以進(jìn)一步探索。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61721
  • Wi-Fi技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    58

    瀏覽量

    8297
  • ARMv8
    +關(guān)注

    關(guān)注

    1

    文章

    35

    瀏覽量

    14105
  • Beacon技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    6236
  • xr806
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    1303
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    802.11be是什么 802.11be與Wi-Fi6的對(duì)比分析

    Wi-Fi 6(802.11ax)之后提出的新的WLAN標(biāo)準(zhǔn),也是坊間傳聞甚廣的Wi-Fi 7。其實(shí),Wi-Fi聯(lián)盟到目前還沒有把802.11
    的頭像 發(fā)表于 12-02 13:55 ?1.5w次閱讀

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

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

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

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

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

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

    wi-fi認(rèn)證基本知識(shí)

    ;  802.11n標(biāo)準(zhǔn)草案2.0版產(chǎn)品經(jīng)過業(yè)內(nèi)可互操作性認(rèn)證、擁有最新安全保護(hù)及針對(duì)傳統(tǒng)Wi-Fi產(chǎn)品的向后兼容性測試,將大大簡化消費(fèi)者的購買流程。<br/>  Gartner市場
    發(fā)表于 10-10 13:22

    推出的802.11ac Wi-Fi聯(lián)盟的認(rèn)證程序

    Wi-Fi聯(lián)盟宣布其Wi-Fi認(rèn)證的交流認(rèn)證計(jì)劃,其目的是保證的802.11ac功能的設(shè)備的互操作性,無論他們的硬件供應(yīng)商或客戶類型。新的802.11ac
    發(fā)表于 06-27 10:01

    Wi-Fi CERTIFIED?交流會(huì)的Wi-Fi?技術(shù)的性能提升到新的高度

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

    Wi-Fi 認(rèn)證--華夏準(zhǔn)測

    及應(yīng)用,使經(jīng)Wi-Fi認(rèn)證的產(chǎn)品和服務(wù)行程一個(gè)不斷發(fā)展的全球市場,影響且?guī)椭?b class='flag-5'>定義技術(shù),標(biāo)準(zhǔn),服務(wù)和應(yīng)用等各方面的策略性發(fā)展要求測試項(xiàng)目Wi-Fi 8
    發(fā)表于 03-10 17:52

    什么是Wi-Fi

    什么是Wi-Fi What is Wi-Fi?􀂄 Short for wireless fidelity and is meantto be used generically
    發(fā)表于 06-17 16:02 ?45次下載

    幾種Wi-Fi技術(shù)標(biāo)準(zhǔn)與應(yīng)用對(duì)比

    本為為你介紹Wi-Fi技術(shù)標(biāo)準(zhǔn),如802.11n、802.11g、802.11b、802.11a、藍(lán)牙、WiMax等
    發(fā)表于 01-18 11:02 ?8159次閱讀

    支持802.11ax Wi-Fi技術(shù)的Wi-Fi 6出臺(tái),主要用于設(shè)備與Wi-Fi網(wǎng)絡(luò)的連接

    據(jù)外媒報(bào)道,Wi-Fi聯(lián)盟日前宣布,推出了支持802.11ax Wi-Fi技術(shù)的Wi-Fi 6。
    發(fā)表于 10-11 16:46 ?2288次閱讀

    什么是Wi-Fi6你期待Wi-Fi6嗎Wi-Fi 6的說明

    即將于2019下半年發(fā)布的WI-Fi 6,將使無線網(wǎng)絡(luò)比以往更快、更可靠、更節(jié)能,但這究竟意味著什么呢?Wi-Fi 6是Wi-Fi聯(lián)盟為802.11ax命名的新名字,旨在使
    的頭像 發(fā)表于 04-20 10:53 ?9777次閱讀

    Wi-Fi HaLow 和傳統(tǒng) Wi-Fi 的區(qū)別是什么

    Wi-Fi 就像我們互聯(lián)世界的氧氣。它是當(dāng)今使用最廣泛的無線網(wǎng)絡(luò)協(xié)議,承載了所有互聯(lián)網(wǎng)一半以上的流量?!?b class='flag-5'>Wi-Fi”是一個(gè)包羅萬象的術(shù)語,用于描述不斷發(fā)展的 802.11 協(xié)議家族,這些協(xié)議已經(jīng)發(fā)展
    發(fā)表于 06-18 17:35 ?993次閱讀

    Wi-Fi標(biāo)準(zhǔn)簡介:Wi-Fi 6和Wi-Fi 7

    Wi-Fi 6 是 IEEE 802.11ax 的公開名稱。Wi-Fi 6 于 2021 年初獲得全面批準(zhǔn),得益于 802.11 協(xié)議二十多年的累積改進(jìn),
    的頭像 發(fā)表于 03-24 09:20 ?3863次閱讀

    Wi-Fi HaLow和傳統(tǒng)Wi-Fi的區(qū)別

    802.11b/g/n標(biāo)準(zhǔn),到現(xiàn)在的Wi-Fi 6(802.11ax)標(biāo)準(zhǔn)。除了這些常見的Wi-Fi標(biāo)準(zhǔn)外,還有一種相對(duì)較新的Wi-Fi標(biāo)
    的頭像 發(fā)表于 02-02 15:28 ?802次閱讀