RTL8762蓝牙笔记-----主从机通信(二)

蓝牙通信有个基本的功能,那就是使用蓝牙来进行数据通信。

数据通信可以分为:主机向从机发送数据(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;

   writeReq.wHandle = 0x0d;         //对端接收从机的句柄
   writeReq.wType = blueAPI_GATTWriteTypeRequest;
   writeReq.wLength = sizeof( buff); //要发送数据的长度
   writeReq.pData = (uint8_t *)&buff;//要发送的数据

  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:中回去到主机发过来的数据。








你可能感兴趣的:(蓝牙学习)