【XR806开发板试用】Wi-Fi测试:自定义发送802.11帧(Beacon篇)

XR806是一款使用ARMv8-M的Wi-Fi BLE Combo MCU。本文使用XR806开发板以及基于FreeRTOS的XR806 SDK实现了自定义发送802.11 Beacon帧,并进行了无线抓包分析以及扫描测试来验证帧的发送结果。

环境配置过程

环境搭建可以参考官方文档开发环境搭建。本测试中使用的开发环境为Ubuntu 22.04。需要注意的是,在下载ARM Toolchain时,由于网站更新,文档中链接已不可用,当前可用的下载链接为https://developer.arm.com/downloads/-/gnu-rm,在其中找到对应的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转为\r\n示例的连接串口命令为

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 failed\n");return;}printf("ssid:%s,ssid_len: %d\n", 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 %d\n", 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: %d\n", 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信息
在这里插入图片描述

其中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 Control0x00, 0x00,							// 2-3: Duration0xff, 0xff, 0xff, 0xff, 0xff, 0xff,				// 4-9: Destination address (broadcast)0xba, 0xde, 0xaf, 0xfe, 0x00, 0x06,				// 10-15: Source address0xba, 0xde, 0xaf, 0xfe, 0x00, 0x06,				// 16-21: BSSID0x00, 0x00,							// 22-23: Sequence / fragment number0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,			// 24-31: Timestamp (GETS OVERWRITTEN TO 0 BY HARDWARE)0x64, 0x00,							// 32-33: Beacon interval0x31, 0x04,							// 34-35: Capability info0x00, 0x00, /* FILL CONTENT HERE */				// 36-38: SSID parameter set, 0x00:length:content0x01, 0x08, 0x82, 0x84,	0x8b, 0x96, 0x0c, 0x12, 0x18, 0x24,	// 39-48: Supported rates0x03, 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-basisuint16_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 packetprintf("%i %i %s\r\n", 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 eachbeacon_rick[SRCADDR_OFFSET + 5] = line;beacon_rick[BSSID_OFFSET + 5] = line;// Update sequence numberbeacon_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: %d\n", ret);if (++line >= TOTAL_LINES)line = 0;}return 0;
}

测试效果如下:
使用Netspot工具获取无线AP列表
在这里插入图片描述

可以看到我们定义的SSID列表(Never gonna give you up:)),同时和默认的AP名称AP-XRADIO。

对XR806的Beacon进行无线抓包分析,如图所示
在这里插入图片描述

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

总结

本次测试发送了自定义的Beacon帧,实际上XR806还支持发送其他类型的帧,后续可以进一步探索。最后感谢极术社区赞助的开发板,以及社区工作人员和社群中各位小伙伴的答疑解惑-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/284079.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

社交电商第一步怎么做?适合商家引流裂变的电商运营模式有哪些?

社交电商第一步怎么做&#xff1f;适合商家引流裂变的电商运营模式有哪些&#xff1f; 老生常谈&#xff1a;做电商一定要培养自己的私域&#xff0c;社交电商的定义就是通过熟人经济的方式&#xff0c;通过各种电商运营模式让用户盘活起来&#xff0c;利用病毒式的营销玩法&am…

如何在本地Docker中部署MinIO服务并实现远程访问管理界面

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…

2023本四前端社招面经

美团 全程问项目&#xff0c;根据项目提问&#xff0c;SEO优化方案&#xff0c;还出了一道动态规划的题 SEO优化方案 一、内部优化 META 标签优化&#xff1a;例如&#xff1a;TITLE&#xff0c;KEYWORDS&#xff0c;DESCRIPTION &#xff08;TDK&#xff09;等的优化 内部链接…

开源微信商城新零售网店,多商户小程序

源码介绍 小玄猪商城是一套基于前后端分离的B2B2C商城系统&#xff0c;支持微信小程序、支付宝小程序、H5商城、APP商城。支持多商户入驻、适用于直播商城、社交电商、团购、拼团、秒杀、砍价、活动报名、客户管理、知识付费、积分商城、抽奖活动、会员卡、权益卡、成长值、预…

云原生基础入门概念

文章目录 发现宝藏云原生的概念云原生的关键技术为何选择云原生&#xff1f;云原生的实际应用好书推荐 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 云原生的概念 当谈及现…

范仲淹:文能治盛世,武可镇山河

北宋景佑元年&#xff08;公元1034&#xff09;年&#xff0c;范仲淹回乡祭拜范氏宗祠。在苏州祖宅住了几天后&#xff0c;范仲淹决定在苏州南园旁边买一块地&#xff0c;在此处盖一处房屋&#xff0c;待老迈时回乡居住。 按照家乡的风俗&#xff0c;在破土动工之前&#xff0c…

【Vue】console.log()打印对象显示点点点,js打印语句显示省略号 | 解决方案

问题描述 提示&#xff1a;这里简述项目相关背景&#xff1a; 在console.log打印对象或者数组时&#xff0c;里面会显示小数点 解决方案&#xff1a; 其实用深拷贝&#xff0c;JSON.parse(JSON.stringify())可以解决&#xff0c;但是每次都在log语句里面写这个json转换&#…

Pycharm enable IntelliBot #patched后,工程无法打开

#本地环境# Pycharm&#xff1a;2023.12 Pro 对应robot pkg版本&#xff1a; robotframework 6.1 robotframework-databaselibrary 1.2.4 robotframework-pythonlibcore 4.1.2 robotframework-requests 0.9.4 robotframework-seleniumlibrary 6.1.…

AI摄影绘画与PS优化:重塑数字艺术的未来

文章目录 《AI摄影绘画与PS优化从入门到精通》内容简介作者简介楚天 目录前言/序言 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的各个领域&#xff0c;包括艺术创作。AI摄影绘画和Photoshop&#xff08;PS&#xff09;优化是这个领…

综合执法vr数字化虚拟教学更安全、有序

公安民警执法规范化VR仿真训练突破了时间和空间的限制。传统的训练方式通常需要在特定的时间和地点进行&#xff0c;这使得训练的灵活性和效率受到限制。而VR仿真训练则可以在任何时间、任何地点进行&#xff0c;只要有VR虚拟现实设备和网络连接&#xff0c;就可以进行训练。这…

Ansible:模块1

Ansible&#xff1a; 远程操作主机功能 自动化运维&#xff08;playbook 剧本 yaml&#xff09; 是基于python开发的配置管理和应用部署工具。在自动化运维中&#xff0c;现在是一军突起。 Ansible能批量配置&#xff0c;部署&#xff0c;管理上千台主机。类似于xshell的一…

基于SpringBoot的房屋租赁系统 附源码

基于SpringBoot的房屋租赁系统 附源码 文章目录 基于SpringBoot的房屋租赁系统 附源码 一.引言二.系统设计三.技术架构四.功能实现五.界面展示六.源码获取 一.引言 本文介绍了一个基于SpringBoot的房屋租赁系统。该系统利用SpringBoot框架的优势&#xff0c;实现了用户注册、登…