NOA定义
NOA(Notice of Absence)是一种节能管理机制,允许 P2P 设备(如手机、智能家居设备)协商休眠和唤醒时间,以优化功耗和协调共存。由 GO 协调休眠,客户端被动适应。
- NOA 的作用
• 节能:P2P 设备(如 IoT 设备)可以周期性休眠,减少功耗。
• 信道共享:协调多个 P2P 设备的活跃/休眠时间,避免冲突。
• 共存优化:在 Wi-Fi 和 P2P 混合网络中,避免与普通 Wi-Fi STA 竞争信道
流程
休眠唤醒
A STA can be in one of two power states:
— Awake: STA is fully powered.
— Doze: STA is not able to transmit or receive and consumes very low power.
a AP can be in one of two power states:
Present:唤醒
Absent: 休眠
TBTT
Beacon帧会按预定的时间间隔发送,这个时间被称为目标信标传输时间(TBTT)。
NOA协商流程
GO发送beacon中携带P2P字段中告知GC asent和present时间窗。GC根据NOA窗口和自身PS决定休眠。
client1有数据业务:GO发送beacon(p2p-NOA),GC接收按照GO的时间窗口休眠唤醒;在唤醒期间向GO发包,到了NOA absent时间后则停止发包进入休眠;到了NOA present时间后唤醒继续发包。
client2没有数据业务:GO发送beacon(p2p-NOA)到GC,由于GC没有数据需要发送,无需等到NOA absent窗口再睡,可在接收到beacon后直接进入doze,达到进一步节省功耗效果。
GO:present由NOA时间和自身PS决定。
GC:awake由本身PS决定。如果GC没有数据要发送,则在接收beacon之后可继续睡下去而不用先醒然后等待noa窗口时间到了再睡,节省功耗。
beacon p2p-NOA
GO发送beacon,携带P2P字段,告知GC,一个TBTT 100ms;休眠窗口80ms;唤醒窗口20ms;
CTwindow:告知client还有多少单位时间可以发送数据给owner Opportunistic Power Save :当为1时,CTwindow才会生效
Duration:表示owner休眠时间
Interval:表示周期间隔时间
Count:表示当前是剩余到少次静默,255为持续静默
StartTime: go静默的开始时间,根据最近的TSF timer生成,每2的31次方us更新一次
wireshark
过滤P2P Action Frames
wlan.fc.type_subtype == 0x0d # P2P Action Frame
NOA+数据业务
1.GO有数据要发送给GC,发送的beacon中携带DTIM
2.GC接收到包含dtim的beacon后,发送NULL data(ps=0),通知GO已经唤醒,可以收包了
3.GO接收到ps=0后开始发送缓存包,在NOA present窗口内持续发送。
4.GO到达absent时间窗后停止发包;此时GC也到达doze时间需要先发送一个null data(ps=1)通知GO,然后进入doze。GO接收到后进入absent。
5.GO到达present时间窗口唤醒;GC此时也达到awake时间,发送null data(ps=0)通知GO。
分析仪波形
wpas使用方式
设置GO NOA
wpa_cli -ip2p-dev-wlan0
# 设置 NOA(Count=无限,Duration=200ms,Interval=1s)
set p2p_noa 255 200 1000
# 启动 P2P GO
p2p_group_add
查看NOA状态
p2p_get_noa
常见问题
GO和GC时间窗口对不齐
1.GC端noa窗口规律性偏移:GC端对于GO发送的beacon tsf会进行硬件的偏差补齐。如果偏差补齐错误可能会导致GC端noa窗口与GO端对不齐,导致noa窗口规律性偏移。
2.GO端 absent窗口和noa窗口对不齐:GO的PS机制可能会导致GO在noa absent窗口期间无法进入休眠,排查GO休眠唤醒源,可能有host侧通知device侧的IPC通知消息一直发送等情况存在,导致休眠时间晚了GO一直在线。
数据不在窗口内发包导致丢包
GC睡眠模式跟随NOA,唤醒模式跟随PS;
1.GC在一个timer时间内没有接收到AP数据会进入休眠,等待DTIM。此时如果GO开始缓存数据,等到GC接收到DTIM唤醒的期间,数据一直缓存。DTIM count如果设置太大,GC在count个interval之后才会唤醒开始收数据,可能会导致GO端内存不足而丢包。
连接断开问题
1.客户端无法连接:NOA休眠时间太长
2.连接probe失败问题:GC进入休眠但是发送null data(ps=1)失败的情况(软件问题),此时GO认为GC仍然在线,GO进入absent后恢复present,此时GO发送probe(null data)探测GC是否在线,因为此时GC进入休眠无法回复,GO认为GC已离线,但其实GC仍在线只是进入了休眠。优化方案:在GC想进入休眠发送null data(ps=1)失败后,保持GC不进入休眠保持唤醒状态,配置其一直在线。
参考文档
https://pan.baidu.com/s/1Cn3J6lLfuSkWTA_sHkC_kw