nrf51822-主从通信分析1
建议看该教程前,先看一下 简单扫描器实现 教程
讲解基于sdk目录下central中的两个例子。
关于主机的程序框架其实和从机都是一样的,都是基于事件驱动的框架。 Main函数中完成初始化, 从机的话就启动广播,主机就启动扫描。 之后都是基于事件驱动的方式将ble相关事件返回给上层app,并且再通过ble_evt_dispatch函数将事件分发给各个处理函数。如下图所示:


蓝牙的使用无非就是 进行数据的通信,从机通常都是作为服务端(一次数据交互中数据的提供者),而主机通常都是作为客户端(一次数据交互中数据的使用者)。(并不是固定的,从机也可以作为客户端,主机也可以作为服务端。 从机和主机的概念是针对链路层来说的,而客户端和服务端是针对GATT层来说的。)
之前的教程中 从机例子中 都是作为服务端的,所以我们发送数据给手机时都是使用notify方式或者indication方式并通过sd_ble_gatts_hvx函数发送。

而这里主机例子ble_app_multilink_central,是作为客户端的,客户端不仅可以发数据给服务端,也可以从服务端读取数据。 所以 有 读写函数,如下图


先说明sdk中主从demo的现象,分别烧录其中的主从例子在两个开发板中,打开主机和从机便会自动连接,连接上后 按从机的button0,主机上就会根据连接时的顺序翻转对应灯的状态。
比如你有三个开发板,一个主机两个从机,当你全部打开时,假设A设备先连接上,B设备后连接上。那么你按A的button0按键时,主机的第一个灯就会状态反转,你按B的button0时,主机就会反转第二个灯的状态。
Sdk中的demo主机时可以连接8个从机的,不过因为板子的led有限你只能看到四个从机连接后 按键时 主机的灯会对应亮。
PS:demo中的例子是针对PCA10028板子的,如果你的板子的按键,LED灯不兼容这个板子的话对应你的板子改下就行了。
下面来分析sdk中的主从通信demo是如何建立连接并通信的。解决一下几个问题:
1:主机怎么判断哪个从机是我要连接的那个设备?
2:如何实现连接多个设备?
3:因为连接上后 从机上按键时会通过notify发送数据给主机,所以主机需要先 使能从机上的notify功能,具体就是写从机上的 CCCD(客户端特性配置描述 符) 描述符。该功能如何实现?
4:连接上后如何通信?
下面首先解决第一个问题:主机怎么判断哪个从机是我要连接的那个设备。
在从机工程ble_app_multilink_peripheral中,看以看到其设置了自己的设备名为Multilink。


在主机工程ble_app_multilink_central 当初始化完成后就会调用 scan_start() 开始监听BLE广播,每当监听到BLE广播时协议栈就会给上层一个 广播事件, 该事件由ble_evt_dispatch派发函数递交给on_ble_evt函数。

在on_ble_evt中会对提取广播数据中的设备名字,并且判断设备是不是Multilink,如果是就启动停止扫描,并且连接改设备,如下图所示


所以 主机判断广播设备是不是自己想要连接的就是通过 名字来判断的。
第二个问题:如何实现可以连接多个设备
第一个问题中找到了如何识别广播设备是不是自己想连的方式,当找到了名字为Multilink设备后就关闭扫描侦听而发起连接,也就是这个时候主机已经不能再监听别的ble设备的广播了,自然也就不能再和别的设备发起连接了(因为没收到广播不知道对方设备地址),
因为demo中主机可以连接8个从机,那么如果能够继续 启动扫描侦听,并且周围还有别的广播设备,并且其名字也是Multilink,那么收到该广播时,就能够在广播事件处理函数再次对这第二个设备发起连接。
所以主机例子中虽然在找到了一个设备名为Multilink的设备后会关闭扫描并且发起连接,但是当这个连接完成后在收到连接事件时 会做当前连接的设备是否已经大于最大可连接数,不过没有超过那么就会再次开启广播。 这样就可以再次链接其他设备名为Multilink的设备了。如下图所示。

