修改SimpleBLECentral的代码去连接notify的心率计的问题
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(¬i.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万分感激
怎么解决的,能分享下嘛?我也是遇到这个问题
问题解决了吗