nRF52832-Bluefruit52学习之Arduino开发(3)-- 蓝牙组网一拖8主机模式(central_bleuart)

本文主要是介绍nRF52832-Bluefruit52学习之Arduino开发(3)-- 蓝牙组网一拖8主机模式(central_bleuart),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       nRF52832技术交流群:680723714

       nRF52832-Bluefruit52核心板详细介绍:

https://blog.csdn.net/solar_Lan/article/details/88688451

       github仓库地址:https://github.com/Afantor/Bluefruit52_Arduino.git

       

       Arduino例程目前分为6大部分:Central、DualRoles、Display、Hardware、Peripheral、Project。

一、Central:主设备与其他设备通信例程

二、DualRoles:从设备与主设备通信例程

本篇讲解蓝牙组网一拖8实验,本实验展示了以一个nRF52382为中心,其他nRF52832模块为外围设备,进行级联通信控制的过程。示例中演示串口打印连接状态和接收到数据,通过数据收发控制板载LED灯。主机中心为一个主模式设备,检测按键发送控制LED的字符。

下面直接讲解代码:

Client Services客户端服务

由于Central角色访问外围设备上的GATT服务器,我们首先需要使用BLEClientUart帮助程序类声明客户端bleuart实例。 如果还使用BLEClientDis,我们也可以方便地读取设备信息。

BLEClientDis  clientDis;
BLEClientUart clientUart;

在我们配置客户端服务之前,必须至少调用Bluefruit.begin(),以获得中央模式支持的并发连接数。 由于在这种情况下我们不会将nRF52作为外设运行,因此我们将外设计数设置为0:

// Initialize Bluefruit with maximum connections as Peripheral = 0, Central = 1
Bluefruit.begin(0, 1);

之后,必须通过调用begin()函数初始化客户端服务,并且可以从helper类设置任何要使用的回调:

// Configure DIS client
clientDis.begin();// Init BLE Central Uart Serivce
clientUart.begin();
clientUart.setRxCallback(bleuart_rx_callback);

Scanner扫描器

让我们启动广告扫描仪找到一个外围设备。

我们将使用setRxCallback()连接扫描结果回调。

每当扫描仪发现广告数据时,它将被传递给该回调处理程序,我们可以检查那里的广告数据,并且只连接到广播bleuart服务的外围设备。

注意:如果外围设备有多个服务且广告包中的UUID列表中未包含bleuart,您可以选择使用其他检查,例如匹配MAC地址,名称检查,使用“其他服务”等。

找到我们希望与之通信的外围设备后,请调用Bluefruit.Central.connect()与其建立连接:

void setup()
{// Other set up ...../* Start Central Scanning* - Enable auto scan if disconnected* - Interval = 100 ms, window = 80 ms* - Don't use active scan* - Start(timeout) with timeout = 0 will scan forever (until connected)*/Bluefruit.Scanner.setRxCallback(scan_callback);Bluefruit.Scanner.restartOnDisconnect(true);Bluefruit.Scanner.setInterval(160, 80); // in unit of 0.625 msBluefruit.Scanner.useActiveScan(false);Bluefruit.Scanner.start(0);                   // // 0 = Don't stop scanning after n seconds
}/*** Callback invoked when scanner pick up an advertising data* @param report Structural advertising data*/
void scan_callback(ble_gap_evt_adv_report_t* report)
{// Check if advertising contain BleUart serviceif ( Bluefruit.Scanner.checkReportForService(report, clientUart) ){Serial.print("BLE UART service detected. Connecting ... ");// Connect to device with bleuart service in advertisingBluefruit.Central.connect(report);}
}

Central Role中心角色

通常需要设置中央模式设备的连接回调,该连接回调在与外围设备建立/断开连接时触发。 或者,可以使用connected()轮询连接状态,但回调有助于显着简化代码:

// Callbacks for Central
Bluefruit.Central.setConnectCallback(connect_callback);
Bluefruit.Central.setDisconnectCallback(disconnect_callback);

在连接回调中,我们将尝试通过浏览外围设备的GATT表来发现bleuart服务。 这将有助于确定特征的句柄值(例如TXD,RXD等)。 这完全由BLEClientUart的.discover()完成。 找到服务后,启用TXD特性的CCCD以允许外设发送数据,我们准备在设备之间来回发送数据:

