【PHY6222】simpleBLEPeripheral剖析

news2024/11/16 5:45:57

源码剖析

main.c

main函数中所有使用extern引用外部的函数均无源码,具体细节不可知。

可以看到源码函数有以下几个:

hal_rfphy_init:

相关参数:

hal_init:

jump_table.c

因为rom的code是不开源的,rom代码调用app就需要一个跳转表。

OSAL_SimpleBLEPeripheral.c

这个文件中包含应用所包含的所有任务初始化。注意在所有任务初始化函数中,初始化每个任务都传入了一个序号,所有所有函数都要按顺序排列。

具体按顺序排列指的是和上面任务函数指针数组中函数指针的顺序:

在osalInitTasks函数中对于我们最重要的是应用初始化:SimpleBLEPeripheral_Init函数

simpleBLEPeripheral.c

此文件才是应用的重点,在这个文件中定义了大量可修改参数,这些参数控制着我们需要实现的功能。同时定义了很多回调函数,来处理不同事件触发时的处理流程。

在我们应用初始化函数中,初始化了很多GAP和GATT的参数:

关于一些可设置的GAP层参数如下:

 

除去一些GAP参数设置外,比较重要的是广播数据和扫描应答数据设置:

根据上面设置类型的注释,已经可以知道这两个数据的最大长度都是31,他们的内容都保存在全局数组里:

 

广播与扫描应答数据的格式都是length+type+value,其中length包含type这一个字节,type一般使用蓝牙协议联盟规定的,value可以有多个字节组成长度=length-1。

当使能绑定管理器时,还回初始化一些配对与绑定的参数:

和我们应用最贴近的设置是添加服务的函数:

不同服务有各自的添加函数。而不同服务实质上是一个个属性数组。

gapgattserver.c

添加服务很简单,主要就是注册属性表和回调函数。

这里回调函数是一个结构体,包含三个函数:

而属性表则是一个结构体数组,包含该服务所有属性:

type其实就是uuid,蓝牙中使用uuid表示不同数据的类型,type中包含了两个部分,一个是len表示长度,因为uuid可以使用完整的16个字节,也可以使用缩写的2个字节。另一个是uuid,这里使用的uuid已经由未开源的代码中定义好了,我们可以直接使用。默认我们使用缩写的2字节的uuid即可。缩写的2字节uuid其实就是完整uuid的byte12、13,因为其他字节完全相同,所以可以缩写。

已经内置的一些uuid(gatt_uuid.h):

他们的具体数值为:

另外权限分为以下几种:

而局部默认都为0,因为句柄由属性服务器分配。

最后值指向的是一个数组,最大为512字节。

最后完整的看一下GAP层的属性表(请注意属性数据组织方式):

下面还包含一些其他特征,其实组织方式都是一样的不再赘述。这里主要看一下两个可读的区别。在特征声明这条属性里的”pValue”可以是以下属性的一个或多个:

注意,这里这个权限描述的是这个特征所允许的一些操作。而属性中的”permissions”则是描述的这条属性的权限。

回过头看一下回调函数,在读取函数里有:

这里读取回调函数看起来是通过传入的gattAttribute_t*指针判断读取的属性,注意这个指针是完整的一个属性,它的pValue就是我们需要读取的值,我们所需要做的就是将这个属性的pValue复制到函数入参的pValue里。属性的pValue值初始化就是在上面提到的属性表里。

在写回调中修改属性表的方式其实就是把读回调中的操作反过来:

同样的,也是判断gattAttribute_t*的uuid,只不过复制数据的方向和读刚好相反。

不过根据前文分析,其实GAP中的特征都是只读的,所以写回调函数理论上是不会触发的。

除了读写这两个比较重要的函数,还有一下函数:

上面两个函数用来设置和获取GGS的属性值。

和注册服务函数相对应的,用来删除服务。

 

设备名称被更改的时候用来回调通知应用。在write函数中被调用。

设置属性的权限。

sbpProfile_ota.c

GATTServApp_AddService( GATT_ALL_SERVICES );和gap差不多,而且内容不用修改所以不再展开。

SimpleProfile_AddService( GATT_ALL_SERVICES );才是真正添加此demo服务的函数,其实大部分内容和GGS相似,但是除了读写还有通知,这里主要提一下通知。

 这里Characteristic 6就是用来指示是否通知。

这个通知也是通过write函数 simpleProfile_WriteAttrCB 写入的:

这里直接调用现成的API设置此handle可以被通知即可,然后在需要通知的时候使用:

其实最底层调用的是:

 

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

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

相关文章

ubuntu 安装 gparted

前提环境: 阿里云的源。 sudo apt update sudo apt upgrade sudo apt install gparted 搜索:

新能源充电桩工业4G路由器应用,推动绿色出行,响应环保理念

在智慧城市环保事业发展领域,新能源技术应用成熟,物联网技术越来越广泛,充电桩物联网成为了智慧城市建设的热门应用。充电桩作为新能源汽车的重要配套设施,对于节能减排和推动环保理念可持续发展具有重要意义。而工业4G路由器作为…

OpenLayers入门,OpenLayers6的WebGLPointsLayer图层样式运算符详解

专栏目录: OpenLayers入门教程汇总目录 前言 本章讲解使用OpenLayers6的WebGL图层显示大量点情况下,列举出所有WebGLPointsLayer图层所支持的所有样式运算符大全。 二、基于的OpenLayers版本 "ol": "^6.15.1"使用npm安装依赖npm install ol@6.15.1使…

Transformer——encoder

