[翱捷]功能机 Wifi
硬件原理上支持WIFI_SCAN。
参考手表方案,
1、3603芯片自带的wifi scan功能,是利用modem在空闲(Idle)时,才能实际去执行搜索wifi热点的功能,如果手机在搜网(基站)、正在打电话、正在进行数据通信,wifi scan搜索不到热点的概率会比较大。
2、上面已经给出了wifi scan的工作原理和参数说明,其中作用比较大的时快速释放rrc连接(AT*FASTDORM),能快速回到idle状态(这是通信协议层相关的东西),这个操作不影响lwip socket相关接口的使用。
3、如果在每次AT*WIFICTRL启动前执行了AT*FASTDORM,对wifi scan定位功能还是不理想,建议从应用逻辑上去调整优化,比如:
1)本次搜索不到wifi热点,马上再启动一次搜索指令,不用等到下一个周期启动搜索,也就是特定的情况下让wifi scan积极一点。
2)避开网络数据传输的密集时段,这个主要针对客户自己应用程序优化,比如,你有一个实时上服务器的task程序在跑,在启动wifi scan时在这个task加判断先不要与服务器交互数据。
wifi scan相关at命令可以参考附件文档。
注意:
PS业务跟wifi scan业务是冲突的。默认情况下是PS业务优先。打电话或者收发网络数据时进行wifi scan可能会失败。
下面两种情况下SW wifi都可以。
1 只插单卡,无论插在simA还是simB都可以。
2 双卡单待模式(主卡CFUN1,副卡CFUN4/CFUN0)
双卡双待版本,同时插双卡是不行的。可能会有各种打电话发短信等的问题。
wifiscan需要在idle态下才能发起。如果不是idle态可以AT*FASTDORM后,再发起wifiscan。可以在每次WiFi scan之前先下指令AT*FASTDORM。
wifiscan相关接口如下,代码是开源的,具体信息见相关接口的定义。可以在callback里获取wifi信息。
UINT32 CMID_NwCfgWifiScan(NW_WIFI_SCAN_CTRL_CB cb, UINT8 scan_round,
UINT8 max_hotspot_number, UINT8 timeout_second, UINT8 scan_priority)
UINT32 CMID_NwCtrlWifiScan(NW_WIFI_SCAN_CTRL_CB cb, UINT8 option)
测试参考代码,
+++ b/evb/src/hal/modem/nw.c
@@ -2827,6 +2893,32 @@ void CMID_NwRspWifiCellInfo(RIL_WIFI_CELL_INFO* pWifiCellInfo)
UI_FREE(pWifiCellInfo);
}
+void wifiscan_cb(NW_WIFI_CELL_INFO_T *CellInfo)^M
+{^M
+ int i;^M
+^M
+ if (CellInfo == NULL)^M
+ return;^M
+^M
+ raw_uart_log("wifi scan result count %d\n", CellInfo->count);^M
+^M
+ for (i=0; i<CellInfo->count; i++)^M
+ raw_uart_log("host %d mac: %x:%x:%x:%x:%x:%x, rssi %d\n", i, ^M
+ CellInfo->item[i].mac[0], CellInfo->item[i].mac[1],^M
+ CellInfo->item[i].mac[2], CellInfo->item[i].mac[3],^M
+ CellInfo->item[i].mac[4], CellInfo->item[i].mac[5],^M
+ CellInfo->item[i].rssi);^M
+^M
+ return;^M
+}^M
+^M
+void wifiscan_test(void)^M
+{^M
+ raw_uart_log("wifiscan_test start...\n");^M
+ CMID_NwCfgWifiScan(wifiscan_cb, 3, 5, 20, 0);^M
+^M
+ return;^M
+}^M
/*
** Config scan parameters and start WIFI scan.
** Asynchronous operation interface.
+++ b/evb/src/gui/mgapollo/apps/launcher/src/Standby.cpp
@@ -112,6 +112,7 @@ extern void volteCallNoticeStandbyHandler(void);
#ifdef CONFIG_BUILD_TTS_TARGET
extern "C" int TTS_SynthText(char * pcData, unsigned int nSize);
#endif
+extern "C" void wifiscan_test(void);
const NGInt _week_days_strs[] = {
SS_SUN,
@@ -1821,6 +1822,7 @@ NGBool Standby::onKey(NGInt keyCode, KeyEvent* event)
#ifndef __MMI_WHITE_THEME__
menubar->setBkColor(Color::RT_C105);
#endif
+ wifiscan_test();//------------------------------------这里是在桌面按下*键时调用测试接口函数
Intent intent(CallApp::START_BY_DIAL, "*", 0);
EntryCall(&intent);
return DISPATCH_STOP_MSG;
打印log如下,
MMI:wifiscan_test start...
MMI:<4>[RILADP]I:CMID_NwWifiCtrlReq <option>=2 [<3> <5> <20> <0>]
MMI:<4>[RILADP]I:CMID_NwWifiCtrlReq sim_id =0
MMI:=>[AT cmd][SS1]AT*WIFICTRL=2,3,5,20,0
MMI:<=[AT cmd][SS1]OK
[15:43:29.031]收←◆MMI:<=[AT cmd][UNSOL1]*WIFICELLINFO: "7C1E0688A630",-71, 1
[15:43:29.077]收←◆MMI:<4>[RILADP]I:CMID_NwRspWifiCellInfo count=0 mac: 7c 1e 06 88 a6 30
MMI:<=[AT cmd][UNSOL1]*WIFICELLINFO: "7C1E0688A631",-75, 2
MMI:<4>[RILADP]I:CMID_NwRspWifiCellInfo count=1 mac: 7c 1e 06 88 a6 31
MMI:<=[AT cmd][UNSOL1]*WIFICELLINFO: "7C1E0687AA70",-76, 6
MMI:<4>[RILADP]I:CMID_NwRspWifiCellInfo count=2 mac: 7c 1e 06 87 aa 70
MMI:<=[AT cmd][UNSOL1]*WIFICELLINFO: "8840337FD04C",-81, 2
MMI:<4>[RILADP]I:CMID_NwRspWifiCellInfo count=3 mac: 88 40 33 7f d0 4c
MMI:<=[AT cmd][UNSOL1]*WIFICELLINFO: ,0, 0
[15:43:29.123]收←◆MMI:<4>[RILADP]I:CMID_NwRspWifiCellInfo *WIFICTRL: unsolicited is done
MMI:wifi scan result count 4
MMI:host 0 mac: 7c:1e:6:88:a6:30, rssi -71
MMI:host 1 mac: 7c:1e:6:88:a6:31, rssi -75
MMI:host 2 mac: 7c:1e:6:87:aa:70, rssi -76
MMI:host 3 mac: 88:40:33:7f:d0:4c, rssi -81
Q:AT*WIFICTRL的使用说明
A:
AT*WIFICTRL=0 //stop;
AT*WIFICTRL=1 //start;
0/1:采用缺省参数,缺省3轮,最大30个WiFi热点,最大25s超时;
每轮WIFI scan需要的时间片为120ms*14(channel)=1.68s, 但真正的时间要多一些overhead(周期性paging,measurement处理),
以及WiFi scan模块向modem申请时间片(gap),modem分配时去掉的一些不合适时间(平均在1/2个paging cycle);
但如果热点多的情况下,每轮底层找到10个热点就会提前返回了,不会用满分配的gap;
AT*WIFICTRL=2,<scanRound>,<bssidNum>,<timeout>,<priority>
AT*WIFICTRL=2,3,10,25,1
2: AT命令参数选项,考虑后面参数;
3: 表示总共搜三轮才结束WiFi 搜索,范围: 1~3;最大3轮;
10:表示总共搜到多少个WiFi 热点就结束WiFi搜网,范围是4~30;(早期有版本为4~10)
小于4的值或者大于30的值,会改成了30。
25:底层WiFi搜索超时timer,单位秒,即多长时间之内没有完成WiFi搜索,超时结束。
这个值范围是1~25,不在这个范围,会认为无效,使用默认值25.
就是AT*WIFICTRL=2 带的参数不符合预期范围,就采用AT*WIFICTRL=1的默认值。
1: 表示数据业务相对WiFi Scan的优先级,参数为0~1;
0,表示数据业务优先级高于WiFi Scan优先级,在WiFi Scan搜索期间,上下行数据业务会打断WiFi scan,
1,表示数据业务优先级低于WiFi Scan优先级,在WiFi Scan搜索期间,会屏蔽上下行数据业务。
BTW, WIFI SCAN异常很多是跟设备处在connected mode,即wifi scan跟空口连接冲突;因此在做wifi scan时,建议上层判断是否有业务数据在传输(空口在连接态下);
如果在连接态,而需要做wifi scan,参考local release说明,释放rrc 连接,回到idle再发起wifi scan;
上层逻辑请客户酌情考虑,即wifi scan跟数据业务冲突时优先哪个。
BTW2,有如下几种情况上报:
1,三轮完成后,才上报;
(每轮gap时间需要最多120ms*14,实际分配的可能多;
针对option=1采用default配置的情况, 如果热点多的情况下,每轮底层找到10个热点就会提前返回了,不会用满分配的gap,这样有些channel也没有scan,同时目前底层不同轮次间,不排除相同热点情况;
对于option=2的情况,底层没有10个热点提前返回的限制;)
2,没到三轮,但是已经搜到30(早期有版本为10)个热点
3,没到三轮,但是time out(25s,早期有版本为20s),或者快到了,不够支持再做一轮的时间,也要上报(无论是否搜到);
这种情况就属于rrc 不批准做或者批准的不足够我们做三轮
4,上层发起stop wifi 搜索,我们将最近的结果上报。
5,类似4,如果被modem打断(其他高优先级业务,主动发数据,接收寻呼要建链等),会将当前的结果上报;