找回密码
 立即注册

使用微信账号登录

只需一步,快速开始

楼主: RobotHCS

[其他] da14580

[复制链接]
连续签到天数:1天
签到总天数:493天
签到总奖励:7020金币
 楼主| 发表于 2016-7-4 14:51:30 | 显示全部楼层
da14580之12.2.2.创建数据库函数

从上节中可以知道这个数据库有4个16位的UUID、2个128位的UUID以及0个32位的UUID,这些参数是要传到协议栈去的,相当于先申请一个空间,再在这个空间上面填数据。
显然上面的函数是一个回调函数,这个回到函数通其它消息进行调用。
上图第82行函数是添加服务,其实就是向协议栈申请内存以及向协议栈获取起始句柄。注意的是87行的参数是申请的内存的大小,这个大小会有特性的多少以及特性的值多少而决定的。这里首要服务的UUID为16字节、特性声明有1(Permission)+2(handle)+16(UUID)、特性值申明有1字节,这个1字节的意思是这个特性以1字节为单位进行收发,当然更具需求这个值是可以修改的、对于第2个特性因为具有通知的许可,所以他还带有CCCD的句柄,它的值为固定2字节,0表示关闭通知功能,1表示开启通知功能。所以总共为58字节长度。
下图中102行向数据库中添加首要服务声明,最后一个参数参数是协议栈返回的句柄值,只是这里服务的句柄和首要服务声明的句柄是一样的,所以第一个参数和最后一个参数使用的是同一个变量。112行是设置首要服务的属性值,这个值就是一个128位的UUID。121行是第一个特性声明,这个声明会从协议栈返回一个这个特性的句柄给char_hdl变量。131行是第一个属性的属性值声明,同样会得到一个句柄val_hdl,而这个变量是一个局部变量最终会赋值给一个全局变量结构体变量sample128_1_char.attr_hdl。143行为赋值上面声明的属性值的value段。因为特征值2具有通知功能所以需要CCCD的特性声明,所以169行即为CCCD的声明。179行设置这个服务于不使能状态,使用到了Permission许可。182行是RW内核相关的,设置这个任务为空闲状态。186行就是发送一个消息给TASK_APP任务,告诉它数据库创建完毕。
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:493天
签到总奖励:7020金币
 楼主| 发表于 2016-7-4 14:52:06 | 显示全部楼层
da14580之12.3.GATT数据库操作

在协议栈中建立了服务的数据库,但是仅仅是一堆数据建立完成,如何进行操作呢?对于da14580因为有RW系统,所以基本上这个对数据库的访问都是通过消息进行传递的。主要有哪些操作?
12.3.1. 使能数据库
在建立数据库时,数据库被设备不使能状态,所以在蓝牙连接建立时需要使能数据库,具体的函数如下,其实就是对特征值进行初始化。
12.3.2. 发送数据
特征值2具有发送和通知的属性,既然有发送,那么就会有特性值更新,如下图中的函数,这个函数中还会判断通知的标志是否开启,如果开启,那么会发送消息给内核,通过内核将这个变量发送给对端设备。


同时在283行中会有处理失败的消息发送给TASK_APP任务,但是这个失败的消息处理函数需不需要就看应用层有没有必要了。



12.3.3. 数据接收

接收数据有可能是远程设备发送给特征值1句柄的也有可能是发送给特征值2CCCD开启或者关闭通知属性的。所以在函数中会有一些判断,首先判断句柄是哪一个,再根据句柄作出不同的处理,一个是发送个应用层,发送给应用层是通过sample128_send_val()发送的,实际上是向应用层发送一个消息,另一个是设置CCCD的值同时将这个值保存在一个全局变量,以被应用层调用,最后还有一个函数是发送一个应答给对端设备。具体函数如下:






消息SAMPLE128_VAL_IND的回调函数,也就是应用层接收到了远程设备的数据,数据怎么应用就看需求了。

