Chinaunix首页 | 论坛 | 博客

fx

  • 博客访问: 1370178
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3964
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-02 14:36
文章分类
文章存档

2022年(2)

2019年(2)

2018年(10)

2017年(1)

2016年(50)

2015年(12)

2014年(9)

2013年(29)

分类: 嵌入式

2016-06-28 12:30:35

当手机和设备连接上后,设备端可以通过获取RSSI来 在一定程度上判断手机离设备的相对距离的远近。

 

获取函数很简单直接调用sd_ble_gap_rssi_get 接口函数就行了,传入连接句柄和buff就能获取到 最近一次连接事件中的 接收信号强度。

 

调用该函数之前需要先调用sd_ble_gap_rssi_start  函数,该函数有三个参数,第一个为连接句柄,第二个为 改变阈值, 第三个为忽略次数。

 

该函数有两种用法, 一种就是 将阈值参数设置为BLE_GAP_RSSI_THRESHOLD_INVALID, 忽略次数参数设置为0。那么每次直接调用sd_ble_gap_rssi_get 函数获取最近一次连接事件中的RSSI值就行了。

如下图所示



另一种使用方式是, 设置第二个参数为一个有效的域值, 当rssi与上一次收到的rssi差值大于等于这个阈值时就会 BLE_GAP_EVT_RSSI_CHANGED 事件,同时也可设置第三个阈值来防抖动,即忽略次数,比如设置 阈值为5,忽略次数为3。如果前一次收到的rssi 1 ,那么只有rssi差值大于等于5超过 三次,第四次才会产生BLE_GAP_EVT_RSSI_CHANGED 事件

如图所示





 

下面实际用代码来实现两种方式。

 

第一种不使用阈值和事件的简单方式: 即直接启动,然后调用函数主动获取。

 

我们设置一个定时器,在设备连接上后,启动定时器开始周期获取RSSI.

main 函数中 创建一个定时器

       app_timer_create(&rssi_timer, APP_TIMER_MODE_REPEATED, rssi_timeout_handler);

 

定时处理函数很简单,就是 获取RSSI

void rssi_timeout_handler(void *p_context){

       int8_t rssi;

       sd_ble_gap_rssi_get(m_conn_handle, &rssi);

       printf("rssi: %d\r\n",rssi);

}

 

然后在连接事件产生的地方添加 sd_ble_gap_rssi_start 并且启动 上面创建的定时器。

如下图所示





运行程序,当手机连接上设备后,就能看到串口周期打印RSSI值了,手机变动距离可以看到RSSI值的变化。




第二种方式: 使用阈值和事件方式

 

on_ble_evt 事件处理函数中,添加当收到连接事件后rssi 测量启动代码,和BLE_GAP_EVT_RSSI_CHANGED事件处理代码

代码中我们定义rssi变化值大于5时才产生BLE_GAP_EVT_RSSI_CHANGED事件,然后在事件处理中打印rssi

如下图所示:




运行程序查看输出打印可以发现 RSSI的差值都是大于等于5


阅读(5194) | 评论(3) | 转发(1) |
给主人留下些什么吧!~~

1234oo2019-11-26 12:00:37

请问可以求一下源码吗

ifndef2016-07-06 19:19:35

riwei_huang:请问楼主函数“sd_ble_gap_rssi_get()”在哪可以找到?

协议栈提供的api接口

回复 | 举报

riwei_huang2016-07-05 17:05:59

请问楼主函数“sd_ble_gap_rssi_get()”在哪可以找到?