MM32W无线MCU 自定义服务和特征值
eetrendMcu 2023-03-22

MM32W0x2xxB 蓝牙功能协议栈目前以Lib 形式提供,用户通过调用相关接口的方式实现对应功能。例程中,用户如需调整BLE 数据交互的特征值、服务及数据的收发,可按照如下的几个步骤进行调整,大部分的配置都在..\SRC_LIB\app.c文件中。

蓝牙之间通信是以参数来进行数据传输,即服务端定好一个参数,客户端可以对这个参数进行读,写,通知等操作,这个东西我们称之为特征值(characteristic),但一个参数不够我们用,比如我们这个特征值是电量的值,另一个特征值是设备读取的温度值。那这时候会有多个特征值,并且我们还会对它们分类,分出来的类我们称之为服务(service)。一个设备可以有多个服务,每一个服务可以包含多个特征值,本章节将介绍如何在例程中调整服务及自定义特征值。
在收发数据的时候,对于协议的处理基本都在lib中完成了,我们只需要在对应的接口函数中进一步处理就好。

声明与定义

首先是服务及特特征值的定义,用户可以自己分配,参考结构定义如下所示:

typedef struct ble_character16{

u16 type16; //type2

u16 handle_rec; //handle

u8 characterInfo[5];//property1 - handle2 - uuid2

u8 uuid128_idx; //0xff means uuid16,other is idx of uuid128

}BLE_CHAR;

 

typedef struct ble_UUID128{

u8 uuid128[16];//uuid128 string: little endian

}BLE_UUID128;

分别修改const BLE_CHAR AttCharList[]和const BLE_UUID128 AttUuid128List[]中的数据,自行分配句柄(递增,不得重复)

1、type16 为database 每个记录的类型,具体取值根据蓝牙规范定义;

常用的三个宏定义:

#define TYPE_CHAR 0x2803 //特征值的声明

#define TYPE_CFG 0x2902 //客户端特征值配置描述符

#define TYPE_INFO 0x2901 //特征值用户描述符

2、handle_rec 为对应记录的句柄,用户可以自定义;

3、characterInfo 保存了对应特征值的属性(property1)、句柄(handle2)及uuid(uuid2),其中handle2 及uuid2 为16 bit 小端格式;

常用的属性的宏定义如下:

#define ATT_CHAR_PROP_RD   0x02   //可读

#define ATT_CHAR_PROP_W_NORSP   0x04   //可写,无需应答

#define ATT_CHAR_PROP_W  0x08    //可写

#define ATT_CHAR_PROP_NTF  0x10    //notify

#define ATT_CHAR_PROP_IND   0x20    //indicate

4、uuid128_idx 表示uuid2 的格式,如该值为UUID16_FORMAT(0xFF) 则表示uuid2 为16bit 格式,反之则表示uuid2 为128bit 的uuid 信息对应的索引值,该索引值对应于AttUuid128List 的内容索引。uuid128 为小端格式保存。UUID就是通用唯一识别码。在蓝牙协议栈中可能会有多个服务,每个服务会有多个特征值,而这些服务或者特征值都有一个唯一的ID,这样就可以区分了。这个UUID是其他设备设置蓝牙服务和特征值的唯一方法。

应答Primary Service 的查询

下一步要修改的是att_server_rdByGrType函数。

在函数中缺省情况下如果客户对Device Info 不做特别修改,可直接调用缺省函数att_server_rdByGrTypeRspDeviceInfo(pdu_type)即可。

而下面的att_server_rdByGrTypeRspPrimaryService()需要按照上面的定义填充对应的数据,其中start_hd 与end_hd 为对应Service handle 取值范围,uuid 为字符串,对应的长度由uuidlen给出。

写操作

当外界发来相关数据时,ser_write_rsp()函数将被调用。

void ser_write_rsp( u8 pdu_type/*reserved*/,

u8 attOpcode/*reserved*/,

u16 att_hd, //对应特征值句柄

u8* attValue, //数据内容指针

u8 valueLen_w) //数据长度

