http://blog.chinaunix.net/uid-28852942-id-5752396.html

解决以下几个问题:

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-广播模式相关推荐

  1. Apache Kafka-通过设置Consumer Group实现广播模式

    文章目录 概述 Code POM依赖 配置文件 生产者 消费者 单元测试 测速结果 源码地址 概述 传统的消息传递模式有2种:队列( queue) 和(publish-subscribe) queue ...

  2. 消费者广播模式和负载均衡模式

    消费消息 1)负载均衡模式 消费者采用负载均衡方式消费消息,多个消费者共同消费队列消息,每个消费者处理的消息不同 2)广播模式 消费者采用广播的方式消费消息,每个消费者消费的消息都是相同的 packa ...

  3. rabbitmq-fanout(广播模式)

    RabbitMQ-fanout(广播模式) 一.什么是fanout(广播模式) 简单的讲,就是把交换机(Exchange)里的消息发送给所有绑定该交换机的队列,忽略routingKey. 由图可知,生 ...

  4. RabbitMQ-fanout广播模式

    RabbitMQ-fanout广播模式 fanout: 所有bind到该交换机的队列都可以接收消息. 消息的接受者需要创建一个队列,绑定到该fanout交换机上,监听来自发送端的消息广播.fanout ...

  5. RabbitMQ fanout广播模式

    一.消息公平分发 如果Rabbit只管按顺序把消息发到各个消费者身上,不考虑消费者负载的话,很可能出现,一个机器配置不高的消费者那里堆积了很多消息处理不完,同时配置高的消费者却一直很轻松.为解决此问题 ...

  6. 关于uinapp 调用PDA设备激光扫码 - 广播模式

    1. 不是所有的PAD设备 都有设置-扫描设置-然后选择广播模式(查看广播动作-广播标签),可能也是在pad设备自带扫描工具(app)参数设置里面–然后选择广播模式(查看广播动作/名称-广播标签/键值 ...

  7. spring-kafka广播模式配置_小学校园智能广播系统方案(定压广播)

    系统概述 校园广播系统是广大中小学校必不可少的基础设施,传统的学校公共广播系统主要完成做广播操,眼保健操.举行全校大会等功能,当智能广播风靡校园后,学校的第一个应用就是自动音乐打铃,铃声音乐是学校自己 ...

  8. RabbitMQ系列笔记广播模式和路由模式

    导语 上一节介绍了简单的工作模式,即一个队列可以被多个消费者进行消费,只有一条消息被送到消费者,采用公平调度的方式,在以往的例子中似乎我们还没用到交换器进行发送消息,我们都知道,往队列里发送消息,是需 ...

  9. springboot+sockjs进行消息推送(广播模式)

    第一步:引入pom依赖: <!-- sockjs --><dependency><groupId>org.springframework.boot</grou ...

  10. Dubbo :广播模式下Can't assign requested address问题

    1.背景 在MAC系统中使用dubbo的multicast模式,启动报错: Exception in thread "main" java.lang.IllegalStateExc ...

最新文章

  1. bat脚本调用函数 简单列子
  2. vue中使用moment来实现导出excel时添加格式化的时间戳
  3. jQuery分页插件
  4. 动态规划-----(思路详解)
  5. 高通android7.0模块编译.ko
  6. 金字塔c_FPN特征金字塔网络解读
  7. JavaWeb框架-Spring(基本概念)
  8. php 61850,IEC61850客户端
  9. Excel下拉框多选(支持再次选择已选项会取消选择)
  10. 2.python制作的倒计时小工具
  11. 阿里巴巴矢量字体库更改设置
  12. 中专计算机专业包括哪些方面,中专计算机有什么专业?
  13. Angel investor
  14. phython学习笔记1
  15. 三菱PLC伺服步进控制样例,包含原点回归,手动程序,伺服绝对定位,相对定位,伺服电路图接线
  16. 同为双摄像头,华为P9到底比iPhone 7 plus差在哪里?
  17. Linux下串口调试及使用shell编程接收数据
  18. 【已解决】error: ‘CV_GRAY2BGR’ was not declared in this scope
  19. Micro SD 卡(TF卡) spi 模式实现方法
  20. Swift:高级架构、流水线深度、内存延迟 转载

热门文章

  1. python多线程返回值_python获取多线程及子线程的返回值
  2. python sendto函数返回值_有返回值的函数amp;闭包(python)
  3. Android开发之Android Studio依赖aar包的四种方法(附加第三方库依赖方式)
  4. html怎么一段时间把网页背景更换_复盛螺杆压缩机故障怎么维修?
  5. svn提交错误file is scheduled for addition, but is missing
  6. 为什么计算机有信息记忆功能,为什么计算机有记忆能力
  7. [UWP]依赖属性2:使用依赖属性
  8. 用python查找指定格式或名称的文件及修改指定文件夹名称
  9. 《并行计算的编程模型》一1.4 数据类型
  10. Renascence架构原理——最优化算法