完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1. Marvell88w8801普通搜索
首先来看下搜索的指令的介绍和命令格式 我们在普通搜索中只会用到channel list param set TLV 特定名称搜索会额外用到,这个留到特定SSID搜索部分来介绍 我们来看下channel list的TLV格式 整个格式如下 好了剩下的我们就是写代码了 /****************************************************************************** * 函数名: mrvl88w8801_process_packet * 参数: channel(IN) --》channel数组,用于存储分别搜索什么通道 channel_num(IN) --》搜索的通道个数 max_time(IN) --》搜索的最大time * 返回值: 返回执行结果 * 描述: 执行普通搜索动作 ******************************************************************************/ uint8_t mrvl88w8801_scan(uint8_t *channel,uint8_t channel_num,uint16_t max_time) { uint8_t index = 0; uint16_t scan_para_len = sizeof(MrvlIEtypesHeader_t) + channel_num*sizeof(ChanScanParamSet_t); uint8_t scan_para[scan_para_len]; MrvlIEtypes_ChanListParamSet_t *channel_list; ChanScanParamSet_t *channel_list_para[channel_num]; COMP_DEBUG(“mrvl88w8801_scann”); channel_list = (MrvlIEtypes_ChanListParamSet_t *)(scan_para); channel_list-》header.type = TLV_TYPE_CHANLIST; channel_list-》header.len = channel_num*sizeof(ChanScanParamSet_t); /* 组合channel list的参数 */ for(index = 0; index 《 channel_num; index++) { channel_list_para[index] = (ChanScanParamSet_t *)(scan_para + sizeof(MrvlIEtypesHeader_t)+index*sizeof(ChanScanParamSet_t)); channel_list_para[index]-》radio_type = 0; channel_list_para[index]-》chan_number = channel[index]; channel_list_para[index]-》chan_scan_mode = 0; channel_list_para[index]-》min_scan_time = 0; channel_list_para[index]-》max_scan_time = max_time; } mrvl88w8801_prepare_cmd(HostCmd_CMD_802_11_SCAN,HostCmd_ACT_GEN_GET,&scan_para,scan_para_len); return COMP_ERR_OK; } /****************************************************************************** * 函数名: mrvl88w8801_scan_prepare * 参数: tx(IN) --》tx buffer data_buff(IN) --》搜索的cmd body,在这里就是channel list data_len(IN) --》搜索的cmd body len,在这里就是channel list长度 * 返回值: 返回执行结果 * 描述: 组HostCmd_CMD_802_11_SCAN command的封包 ******************************************************************************/ static uint8_t mrvl88w8801_scan_prepare(uint8_t* tx,void *data_buff,uint16_t data_len) { HostCmd_DS_COMMAND *cmd = (HostCmd_DS_COMMAND *)tx; HostCmd_DS_802_11_SCAN *pscan = &cmd-》params.scan; uint16_t tx_packet_len = CMD_HDR_SIZE + sizeof(HostCmd_DS_802_11_SCAN)+data_len-sizeof(pscan-》tlv_buffer); cmd-》pack_len = tx_packet_len; cmd-》pack_type = TYPE_CMD_CMDRSP; cmd-》command = HostCmd_CMD_802_11_SCAN; cmd-》size = tx_packet_len - CMD_SDIO_HDR_SIZE; cmd-》seq_num = 0; cmd-》bss = 0; cmd-》result = 0; pscan-》bss_mode = HostCmd_BSS_MODE_ANY; comp_memset(pscan-》bssid,0,MAC_ADDR_LENGTH); comp_memcpy(pscan-》tlv_buffer,data_buff,data_len); return COMP_ERR_OK; } 详细可以看下我的裸机代码,另外,为了便于你的理解,那么我用cmd的raw data来加深你的理解 Cmd的raw data为: 00000000h:79 00 01 00 06 00 75 00 00 00 00 00 03 00 00 00 00000010h:00 00 00 01 01 62 00 00 01 00 00 00 c8 00 00 02 00000020h:00 00 00 c8 00 00 03 00 00 00 c8 00 00 04 00 00 00000030h:00 c8 00 00 05 00 00 00 c8 00 00 06 00 00 00 c8 00000040h:00 00 07 00 00 00 c8 00 00 08 00 00 00 c8 00 00 00000050h:09 00 00 00 c8 00 00 0a 00 00 00 c8 00 00 0b 00 00000060h:00 00 c8 00 00 0c 00 00 00 c8 00 00 0d 00 00 00 00000070h:c8 00 00 0e 00 00 00 c8 00 一一分析下 79 00 --》SDIO packet len 01 00 --》SDIO packet type,此处01为cmd 06 00 --》cmd code,0x0006,也就是scan 75 00 --》cmd packet size 00 --》seq num 00 --》bss type,此处为STA 00 00–》result 03 --》 bss type,此处设置为0x3是BSS ANY 00 00 00 00 00 00 --》 bssid ,mac address,此处是这是过滤的,全0是代表不过滤 01 01 --》channel list para tlv id 62 00 --》channel list para tlv len 00 01 00 00 00 c8 00 --》2.4G 20M带宽,通道1 00 02 00 00 00 c8 00 --》2.4G 20M带宽,通道2 00 03 00 00 00 c8 00 --》2.4G 20M带宽,通道3 00 04 00 00 00 c8 00 --》2.4G 20M带宽,通道4 00 05 00 00 00 c8 00 --》2.4G 20M带宽,通道5 00 06 00 00 00 c8 00 --》2.4G 20M带宽,通道6 00 07 00 00 00 c8 00 --》2.4G 20M带宽,通道7 00 08 00 00 00 c8 00 --》2.4G 20M带宽,通道8 00 09 00 00 00 c8 00 --》2.4G 20M带宽,通道9 00 0a 00 00 00 c8 00 --》2.4G 20M带宽,通道10 00 0b 00 00 00 c8 00 --》2.4G 20M带宽,通道11 00 0c 00 00 00 c8 00 --》2.4G 20M带宽,通道12 00 0d 00 00 00 c8 00 --》2.4G 20M带宽,通道13 00 0e 00 00 00 c8 00 --》2.4G 20M带宽,通道14 整个cmd scan就组包完成 2. Marvell88w8801 搜索解析 完成了搜索的cmd组包,后续会来一堆搜索响应的数据来,那么我们需要解析,此部分比较复杂,首先来看下scan cmd response 其中BssDescSet格式为 BssDescSet中的probe response/beacon payload格式为 IEParameters就是IEEE的TLV,还记得我们之前说过IEEE的TLV和Marvell的TLV的区别吗? IEEE的TLV type,len各占1byte,Marvell TLV type,len各占2个byte,这部分解析的的时候会用到。 下面我们来看下cmd reponse的raw data来加深下理解 在开始raw data前,我们先贴下IEEE的TLV ID,至于是什么意思,内容众多,自己去看下 IEEE std 802.11,我看的是2012版 |
|
|
|
只有小组成员才能发言,加入小组>>
4527个成员聚集在这个小组
加入小组3340 浏览 0 评论
航顺(HK)联合电子发烧友推出“近距离体验高性能Cortex-M3,免费申请价值288元评估板
4269 浏览 1 评论
4296 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 12:37 , Processed in 0.800389 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号