nRF52832蓝牙从机

news2025/1/15 23:28:38

具体内容直接参考《nRF52832开发指南》

本文仅对关键内容和容易搞错的内容进行描述。 

广播事件

扫描事件 

 

连接事件

 

从机框架 

  • 日志配置和初始化log_init,具体参考手册和示例程序;
  • APP定时器初始化timers_init,具体参考手册和示例程序;
  • led指示灯初始化leds_init,可选,具体参考手册和示例程序;
  • 初始化和运行电源管理,初始化power_management_init,运行nrf_pwr_mgmt_run,具体参考手册和示例程序;
  • BLE协议栈初始化ble_stack_init,这里面注册了BLE事件处理函数句柄ble_evt_handler,这里涉及到两个操作需要我们确定下,第一个就是配置低频时钟nrf_sdh_enable_request,再就是在工程Target界面中为协议栈和应用程序分配合适的内存,具体参考手册和示例程序;
  • GAP初始化,gap_params_init,这里需要注意的是,设置设备名称sd_ble_gap_device_name_set,然后就是理解首选连接参数,具体参考手册和示例程序;
  • GATT初始化gatt_init,具体参考手册和示例程序;
  • 广播初始化advertising_init,这里需要注册一个广播事件处理函数on_adv_evt,具体参考手册和示例程序;
  • 服务初始化services_init,可以在这里面初始化串口透传服务,设置串口透传事件回调函数,具体参考手册和示例程序;
  • 连接参数协商模块初始化conn_params_init,这里面有一个连接参数协商模块事件处理函数on_conn_params_evt,用来处理协商成功或者失败,具体参考手册和示例程序;
  • 启动广播advertising_start,该函数所用的模式必须和广播初始化中设置的广播模式一样,具体参考手册和示例程序;

SoftDevice,指的是NORDIC softDevice 蓝⽛协议栈;

日志打印

参考视频:

第22讲:(蓝牙从机工程框架篇)协议栈下log输出_哔哩哔哩_bilibili

选择日志的输出终端

STM32中一般使用printf进行打印,此时,会占用一个串口。

日志的相关设置,在sdk_config.h文件中,找到任意一个c文件,点击加号展开,即可找到该头文件(以下为头文件的向导模式展示)。

使用RTT输出日志时,可以节省一个串口,使用JLINK本身,既能实现烧录,也能输出日志。

注意:RTT和串口可以同时使能输出。

LOG有个总开关

5种日志级别

我们实际开发时,可根据情况分别调用这几个函数来实现不同信息的输出。

我们在程序里,不同的地方调用不同的日志函数来输出日志,但是并不是所有的日志都会打印出来,哪些会打印出来呢?这就由默认的日志级别来确定:

如果选择了Off,则不会打印任何日志;

如果选择了Error,则只会打印出NRF_LOG_ERROR函数所输出的内容;

如果选择了Warning,则只会打印出NRF_LOG_WARNING函数所输出的内容;

如果选择了Info,则只会打印出NRF_LOG_INFO函数所输出的内容;

如果选择了Debug,则会打印出所有LOG函数输出的内容。

通常,默认选择Info级别。

Log配置(RTT作为输出终端)

启动RTT

配置RTT

信息显示

上述选择完成后,点击OK,即可进入主界面

RTT常用操作补充

清除终端显示

保存日志

注意,以上日志操作都是NORDIC帮我们实现的,并不属于BLE协议的一部分。

自定义串口服务

具体参考手册第七章:《实现一个自定义的profile》

一上来就有个疑惑,这是从机直接发数据给主机,怎么还有串口的事呢?

使用步骤如下:

生成自定义UUID,可使用工具,网址Online UUID Generator Tool,并用数组保存起来,保存时注意字节序,是反着放的;

明确需求;

勾选串口透传服务

根据上面说的框架步骤,初始化和配置时设置各项参数;

在扫描响应中加入串口透传服务的UUID

相关代码

后续更多流程自行查阅手册和示例代码即可。

解惑:

这里的串口透传服务和特征,只是在有串口透传场景下的一种方式,其实,服务和特征名不一定要取TX和RX,不要被取名误导,关键是服务和特征的UUID唯一识别码,名称没那么重要。不是说这样取名就表示蓝牙之间传输使用的是串口,想想都不大可能。

这里更多的含义是:串口透传服务实现了蓝牙的串口收发数据,然后可以直接取数据并通过蓝牙收发,从而实现透传,这一块nordic已经写好了,而不用我们自己去写代码来实现。

如果只是主从机之间,根本就用不到串口透传。一般都是涉及到三方,其中有一侧是通过串口传输数据,然后有个中间方在牵桥搭线,这种情况下,可以在中间方芯片上使用透传。

