nrf51822-广播模式
解决以下几个问题:
1 SDK9 中的几种广播模型
2 广播超时如何进入睡眠
3 如何取消广播超时睡眠使其可以无限广播。
1 SDK9 中的几种广播模型
Nordci SDK对于广播方面有一个模块。这个模式定义了几种广播模式,当然这些模式并非规范中的广播模式,仅仅是sdk自己定义的一些模式而已。
如下图

Direct模式及直连模式,利用的就是ble中的直连广播,该模式是为了快速重连上刚刚断开的设备,比如利用在快速重连上意外断开的设备,已达到无缝恢复的目的。(实践代码中还分成了)
Fast模式:就是普通的广播,不过连接间隔我们可以设置的快一点。
Slow模式:普通广播,连接间隔设置的慢一点
Idle模式:停止广播。
这四种模式是递进的,比如你设置了启动广播时选择Direct模式,但是如果你并未在初始化时设置Direct模式的相关参数,那么它就会回尝试Fast模式,如果初始化时Fast模式的相关信息也没设置,就会再尝试Slow模式,如果初始化时Slow模式相关信息也没设置最后就直接进入到Idle模式了。
同样的,广播超时后的超时处理就是选择下一个模式再进行广播,比如你Fast模式启动广播成功后,如果超时时间是3分钟,3分钟后,广播超时处理中就是选择尝试Slow模式广播。
其实模式的定义只是给出了一个可以直接利用的模块,比如Fast模式和Slow模式并没有定义所谓的快慢是多少,只是给以一个你可以直接使用的代码模块。比如你的使用场景是希望设备上电后以30ms快速广播20s,如果一直都没有被连接上,30s后切换成200ms的广播3分钟以达到减小功耗目的。
那么在广播初始化的时候就可以忽略Direct模式的相关设置,设置Fast模式使能,并且广播间隔为30ms,超时时间为20s,设置Slow模式使能,并且其广播间隔为200ms,超时时间设置为180s。之后启动Fast模式广播就可以了,当20s超时到期后,就会收到协议栈的BLE timeout事件,sdk中的处理就是切换成Slow模式继续广播。如果Slow模式180s也超时了,协议栈就会上抛Slow timeout事件,最终就停止广播了。
2广播超时后如何进入睡眠:
Main函数中调用了advertising_init来初始化广播参数

从上图可以看到,sdk中默认只初始化了Fast 这个模式的参数,也就是说当我们用Fast模式启动广播后,当广播超时后。由之前的描述知道Sdk会再选择SLOW模式,但是初始化这里并未设置SLOW模式参数,所以最终会再选择IDLE模式也就是进入睡眠了。分析如下:

Main中初始化广播后,启动FAST模式广播

如果一直没有其他设备来连接,当广播超时后,协议栈就会上抛一个TIMEOUT事件,广播模块的事件处理函数会处理这个事件



可以看到对TIMEOUT的事件处理为先判断是不是广播的TIMEOUT事件。如果是就判断模式,因为是FAST模式启动,所以代码中就会再次启动SLOW模式的广播。
再看下启动广播函数,只看相关的几个代码段:

下面这段代码就是根据启动广播的模式和初始化时设置的参数来决定真正的广播模式。
第一次启动时,因为是FAST模式启动的,并且初始化函数advertising_init中设置了FAST模式的相关参数,所以确定就是FAST模式,当FAST广播模式超后,上面的代码显示是又启动了SLOW模式,但是advertising_init函数中并未设置SLOW模式的相关参数,从下面的代码中看到最终设置成了IDLE模式。即并未按照要求启动了SLOW广播,因为初始化时没有设置SLOW模式的相关参数。

PS:上图的DIRECT_SLOW这个模式就是利用ble中的Low Duty Cycle Directed Advertising。4.0时规范只定义了DIRECT广播类型,就是定向广播,并且广播周期为3.75ms,并且只能持续1.28s。4.1开始分成了Low Duty Cycle Directed Advertising和High Duty Cycle Directed Advertising,High Duty Cycle Directed保持了之前的定义即3.5ms周期和最多持续1.28s,而Low Duty Cycle Directed类似普通广播,不过是定向的而已。
函数的最后有如下片段,因为最终设置成了IDLE模式,所以没有启动广播,于是调用了m_evt_handler函数。

这个函数时在广播初始化里面设置的

实现如下

sleep_mode_enter函数的实现就是设置唤醒按键,然后进入深度睡眠


唤醒按键设置了BUTTON0 和BUTTON1 这里的0,1是编号的意思。我用的板子是PCA10028型号,这个板子上有4个按键分别是p0.17 p0.28, p0.19 ,p0.20。对应的编号就是0-3.
这里就是将17 ,18连个引脚设置为唤醒引脚。(17引脚唤醒的同时会删除绑定信息)


综上:广播初始化中设置了FAST模式广播的相关参数,然后按FAST模式启动广播。当广播超时后,超时时间处理中判断是FAST模式超时,于是再启动SLOW模式广播,但是因为SLOW模式广播的相关参数并没有设置,于是切换成IDLE模式,并且调用了初始化时设置的回调函数。回函数中会设置唤醒按键然后设置深度睡眠。
3如何取消广播超时睡眠使其可以无限广播