PS:这里的 device_manager_event_handler函数并不是由派发函数ble_evt_dispatch调用的,而是派发函数ble_evt_dispatch先调用了dm_ble_evt_handler(p_ble_evt),而该函数内部会调用device_manager_event_handler
函数关系链如下:main中首先调用了device_manager_init()初始化函数,该初始化函数会将device_manager_event_handler函数设置为回调函数。
当连接完成后ble_evt_dispatch函数将 连接事件 派发给dm_ble_evt_handler 函数,改函数中判断如果当前收到的事件是 连接事件就内部 设定了一个DM_EVT_CONNECTION事件然后调用之前注册的device_manager_event_handler这个回调函数,来最终处理关于连接事件的后续工作,也就是上面提到的,判断是否要继续开启广播。
nrf51822-主从通信分析1的更多相关文章
- MINIX3 进程通信分析
MINIX3 进程通信分析 6.1MINIX3 进程通信概要 MINIX3 的进程通信是 MINIX3 内核部分最重要的一个部件,我个人认为其实这 是内核中的“内核”,怎么来理解这个概念呢?其实 MI ...
- STM32F10x_硬件I2C主从通信(轮询发送,中断接收)
Ⅰ.写在前面 关注我分享文章的朋友应该知道我在前面讲述过(软件.硬件)I2C主机控制从机EEPROM的例子.在I2C通信主机控制程序是比较常见的一种,可以说在实际项目中,很多应用都会使用到I2C通信. ...
- 有关RDS上只读实例延时分析-同适用于自建MySQL主从延时分析判断
个人不是很喜欢在技术上跟人互喷,尤其是不在同一个岗位上的人.一方面本人的性格如此,另一方面,我自身的口水也确实是不行,人生经历了第一次的双11洗礼,在大促的环境下,总算知道了有些东西是否应该规避,这次 ...
- nrf51822-主从通信分析2
解决第三个问题:如何使能从机上的特征值的 notify功能,使其能通过notify方式发送数据 使能从机的notify功能是通过写0x0001到从机的那个具有notify功能的特征值的CCCD描述 ...
- S7-300之间的PROFIBUS-DP主从通信
一.PROFIBUS-DP简介 1.由来 2..总线连接器 二.系统结构示例 三.组态过程示例 三,DP网络组态 1.新建一个项目和两个300站点如下 2.组态从站DP网络 1)点击常规中的属性 2) ...
- nrf51822 RAM不足分析
之前了解过STM32 的内存分配问题,对于蓝牙芯片51822的内存分配问题把项目中,遇到了.bss和.data部分超了的问题,这其实就是声明的变量和stask 及 heap的大小总和超出了单片机的RA ...
- 基于STM32Cube的IIC主从通信
1.建立STM32Cube工程,我使用的芯片是STM32F429,为了更简单的建立单独的IIC通信任务,我使用了FREERTOS,另外选择了RCC(系统时钟初始化),I2C1,I2C2(为了验证代码的 ...
- mycat 主从切换分析过程
67 68互为主从 66为67从 区分双主写的数据,设置不同的自增id 67: SET @@auto_increment_offset=2;SET @@auto_increment_increment ...
- Redis主从同步分析(转)
一.Redis主从同步原理 1.1 Redis主从同步的过程 配置好slave服务器连接的master后,slave会建立和master的连接,然后发送sync命令.无论是第一次同步建立的连接还是连接 ...
随机推荐
- Hark的数据结构与算法练习之耐心排序
算法说明 耐心排序是插入排序的一种,至少wikipedia是这么分的. 话说我明白这个算法的实现思路了,但是不明白这么做的意义何在? 如果明白的朋友帮忙留个言说一下,以后如果我明白的话,我会来修改这个 ...
- Hark的数据结构与算法练习之地精(侏儒)排序
算法说明 地精排序是交换排序的一种,它是冒泡排序的一种改良,我感觉和鸡尾酒排序挺像的. 不同之处是鸡尾酒排序是从小到大,然后再从大到小切换着排序的.而地精排序是上来先从小到大排序,碰到交换到再从大到小 ...
- 向数据库中添加内容 manageStdInfo.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="manageStdInfo.as ...
- node工具--express
//使用supervisor Connect是基于HTTP米快创建的:Express则是基于Connect上创建的: 绝大多数web服务器和浏览器之间的任务是通过url和method完成的,两者的组 ...
- POJ2226 Muddy Fields(二分图最小点覆盖集)
题目给张R×C的地图,地图上*表示泥地..表示草地,问最少要几块宽1长任意木板才能盖住所有泥地,木板可以重合但不能盖住草地. 把所有行和列连续的泥地(可以放一块木板铺满的)看作点且行和列连续泥地分别作 ...
- BZOJ4303 : 数列
将每个点看成二维坐标点$(i,a_i)$,那么每次操作的范围都是一个矩形. 于是建立KD-Tree,通过打标记支持操作即可. 时间复杂度$O(m\sqrt{n})$. #include<cstd ...
- linux网络配置相关命令、虚拟网络接口eth0:0
网络接口(interface)是网络硬件设备在操作系统中的表示方法,比如网卡在Linux操作系统中用ethX,是由0开始的正整数,比如eth0.eth1...... ethX.而普通猫和ADSL的接口 ...
- cJSON应用举例
//在网上查了不少cJSON,结果只找到c语言字符串转换到JSON的实例,想转回来结果没有实例.自己琢磨了一个下午才敢下手.下面把转来转去的代码贴上. //百度网盘的 CJSON 实例源码 地址 ht ...
- easyui datagrid分页要点总结
easyui的datagird插件比较好用,也很方便.网上也有很多热的网友贴出了使用代码,但是很少有网友指出在使用过程应该注意的地方,让我实在搞不清分页应该怎么使用.我就说下使用分页功能中要注意的一个 ...
- android之OptionsMenu
首先编写res/layout/Activity_main.xml 代码如下: <LinearLayout xmlns:android="http://schemas.android.c ...