各位大神,你们好!
我从Central向Peripheral发送数据,并从串口将数据打印出来,已经实现。但是如何从Peripheral向Central发送数据呢?找了好多TI的例层,但是没找到,希望大家指教。
Yan:
hi Qin,
可以通过central 向peripheral 发送读请求, peripheral回复,
或者peripheral 发送notification, 或indication 给central 实现.
具体请参考central 和 peripheral 代码.
Qin Daohong:
回复 Yan:
Peripheral 每5秒执行performPeriodicTask( void )函数,通过SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &valueToCopy);向Central发送数据。但是SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &valueToCopy)-> simpleProfile_ProcessCharCfg( simpleProfileChar4Config, &simpleProfileChar4, FALSE )->simpleProfile_ProcessCharCfg()->GATT_Notification(),但是GATT_Notification()这个函数更本就没调用。 simpleProfile_ProcessCharCfg函数中
if ( ( pItem->connHandle != INVALID_CONNHANDLE ) && ( pItem->value != GATT_CFG_NO_OPERATION ) )
条件就没法成立。
Qin Daohong:
回复 Qin Daohong:
bStatus_t SimpleProfile_AddService( uint32 services ) {
uint8 status = SUCCESS;
// Initialize Client Characteristic Configuration attributes
for ( uint8 i = 0; i < GATT_MAX_NUM_CONN; i++ ) {
simpleProfileChar4Config[i].connHandle = INVALID_CONNHANDLE; /'/不知道这里为什么都填为INVALID_CONNHANDLE?
simpleProfileChar4Config[i].value = GATT_CFG_NO_OPERATION;
}
// Register with Link DB to receive link status change callback
VOID linkDB_Register( simpleProfile_HandleConnStatusCB );
if ( services & SIMPLEPROFILE_SERVICE ) {
// Register GATT attribute list and CBs with GATT Server App
status = GATTServApp_RegisterService( simpleProfileAttrTbl, GATT_NUM_ATTRS( simpleProfileAttrTbl ),
simpleProfile_ReadAttrCB, simpleProfile_WriteAttrCB, NULL );
}
return ( status );
}
Qin Daohong:
回复 Yan:
能给一下指导吗?
TI的工程师怎么也不给个回应呢!
Yan:
回复 Qin Daohong:
hi qin,
simpleProfile_ProcessCharCfg() 是什么? 你自己加的代码? 为什么没有用 GATTServApp_ProcessCharCfg() ?
请麻烦你再把你的具体情况说清楚一点, 是否自己加了代码.
GATTServApp_ProcessCharCfg() 会调用GATT_Notification().
请参考以下这个帖子:http://www.deyisupport.com/question_answer/analog/wireless_connectivity/f/45/t/23478.aspx
有时候你问的问题可能已经在论坛里面有人解答过了, 所以有可能的话请在提问前在论坛里面搜索一下 🙂
Yan:
回复 Qin Daohong:
INVALID_CONNHANDLE , 这是表示蓝牙连接的handle.
你初始化的时候根本没有设备给你连上, 当然默认全都是invalid.
你这个代码也不是TI 的源码, 被人改过的. 请去官网下载正宗的协议栈对比一下:
http://www.ti.com/tool/ble-stack?DCMP=wbu-blestack&HQS=blestack
Qin Daohong:
回复 Yan:
我之前用的是BLE-CC254X-1.1版本的。现在换了BLE-CC254x-1.3版本了。
我的问题是,Central和Peripheral建立连接后,Peripheral给Central的发送数据,主机接收不到数据,且没任何反应。
现在两个Central和Peripheral能建立连接。因为主机打印了Connected,还打印了从机地址0xE0C79D60DEC6。
GATTServApp_ProcessCharCfg( simpleProfileChar4Config, &simpleProfileChar4, FALSE, simpleProfileAttrTbl, GATT_NUM_ATTRS( simpleProfileAttrTbl ), INVALID_TASK_ID );是周期性地调用,但是,主机没任何反应。
Yan:
回复 Qin Daohong:
Hi Qin,
请确认主机已经把从机的CHAR4 的 notification enable打开.
Qin Daohong:
回复 Yan:
怎样做,主机才能把从机的CHAR4 的 notification enable打开呢?我之前在其他坛子也看到了你这句话,但是一直没明白。是在主机和从机连接完成后吗,还是连接过程中呢?
Yan:
回复 Qin Daohong:
Hi Qin,
这是在连接完成后进行操作的.
具体的话, 你先看simpleGATTProfile.c 中, CHAR4 的定义里, 有个
// Characteristic 4 configuration { { ATT_BT_UUID_SIZE, clientCharCfgUUID }, GATT_PERMIT_READ | GATT_PERMIT_WRITE, 0, (uint8 *)simpleProfileChar4Config },
simpleProfileChar4Config 这个值负责的就是notification 和 indication 的打开关闭.
连接成功后, master 端用 write 的方式把这个值写成 0x0001, 就把notification 打开了.