CH573 CH582 CH579蓝牙从机(Peripheral)/主机(Central)例程讲解一(蓝牙主从机收发数据接口说明)
原文链接:
https://www.cnblogs.com/risc5-ble/p/15994545.html
前言:
蓝牙从机,顾名思义,就是一个蓝牙从设备,可以不断发送广播等待与主机建立连接进行通信,建立连接后,可以通知主机,也可以收到主机发的信息,
一般使用BLE调试助手(安卓应用市场可下载),ios可使用Lightblue来进行调试通信等的基础功能。
如果用Central例程来连接Peripheral例程的话,需要将Peripheral例程中宏BLE_MAC设置成TRUE,否则的话Peripheral例程使用自带的MAC,与主机例程中的目标设备MAC不对应,主机不会发起连接。
首先讲解一下Peripheral例程的蓝牙收发接口吧,这样的话比较方便上手,大多数需要修改的都在peripheral.c中修改,
从机给主机发送数据例程是通过一个一秒执行一次的tmos任务来实现的,接口函数如下:
蓝牙从机的收发接口:
一、蓝牙从设备例程(Peripheral例)发送蓝牙数据:
tmos_start_task(Peripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD);
这个任务第一次调用是在蓝牙连接后,因为不连接调用它也没什么意义,
任务里会调用此蓝牙发送函数performPeriodicTask();
二、蓝牙从设备例程(Peripheral例)接收蓝牙数据:
接收主机的数据也已经包装好了,例程只打印输出了一段标识,代表接收到数据了,可以自己添加处理下,
三、蓝牙串口例程(BLE_UART)接收蓝牙数据:
四、此例程蓝牙发送数据的方式是将串口3收到的数据通过蓝牙发送给主机,当然也可以自己调用notify函数发送实现。
蓝牙主机的收发接口:
一、当主机是手机时,使用BLE调试助手:
二、当主机为CH573时:
蓝牙主机例程(Central)接收蓝牙数据:
蓝牙主机例程(Central)发送蓝牙数据:
此主机例程在不修改的情况下只适用于与Peripheral例程通信,原因是枚举服务是针对Peripheral例程服务去写的,
如果需要和别的从机通信可以将主机写成像手机那样枚举从机的所有服务,获取其handle进行通信,例程可发送邮件至hy@wch.cn获取,
也可像主机例程这样,已经知晓从机的UUID根据UUID去获取handle进行通信。。
蓝牙包大小修改:
在config.h文件中BLE_BUFF_MAX_LEN默认是27,此时默认的MTU只有23,一包数据最大20字节,
默认例程实际传输就写的一个字节,可以修改gattprofile.h宏定义SIMPLEPROFILE_CHAR1_LEN为20,
如果想修改的再大一点的,那么有两种方法,一种是主机发起交互,还有种是从机发起交互,
主机分三种:手机电脑平板等设备,沁恒的蓝牙主机,其他厂商的蓝牙主机,
首先需要将从机端代码中BLE_BUFF_MAX_LEN可以直接修改到最大值251,
1.手机电脑平板等设备的话,直接通过软件去配置即可,
ps后期加图:在BLE调试助手右上角的三个点里面,
2.沁恒的蓝牙主机的话,将主从的BLE_BUFF_MAX_LEN修改为251,此时在连接后,协议栈底层会交互MTU为247,SIMPLEPROFILE_CHAR1_LEN修改为244,
若是别的从机可以主机调用交互:
attExchangeMTUReq_t req;
req.clientRxMTU = 247;
GATT_ExchangeMTU(centralConnHandle, &req, centralTaskId);
3.其他厂商的主机,可以通过代码实现。
从机发起交互:
步骤1:BLE_BUFF_MAX_LEN需要修改为251,
步骤2:在初始化函数Peripheral_Init()中添加GATT_InitClient();
步骤3:在蓝牙连接后调用GATT_ExchangeMTU来修改MTU。
attExchangeMTUReq_t req;
req.clientRxMTU = 247;
GATT_ExchangeMTU(peripheralConnList.connHandle, &req, Peripheral_TaskID);