nrf51822-广播模式的更多相关文章
- Python Rabbit 广播模式
Exchange 在RabbitMQ下进行广播模式需要用到,exchange这个参数,它会把发送的消息推送到queues队列中,exchange必须要知道,它接下来收到的消息要分给谁,是要发给一个qu ...
- RabbitMQ广播模式
广播模式:1对多,produce发送一则消息多个consumer同时收到.注意:广播是实时的,produce只负责发出去,不会管对端是否收到,若发送的时刻没有对端接收,那消息就没了,因此在广播模式下设 ...
- Exchange-fanout 广播模式
一.前言 我们看到生产者将消息投递到Queue中,实际上这在RabbitMQ中这种事情永远都不会发生.实际的情况是,生产者将消息发送到Exchange(交换器,下图中的X),由Exchange将消息路 ...
- RabbitMQ基本用法、消息分发模式、消息持久化、广播模式
RabbitMQ基本用法 进程queue用于同一父进程创建的子进程间的通信 而RabbitMQ可以在不同父进程间通信(例如在word和QQ间通信) 示例代码 生产端(发送) import pika c ...
- demo rabbitmq topic(主题模式),fanout(广播模式),轮询分发,确认接收Ack处理
//durable = true 代表持久化 交换机和队列都要为true ,持久代表服务重启,没有处理的消息依然存在 //topic 根据不同的routkey 发送和接收信息 //fanout 广播模 ...
- rabbitmq 交换机模式一 广播模式 fanout
<?php require_once "./vendor/autoload.php"; use PhpAmqpLib\Connection\AMQPStreamConnect ...
- uip UDP server广播模式(client能够随意port,而且主动向client发送数据)
眼下移植uip,发现UDP server模式下,必须指定本地port以及clientport,否则仅仅能讲clientport设置为0,才干接收随意port的数据,可是无法发送数据,由于此时clien ...
- Dubbo广播模式下报错:Can't assign requested address解决办法
原因: 尝试使用Dubbo的multicast模式,发现一运行就报Can't assign requested address的错误,造成这种原因的主要是系统中开启了IPV6协议(比如window7) ...
- [UE4]先报告后广播模式
解决客户端射击,在服务器端和其他客户端看不到的问题. 一.把要广播的操作封装成一个事件(函数不支持网络属性),选择“多路传送” 二.创建一个事件,选择“在服务器上运行” 总结:从客户端执行的事件报告到 ...
- Python-RabbitMQ-direct(广播模式)
direct绑定模式的,选择性接收 生产者:direct_publiser.py import pika,sys connection = pika.BlockingConnection(pika.C ...
随机推荐
- 讓 MySQL 能夠用 EF6
http://www.dotblogs.com.tw/yc421206/archive/2014/03/14/144395.aspx 要讓 MySQL 能夠用 EF6,我花了一點時間,在此記錄一下 安 ...
- Grunt上手指南<转>
原文链接:http://www.hulufei.com/post/grunt-introduction 安装 如果之前有装过grunt,卸载之 npm uninstall -g grunt 安装gru ...
- Linux磁盘分区与格式化
磁盘分区格式说明 linux分区不同于windows linux下分区标示: 例如:hda1 hd这两个字母表示分区所在的设备类型,hd标示IDE类型硬盘,sd表示SCSI类型硬盘 第三字母a标示硬盘 ...
- Objective-C专题,是学习iOS开发的前奏(转)
第一个OC的类 来源:http://www.cnblogs.com/mjios/archive/2013/04/06/3002814.html 本文目录 一.语法简介 二.用Xcode创建第一个OC的 ...
- 【POJ】3150 Cellular Automaton(矩阵乘法+特殊的技巧)
http://poj.org/problem?id=3150 这题裸的矩阵很容易看出,假设d=1,n=5那么矩阵是这样的 1 1 0 0 1 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 ...
- e.KeyChar用到的键盘对应ASCII码值(转)
十进制编码 (对应)缩写字符(或功能/解释) 0 NUL(null) 空字符 1 SOH(start of headline) 标题开始 2 STX (start of text) 正文开 ...
- [转]ASP.NET会话(Session)保存模式
本文转自:http://blog.csdn.net/cityhunter172/article/details/727743 作者:寒羽枫(cityhunter172) 大家好,已有四个多月没写东东啦 ...
- 获取某个Group中所有对象的DisplayName
$SANs = Get-ADGroupMember -Identity "CN=gAPCHN-HGZ-IE10-Users,OU=Groups,OU=Hangzhou - China,OU= ...
- 【转】移动Web单页应用开发实践——页面结构化
1. 前言 在开发面向现代智能手机的移动Web应用的时候,无法避免一个事实,就是需要开发单页应用(Single Page WebApp).对于不同的系统需求,单页应用的粒度会不同,可能是整个系统都使用 ...
- 【转】个人对JQuery Proxy()函数的理解
原文地址:http://www.cnblogs.com/acles/archive/2012/11/20/2779282.html JQuery.proxy(function,context): 使用 ...