CC3200 如何获取链接质量
TI工程师,你们好:
CC3200作为STA模式链接上路由了,数据交换都没问题,请使用什么函数获取当前跟路由器的连接质量呢?就是RSSI值。
我看了TI提供的DEMO,好像是是用 sl_WlanRxStatStart, sl_WlanRxStatGet, sl_WlanRxStatStop,这3个函数,对吗?
如果是,这个开启统计数据,对WIFI链接或成功链接上路由器后的TCP,UDP数据交换是否有影响呢?谢谢
同问楼上的问题。
另外,想问一下有没有用CC3200做网关的,如果有,能给指点一下怎么配置么?AP和STA之间怎么切换?会不会影响到已经连接到AP上的设备?
没有哦,我一直都是使用在STA模式下,但是TI提供的参考例子里有很多,跟STA模式差不多的流程,如果已经连上AP了,再切换为STA,那肯定会断开所有连接的哦
不是上面的三个API,可以直接去FLASH里面取扫描的结果,sl_WlanGetNetworkList, 然后和你连的SSID对比,就可以得到相应的RSSI了。
这个函数不是要扫描的时候才使用的吗?就是需要断开链接,如果是东东链接的话,还需要先改变链接策略。我的意思是,如何像普通笔记本一样,你笔记本离路由器远点,右下角的信号强度会减弱,也就是说这个信号值是从正常链接后的数据交换中所提取出来的实时信号值,就像CC2530里的通讯一样,每个数据包都包含RSSI,请问CC3200如何获取在正常链接之后的实时RSSI值呢?
因为WIFI内部是有一个定时的扫描来更新FLASH里面的扫描结果,你可以用API去设置这个定时的interval是多少。你可以参考例程scan_policy, 里面有详细的介绍。
Yonghua Pan 谢谢你的回答。
恩,例子都都看了,扫描的功能我都是参照例程的。
但有个问题,要使用sl_WlanGetNetworkList获取扫描结果,需要 SL_SCAN_POLICY(1);来开启扫描,那意思是从一开始就开启 SL_SCAN_POLICY(1);,然后就不关闭了,就算跟WIFI连接或断开都不用去 SL_SCAN_POLICY(0);,是吗?
是的,你说的是对的。
好的,谢谢你的回答
HI Yonghua Pan
我在使用sl_WlanGetNetworkList(0, SCAN_TABLE_SIZE, netEntries);读出了ap的rssi的值;我在手机里也下载了这样一个能够读取信号强度的APP,把手机放在3200模块的旁边,对比两者的结果发现CC3200读取的数值都要比手机读到的数值小了十几甚至20多个db。
我的问题是为什么会出现这种情况,这与硬件有关还是与软件相关? cc3200可以通过设置(而不改变里路由器的距离)抬高rssi的值吗?
同样的,3200开放了设置接收灵敏度的接口吗?如果有,使用哪个API可以修改接收灵敏度?
期盼你的回复,谢谢!
这通常是硬件的问题。你的CC3200的模块是TI的吗?还是你们自己做的。如果是自己做的,可能需要先测试一下射频。
请问您是怎么测得RSSI值,能告诉我具体步骤吗?是用的IAR还是CCS?
直接调用
lRetVal = sl_WlanGetNetworkList(ucIndex, (unsigned char)WLAN_SCAN_COUNT,
&netEntries[ucIndex]);
函数就可以得到扫描到的AP的RSSI值,具体可以参考scan_policy例程
谢谢
请问是用CCS还是用IAR测?是不是都需要用Uniflash将程序导入?
用CCS或是IAR都行,你可以将程序烧录到片内的RAM里面在线调试。
当然用uniflash烧录到片外的SFLASH也行,只是需要离线运行了。
谢谢
谢谢您 有问题再向您请教
您好,请问在实验scan policy 的实验时,怎样修改扫描的周期?我在进行这项例程时,返回的RSSI值没有显示,lRetVal返回值为-1,可是我用transceiver mode时能扫到周五5个不同位置所发送的数据包。
我是这样改变扫描周期的
。。。。。 ui_policy_inv = 5; ucpolicy_opt = SL_SCAN_POLICY(1); ret_val = sl_WlanPolicySet(SL_POLICY_SCAN, ucpolicy_opt, (unsigned char *)(&ui_policy_inv), sizeof(ui_policy_inv)); if(ret_val < 0){ DO_Printf("Wlan Enable Scan Policy Failure.\r\n"); goto return_point; } 。。。。。
而且RSSI的值是8位有符号数,是不是变量类型没给对呢?
我的信号值是这样处理的
signed char rssi = wlan_net_entries[ret_val].rssi;
chen,
你的程序好像有点问题,应该使用下面的语句来改变scan cycle:
// enable scan // ucpolicyOpt = SL_SCAN_POLICY(1); // // set scan cycle to 10 seconds // policyVal.uiPolicyLen = 10; // // set scan policy - this starts the scan // lRetVal = sl_WlanPolicySet(SL_POLICY_SCAN , ucpolicyOpt, (unsigned char*)(policyVal.ucPolicy), sizeof(policyVal));
谢谢
但是我在 CC32XX SimpleLink Host Driver 1.0.0.1这个文档上看到的是这样的
For example, setting scan interval to 1 minute interval use: _u32 intervalInSeconds = 60; #define SL_SCAN_ENABLE 1 sl_WlanPolicySet(SL_POLICY_SCAN,SL_SCAN_ENABLE, (_u8 *)&intervalInSeconds,sizeof(intervalInSeconds)); For example, disable scan: #define SL_SCAN_DISABLE 0 sl_WlanPolicySet(SL_POLICY_SCAN,SL_SCAN_DISABLE,0,0);
是否我的这个文档版本旧呢?或者你的代码中的 policyVal 是一个联合体呢?
谢谢
chen,
我用的是例程里面自带的,你看到的是driver 库里面的,这两种实现的功能没有差别,我刚试了一下,都是能够正常扫描到network list的。
谢谢
对了,你在设置好policy以后,有么有再调用
lRetVal = sl_WlanGetNetworkList(ucIndex, (unsigned char)WLAN_SCAN_COUNT,
&netEntries[ucIndex]);
这个函数去得到networklist啊,只有调用这个以后,才能去得到内个list对应的RSSI的值。
谢谢
SDK里的scan例程还要修改吗?最后调用lRetVal怎么调用,是在main里面再调用一次吗?
SDk里面的scan例程不需要修改,你直接在那个例程的WlanScan()函数里面,设置好scanpolicy的扫描周期后,在 MAP_UtilsDelay(8000000);延时后面添加就行。
谢谢
非常感谢您的帮助,我马上试试。
我按照您的说明操作了一次,可是还是测不到RSSI值?是这样的吗?在 MAP_UtilsDelay(8000000)后面例程中原来就调用了lRetVal还有什么需要修改的吗?
SDK 的scan例程中RSSI的是 _i8 rssi; 应该没有问题吧
这是做transceiver mode 的截图,是不是说明所处环境还是有无线热点的?
我是直接用SDK里的scan 例程用CCS进行试验的,没有一点改动,然后数据库里还是导入simplelin,oslib,driverlib和ti_rtos这几个函数,这样做是不是少了什么步骤?希望您的指正,谢谢!
//启动扫描热点 ui_policy_inv = 5; ucpolicy_opt = SL_SCAN_POLICY(1); ret_val = sl_WlanPolicySet(SL_POLICY_SCAN, ucpolicy_opt, (unsigned char *)(&ui_policy_inv), sizeof(ui_policy_inv)); if(ret_val < 0){ DO_Printf("Wlan Enable Scan Policy Failure.\r\n"); goto return_point; }
开启扫描热点后,等待一段时间,让芯片内部去扫描一些结果,然后循环去查询这个结果列表
i_val = 20; while(i_val--){ vTaskDelay(1350); memset(wlan_net_entries, 0, sizeof(wlan_net_entries)); ret_val = sl_WlanGetNetworkList(i_val, (unsigned char)WLAN_MAX_NET_ENTRIE_COUNT, &wlan_net_entries[0]); if(ret_val == 0){ return -1;//无法扫描到热点 }else{ for(j_val = 0;j_val < WLAN_MAX_FILTER_ENTRIE_COUNT;j_val++){ i8 rssi = wlan_net_entries[j_val].rssi; } }
楼上的代码不错,楼主可以试下看
您这个程序应该不是SDK scan例程吧?是您自己写的还是照着例程修改的?
还有就是大概等多长时间呢?
我自己修改的,2,3秒应该就可以了
您是照着SDK里的scan修改的吗?
是的
好的,谢谢您的耐心指导。我再好好看看。
Hi Pan,
RSSI怎么转化成 百分比例 ?
盼回复。
Hi chen,
Rssi 怎么用 1 至 100的表示? 或者怎么转化成 百分比?
谢谢
你好!
我在使用scan_policy例程时,单步运行到sl_WlanGetNetworkList函数lRetVal能看到数值,可以我的wifi并没有开启呀?
万分感激您的回答