12.3.4. 关闭数据库

协议栈中会检查服务是不是关闭,如果关闭了会通知应用层。


消息SAMPLE128_DISABLE_IND对应的回调函数,实际上就是应用层填数据了。


OK!到这里整个profile的数据库建立完毕,这样可以去看应用层、RW任务以及协议栈之间是怎么通信交互的了。
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:493天
签到总奖励:7020金币
 楼主| 发表于 2016-7-4 14:52:45 | 显示全部楼层
da14580之12.4.应用层开发

12.4.1. 应用层创建服务的任务
对于RW系统来说都是任务和任务之间交互,TASK_APP和profile之间都是通过消息通信,所以profile也需要建立任务,那么在哪里建立呢?在SDK中有一个函数void prf_init_func(void),这个函数会调用每个profile的初始化函数。





voidsample128_init(void)函数在sample128.c中定义:


那么prf_init_func()函数在哪里调用呢?在第1节启动章节中开头就有一个跳转表jump_table_base,在这个跳转表中有调用这个函数。
12.4.2. 应用层建立数据库

在6.4节中调用app_db_init_func()函数其实就会创建各个Profile的数据库,也就是需要将上面创建数据库的函数放在这个函数中作为入口。实际上就将下面函数加入到这个函数中。


也就是发送消息SAMPLE128_CREATE_DB_REQ,而消息对应的回调函数:




也就是12.2.2节提到的:



12.4.3. 应用层使能数据库
在8节设备连接建立时会调用app_connection_fun()函数,在这个函数中调用profile使能函数,如下调用void app_sample128_enable(void)函数,也就是最终调用sample128_enable_req_handler回调函数:



12.4.4. 应用层数据发送

在12.3.2节中的函数回调函数即为发送数据的句柄:


也就是对于应用来说就是通过TASK_APP任务发送一个消息给这个任务,从而调用这个函数,而发送的值,通过参数传送进来。例如:


在需要发送数据的地方,调用这个函数即可。

12.4.5. 应用层接收数据

在12.3.3节中以及提到,接收到的应用数据最终在回调函数中处理:
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:493天
签到总奖励:7020金币
 楼主| 发表于 2016-7-4 14:53:43 | 显示全部楼层
da14580之12.5.C和H文件分析

对于da14580的profile有它的基本规则,一般是有4个文件,分为两部分:
l  Profile的GATT数据库建立文件
sample128.c:被sample128 _task.c中的回调函数调用
sample128.h         
sample128 _task.c:这个函数是应用和协议栈之间进行消息传递的回调函数
sample128 _task.h
l  应用层相关配置
App_sample128.c:文件中的函数是应用层向协议栈传递消息的入口函数
App_sample128.h
App_sample128 _task.c:文件中的函数是协议栈向应用层传递的消息对应的处理函数
App_sample128 _task.h
12.5.1. sample128.c文件
sample128.c文件中定义了服务的UUID以及主要有如下几个函数:
  
函数
   说明
void sample128_init(void) 被void prf_init_func(void)调用
void sample128_send_val(uint8_t val) 被gattc_write_cmd_ind_handler调用,这个函数就是发送消息SAMPLE128_VAL_IND给应用层,告诉应用层接收到了对端设备发送过来的数据
void sample128_disable(void)

void sample128_upd_char2_cfm_send(uint8_t  status) 当sample128_upd_char2_req_handler发送数据有没有成功时调用这个函数,这个函数发送一个消息给应用,应用作出相应的操作。


sample128.h文件中是对上面函数的声明。
12.5.2. sample128 _task.c文件
  
函数
   说明
sample128_create_db_req_handler 创建数据库函数,对应消息SAMPLE128_CREATE_DB_REQ
sample128_enable_req_handler 使能数据库,对应消息SAMPLE128_ENABLE_REQ
sample128_upd_char2_req_handler 本地发送数据,对应消息SAMPLE128_UPD_CHAR2_REQ
gattc_write_cmd_ind_handler 接收到对端设备数据,对应消息GATTC_WRITE_CMD_IND
gap_disconnnect_ind_handler 连接断开回调,对应消息GAPC_DISCONNECT_IND