本文参考了b站的Eve的科学频道中的深入浅出解释Transformer原理和DASOU讲AI中的Transformer从零详解。 入浅出解释Transformer原理 Transformer从零详解 前言: 在自然语言识别中,之前讲过lstm,但是lstm有明显的缺陷,就是当文本过…

GNSS技术在灾害监测与应急响应中的关键作用

全球导航卫星系统(GNSS)技术在灾害监测与应急响应领域发挥着重要作用,为预防、监测和应对自然灾害提供了关键数据支持。本文将深入探讨GNSS技术在灾害监测与应急响应中的作用,并分析其对提高应对灾害能力的重要性。 一、GNSS在灾害…

78基于matlab的BiLSTM分类算法,输出迭代曲线,测试集和训练集分类结果和混淆矩阵

基于matlab的BiLSTM分类算法,输出迭代曲线,测试集和训练集分类结果和混淆矩阵,程序有详细注释,数据可更换自己的,程序已调通,可直接运行。

大模型的实践应用7-阿里的多版本通义千问Qwen大模型的快速应用与部署

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用7-阿里的多版本通义千问Qwen大模型的快速应用与部署。阿里云开源了Qwen系列模型,即Qwen-7B和Qwen-14B,以及Qwen的聊天模型,即Qwen-7B-Chat和Qwen-14B-Chat。通义千问模型针对多达 3 万亿个 token 的多语言数据进行了…

轻量封装WebGPU渲染系统示例<37>- 多个局部点光源应用于非金属材质形成的效果(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/BasePbrMaterialMultiLights.ts 当前示例运行效果: 此示例基于此渲染系统实现,当前示例TypeScript源码如下: export class BasePbrMaterial…

5.4 Windows驱动开发:内核通过PEB取进程参数

PEB结构(Process Envirorment Block Structure)其中文名是进程环境块信息,进程环境块内部包含了进程运行的详细参数信息,每一个进程在运行后都会存在一个特有的PEB结构,通过附加进程并遍历这段结构即可得到非常多的有用信息。 在应用层下&am…

SQL基础理论篇(九):存储过程

文章目录 简介存储过程的形式定义一个存储过程使用delimiter定义语句结束符存储过程中的三种参数类型流控制语句 存储过程的优缺点参考文献 简介 存储过程Stored Procedure,SQL中的另一个重要应用。 前面说的视图,只能勉强跟编程中的函数相似&#xff…

datagrip只导出表结构

话不多说,直接上教程。 datagrip版本:2022.3 第一步,连接数据库 第二步,右击数据库,复制即可

vivado产生报告阅读分析14-时序报告10

Vivado IDE 中的例外报告 “ Report Exceptions ”对话框 在 AMD Vivado ™ IDE 中 , 选择“ Reports ” → “ Timing ” → “ Report Exceptions ” ( 报告 > 时序 > 例外报告 ) 即可打开“Report Exceptions ”对话框。 从“…

做接口自动化遇到的20个难点,记录下我是如何解决的!

我是一名接口自动化测试工程师,在公司中负责接口自动化测试的设计和执行。在公司中,接口自动化测试非常重要,因为公司的业务场景非常复杂,需要保证接口的质量。在这篇文章中,我将分享我在公司中接口自动化测试遇到的20…

Java JSON字符串替换其中对应的值

代码: public static void main(String[] args) { // String theData crmScene.getData();String theData "[{\"type\":1,\"values\":[\"审批中\",\"未交付\"],\"name\":\"status\"}]"…

UE4 基础篇十四:自定义插件

文末有视频地址和git地址 一、概念 虚幻里插件都是用C++写的,C++包括.h文件和.cpp文件,.h头文件通常包含函数类型和函数声明,cpp文件包含这些类型和函数的实现, 你为项目编写的所有代码文件都必须位于模块中,模块就是硬盘里的一个文件夹,包含名为“Build.cs”的C#文件…

政府采购变数大,联想还值不值得代理渠道商们“跟”?

文|新熔财经 作者|余一 “事业单位更换纯国产电脑”、“联想被排除在大订单之外”等消息下,联想硬件终端产品面临的问题日益严峻。 早在今年年初,联想集团(下称联想)掌门人杨元庆坦承,“智能…

深入了解Java 8 新特性:Stream流的实践应用(一)

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概一万多字,预计阅读时间长需要10分钟(不要害怕字数过多,其中有一大部分是示例代码,读起…

关于在3dsmax中制作的模型导入UE后尺寸大小不对的问题

现象 在3dsmax中的基本单位为毫米 在UE中基本单位是厘米 我在3dsmax中创建一个长宽高均为1000mm的方块 然后导入到UE中的世界坐标原点 方块向X轴正方向移动100个单位100cm1000mm,按理来说,新方块的此时应该和旧方块是贴着的,但是现象确是两者…

厦门城市内涝的落地解决方案,城市内涝积水监测系统

有来过厦门的都知道这是一座让人想要扎根的城市,但是这座城市在受2023年第11号台风“海葵”影响,9月份连续3天出现大暴雨天气,厦门受强降水影响,全市共有积水点位24处,造成了极大的交通阻塞,却没有及时进行…

P9232 [蓝桥杯 2023 省 A] 更小的数(区间DP)

求大数字某连续部分反转后&#xff0c;比原数字小的个数 思路&#xff1a;自前向后遍历 ai是位于数字第i位的数字 aj是位于数字第j位的数字&#xff08;i<j&#xff09; ai>aj f[ai][aj]1; ai<aj f[ai][aj]0; aiaj f[ai][aj]f…