蓝牙通信有个基本的功能,那就是使用蓝牙来进行数据通信。
数据通信可以分为:主机向从机发送数据(GATT的client主动向service发送数据);主机接收从机发来的数据;从机向主机发送数据(GATT的service主动向client发送数据);从机接收主机发送来的数据。
一、主机向从机发送数据
主机发送数据,调用的是clientAPI_AttribWrite( TClientID clientID, PWriteReq pWriteReq ) 函数,现在我们看看发送函数PWriteReq 的结构体;
typedef struct
{
uint16_t wHandle; /**< Handle of the attribute to be written */
TBlueAPI_GATTWriteType wType; /**< Write type, command or request */
uint16_t wLength; /**< Length of data to be written */
uint8_t *pData; /**< Data to be written */
} TWriteReq, * PWriteReq;
下面是使用发送函数例子:
TWriteReq writeReq;
clientAPI_AttribWrite( SimpClient_ClientID, &writeReq );
发送函数有两个参数,一个是client module,另外就是写结构体,调用次函数就可以将数据发送给从机了。当然,需要主机与从机连接后进行上述操作。
二、从机向主机发送数据
从机向主机发送数据,使用的是notification,RTL8762中使用的是如下发送函数:
ProfileAPI_SendData(uint8_t ServiceIdx,
uint16_t wAttribIndex,
uint8_t* pData,
uint16_t wLength)
需要正确写入函数里面的四个参数,ServiceIdx为服务ID,wAttribIndex特征属性值,pData为需要写入数据,wLength为写入数据的长度。正确写入上述四个参数后,发送函数准备完毕。需要主机接收该函数发来的数据,则需要看下面主机接收从机发送数据。
三、主机接收从机发送的数据
1)在接收从机发送数据前,需要使能Notify_CCCD,使能Notify_CCCD就是向Notify_CCCD句柄发送1,即可。
主机与从机连接上后,可以使用函数Discovery来发现从机的句柄值。可以看出NOTIFY的服务值,其中NOTIFY服务的第一个句柄为character declaration、接着第二个句柄为character Value、接着的就是Notify_CCCD的句柄。(一般Notify_CCCD的句柄为character Value句柄+1)。
最后使用主机发送函数clientAPI_AttribWrite将clientAPI_AttribWrite将Notify_CCCD句柄置1,发送出去。
2)主机读取从机属性为read的值
主机读取从机属性为read的值,首先主机通过读取函数clientAPI_AttribRead( TClientID clientID, TReadHandleReq readHandle ),读取从机属性为read的值,函数中readHandle 为所要读取的句柄值。
从机收到读取消息后,再将相应的read属性值传输给主机。最后 ,主机可以在“SimBleClientID = SimpBle_AddClient( App_ClientCallback )”的回调函数App_ClientCallback 中 的case CLIENT_APP_CB_TYPE_READ_RESULT:获取到read属性值。
(此部分读取从机read的属性值,不需要使能Notify_CCCD。)
3)主机获取从机notify值
使能Notify_CCCD值后,此时,就不需要主机发送请求消息了。只要从机通过Notify给主机发送数据,在主机可以在“SimBleClientID = SimpBle_AddClient( App_ClientCallback )”的回调函数App_ClientCallback 中 的case CLIENT_APP_CB_TYPE_NOTIF_IND_RESULT:获取到从机传来的数据。
四、从机接收主机数据
从机接收主机发来的数据相当于简单些,从机可以通过Service_AddService(AppProfileCallback)种的回调函数AppProfileCallback获取到想要的数据,进入回调函数里面,case SERVICE_CALLBACK_TYPE_WRITE_CHAR_VALUE:中回去到主机发过来的数据。