12.5.3. sample128_task.h












12.5.4. app_sample128.c文件  
函数
   说明
void app_sample128_enable(void) TASK_APP向TASK_SAMPLE128发送消息SAMPLE128_ENABLE_REQ
void app_sample128_create_db_send(void) TASK_APP向TASK_SAMPLE128发送消息SAMPLE128_CREATE_DB_REQ
void app_sample128_upd_char2(uint8_t val) TASK_APP向TASK_SAMPLE128发送消息SAMPLE128_UPD_CHAR2_REQ实际调用sample128_upd_char2_req_handler函数,这个函数有最终

App_sample128.h文件是对上面函数的声明。

12.5.5. app_sample128_task.c文件  
函数
   说明
app_sample128_create_db_cfm_handler 创建数据库完成回调函数,在sample128_create_db_req_handler句柄中发送消息SAMPLE128_CREATE_DB_CFM消息给
app_sample128_disable_ind_handler 不使能数据库指示函数
app_sample128_val_ind_handler 这个函数就是应用层接收到了对端设备发送过来的数据,可以在这个函数中处理

app_sample128_task.h文件中是对上面函数的声明。


积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:493天
签到总奖励:7020金币
 楼主| 发表于 2016-7-4 14:54:20 | 显示全部楼层
da14580之12.6.任务消息传递表

TASK_APP任务用A表示,TASK_SAMPLE128任务用S表示。  
创建数据库
   应用层------> 文件/调用-------> 消息/源任务--->目标任务 文件/调用
app_db_init_func() app_sample128.c SAMPLE128_CREATE_DB_REQ sample128_task.c
void app_sample128_create_db_send(void) A S sample128_create_db_req_handler
创建数据库状态 Profile-------> 消息/源任务--->目标任务 文件/调用------> 消息/源任务--->目标任务 文件/调用
sample128_create_db_req_handler SAMPLE128_CREATE_DB_CFM app_sample128_task.c APP_MODULE_INIT_CMP_EVT app_task.c(作用是继续创建数据库)
S A app_sample128_create_db_cfm_handler A A app_module_init_cmp_evt_handler
使能数据库 应用层------> 文件/调用-------> 消息/源任务--->目标任务 文件/调用
app_connection_fun() app_sample128.c SAMPLE128_ENABLE_REQ sample128_task.c
void app_sample128_enable(void) A S sample128_enable_req_handler
发送数据 应用层调用------> 消息/源任务--->目标任务 文件/调用------>  
app_sample128.c SAMPLE128_UPD_CHAR2_REQ sample128_task.c  
void app_sample128_upd_char2(uint8_t val) A S sample128_upd_char2_req_handler  
数据接收 接收到协议栈消息 文件/调用-------> 消息/源任务--->目标任务 文件/调用
sample128_task.c sample128.c SAMPLE128_VAL_IND app_sample128_task.c
gattc_write_cmd_ind_handler sample128_send_val S A app_sample128_val_ind_handler
数据库关闭 协议栈-------> 文件/调用-------> 消息/源任务--->目标任务 文件/调用------->
sample128_task.c sample128.c SAMPLE128_DISABLE_IND app_sample128_task.c
gap_disconnnect_ind_handler void sample128_send_val(uint8_t val) S A app_sample128_disable_ind_handler
           



未完待续……




积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:493天
签到总奖励:7020金币
 楼主| 发表于 2016-7-4 14:55:19 | 显示全部楼层
RobotHCS 发表于 2016-7-4 14:50
da14580之9.睡眠模式 10.睡眠模式下唤醒事件

9.     睡眠模式

da14580之11.WakeUP Timer使用

