微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 修改SimpleBLECentral的代码去连接notify的心率计的问题

修改SimpleBLECentral的代码去连接notify的心率计的问题

时间:10-02 整理:3721RD 点击:

TI技术你们好,我最近在想用cc2540主机模式去连接一个心率计并且读出其数据。

在SimpleBLECentral源代码基础之上进行修改,

步骤如下:

1、首先添加接收notify消息的回调

else if ( ( pMsg->method == ATT_HANDLE_VALUE_NOTI)||
( pMsg->method == ATT_ERROR_RSP ) ||
(pMsg->method == ATT_HANDLE_VALUE_IND) )

{

attHandleValueNoti_t noti;



if ( pMsg->method == ATT_ERROR_RSP )
{
uint8 status = pMsg->msg.errorRsp.errCode;

LCD_WRITE_STRING_VALUE( "Read Error", status, 10, HAL_LCD_LINE_1 );
sbpSerialAppWrite("Read Error\r\n",12);
}
else
{
// After a successful read, display the read value
//uint8 valueRead = pMsg->msg.readRsp.value[0];
noti.handle = pMsg->msg.handleValueNoti.handle;
noti.len = pMsg->msg.handleValueNoti.len;
osal_memcpy(&noti.value, &pMsg->msg.handleValueNoti.value,noti.len);

sbpSerialAppWrite("Read rsp2:\r\n",11);

}

}

2、将所有用到uuid的地方修改为心率计的uuid

#define Heartrate_UUID 0x180d
#define Heartrate_UUID_char 0x2a37

// if ( simpleBLEFindSvcUuid( SIMPLEPROFILE_SERV_UUID,

// pEvent->deviceInfo.pEvtData,
// pEvent->deviceInfo.dataLen ) )
if ( simpleBLEFindSvcUuid( Heartrate_UUID,
pEvent->deviceInfo.pEvtData,
pEvent->deviceInfo.dataLen ) )

//uint8 uuid[ATT_BT_UUID_SIZE] = { LO_UINT16(SIMPLEPROFILE_SERV_UUID),
// HI_UINT16(SIMPLEPROFILE_SERV_UUID) };
uint8 uuid[ATT_BT_UUID_SIZE] = { LO_UINT16(Heartrate_UUID),
HI_UINT16(Heartrate_UUID) };

//req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);
//req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);

req.type.uuid[0] = LO_UINT16(Heartrate_UUID_char);
req.type.uuid[1] = HI_UINT16(Heartrate_UUID_char);

3、这样修改完了之后,central设备能够发现心率计设备,但是确不能正确发现句柄,跟踪之后发现是在此处不能正确产生simpleBLEConnHandle句柄。

GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req, simpleBLETaskId );

将此函数改为(此两个函数在功能上都能产生字符巨柄)

GATT_DiscCharsByUUID( simpleBLEConnHandle, &req, simpleBLETaskId );

能够产生正常的句柄,并且进入 正确的ATT_READ_BY_TYPE_RSP消息回调。

4、如上修改之后,也是不能正确地进行从机notify的数据接收,查询资料发现,还需要主动去修改从机的skconfig值。

在发现从机字符巨柄之后,使用如下代码去修改从机skconfig的值。

attWriteReq_t req;
req.handle = simpleBLECharHdl+1;
req.len = 2;
req.value[0] = 0x01;
req.value[1] = 0x00;
req.sig = 0;
req.cmd = 0;

status = GATT_WriteCharValue( simpleBLEConnHandle, &req, simpleBLETaskId );

status 返回成功,随后携带msg数据进入

static void simpleBLECentralProcessGATTMsg( gattMsgEvent_t *pMsg )处理函数

else if ( ( pMsg->method == ATT_WRITE_RSP ) ||
( ( pMsg->method == ATT_ERROR_RSP ) &&
( pMsg->msg.errorRsp.reqOpcode == ATT_WRITE_REQ ) ) )
{

if ( pMsg->method == ATT_ERROR_RSP)
{
uint8 status = pMsg->msg.errorRsp.errCode;

LCD_WRITE_STRING_VALUE( "Write Error", status, 10, HAL_LCD_LINE_1 );
}
else
{
// After a succesful write, display the value that was written and increment value
LCD_WRITE_STRING_VALUE( "Write sent:", simpleBLECharVal++, 10, HAL_LCD_LINE_1 );
}

simpleBLEProcedureInProgress = FALSE;

}

进入此函数之后返回Write Error 3;

请问以上步骤是否是写从机skconfig的时候出现错误了?如果是,应该如何去修正?

我估计就是去修改从机skconfig的时候出了问题,但是并没有在任何地方发现有这个的修改样例。。。求指导。。。。。

目前依然如故,求哪位大神给个主机去设置修改从机skconfig的方法。跪谢。。。。。。

20140611继续更新:

依然无法从主机中写代码去改变从机的skconfig值从而打开从机notify发送,是否有其他方法去打开从机的notify开关,求助。。。。

