当前位置: 首页 > news >正文

[翱捷]功能机 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打断(其他高优先级业务,主动发数据,接收寻呼要建链等),会将当前的结果上报;

相关文章:

  • Pygame实现射击鸭子游戏3-2
  • 根据 GPU 型号安装指定 CUDA 版本的详细步骤(附有CUDA版本对应torch版本的表格)
  • 策略模式和责任链模式的区别
  • C语言刷题第五章(下)
  • 道路运输安全员考试备考:循序渐进,稳步提升
  • 手机遥控开关技术解析与应用指南
  • 【随手笔记】中移4G记录(ML307R)
  • AutoGen学习笔记系列(十二)Advanced - Memory
  • openai-cua-sample-app - 使用计算机的 Agent示例应用
  • 我与DeepSeek读《大型网站技术架构》(11)- 海量分布式存储系统Doris的高可用架构设计分析
  • ima 知识库,重新定义你的「成长加速器」
  • Github 2025-03-11 Python开源项目日报Top10
  • Bash和Zsh在处理大文件时差异
  • 设计模式C++
  • ArcGIS水文水资源水环境应用实战:从入门到精通!ArcGIS水文分析及流域特征提取;湖泊水库水环境监测及评价;河道水污染预测与水环境容量计算等
  • 《黑客攻防从入门到精通:工具篇》全15章万字深度总结——从工具解析到实战攻防,构建完整网络安全知识体系
  • Java 8 Stream 面试题
  • win32汇编环境,对 WM_MOUSEMOVE 消息的理解
  • 运维新手入门——线缆的使用(Beginner‘s Guide to Operations and Maintenance - Cable Usage)
  • 七大常用智能家居协议对比
  • 北京今日白天超30℃晚间下冰雹,市民称“没见过这么大颗的”
  • 王毅谈中拉论坛十年成果
  • 《新时代的中国国家安全》白皮书(全文)
  • 干部任职公示:陕西宁强、镇安两县县长拟进一步使用
  • 中国工程院院士、国医大师石学敏逝世
  • 竞彩湃|德甲欧冠资格竞争白热化,伯恩茅斯主场迎恶战