本文由嵌入式企鹅圈原创团队成员黄鑫供稿。

  本文所述的原理适用于所有无线传输技术,只是用蓝牙来举例。应该说,嵌入式企鹅圈更加偏重于嵌入式和物联网、安卓技术原理方面的知识分享和传播,其次才是实践,尽管很多开发者都很浮躁地希望能够立刻获得例程源码。本人一直都认为,只有通晓理论,才能把实践做得更好,才能成为真正的专家级工程师,否则就永远都是码农一枚。

一、应用

  无线接收信号强度(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)那些事儿的更多相关文章

  1. 无线网络中的MAC协议(1)

    前文我们对传统的有线网络的MAC协议进行了分析,接下来我们在对无线网络的MAC也进行一个详细的介绍.那么无线网络中的MAC工作方式是如何的呢?无线局域网(WLAN)中MAC所对应的标准为IEEE 80 ...

  2. [计算机网络-数据链路层] CSMA、CSMA/CA、CSMA/CD详解

    1.CSMA(载波侦听多路访问协议) CSMA 当其他节点检测到信道被占用时不发送数据.但是当数据发送完后其他节点同时检测到信道为空闲,之后又在同一时刻发送数据,可能再次产生冲突. 2.CSMA/CD ...

  3. 信号强度(RSSI)知识整理

    来源: https://www.cnblogs.com/lele/articles/2832885.html 为什么无线信号(RSSI)是负值 答:其实归根到底为什么接收的无线信号是负值,这样子是不是 ...

  4. 转]GSM模块信号强度CSQ与RSSI的对应关系

    使用GSM或者3G模块时,都会接触到信号强度CSQ.通过指令AT+CSQ,模块返回当前的信号质量,例如: AT+CSQ +CSQ: 28,0 其中28就是信号强度CSQ,但它不是真实的CSQ,他应该叫 ...

  5. 为什么无线信号(RSSI)是负值(转)

    源:为什么无线信号(RSSI)是负值 为什么无线信号(RSSI)是负值 答:其实归根到底为什么接收的无线信号是负值,这样子是不是容易理解多了.因为无线信号多为mW级别,所以对它进行了极化,转化为dBm ...

  6. Bluetooth篇 开发实例之五 为什么无线信号(RSSI)是负值?

    原文:http://www.cnblogs.com/lele/articles/2832885.html   为什么无线信号(RSSI)是负值 答:其实归根到底为什么接收的无线信号是负值,这样子是不是 ...

  7. 蓝牙RSSI转距离计算工具

    RSSI是无线接收的信号强度指示,如WIFI.BLE.ZigBee.接收到的RSSI的强弱与发射点与接收点的距离有一定的关系,故可以依据RSSI进行粗略的定位计算,如苹果的iBeacon. 其中用到最 ...

  8. Mac 下如何判断 WIFI 的极限传输速度还有信号强度?

    每当你加入一个无线网络后,按住Option键并点击屏幕右上角的Wi-Fi图标,就会发现除了平常的各种网络外,还出现了关于网络连接技术细节的列表. 比如说,如果想知道信号强度的信息,则需要尤其关注列表中 ...

  9. BLE-NRF51822教程-RSSI获取

    当手机和设备连接上后,设备端可以通过获取RSSI,在一定程度上判断手机离设备的相对距离的远近. 获取函数很简单直接调用sd_ble_gap_rssi_get 接口函数就行了,传入连接句柄和buff就能 ...

随机推荐

  1. ROM及其他知识

     ROM--Read Only Memory 中文意思是:只读存贮器  以前的游戏机用的都是卡带,里面是一块或几块集成电路芯片,游戏程序就是在生产厂家一次性写入这几块芯片,以后用户玩游戏的时候只能读出 ...

  2. BZOJ 1095: [ZJOI2007]Hide 捉迷藏(线段树维护括号序列)

    这个嘛= =链剖貌似可行,不过好像代码长度很长,懒得打(其实是自己太弱了QAQ)百度了一下才知道有一种高大上的叫括号序列的东西= = 岛娘真是太厉害了,先丢链接:http://www.shuizilo ...

  3. spring mvc之@ModelAttribute注解

    1.@ModelAttribute注释void返回值的方法 @Controller public class HelloModelController { @ModelAttribute public ...

  4. 转:常用的iOS开源库和第三方组件

    1.通过CocoaPods安装:

  5. HTTP各状态消息说明

    200:请求已成功,请求所希望的响应头或数据体将随此响应返回. 302:请求的资源临时从不同的 URI 响应请求.由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求.只有在 Cache- ...

  6. Javascript原型链和原型继承

    哇好久都没有写随笔啦,整个人都慵懒啦. 为了不让大家忘记我,把以前写过的一些慢慢发出来. 在JS 中, 有两条链子,作用域链 和 原型链. 作用域链相对容易理解,两点 - 函数限定变量作用域,就是说, ...

  7. C#语言基础——定义变量、变量赋值、输入输出

    第一部分 了解c# 一.C#的定义及其特点 C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.net的应用而开发的语言.它吸收了c++.Visual basi ...

  8. Spring+SpringMVC+MyBatis+easyUI整合基础篇(七)JDBC url的连接参数

    在java程序与数据库连接的编程中,mysql jdbc url格式如下: jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值 ...

  9. Java代码块详解

    Java中代码块指的是用 {} 包围的代码集合,分为4种:普通代码块,静态代码块,同步代码块,构造代码块 普通代码块: 定义:在方法.循环.判断等语句中出现的代码块 修饰:只能用标签修饰 位置:普通代 ...

  10. 阿里巴巴Java开发手册快速学习

    Java作为一门名副其实的工业级语言,语法友好,学习简单,大规模的应用给代码质量的管控带来了困难,特别是团队开发中,开发过程中的规范会直接影响最终项目的稳定性. 善医者“未有形而除之”,提高工程健壮性 ...