又有个疑惑,如果不使用透传,那么数据是如何从蓝牙从机发送给主机的呢?在有其他MCU的场景下,MCU直接通过串口发送数据给从机,从机就会自动透传给主机;nRF52832如果只有主从机,连接后是调用什么来发送数据呢?难道就是从机打开发射模块和通知主机打开接收模块?数据就能发送了?而我们使用串口透传服务,难道如果没有用到串口,也就当做要发送的数据是从串口来的?然后调用透传服务函数,就能自动将数据发送出去了?

我觉得这应该就是物理层和链路层的事情,发送放和接收方各自打开发射模块和接收模块。

长包传输

设置支持的数量

MTU长度赋值给GATT实例

GATT事件回调函数

补充

主机界面示例:

打开对应的主机APP,nordic的nRF Connect,然后连接,可以看到有如下主机界面:

可以看到有一个订阅的服务,该服务还包括两个特征。

然后还有两个GAP服务和GATT服务是强制包含的,也就是图中的Generic Access 和 Generic Arrribute。

这两个一般是在协议栈里面实现的,不需要用户实现。

几个术语

经典蓝牙BR/EDR

LE:蓝牙低功耗

蓝牙断开的问题

蓝牙如能被发现,能连上,并且查看数据是对的,说明设置是没问题。

之后过程中又断开,通常是连接超时,可能是距离太远了。

可以在连接断开的事件中打印出断开连接的原因

错误编号所在处BLE_HCI_STATUS_CODES Bluetooth status codes

比如0x08连接超时。

断开后,nordic协议栈会使得从机重新进入广播。

为什么会自动广播?
NRF_SDH_BLE_OBSERVER——ble_advertising_on_ble_evt中可以查看

在广播或者扫描响应中放入数据

如果希望在广播或者扫描响应里放入某些数据,可直接参考手册的第四章《全面掌握广播》

我们要记住的是广播数据的组成:

广播或者扫描响应的数据报文一共有37个字节,前6个字节是广播设备的地址,所以,只有31个字节可以携带数据,这些数据由一个一个的AD Structure构成。

有哪些广播数据的类型?

AD Type的定义在程序的ble_gap.h头文件中,可自行查看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1099180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EFLK与logstash过滤

目录 一、Filebeat工作原理: 二、为什么要使用Filebeat: 三、Filebeat和Logstash的区别: 四、logstash 的过滤插件: 五、FilebeatELK 部署: 1. 安装filebeat: 2. 设置 filebeat 的主配置文件&#xff1…

SpringBoot面试题7:SpringBoot支持什么前端模板?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:SpringBoot支持什么前端模板? Spring Boot支持多种前端模板,其中包括以下几种常用的: Thymeleaf:Thymeleaf是一种服务器端Java模板引擎,能够…

【2】c++11新特性(稳定性和兼容性)—>超长整型 long long

c11标准要求long long整型可以在不同的平台上有不同的长度,但是至少64位,long long整型有两种: 有符号long long:–对应类型的数值可以使用LL或者ll后缀 long long num1 123456789LL; long long num2 123456789ll;无符号unsign…

Linux性能优化--实用工具:性能工具助手

8.0 概述 本章介绍一些在Linux系统上可用的实用程序,它们能够加强性能工具的有效性和可用性。实用工具本身不是性能工具,但是当它们与性能工具一起使用时,它们可以帮助完成如下功能:自动执行繁琐的任务、分析性能统计数据&#x…

【机器学习】逻辑回归

文章目录 逻辑回归定义损失函数正则化 sklearn里面的逻辑回归 逻辑回归 逻辑回归,是一种名为“回归”的线性分类器,其本质是由线性回归变化而来的,一种广泛使用于分类问题中的广义回归算法。 线性回归是机器学习中最简单的的回归算法&#…

基本分段存储管理方式(分段,段表,地址转换以及与分页管理对比)

1.分段 1.进程的地址空间: 按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名 (在低级语言中,程序员使用段名来编程),每段从0开始编址. 2.内存分配规则: 以段为单位进行分配,每个段在内存中占据…

BIM轻量化技术简介

BIM轻量化技术是指在工程建筑的BIM模型建立之后(利用专业的BIM建模软件,比如Autodesk Revit, Bentley MicroStation, DS Catia等),通过对BIM模型的压缩处理等技术手段,让BIM可以在各类WEB浏览器、移动App上被使用的技术…

【网络协议】聊聊DHCP和PXE 工作原理

