蓝牙作为一种近距离无线通信技术,被广泛使用在汽车,智能家居和医疗等领域中。本文主要介绍如何通过EsDA开发套件,快速实现蓝牙服务器的相关应用业务。
简介
前面文章讲解了ble_client的相关节点和业务处理,有兴趣的可以跳转链接【EsDA应用】蓝牙客户端节点详解去查看。
本文主要基于MPC_ZC1开发板以及可将节点进行拖拽连接的图形化设计工具AWFlow Designer,着重对UIS8910DM平台的板载蓝牙的配套节点以及示例进行讲解。本文除了对ble_server设备端节点进行详细阐述还有以MPC_ZC1开发板做蓝牙服务器的相关应用业务介绍如:定义支持的服务,发布服务器以便远程客户端可连接,响应读取和写入请求等。
节点介绍
因蓝牙服务端节点中的属性数量过多,所以本节只介绍几个重点属性,其他的属性内容详见AWFlow Designer上相关节点的帮助文档。
1. 配置节点1.1 ble_server创建BLE服务端设备,保存用户传入的广播配置。1.1.1 属性
- 发现模式:值为0表示不可发现模式;值为1表示有限可发现模式;值为2表示普通可发现模式。
- 广播类型:值为0表示可连接的非定向广播;值为1表示可连接的定向广播;值为2表示不可连接的非定向广播;值为3表示可扫描的非定向广播。
- 广播信道:广播通道映射在37、38、39通道通信。值为0时表示通道37被使用,值为1时表示通道38被使用,值为2时表示通道39被使用。
广播的过滤策略:
值为0时表示处理所有设备的扫描和连接请求;
值为1时表示处理所有设备的连接请求和只有白名单上的设备的扫描请求;
值为2时表示处理所有设备的扫描请求和只有白名单上的设备的连接请求;
值为3时表示只处理在白名单上的设备的扫描和连接请求。
SMP配对模式的参数:
smp_pair_mode | io_cap | 安全等级 |
SECURE_CONNECTION_PASSKEY | KEYBOARD_DISP | 最高 |
SECURE_CONNECTION_JUSTWORK | NOIN_NOOUT | 次之 |
LEGACY_PASSKEY | KEYBOARD_DISP | 第三 |
LEGACY_JUSTWORK | NOIN_NOOUT | 最低 |
- 支持的服务个数:支持提供的服务个数,需要与流图中添加的服务数量一致。* 配置节点无输入输出。
2. 服务端节点2.1 ble_server_service2.1.1 属性
- BLE服务端配置节点:关联到的BLE服务端配置节点。
- 服务UUID:支持提供服务的UUID。支持2个字节或16个字节,按照小端模式依次用逗号隔开。
- 支持服务的特征相关属性:
特征值的格式 | 特征声明的性质 | 特征值的权限 |
短UUID | 广播属性 | 可读 |
修补长度 | 读属性 | 可写 |
写通知 | 不带回复的写属性 | 读取认证 |
组 | 带回复的写属性 | 读取授权 |
冲突通知 | 通知属性 | 读取加密 |
追加写 | 指示属性 | 读取认证文件 |
签名认证的写属性 | 写认证 | |
扩展属性 | 写授权 | |
写加密 | ||
写认证文件 | ||
只允许经典蓝牙访问 |
2.1.2 输入
payload:输入数据。传入特征值数据,可以使用“fscript”节点作为前级节点,设置需要写入的数据。
payloadLength:输入数据。传入特征值数据的长度,可以使用“fscript”节点作为前级节点,设置需要写入的数据长度,最大不超过255。
2.1.3 输出本节点无实质性数据输出,其消费者节点一般是ble_server_adv节点。2.2 ble_server_adv
2.2.1 属性
BLE服务端配置节点:关联到的BLE服务端配置节点。
- 蓝牙本地设备名称:蓝牙服务端本地设备的名称,代码里自动将此参数加入到广播数据包的类型为09的小数据包中。
广播数据包最长31个字节,而这31个字节又被拆分成很多小数据包,每个小数据包代表一类广播数据。
每个小数据包是由:length(数据长度)+type(类型)+data(数据内容)构成的。
需要广播的每个小数据包的数据长度:表示需要广播的每个小数据包的数据长度(数据内容的字节长度+1)。因为格式是csv,所以多个数据包的数据长度按顺序用逗号来隔开。
需要广播的每个小数据包的数据类型:表示需要广播的每个小数据包的数据长度(数据内容的字节长度+1)。多个数据包的数据类型按顺序用逗号来隔开。
扫描响应的每个小数据包的数据内容:表示扫描响应的每个小数据包的数据内容。多个数据包的数据内容按顺序用逗号来隔开。
扫描响应的每个小数据包的数据类型:表示扫描响应的每个小数据包的数据类型,多个数据包的数据类型按顺序用逗号来隔开。具体的广播数据包类型详细信息可在网上进行查阅。
数据类型为09表示本地设备名称即属性蓝牙本地设备名称,现已被后续代码自动处理加入到了广播数据包中。计算长度时需注意,如若广播数据包超过最长31个字节的内容,则截断。
扫描响应的每个小数据包的数据内容:表示扫描响应的每个小数据包的数据内容。多个数据包的数据内容按顺序用逗号来隔开。
如:需要广播的每个小数据包的数据长度为0x02;需要广播的每个小数据包的数据类型为:0x01;需要广播的每个小数据包的数据内容为:0x06。那么算上蓝牙本地设备名称:(BLE-ZC1)0x42,0x4c,0x45,0x2d,0x5a,0x43,0x31,
那么最终的广播数据包为0x08(数据长度),0x09(数据类型),
0x42,0x4c,0x45,0x2d,0x5a,0x43,0x31(数据内容BLE-ZC1),
0x02(数据长度),0x01(数据类型),
0x06(数据内容),
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
2.2.2 输入
ble_server_adv节点的输入并无实际意义的输入,由ble_server_service节点作为前级节点,进入当前节点的on_data虚函数中开启广播。
- * sink类型节点无输出功能
业务处理
定义支持的服务:由ble_server_service节点添加服务UUID和特征值UUID以及特征值数据;发布服务器,以便远程客户端可连接:由ble_server_adv节点开启广播(在一个运行程序中不能多次开启广播)后服务端蓝牙准备完成,开始等待客户端蓝牙设备连接;以及后续的响应读取和写入请求。实现框图如下所示。
1. 资源准备
硬件上依旧如【EsDA应用】蓝牙客户端节点详解使用MPC_ZC1开发板作为服务器去广播数据,软件上使用可拖拽连线的图形化设计工具AWFlow Designer去设计流图以及手机app(BLE调试宝)作为客户端进行蓝牙通信。
2. 添加节点并绘制流图
添加timer,gpio,trigger,fscript,ble_server_service和ble_server_adv节点到画布中,如下图所示。
3. 配置节点
添加多个蓝牙服务端的服务和特征值数据,并开启蓝牙广播。需注意的是本蓝牙模块在程序运行时不能重复多次开启蓝牙广播,否则会打开蓝牙失败。
双击gpio节点的前驱timer节点,打开属性面板设置定时周期(ms),定时去读取gpio的引脚电平状态。修改完后点击右上角的完成即可保存属性配置。
双击gpio节点,配置属性如下图所示,根据需求选择所需的gpio引脚,本章节使用的是P4.5,并设置为浮空输入,用户可根据自身需求设置该gpio引脚号。修改完后点击右上角的完成即可保存属性配置。
双击gpio的后继节点fscript,功能代码内容的主要目的是让后续的trigger节点只能被触发一次,因P4.5的引脚默认是低电平,且trigger节点被触发只能收到msg.trigger_stop属性消息,所以具体代码如下。
if (msg.payload == 1) { msg.trigger_stop = "reset";}
双击trigger节点,本节点主要目的是只一次触发多个后继节点,所以在此选择等待被重置模式(Wait_to_be_reset_mode)在trigger被触发前,不传递任何的消息给后继节点。修改完后点击右上角的完成即可保存属性配置。
双击第一栏的fscript节点,本节点作为ble_server_service节点的前驱节点,所以具体内容即ble_server_service的输入组:payload(传入的特征值数据),payloadLength(传入的特征值数据的长度)。修改完后点击右上角的完成即可保存属性配置。
msg.payload = "hello";set(msg.payloadLength, u16("5"));
双击第一栏的ble_server_service节点中的属性:BLE服务端配置节点旁的铅笔图标,属性:BLE服务端配置节点在本流图中只需要配置一遍即可,后续不再阐述。需注意的是支持的服务个数的属性值必须与本流图中所添加的服务个数数量一致,其他属性参数可用demo流图默认值。修改完后点击右上角的完成即可保存属性配置。
双击第一栏的ble_server_service节点,只需要确定需要添加的服务UUID和特征值UUID,其他参数视具体情况而定,也可使用默认的参数值。修改完后点击右上角的完成即可保存属性配置。
双击第二栏的fscript节点,其内容与第一栏的fscript节点大体一致,都是作为ble_server_service节点的前驱节点,所以具体内容即ble_server_service的输入组:payload(传入的特征值数据),payloadLength(传入的特征值数据的长度)。修改完后点击右上角的完成即可保存属性配置。
msg.payload = "server";set(msg.payloadLength, u16("6"));
双击第二栏的ble_server_service节点,其属性与第一栏的ble_server_service节点大体一致,需要添加的服务UUID和特征值UUID不同,其他参数视具体情况而定,也可使用默认的参数值。
服务UUID:
0xf5,0x89,0x9b,0x5f,0x80,0x00,0x00,0x80,0x00,0x10,0x00,0x00,0xfe,0x18,0x00,0x00
特征值UUID:
0xf5,0x89,0x9b,0x5f,0x80,0x00,0x00,0x80,0x00,0x10,0x00,0x00,0xfe,0xff,0x11,0x11
最后双击ble_server_adv节点,自行设置蓝牙本地设备名称,以及需要广播的每个小数据包的数据长度,类型,内容和扫描的每个小数据包的数据长度,类型,内容。修改完后点击右上角的完成即可保存属性配置。
4. 下载验证
下载流图后可在BLE调试宝点击蓝牙服务选项对流图提供的service进行访问,点击每个service的左侧箭头,展开对各个service提供的特征进行查看,还可对支持操作的特性进行读写。
每次操作都会有相应的日志信息,注意各服务UUID的联系,实时日志如下所示。
BLE调试宝向特征值UUID为0x1111fffe写入12 34 56,作为服务端板子的串口打印可显示收到的相应数据如下。
-
蓝牙
+关注
关注
114文章
5767浏览量
169819 -
节点
+关注
关注
0文章
217浏览量
24386 -
终端节点
+关注
关注
0文章
6浏览量
1866
发布评论请先 登录
相关推荐
评论