void connect_callback(uint16_t conn_handle)
{Serial.println("Connected");Serial.print("Dicovering DIS ... ");if ( clientDis.discover(conn_handle) ){Serial.println("Found it");char buffer[32+1];// read and print out Manufacturermemset(buffer, 0, sizeof(buffer));if ( clientDis.getManufacturer(buffer, sizeof(buffer)) ){Serial.print("Manufacturer: ");Serial.println(buffer);}// read and print out Model Numbermemset(buffer, 0, sizeof(buffer));if ( clientDis.getModel(buffer, sizeof(buffer)) ){Serial.print("Model: ");Serial.println(buffer);}Serial.println();}  Serial.print("Discovering BLE Uart Service ... ");if ( clientUart.discover(conn_handle) ){Serial.println("Found it");Serial.println("Enable TXD's notify");clientUart.enableTXD();Serial.println("Ready to receive from peripheral");}else{Serial.println("Found NONE");// disconect since we couldn't find bleuart serviceBluefruit.Central.disconnect(conn_handle);}  
}

Full Sample Code完整的例程代码:

/*********************************************************************This is an example for our nRF52 based Bluefruit LE modulesPick one up today in the adafruit shop!Adafruit invests time and resources providing this open source code,please support Adafruit and open-source hardware by purchasingproducts from Adafruit!MIT license, check LICENSE for more informationAll text above, and the splash screen below must be included inany redistribution
*********************************************************************//** This sketch demonstrate the central API(). A additional bluefruit* that has bleuart as peripheral is required for the demo.*/
#include <bluefruit.h>BLEClientBas  clientBas;  // battery client
BLEClientDis  clientDis;  // device information client
BLEClientUart clientUart; // bleuart clientvoid setup()
{Serial.begin(115200);while ( !Serial ) delay(10);   // for nrf52840 with native usbSerial.println("Bluefruit52 Central BLEUART Example");Serial.println("-----------------------------------\n");// Initialize Bluefruit with maximum connections as Peripheral = 0, Central = 1// SRAM usage required by SoftDevice will increase dramatically with number of connectionsBluefruit.begin(0, 1);Bluefruit.setName("Bluefruit52 Central");// Configure Battyer clientclientBas.begin();  // Configure DIS clientclientDis.begin();// Init BLE Central Uart SerivceclientUart.begin();clientUart.setRxCallback(bleuart_rx_callback);// Increase Blink rate to different from PrPh advertising modeBluefruit.setConnLedInterval(250);// Callbacks for CentralBluefruit.Central.setConnectCallback(connect_callback);Bluefruit.Central.setDisconnectCallback(disconnect_callback);/* Start Central Scanning* - Enable auto scan if disconnected* - Interval = 100 ms, window = 80 ms* - Don't use active scan* - Start(timeout) with timeout = 0 will scan forever (until connected)*/Bluefruit.Scanner.setRxCallback(scan_callback);Bluefruit.Scanner.restartOnDisconnect(true);Bluefruit.Scanner.setInterval(160, 80); // in unit of 0.625 msBluefruit.Scanner.useActiveScan(false);Bluefruit.Scanner.start(0);                   // // 0 = Don't stop scanning after n seconds
}/*** Callback invoked when scanner pick up an advertising data* @param report Structural advertising data*/
void scan_callback(ble_gap_evt_adv_report_t* report)
{// Check if advertising contain BleUart serviceif ( Bluefruit.Scanner.checkReportForService(report, clientUart) ){Serial.print("BLE UART service detected. Connecting ... ");// Connect to device with bleuart service in advertisingBluefruit.Central.connect(report);}else{      // For Softdevice v6: after received a report, scanner will be paused// We need to call Scanner resume() to continue scanningBluefruit.Scanner.resume();}
}/*** Callback invoked when an connection is established* @param conn_handle*/
void connect_callback(uint16_t conn_handle)
{Serial.println("Connected");Serial.print("Dicovering Device Information ... ");if ( clientDis.discover(conn_handle) ){Serial.println("Found it");char buffer[32+1];// read and print out Manufacturermemset(buffer, 0, sizeof(buffer));if ( clientDis.getManufacturer(buffer, sizeof(buffer)) ){Serial.print("Manufacturer: ");Serial.println(buffer);}// read and print out Model Numbermemset(buffer, 0, sizeof(buffer));if ( clientDis.getModel(buffer, sizeof(buffer)) ){Serial.print("Model: ");Serial.println(buffer);}Serial.println();}else{Serial.println("Found NONE");}Serial.print("Dicovering Battery ... ");if ( clientBas.discover(conn_handle) ){Serial.println("Found it");Serial.print("Battery level: ");Serial.print(clientBas.read());Serial.println("%");}else{Serial.println("Found NONE");}Serial.print("Discovering BLE Uart Service ... ");if ( clientUart.discover(conn_handle) ){Serial.println("Found it");Serial.println("Enable TXD's notify");clientUart.enableTXD();Serial.println("Ready to receive from peripheral");}else{Serial.println("Found NONE");// disconnect since we couldn't find bleuart serviceBluefruit.disconnect(conn_handle);}  
}/*** Callback invoked when a connection is dropped* @param conn_handle* @param reason is a BLE_HCI_STATUS_CODE which can be found in ble_hci.h*/
void disconnect_callback(uint16_t conn_handle, uint8_t reason)
{(void) conn_handle;(void) reason;Serial.print("Disconnected, reason = 0x"); Serial.println(reason, HEX);
}/*** Callback invoked when uart received data* @param uart_svc Reference object to the service where the data * arrived. In this example it is clientUart*/
void bleuart_rx_callback(BLEClientUart& uart_svc)
{Serial.print("[RX]: ");while ( uart_svc.available() ){Serial.print( (char) uart_svc.read() );}Serial.println();
}void loop()
{if ( Bluefruit.Central.connected() ){// Not discovered yetif ( clientUart.discovered() ){// Discovered means in working state// Get Serial input and send to Peripheralif ( Serial.available() ){delay(2); // delay a bit for all characters to arrivechar str[20+1] = { 0 };Serial.readBytes(str, 20);clientUart.print( str );}}}
}

从上面分析的代码流程,我们很容易理解蓝牙组网连接的流程。本例程代码是主机端的,从机端将在下一篇博文。从最后的实验现象我们可以看出,蓝牙组网中主机只能存在一个设备,从机可以是多个设备,从机是主从模式存在的,所以此蓝牙网络是一种级联的形式,中间连接的从设备既充当主机又是中继站。

这篇关于nRF52832-Bluefruit52学习之Arduino开发(3)-- 蓝牙组网一拖8主机模式(central_bleuart)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/621467

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架