通过判断特征值句柄att_hd,就可以进一步处理收到的数据。

若特征值属性为ATT_CHAR_PROP_W,需要调用ser_write_rsp_pkt()函数对这次写操作进行应答,不应答会导致连接断开。

若特征值无效或未定义,则使用att_notFd()函数进行应答,参数直接引用回调函数对应参数即可。

其中att_hd 为从手机BLE 传(写)过来数据对应的特征值的句柄,数据内容保存在变量attValue 中,数据长度为valueLen_w。

读操作

类似写操作,收到读取特征值请求时,ser_write_rsp()函数将被调用。

void server_rd_rsp(u8 attOpcode, u16 attHandle, u8 pdu_type)

通过判断attHandle来执行对应操作,使用att_server_rd()函数进行应答。

void att_server_rd(unsigned char pdu_type,

unsigned char attOpcode

unsigned short att_hd, //对应特征值句柄

unsigned char* attValue, //应答数据指针

unsigned char datalen ); //数据长度

其中pdu_type和attOpcode直接引用回调函数中对应参数,每次调用发送的数据长度不得超过20字节。

同写操作,若特征值无效或未定义,则使用att_notFd()函数进行应答。

Notify 数据发送操作

在模块出厂时烧录的例程中,可以通过UART的AT指令,调用Notify数据透传,对应的接口函数是

u8 sconn_notifydata(u8* data, u8 len);

原则上数据长度可以超过20 字节,协议会自动拆包发送,每个分包最大20字节,推荐一次发送的数据尽量不超过3 个分包,该函数返回实际发送的数据长度。这一函数没有指定对应的句柄,如果用户定义了多个Notify特征值,需要在发送前使用set_notifyhandle()函数指定对应的句柄,或者直接修改变量u16 cur_notifyhandle。

下面我们以在例程中添加一个可读可写的特征值为例,最后通过手机app与BLE之间进行通信:

1、在const BLE_CHAR AttCharList[]数组最后添加

{TYPE_CHAR,0x1A,ATT_CHAR_PROP_RD|ATT_CHAR_PROP_W, 0x1B,0,0,0,4},

//User defined

即在原数组最后句柄0x19后添加新的特征值,对应特征值设置可读可写,句柄0x001B为用户自定义特征值,128位UUID,索引值为4;

2、在const BLE_UUID128 AttUuid128List[]数组最后添加对应的UUID

{0x9e,0xca,0x0dc,0x24,0x0e,0xe5,0xa9,0xe0,0x93,0xf3,0xa3,0xb5,5,0,0x40,0x6e}, //idx4,little endian, Test

3、修改att_server_rdByGrType()函数:

att_server_rdByGrTypeRspPrimaryService(pdu_type,0x10,0x1B,(u8*)(AttUuid128List[0].uuid128),16);

修改最后的句柄值。

4、修改ser_write_rsp()函数

在switch(att_hd)分支中加入

case 0x1B:

moduleOutData("Write_Server_1B\r\n",17);

ser_write_rsp_pkt(pdu_type);

break;

5、修改server_rd_rsp()函数

在switch(attHandle)分支中加入

case 0x1B:

moduleOutData("Read_Server_1B\r\n",17);

att_server_rd( pdu_type, attOpcode, attHandle, "RD_SERVE_1B", 11);

break;

如下图,程序下载运行后,我们用手机连接模块,可以看到在服务列表最后多出了一项Unknown Characteristic ,可读可写,点击读按钮,可以收到字符串” RD_SERVE_1B”,UART串口输出”Read_Server_1B”,点击写按钮发送任意值会UART串口输出”Write_Server_1B”。


图1 手机端截图