如果要使用这个模块,就必须将WKUP_ENABLED这个宏打开。
当应用接收到从wakeup timer产生一个中断时,系统将从睡眠模式唤醒并执行中断回调函数。
11.1.   WakeUP中断向量号



从上面注释可以看到这个中断号被3个中断共用:时间捕获中断、GPIO中断和正交解码中断使用。
11.2.   WakeUP中断回调函数怎么注册



也就是定义一个不带入口出口参数的函数然后进行传输。


11.3.    WakeUP中断回调函数在哪个地方注册
可以在主函数中进行初始化时注册一次,也可以在每次中断函数进来执行这个回调函数时对于自己再次注册。
11.4.   WakeUP回调函数中必须做事情

睡眠中唤醒后必须重新初始化所有的外设,所以在wakeup timer的中断回调函数中必须将设备再次初始化。也就是在回调函数中必须调用:
11.5.    WakeUP GPIO中断使能

当用某个引脚作为中断口时,需要调用系统提供的wkupct_enable_irq函数将所使用的IO口进行中断使能。函数原型:
例如:
每次中断产生后就必须重新调用一次上面的这个使能函数以便下次使用,就相当于清中断标志,只是这里通过重新注册中断重新使能中断。
11.6.   WakeUP GPIO中断关闭

函数原型:




























积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:493天
签到总奖励:7020金币
 楼主| 发表于 2016-7-4 14:56:14 | 显示全部楼层
da14580之12创建自己的profile

12.1.   总任务
有两个任务需要完成:
l  服务GATT数据库创建函数和属性值应用层函数实现;
l  将上面创建数据库的函数嵌入到工程中,并在应用层进行上面函数调用。
12.2.   独立服务创建
以官方Ssample128为例,创建两个特征值,一个TX一个RX,RX特征值具有读写两个特性,TX具有读和通知的特性。
12.2.1. sample128GATT数据库的元素
对于一个服务基本的元素有:首要服务声明、特性声明以及特性值声明。对于lowspp服务具有1个首要服务声明、2个特性声明和特性值声明,以及因为有通知属性所以还需要用一个CCCD(Client Characteristic Configuration Declaration)客户端特性配置声明,所以整个数据库需要6个句柄,如下:


  
Handle
   属性声明类型 UUID Value
Start 首要服务声明 0x2800 0x0F0E-0D0C-0B0A09080706050403020100
Start+1 特性声明 0x2803 0x<RD|WR><start+2>
  
1F1E-1D1C-1B1A19181716151413121110
Start+2 特性值声明 0x1F1E-1D1C-1B1A19181716151413121110 0x00
Start+3 特性声明 0x2803 0x<RD|WR><start+4>
  
2F2E-2D2C-2B2A29282726252423222120
Start+4 特性值声明 0x2F2E-2D2C-2B2A29282726252423222120 0x00
Start+5 特性配置声明 0x2902 0x0000





上面的UUID是在simple128.c中进行定义的:
上面的标注{0,0}本来是handle的值,这里设置为0因为这个handle是创建数据库之后协议栈分配的。
对于CCCD的值开始设置为0x0000,这个值会在连接后由主机写1,也就是开启通知功能,换句话说,这个特性值具有通知的功能,但是接不接通知是又主机控制的。


积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:346天
签到总奖励:7929金币
发表于 2016-7-4 16:42:08 | 显示全部楼层
dialog 不是国产的吧
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:493天
签到总奖励:7020金币
 楼主| 发表于 2016-7-4 16:48:43 | 显示全部楼层
没注意看这些
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:273天
签到总奖励:5132金币
发表于 2016-7-6 13:27:15 | 显示全部楼层
受教了~~~~~~~~~~
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

小黑屋|手机版|我爱蓝牙网 - 52Bluetooth

GMT+8, 2024-5-17 05:22 , Processed in 0.190714 second(s), 20 queries , Gzip On, MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表