2014-06-11-17:11更新:

使用以下代码来试图激活心率计从机的notify功能,没有产生任何读写错误,但是依然不能产生notify的消息回调。

writeReq.handle = simpleBLECharHdl+1; // if you know the value, you can put it in as a fixed value;
// otherwise you will need to first discover the value
writeReq.len = 2;
writeReq.value[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY);
writeReq.value[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY);
writeReq.sig = 0;
writeReq.cmd = 1;

status = GATT_WriteNoRsp( simpleBLEConnHandle, &writeReq);

20140611-17:49更新:

使用以下代码去打开心率计从机的notify依然失败。

writeReq.handle = simpleBLECharHdl+1; // if you know the value, you can put it in as a fixed value;
// otherwise you will need to first discover the value
writeReq.len = 2;
writeReq.value[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY);
writeReq.value[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY);
writeReq.sig = 0;
writeReq.cmd = 1;


status = GATT_WriteNoRsp( simpleBLEConnHandle, &writeReq);

if ( status == SUCCESS )
{
GAPBondMgr_UpdateCharCfg( simpleBLEConnHandle, writeReq.handle, GATT_CLIENT_CFG_NOTIFY );
sbpSerialAppWrite("write ok\r\n", 10);
simpleBLEProcedureInProgress = TRUE;
simpleBLEDoWrite = !simpleBLEDoWrite;
}

20140612-14:29更新:

蓝牙协议栈更新到1.40,依然无法去读取从机notify的内容。

20140612-17:24更新:

问题已经完美解决,代码整理好之后发长帖子对此问题进行说明。

我现在遇到和你这边同样的问题。

//uint8 uuid[ATT_BT_UUID_SIZE] = { LO_UINT16(SIMPLEPROFILE_SERV_UUID),
// HI_UINT16(SIMPLEPROFILE_SERV_UUID) };
uint8 uuid[ATT_BT_UUID_SIZE] = { LO_UINT16(Heartrate_UUID),
HI_UINT16(Heartrate_UUID) };

//req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);
//req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);

req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR4_UUID);
req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR4_UUID);

就读不到句柄。使用GATT_DiscCharsByUUID就可以获取句柄。你这个问题是怎么解决的啊?多谢!

我也想知道你的问题是怎么解决的,我接受sensortag的值  也是你的方法 ,求解呀?

你问题解决了么,介绍一下解决方法啊

你好我也遇到您遇到的问题不知道您的长贴在哪?能不能分享下经验。谢谢

请问您是怎么解决的,能提供您整理的代码吗?多谢!

哥们,我照着你的方法,修改了UUID,但还是搜索的设备为0啊 这是为什么

我这边测试,用status = GATT_WriteNoRsp(simpleBLEConnHandle ,&req); status 返回值为success 。也可以正常收到notify 数据 但用status = GATT_WriteCharValue( simpleBLEConnHandle, &req, simpleBLETaskId ); status 返回值不是2,就是22(blepending);但status 为2时也能正常收到notify 数据,不知道什么情况。 如有人知道,或者遇到此情况,请指教。。。

你好,dali Wang

            请问你是怎么解决notification问题的,有帖子链接吗?谢谢

            

大神,跪求长贴啊!

hi Han

我想请问一下 你这个Notification使能写操作 是在哪部分写入的呢? 我直接在service found 事件后写入可是,使能不成功

前几天做的东西 忘了总结一下了,在使能Notification或者Indication的时候不能在 simpleBLECentralProcessGATTMsg 函数里进行使能。这样会造成 写失败,目前用串口进行使能,解决问题

各位好!

        我现在遇到了一个问题。我现在用SimpleBLEPeripherial SimpleBLEcentral 连接的时候,SimpleBLECentral可以收到 SimpleBLEPeripheral 0xFFF4发过来的Notification的信息。但是我用手头的一个CC2541方案的血糖仪, SimpleBLECentral可以发现和连接到血糖仪上,但是就是收不到血糖仪发过来的notification的信息。血糖仪的特征值是0x2A18 (属性是Notify)。我已经给0x2902写了配置信息,返回值是SUCCESS,但是还是收不到血糖仪发过的notify。

       我用lightBLUE连接这个血糖仪,可以连接上。在lightBLUE上对0x2A18 listen for notification,可以收到血糖仪的notification信息。

      请问我怎么设置SimpleBLECentral才能够收到血脂仪的0x2A18的notification信息那?

      非常感谢!

我同时做了一个实验。用BTOOL连接这个血脂仪,可以连接上。可以读到可读的特征值。但是同样收不到血糖仪发过来的0x2A18的特征值。BTOOL和SImpleBLECentral的情况是一样的

请问你最后怎么解决的啊,大神,能有长贴说明一下吗

楼主你好 能分享下你的成果吗?457176958@qq.com万分感激

怎么解决的,能分享下嘛?我也是遇到这个问题

问题解决了吗

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top