DHCP 动态主机配置协议 对于每个主机来说,只要连接了网络,那么就会配置一个IP地址,那么这个IP地址,如果是手动配置的话,对于公司内部的人员来说都要找IT进行配置,这个太浪费人力物力了,所以解决…

【软件设计师】面向对象类图的六种关系

面向对象类图的六种关系(继承、实现、依赖、关联、聚合、组合) 1、泛化(继承)2、实现3、依赖4、关联5、聚合6、组合 面向对象类图的六种关系(继承、实现、依赖、关联、聚合、组合) 进行面向对象设计时&…

为什么要做服务器监控?

应用程序一般都是在服务器上运行,可以这么说,服务器就是一家公司的全部,因此,服务器必须要监控,来确保性能和正常运行。 如果服务器宕机,那会导致很多问题,会给公司带来巨大的损失,…

[论文精读]Semi-Supervised Classification with Graph Convolutional Networks

论文原文:[1609.02907] Semi-Supervised Classification with Graph Convolutional Networks (arxiv.org) 论文代码:GitHub - tkipf/gcn: Implementation of Graph Convolutional Networks in TensorFlow 英文是纯手打的!论文原文的summari…

小黑子—MyBatis:第五章

MyBatis入门5.0 十三 小黑子的MyBatis高级映射及延迟加载13.1 多对一映射13.1.1 实体类关系怎么设计13.1.2 第一种方式:级联属性映射13.1.2 第二种方式 association 关联13.1.3 第三种方式 分步查询13.1.3 延迟加载 13.2 一对多映射13.2.1 一对多的映射原理13.2.2 第…

lv8 嵌入式开发-网络编程开发 18 广播与组播的实现

目录 1 广播 1.1 什么是广播? 1.2 广播地址 1.3 广播的实现 2 组播 2.1 分类的IP地址 2.2 多播 IP 地址 2.3 组播的实现 1 广播 1.1 什么是广播? 数据包发送方式只有一个接受方,称为单播 如果同时发给局域网中的所有主机&#xff0…

Python浏览器自动化

如果你正在进行手机爬虫的工作,并且希望通过模拟浏览器行为来抓取数据,那么Pyppeteer将会是你的理想选择。Pyppeteer是一个强大的Python库,它可以让你控制浏览器进行自动化操作,如点击按钮、填写表单等,从而实现数据的…

以数智化指标管理,驱动光伏能源行业的市场推进

近年来,碳中和、碳达峰等降低碳排放、提升环境健康度的政策和技术改进正在不断地被社会所认可和引起重视,也被越来越多的企业在生产运营和基础建设中列为重要目标之一。而光伏能源行业作为全球绿色能源、新能源的优秀解决方案,充分利用太阳能…

Linux小程序---进度条

一&#xff1a;\r 和 \n \r --- 回车 --- 使光标回到这一行的开头 \n --- 换行 --- 会来到下一行与之平行的位置 缓冲区的问题&#xff1a; <1>: \n 的示例 正常输出 hehehehe 。 <2>: \r 的示例 为了方便观察&#xff0c;加入一个 sleep &#xff08;休眠函数…

[GSEP202306 一级] C++ 时间规划

题目描述 小明在为自己规划学习时间。现在他想知道两个时刻之间有多少分钟&#xff0c;你通过编程帮他做到吗? 输入格式 输入4行&#xff0c;第一行为开始时刻的小时&#xff0c;第二行为开始时刻的分钟&#xff0c;第三行为结束时刻的小时&#xff0c;第四行为结束时刻的分…

新能源电池试验中准确模拟高空环境大气压力的解决方案

摘要&#xff1a;针对目前新能源电池热失控和特性研究以及生产中缺乏变环境压力准确模拟装置、错误控制方法造成环境压力控制极不稳定以及氢燃料电池中氢气所带来的易燃易爆问题&#xff0c;本文提出了相应的解决方案。方案的关键一是采用了低漏率电控针阀作为下游控制调节阀实…

MySQL锁学习笔记

锁 事务的隔离性由锁来实现。 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题&#xff0c;当多个线程并发访问某个数据的时候&#xff0c;尤其是针对一些敏感的数据&#xff08;比如订单、金额等&#xff09;&#xff0c;我…

第二届中国未来交通产业发展峰会在深举办 聚焦智能网联、低空经济

智慧交通、低空飞行、自动驾驶……交通产业“未来已来”。10月12日&#xff0c;2023第二届中国未来交通产业发展峰会在深圳成功举办。本次峰会是国内聚焦高级别智能网联、低空产业、智慧物流、新能源和交通装备发展的高水平行业盛会&#xff0c;为行业搭建上下游沟通交流的广阔…