计划的每周末更新,由于个人的原因上周落下了。 今天来分享一下蓝牙相关的开发,从入门的开始,先来讲一下手机端和开发板的蓝牙通讯。 大体流程是:手机发送命令到开发板,开发板接到命令之后做出响应,给发送端通知或者传递一下数据信息,内容涉及到一个交互的过程,我计划先录制个视频来演示整个过程。 演示视频放在 “ 哔哩哔哩 ” 上了,大家可以点击 演示视频 看一下效果,是自己想要的效果就继续往下看。 接下来是代码展示 主要修改的是 simple_gatt_service.c 文件的 sp_gatt_write_cb 函数 以上是代码展示 在接收到的数据是 1 字节的时候执行这部分代码。 把接收到的数以 "Hello %s!" 格式进行处理,通知到蓝牙客户端同时显示在屏幕上。 代码很简单,可能大部分玩家也都写了同样的代码,但是手机端总是收不到开发板通知的信息,要解释这个问题就需要了解一下蓝牙。文中如果讲的不对,还请指点纠正。 接下来白话一下蓝牙。 提到蓝牙, Service 和 Characteristic 是必须要简单了解一下的 Service 和 Characteristic Service 是服务, Characteristic 是特征值。蓝牙里面有多个 Service ,一个 Service 里面又包括多个 Characteristic ,具体的关系可以看图 service 和 characteristic 的关系 图中画的比较少,实际上一个蓝牙协议里面包含的 Service 和 Characteristic 是比较多的 ,这时候你可能会问,这么多的同名属性用什么来区分呢?答案就是 UUID ,每个 Service 或者 Characteristic 都有一个 128 bit 的 UUID 来标识。 Service 可以理解为一个功能集合,而 Characteristic 比较重要,蓝牙设备正是通过 Characteristic 来进行设备间的交互的(如读、写、订阅等操作)。 这段描述摘自 “ 简书 ” 一位大佬在《蓝牙BLE(BlueTooth BLE)入门及爬坑指南》一文中对蓝牙的描述。 看完之后,会不会明了一下。蓝牙通讯是通过一个一个 “Characteristic” (特征码)来实现一个一个“Service”功能集合,所以这个 “Characteristic” (特征码)必须选择正确了,才能正常的发送数据,接收数据。 下面截图时我的演示实例中的 “Characteristic” (特征码)选择。 看到这儿大伙明白了一些了, 之前开发板收不到数据,或者手机蓝牙收不到通知其实都是这个 UUID 配置的不正确导致的 ,那又有个问题来了,为什么要这样配置呢? 接下来接续看代码 1 、透传服务的 UUID 来自于下面的代码片段 2 、透传 TX 特征的 UUID ,其实就是开发板通知手机端用的 Characteristic ,要看三部分 这里用的是 SP_IDX_CHAR4_VALUE UUID 来自 SP_CHAR4_UUID 这样就确定了这个 UUID 。 3 、透传 RX 特征的 UUID ,手机给模块发送数据用的 Characteristic 只要这个 Characteristic Value 有 GATT_PROP_WRITE 权限 就可以写数据到开发板 经过查代码得知图中标记三个的Characteristic的UUID都有Wirte权限,所以选择这三个UUID都是可以的,经过验证确实是这样的。 今天的开发板的蓝牙通讯已经结束了。大家需要演示固件或者演示源码联系我,后面有需要我会把源码开放在 github 或者码云,供大家体验。 之前漏掉了 sp_gatt_msg_handler 的调整,下面补上【2020-06-29】 sp_gatt_msg_handler 方法的调整 修改前的 att_idx); 图片是修改后的,增加了 conn_idx 搜索 复制