cc2541之Notification

来源:互联网 发布:减员增效人员优化散文 编辑:程序博客网 时间:2024/06/03 17:58
从机给主机发送数据有两种方式:第一种:通过GATT_Notification()这个函数来通知主机。第二种:通过GATTServApp_ProcessCharCfg()这个函数通知主机。简介这两种方式,一、GATT_Notification():在从机代码中使用,由从机主动通知,且不需要主机发出请求和回应。例如,在需要从机给主机发送数据的地方,直接使用这个函数即可。void GUA_SimpleGATTprofile_Char1_Notify(uint16 nGUA_ConnHandle, uint8 *pGUA_Value, uint8 nGUA_Len)    {        attHandleValueNoti_t  stGUA_Noti;         //填充数据      stGUA_Noti.handle = simpleProfileAttrTbl[3].handle; //读取notification对应的handle    stGUA_Noti.len = nGUA_Len;   //数据长度     osal_memcpy(stGUA_Noti.value, pGUA_Value, nGUA_Len);  //赋值          //发送数据      GATT_Notification(nGUA_ConnHandle, &stGUA_Noti, FALSE);    }注意:在这里函数GATT_Notification()直接把通知发送给主机,不管是否通知是否使能。即无论notify开关是否打开,从机都能把数据发送给主机。二、GATTServApp_ProcessCharCfg()[这个函数里依然会调用GATT_Notification()这个函数,只是等待收到主机通知/read请求后,才会调用GATT_Notification()。] 在从机代码中使用,需要主机发送一次“通知请求”给从机,从机收到“通知请求”,才发送通知。即:函数GATTServApp_ProcessCharCfg内部会先判断notify开关是否打开,如果notify开关打开,则调用GATT_Notification(),发送通知给主机。 GATTServApp_ProcessCharCfg( simpleProfileChar4Config, &simpleProfileChar4, FALSE, simpleProfileAttrTbl, GATT_NUM_ATTRS( simpleProfileAttrTbl ), INVALID_TASK_ID );直接调用这一句就可以了,我们来看一下这里面的参数,@1:特征表配置参数,@2:传递的数据,@3:判断是否经过省份验证,TURE   FALSE@4:属性表@5:在属性表中属性的数目@6:任务的确认通知1.Client Characteristic Configuration(简称CCC)如何打开?答:notify开关可由主机端或者从机端打开,但应尽量保证由主机来打开比较合适,毕竟它是“主机”,“主机“就该有主动权。1)、主机端打开(推荐)先获取到CCC的特征值句柄,然后利用CCC的特征值句柄往CCC的特征值中写入0x0001。2)、从机端打开(不推荐)GATTServApp_WriteCharCfg(connHandle, simpleProfileChar4Config, 0x0001);  2.主机notify开关打开的方法?主机发送一次“通知请求”给从机,从机收到“通知请求”,具体实现方法,如下:两个步骤,第一主机给从机发送打开通知开关。第二,从机接受到主机打开通知开关的数据,然后打开本地的通知开关。第一步骤:让Client Characteristic Configuration(简称CCC)打开,先获取到CCC的特征值句柄,然后利用CCC的特征值句柄往CCC的特征值中写入0x0001。例:1)、添加宏定义(SimpleBLECentral.c中) //GUA#define GATT_CLIENT_CFG_NOTIFY                  0x0001 //打开notify开关的数值#define GATT_CLIENT_CFG_INDICATE                0x0002 //打开indicate开关的数值#define GUA_CHAR4_Hdl                           0x2E //char4的句柄 #define GUA_CHAR4_CCC_Hdl                       0x2F //char4的CCC的句柄  2)、主机给从机发送数据//开启notify的CCCattWriteReq_t req;req.handle = GUA_CHAR4_CCC_Hdl;                   //char4的CCC的特征值句柄,这里写死0x2F,可通过btool获取到req.len = 2;req.value[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY); //0x0001为开notifyreq.value[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY);        req.sig = 0;req.cmd = 0;GATT_WriteCharValue( 0, &req, simpleBLETaskId ); //将CCC(值为1,打开)发送给从机。第二步骤:从机接收到主机的notify开关cmd,如何打开从机的notify?在函数simpleProfile_WriteAttrCB()里,case GATT_CLIENT_CHAR_CFG_UUID://CHAR6的通知开关        if(pAttr->handle == simpleProfileAttrTbl[GUA_ATTRTBL_CHAR6_CCC_IDX].handle)   {   status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, offset, GATT_CLIENT_CFG_NOTIFY ); }    //其他情况不打开通知开关else  {    status = ATT_ERR_INVALID_HANDLE;  }. 调用函数GATTServApp_ProcessCCCWriteReq(),这个函数的功能是,处理主机那边过来的改写CCC的请求,比如打开/关闭notification。与这个函数相关的两个函数,也介绍一下。GATTServApp_WriteCharCfg(),就是单纯写一下CCC的值。GATTServApp_ProcessCharCfg(),就是会判断一下CCC的值,如果notification 或者indication打开的话,顺便把内容发出去。