图2 UART输出 
声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 【7.24 深圳】2025国际AI+IoT生态发展大会/2025全球 MCU及嵌入式技术论坛


  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
  • 基于C51单片机实现汽车座椅自动控制系统的软硬件设计

    引言 随着人们生活水平的提高,对汽车座椅的舒适性要求也越来越高,要求对汽车座椅地调节能够更加简单、方便、快捷。目前,汽车座椅位置的调节多采用基于手动调节方式的机械和电动控制两种方式。汽车座椅位置的调节...

    07-02
  • MCS51单片机程序设计时堆栈的计算方法解析

    用C语言进行MCS51系列单片机程序设计是单片机开发和应用的必然趋势。Keil公司的C51编译器支持经典8051和8051派生产品的版本,通称为Cx51。应该说,Cx51是C语言在MCS51单片机上的扩展,既有C语言的共性,又有它自己...

    07-02
  • 51单片机定时器工作原理及用法

    TMOD : 控制定时器的工作方式。8个bit,高四位 bit 控制 T1,、低四位 bit 控制 T0。因为定时器有4种工作方式;TMOD = 0x00(工作方式0),TMOD = 0x01(工作方式0),TMOD = 0x02(工作方式2),TMOD = 0x03(工作方式3)。...

    07-02
  • 51单片机学习单片机之路总结

    学习单片机有一学期了,现在也由51转到STM32了。一直想对51的学习做一个总结。也希望对别人有一些启发。也给后学者提供一些建议。当然本文是我对自己学习过程的总结,若有不对的地方,还请高手指出。 我想,再看本...

    07-02
  • hot51增强型单片机开发板原理图

    功能要求: 一):绿灯25s倒计时,绿灯过度红灯有5s黄灯时间,红灯25s后直接跳绿灯。 二):按键按下模拟闯红灯输入,产生5s蜂鸣器鸣叫。 开发环境: 软件:Keil uVision4 硬件:HOT51增强型单片机开发板 程序代码:...

    07-01
  • 51单片机的延时子程序

    延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指令周期的区别和联系...

    07-01
  • 什么是Flash盘?Flash盘的结构是什么样的?

    Flash是大家常使用的存储之一,对于Flash,大家或多或少有所了解。上篇文章中,小编对Flash闪存的类型有所介绍。为继续增进大家对Flash的认识,本文将对Flash盘、Flash盘结构以及Flash读写操作予以介绍。如果你对本...

    07-01
  • 深谈嵌入式系统,嵌入式系统是如何组成的?

    嵌入式系统在生活中有诸多应用,大家对于嵌入式系统或多或少有所耳闻。在前两篇文章中,小编对嵌入式系统进行过详细介绍。为继续增进大家对嵌入式系统的认识,本文将对嵌入式系统的组成加以说明。如果你对嵌入式系...

    06-27
  • 嵌入式系统秘籍共享,最全嵌入式系统解析

    嵌入式系统的应用十分广泛,因此越来越多的人学习嵌入式系统。由此,在学习嵌入式系统之前,我们应当对嵌入式系统具备一些认识。所以在本文余下部分,小编将对嵌入式系统进行全面解析。如果你对嵌入式系统具有兴趣...

    06-27
  • 51单片机超声波测距程序详解

    51单片机超声波测距程序详解 超声波四通道测距:超声波测距实现分为三大块: 其一是12864带字库的液晶驱动程序: 代码如下: /////////////////12864驱动程序/////////////////////////// //1写数据 void WriteDat...

    06-25
  • 51系列单片机的引脚图

    51系列单片机的引脚图 端子介绍 l P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。 l P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子)。 l P2.0~P2.7 P2口8位双向口线(在引脚的21~28号端子)。 l P3.0~P3.7 P2口8...

    06-25
  • 51单片机串口通信需要加超时中断吗?

    接收数据时,超过一定时间就算出错. 这个超时的时间是单片机自己算出的吗?超时的时间是由编程序的人定的,他定多长就多长从一段程序开始 实现电脑向 单片机发送一些数据,单片机返回Iget +数据 #include #define u...

    06-25
下载排行榜
更多
评测报告
更多
广告