一、基本概念:
RSSI:Received Signal Strength Indication接收的信号强度指示,无线发送层的可选部分,用来判定链接质量,以及是否增大广播发送强度。
因为无线信号多为mW级别,所以对它进行了极化,转化为dBm而已,不表示信号是负的。1mW就是0dBm,小于1mW就是负数的dBm数。
接收的信号强度指示:RSSI只是信号强度的一个指示值!
指示体现在两方面:
1) RSSI的值对应的单位是dbm。 dbm(Decibel-milliwatts):分贝毫瓦,表示某一功率与1mw的相对关系,数值x(dbm)与功率P(mw)的具体计算公式如下,
可以看出0.5毫瓦约为-3dbm。 所以RSSI并不是功率,db是分贝,实际上常常用来表示信噪比的单位。上面的dbm是一个带用量纲(毫瓦)的两个功率的比值的表示方法。这下彻底明白了为什么RSSI的值对应的dbm值不具备物理意义了吧。
注:(关于dB与dBm)
dB是一个纯计数单位,dB = 10logX,可以轻易把一个很大的数表示出来,因为2倍就是3dB,10倍就是10dB,即2^n=3*n dB,X = 1000000000000000= 10logX = 150 dB,便于表达。
dBm是一个表示功率绝对值的单位,计算公式为:10lg功率值/1mW。例如:如果发射功率为1mW,按dBm单位进行折算后的值应为:10 lg 1mW/1mW = 0dBm;对于40W的功率,则10 lg(40W/1mW)=46dBm。最常用的2W=33dBm,20W=43dBm。
dBm与dBm之间的差值就可以用dB来表示。比如46dBm-43dBm=3dB,表示40W功率是20W功率的2倍。
2)无线局域网供应商可以按照私有的方式定义RSSI值。RSSI的范围可由供应商自己选择从0到最大值(小于等于255),许多供应商在产品文档和网站上中把RSSI的执行数值发布出来,而有些供应商并没有这么做。因为RSSI指标的规定是私有的,在比较不同制造商的无线网卡的RSSI值时会出现两个问题。首先,不同供应商可能选择不同的RSSI最大值,例如A供应商可能选择RSSI范围从0到100,而B供应商选择从0到30,于是A供应商表明当前信号为25时,B供应商针对相同信号可能表达为8。另外,A供应商制造的无线网卡使用了更多的指标,在评估信号和信噪比时可能会显得更灵敏。
二、RSSI与802.11协议帧
RSSI是否是802.11协议帧中的字段呢?
通过对802.11底层协议帧进行分析,我们了解到802.11物理层PHY是介质访问控制层MAC与无线介质之间的接口,它传输和接收共享无线介质上的数据帧。
802.11将PHY进一步划分为两个组成元件:
一是物理层收敛程序(Physical Layer ConvergenceProcedure,简称PLCP),负责将MAC帧对映到传输介质;
另一是实际搭配介质Physical Medium Dependent,简称PMD),负责传送这些帧。
MSDU(MAC层业务数据单元。这是最原始的待发数据信息)经过封装变成MPDU(MAC层协议数据单元),MPDU传到PLCP子层变成PSDU(PLCP子层业务数据单元),PSUD经过封装变成PPDU(PLCP子层协议数据单元)。
802.11协议帧格式
802.11MPDU的帧格式
802.11PPDU的帧格式
我们以802.11g为例,上图是802.11MAC层的帧格式以及最终从物理介质发出去的数据封装。
从以上帧格式中,我们并没有发现RSSI数据字段,那么RSSI的值我们究竟是从哪里得到?
根据802.11-2007标准的描述,“RSSI是接收到的射频能量的测量值。RSSI与实际接收功率的映射是独立实施的。”换句话说,无线局域网供应商可以按照私有的方式定义RSSI值。通过标准中的描述我们知道,RSSI是接收方网卡测出来的,中间有路径衰减,所以发送方没办法确定接收方的具体接收功率。
(其实我们思考一个简单的问题,就知道RSSI不是协议中的字段了。
试想AP位置固定,功率固定,在8米外接收和1米外接收,接收端的信号强度会一样吗?如果不一样,而RSSI又是协议中的字段,那发送端发送这个字段时,这个字段的值到底该是多少呢?)
三、RSSI的测量过程
知道了RSSI不是协议中的字段,那么在接收方是根据那些信息得出的RSSI值的呢?
802.11协议中没有给出具体产生RSSI的过程或者说是算法吧。协议中说RSSI值范围0~255,RSSI值随PHY Preamble部分的能量单调递增。因此RSSI值可以只选取PHY Preamble(前导码)的测量就行了。
协议中虽然没有给出RSSI的具体计算方法,在协议帧中也没有RSSI字段。但是物理层原语中明确给出了有关RSSI的接口PMD_RSSI.indicate,即在接收端网卡测量到RSSI的值以后,我们可以从这个程序接口获得RSSI的值。
所以:
RSSI由接收端测量得到后,由PMD_RSSI.indicate(该可选的原语可由PMD产生,用于向PLCP提供接收到的信号强度。该原语有一个参数:RSSI,它是高速PHY接收的射频能量的测量值,长度为0-8bit。RSSI和SQ作为CCA机制的部分一起协同使用)原语携带。
PMD子层用PMD_RSSI.request指令告知PLCP子层当前信号的强度值。PHY就将向MAC发出一个PHY_RXSTART.indicate(RXVECTOR)指令。参数RxVECTOR是参数矢量,它的取值是依赖于物理层的,不同的物理层RxVECTOR的参数可能有所不同。RSSI是它中的一个元素。
因此,得到RSSI的一个大致的过程为:
根据前导码测量得出PMD_RSSI.indcate——>TXVECTOR/RXVECTOR parameter RSSI——>Radiotap
注:
Radiotap:用于802.11的 帧接收(frame reception)和帧注入(frame injection) Radiotap是网卡接收到的数据帧交给上层monitor(监测仪)的一些额外信息,给一些抓包程序的额外信息。不属于802.11协议的内容。
PMD_RSSI.indicate:该可选的原语可由PMD产生,用于向PLCP提供接收到的信号强度。该原语有一个参数:RSSI,它是高速PHY接收的射频能量的测量值,长度为0-8bit。RSSI和SQ作为CCA机制的部分一起协同使用。
目前如果用抓包工具抓取无线数据报文,会发现RSSI在数据包中的,一般都是本地网卡在添加Radiotap头部的时候,给打上去的,即在本地网卡把物理层的无线帧解析的时候,把物理层PLCP头部给删除后,本地网卡有可能会添加一个Radiotap头部,然后在给MAC层继续做解析。一般用wireshark能看到这个头部的信息(由于无线网卡驱动的原因,并不是所有无线网卡的都能用wireshark捕获),也有可能直接把这个参数直接丢给上层(直接作为本地参数),而不是以数据包解析的形式传递,如下图
也有可能直接把这个参数直接丢给上层(直接作为本地参数),而不是以数据包解析的形式传递,如下图
四、RSSI的理论计算公式
RSSI的具体计算如下:
t us内进行基带IQ功率积分得到RSSI的瞬时值
8192个RSSI的瞬时值进行平均得到1s的RSSI的平均值
理论上是对频段去积分求功率,实际上由于是时域采样,所以直接利用采样信息取平均求功率。
五、802.11n协议中RSSI的作用
下面我们通过PLCP的传输过程来了解下RSSI在其中的作用:
为了传输数据,需要使用PHY-TXSTART.request原语使物理层实体处于传输状态,通过PLME管理实体将给物理层分配合适的工作信道。
下图是DSSS PLCP的传输过程示意图,参数例如DATARATE,传输天线,传输功率通过PHY-TXSTART.request(TXVECTOR)来设置。
基于PHY-CCA.indicate的CCA(Clear Channel Assessment。 PHY层用于探测信道占用情况的一个功能模块。 空闲信道评估,用来指示MAC是否检测到了信号。)状态,MAC将判断信道是否被清空,当信道为空时,PPDU的传输将通过PHY-TXSTART.request原语来进行初始化,该原语的产生TXVECTOR中各个子参数将用来设置PPDU的前同步码和报头,以及TX_ANTENNA,TXPWR_LEVEL的PMD参数。
PLCP在收到MAC层发出的PHY-TXSTART.request原语之后,发出PMD_ANTSEL, PMD_RATE,和 PMD_TXPWRLVL原语来配置PHY,然后又发出PMD_TXSTART.request原语,PHY实体将根据该原语中的参数立即初始化PLCP数据扰码器并开始传输前同步码。一旦PLCP前同步码传输完成,MAC与PHY之间将通过一系列由MAC发出的PHY-DATA.request (DATA)原语和由PHY发出的PHY-DATA.confirm原语交换数据。如果调制方式和传输速率改变,则将用MPDU最初的数据码元进行初始化。在PMD层,字节数据通过PMD_DATA.request原语提交给PHY层。MAC可通过PHY_TXEND.request原语提前终止数据传输,同时PHY-TXEND.request.原语还禁止了PHY-TXSTART.req原语。当传完PSDU最后一个字节的最后一位时,正常的传输过程终止。PPDU传输结束时,PHY实体进入接收状态。
PLCP接收过程
为了能够接收数据,物理层实体将禁止PHY-TXSTART.request原语,因为物理层实体需要处于接收状态,同样通过PLME来进行管理,选择CCA模式(空频道检测技术Clear Channel Assessment)。其他的接收参数如接收信号强度指示(RSSI),信号质量(SQ),DATARATE都通过PHY-SAP获得。
下图是PLCP的接收过程图。
按照所选的CCA模式和接收信号的能量,当其RSSI强度达到ED_THRESHOLD时, 将开启PMD_ED,【ED(能量检测)、CS(载波侦听)】在建立码锁定之后,将开始PMD_CS。这些条件用来指示MAC的活动状态,在正确接收PLCP报头之前,将产生PHY-CCA.indicate(BUSY)来做能量检测和/或码锁定。原语PMD_SQ,PMD_RSSI用来更新RSSI和SQ参数。
当发出PHY-CCA.indicate后,PHY实体开始搜索SFD字段。一旦检测到SFD字段(帧开始符(SFD)字段),将初始化CCITT CRC-16 处理,并接收PLCP SIGNAL, SERVICE, 和LENGTH字段。然后处理CCITT CRC-16 FCS,若CCITT CRC-16 FCS检测失败,PHY接收端将返回RXIDLE状态。如果在全部的PLCP处理完成之前已开始接收,CCA就返回到IDLE状态,PHY接收端也将返回到RX IDLE状态。
如果成功接收PLCP报头(并支持SIGNAL字段且该字段完全可识别),将发出PHY-RXSTART.indicate(RXVECTOR)原语,与该原语相关的RXVECTOR包括:
a)SIGNAL字段;
b)SERVICE字段;
c)以微秒为单位的LENGTH域和以Mbit/s为单位的DATARATE计算出的MPDU长度。
d)接收用的天线(RX_ANTENNA),RSSI和SQ。
接收到的MPDU位被装入字节并通过一系列PHYDATA.indicate (DATA)原语发给MAC层。PHY继续MPDU的接收,直到收到MPDU最后字节的最后一位,这时,接收端将返回到RXIDLE状态,这时将发出一个PHY-RXEND.indicate (NoError)原语。根据所选的CCA方式,当PHY载波检测和(或)PHY强度检测发生变化,将发出PHY-CCA.indicate (IDLE)原语。
在完成MPDU的接收之前,PHYCS或PHYED的变动将会导致CCA返回到IDLE状态,此时,该错误情况通过PHY-RXEND.indicate (CarrierLost)原语报告给MAC层。在整个PPDU传输期间,高速PHY应确保CCA一直指示介质忙。
如果PLCP报头接收成功,但SIGNAL和SERVICE字段中的速率和调制方式与接收端不兼容,则PHY不发送PHY-RXSTART.indicate原语,而将发送错误状态PHY-RXEND.indicate (UnsupportedRate)原语。如果PLCP报头无效,PHY同样不发送PHY_RXSTART. Indicate原语,而将发送错误状态PHY-RXEND.indicate (FormatViolation)原语。在这两种情形下,在整个PPDU传输期间,高速PHY都应确保CCA一直指示介质忙。计划持续时间由LENGTH字段指明(LENGTH ×µs)。
六、实际应用中RSSI值的获取
目前,所有的无线网卡都遵循协议规定提供了PMD_RSSI.indicate服务原语,并且我们通过程序接口都可以获取到无线信号的RSSI值。
通过以上分析我们知道,RSSI是接收方网卡测量出来的。在实际编程中,我们怎样能获得到RSSI,以C#为例,windows下控制进行wifi编程一般都使用native wifi api(微软提供的类库进行)C#中有基于native wifi api 进行封装的managed wifi API ,利用它我们可以获取到我们所需要的wifi信息。