主机端开发中如何设置与特定广播设备配对方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_24179601/article/details/86681460

本文主要讲解,在开发主机过程中,我们常常需要对特定的从设备进行过滤连接,以防止和其他符合SIG规范的不需要的BLE设备连上,造成不必要的麻烦;那么怎样才能实现过滤呢,这里主要通过广播数据来进行区分。
一、 从机端广播
在这里插入图片描述
图1
这里设置USER_ADVERTISE_DATA宏定义即为广播数据,\x05表示以下三行的总长度,单位为字节;ADV_TYPE_COMPLETE_LIST_16BIT_SERVICE_IDS指以下两行的服务是16bit的,这里有两个服务,一个读写服务(注意,这个服务的内容跟通信用的UUID没什么关系,相当于只是一个代号,非标准服务),一个OTA服务(标准服务),\x11表示下面两行的总长度,ADV_TYPE_COMPLETE_LIST_128BIT_SERVICE_IDS表示接下来的服务是128bit的,其实现在大部分都是采用16bit的服务。这里配置好后反应在广播中如下:
在这里插入图片描述
图2

这里都是能与从机代码里对应上的。需要注意的是Details里的长度LEN是以十进制显示的,换算为十六进制与代码里正好对应。

二、 主机端代码:
在这里插入图片描述
图3

这里的广播包宏定义可以根据需求配置,只要按照广播包数据对比相同即可实现过滤,这里我们通过特定字节(服务类型)过滤;\x05表示后面几个数据的长度,\x03表示后面两个服务的类型,接下来是两个服务;主要用于与主机搜索到的广播包数据进行对比是否相同,相同就连接,不同就继续扫描;那么怎么判断呢;以下语句:
在这里插入图片描述
图4

这里加了一句代码log打印,我们可以看看刚刚的从机广播在主机端是怎么反应的,如下:
在这里插入图片描述
图5

可以看到,这里的显示与图2是一样的,在if(!memcmp(&param->report.data[3], USER_ADVERTISE_DATA, USER_ADVERTISE_DATA_LEN))中,表示从report.data[3]开始与主机端定义的USER_ADVERTISE_DATA进行匹配,相同即通过;这里的系数3可以通过APP来看,在图二中,从第一个数开始数0,每行依次数下来,在第二行第一个数开始就是我们要比较的数据,而这个数据就是第3个数(从0开始加)。至此,配置完成,既能实现广播包过滤了。

这里需要注意的是:
1、 在主机端设定过滤特定服务时,宏定义一定要正确,不能只写服务省掉了长度和服务类型。
2、 Memcmp中report.,data[]系数地址要与广播包的匹配上。否则匹配不成功。
3、 对于过滤,这里只是采用了一种常规的方式,只要主机端USER_ADVERTISE_DATA数据与广播包数据匹配上即可

猜你喜欢

转载自blog.csdn.net/qq_24179601/article/details/86681460