无线接收信号强度(RSSI)那些事儿
本文由嵌入式企鹅圈原创团队成员黄鑫供稿。
本文所述的原理适用于所有无线传输技术,只是用蓝牙来举例。应该说,嵌入式企鹅圈更加偏重于嵌入式和物联网、安卓技术原理方面的知识分享和传播,其次才是实践,尽管很多开发者都很浮躁地希望能够立刻获得例程源码。本人一直都认为,只有通晓理论,才能把实践做得更好,才能成为真正的专家级工程师,否则就永远都是码农一枚。
一、应用
无线接收信号强度(RSSI)在距离测算方面的应用中需要用到。咱们不说室内定位了,换个例子:学生考勤,由于获取的RSSI只有绝对值,没有方向性,所以需要在校门口的外面和里面各装一个AP接入点。假如是只有一个接入点,那就不知道这个学生到底是进入学校还是离开学校。
现在有两个接入点,那它们可能同时检测到一个学生手环,但明显,如果是进入学校,那当学生在校外时,校外的AP获得的RSSI肯定会高过校内的RSSI。当学生进入校内时,校内的AP获得的RSSI肯定会高过校外的RSSI。换一种说法,校内和校外AP获得RSSI峰值的时间点是有先有后的。比较峰值时间即可判定是进入学校或者离开学校。
二、单位
RSSI的单位是DBm,而不是DB。DB是输出和输入功率的比例值,而DBm确是一个绝对值。
dbm是一个表示功率绝对值的单位,他的计算公式为10lg(功率值/1mw)。例如如果接收到的功率为1mw,按照dbm单位进行折算后的值应该为10lg 1mw/1mw=0dbm。当然在实际传输过程中接收方是很难达到接收功率1mw的。因为还有接收端的天线增益,所以即使接收功率是0.00001mw(即-50db)时,RF射频的接收端也能很好地进行码元解码。
但是,对于某种无线接口(就是802.xx定义的规格,对于蓝牙来说就是IEEE 802.15.1)来说,也是要保障接收功率在一定范围,才能正常工作。对于无线传感器网络来说,低于-95db时信号是不可靠的。
从这里,我们也可以看出,在安卓上利用BLE接口获得的RSSI值都是负数的,是因为它获取的就是以dbm为单位的。
但是,为什么我们从蓝牙单芯片(如NRF52832,DA14580,或者TI 2541)平台来说,我们获得的RSSI数值确实正数的呢?
三、信号等级
获得正数是因为各个蓝牙厂商自己根据自身的信道和信号经验值来给出信号等级。好比,我们手机用户只需要知道电池电量是多个格就好了,无需知道电池电压值。
从这里也可以看出,真正的RSSI信号dbm值和信号等级是厂家的自行进行映射的,而且是跟自家产品相关的,不是标准。就是说NRF52832的信号等级A和DA14580的信号等级A尽管数值一样,但是对应的真正的dbm是可能不一样的。
四、如何获得RSSI
1). 一般蓝牙主机在扫描到蓝牙设备时,底层协议栈会给上层一个报告事件,其携带的参数就有一个RSSI值。例如,DA14580平台会返回一个GAPM_ADV_REPORT_IND报告事件,其携带的参数是:
2)当连接上设备之后,如何还想获得RSSI的话(记住,RSSI在每次连接事件时都会发生变化的),就必须想数据链路层(LLC)发送查询RSSI请求,LLC就会启动接收功率积分电路(物理层的事),当电路工作完成并准备好数据后再给上层一个完成事件,通过携带的参数即可获得RSSI。例如,DA14580平台的请求命令是:LLC_RD_RSSI_CMD,而返回的事件是LLC_RD_RSSI_CMP_EVT,携带的参数是:
struct llc_rd_rssi_cmd_complete
{
///Status for command reception
uint8_t status;
///Connection handle
uint16_t conhdl;
///RSSI value
uint8_t rssi;
};
RSSI对于上层的开发知识就这么多,如果你想继续研究发篇高水平的论文也是可以的,例如根据RSSI的变化来调整发射功率,来达到节省功耗的目的。
- 欢迎扫码关注微信公众号:嵌入式企鹅圈,获取上百篇物联网原创技术分享,资深工程师力作
!
无线接收信号强度(RSSI)那些事儿的更多相关文章
- 无线网络中的MAC协议(1)
前文我们对传统的有线网络的MAC协议进行了分析,接下来我们在对无线网络的MAC也进行一个详细的介绍.那么无线网络中的MAC工作方式是如何的呢?无线局域网(WLAN)中MAC所对应的标准为IEEE 80 ...
- [计算机网络-数据链路层] CSMA、CSMA/CA、CSMA/CD详解
1.CSMA(载波侦听多路访问协议) CSMA 当其他节点检测到信道被占用时不发送数据.但是当数据发送完后其他节点同时检测到信道为空闲,之后又在同一时刻发送数据,可能再次产生冲突. 2.CSMA/CD ...
- 信号强度(RSSI)知识整理
来源: https://www.cnblogs.com/lele/articles/2832885.html 为什么无线信号(RSSI)是负值 答:其实归根到底为什么接收的无线信号是负值,这样子是不是 ...
- 转]GSM模块信号强度CSQ与RSSI的对应关系
使用GSM或者3G模块时,都会接触到信号强度CSQ.通过指令AT+CSQ,模块返回当前的信号质量,例如: AT+CSQ +CSQ: 28,0 其中28就是信号强度CSQ,但它不是真实的CSQ,他应该叫 ...
- 为什么无线信号(RSSI)是负值(转)
源:为什么无线信号(RSSI)是负值 为什么无线信号(RSSI)是负值 答:其实归根到底为什么接收的无线信号是负值,这样子是不是容易理解多了.因为无线信号多为mW级别,所以对它进行了极化,转化为dBm ...
- Bluetooth篇 开发实例之五 为什么无线信号(RSSI)是负值?
原文:http://www.cnblogs.com/lele/articles/2832885.html 为什么无线信号(RSSI)是负值 答:其实归根到底为什么接收的无线信号是负值,这样子是不是 ...
- 蓝牙RSSI转距离计算工具
RSSI是无线接收的信号强度指示,如WIFI.BLE.ZigBee.接收到的RSSI的强弱与发射点与接收点的距离有一定的关系,故可以依据RSSI进行粗略的定位计算,如苹果的iBeacon. 其中用到最 ...
- Mac 下如何判断 WIFI 的极限传输速度还有信号强度?
每当你加入一个无线网络后,按住Option键并点击屏幕右上角的Wi-Fi图标,就会发现除了平常的各种网络外,还出现了关于网络连接技术细节的列表. 比如说,如果想知道信号强度的信息,则需要尤其关注列表中 ...
- BLE-NRF51822教程-RSSI获取
当手机和设备连接上后,设备端可以通过获取RSSI,在一定程度上判断手机离设备的相对距离的远近. 获取函数很简单直接调用sd_ble_gap_rssi_get 接口函数就行了,传入连接句柄和buff就能 ...
随机推荐
- Windows 10 IoT Serials 6 - 如何修改IoTStartupOnBoot.cmd文件
使用Windows 10 IoT Core系统的朋友应该会比较熟悉IoTStartupOnBoot.cmd文件,该文件是系统启动以后加载的批处理文件,一般会包含应用.服务和后台的启动,比如WinRM. ...
- DOM解析,取得XML文件里面的信息
1 创建解析器工厂 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 2 解析器工厂对象创建解析器对象 Do ...
- hibernate 为什么持久化类时必须提供一个不带参数的默认构造函数
因为hibernate框架会调用这个默认构造方法来构造实例对象..即Class类的newInstance方法 这个方法就是通过调用默认构造方法来创建实例对象的 ,另外再提醒一点,如果你没有提供任何构造 ...
- 内网穿透+VS2015自带IIS express实现本地调试(微信等需要将开发环境暴漏到外网的情况使用)
今天一个兼职结束了,又要开始寻找新的兼职公司了 ,为了贴补家用啊,为了给儿子更好的生活加油! 抒情完毕进入正题,本篇文章要解决的问题是其实在开发微信支付,微信公众号等回调地址必须是外网可访问的80端口 ...
- 好用的JS压缩工具—JSCompress
好用的JS压缩工具-JSCompress http://www.jscompress.cn/ 1.容量体积小 2.可视化.自动化 3.独立性
- margin:0 auto;不居中?
1.没有设置宽度 <div style="margin:0 auto;"></div> 看看上面的代码,根本没有设置DIV的宽度,如何根据宽度自适应呢?新手 ...
- CentOS下WDCP下的MYSQL开启远程连接
1.首先要在防火墙开启3306端口访问 2.然后做如下操作 如何开启MySQL的远程帐号-1)首先以 root 帐户登陆 MySQL 在 Windows 主机中点击开始菜单,运行,输入"cm ...
- CreateWindow的出错解决
CreateWindow返回NULL,而且GetLastError()也返回0,代码如下: WNDCLASSEX wc = { sizeof( WNDCLASSEX ), CS_CLASSDC, N ...
- 基于nginx+lua+redis高性能api应用实践
基于nginx+lua+redis高性能api应用实践 前言 比较传统的服务端程序(PHP.FAST CGI等),大多都是通过每产生一个请求,都会有一个进程与之相对应,请求处理完毕后相关进程自动释放. ...
- groovy学习(五) 命令行输入输出
isr = new InputStreamReader(System.in);br = new BufferedReader(isr);name = br.readLine();println(&qu ...