central 如何对peripheral进行数据的读和写?
我在peripheral中,开设了主服务0xFFF0,然后服务下的0xFFF1具有read和notify权限,0xFFF2具有write权限。
我用central进行如下的操作:
1、调用GAPCentralRole_StartDiscovery去扫描peripheral;
2、当扫描到设备以后,进一步调用simpleBLEFindSvcUuid函数进行服务筛选,如果找到了0xFFF0服务后,就调用GAPCentralRole_CancelDiscovery退出扫描;
3、扫描完成后,因为2那里扫描到了符合的设备,于是调用GAPCentralRole_EstablishLink函数进行连接;
到了这里,就不知道该如何进行下一步的操作了。
现在的问题,有以下几个:
1)、连接上设备后,怎么搜索主服务oxFFF0下面的所有特性值,如0xFFF1、0xFFF2、0xFFF3等;
2)、假设通过主服务0xFFF0,搜索到服务下的特性0xFFF1,该通过什么函数去搜索该特性的权限?
3)、假如已经搜索到,0xFFF1具有read和notify权限,那么,通过什么函数去读0xFFF1的特征值。如果该特性还具有write的权限,又该怎么把数据写进去呢?
TI官方提供的central工程,没有那么详细的操作。而看gatt.h里面的函数描述,也看得很迷糊。
请问我该怎么解决以上提出的几点问题呢,谢谢!
官方central例程是和官方peripheral例程配合使用的,使用的都是samplegattprofile
central例程里面写了如何对peripheral进行读写操作的例子,注意看central代码里面对向上的按键处理的部分
你好,
你需要好好研究一下代码中SimpleBLECentral_handleKeys()函数。
里面的up按键里面有一块代码如下:
// Do a read or write as long as no other read or write is in progress
if (doWrite)
{
// Do a write
attWriteReq_t req;
req.pValue = GATT_bm_alloc(connHandle, ATT_WRITE_REQ, 1, NULL);
if ( req.pValue != NULL )
{
req.handle = charHdl;
req.len = 1;
req.pValue[0] = charVal;
req.sig = 0;
req.cmd = 0;
status = GATT_WriteCharValue(connHandle, &req, selfEntity);
if ( status != SUCCESS )
{
GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
}
}
}
else
{
// Do a read
attReadReq_t req;
req.handle = charHdl;
status = GATT_ReadCharValue(connHandle, &req, selfEntity);
}
if (status == SUCCESS)
{
procedureInProgress = TRUE;
doWrite = !doWrite;
}
}
你可以看到GATT_WriteCharValue函数和GATT_ReadCharValue函数就是直接对服务器端数据进行读写的函数,调用的句柄是一个结构体,结构体里面就定义了UUID的值。
typedef struct
{
uint16 handle; //!< Handle of the attribute to be written (must be first field)
uint8 len; //!< Length of value
uint8 *pValue; //!< Value of the attribute to be written (0 to ATT_MTU_SIZE-3)
uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2))
uint8 cmd; //!< Command Flag
} attWriteReq_t;
希望对你有帮助。
你好,我用light blue模拟出peripheral设备,主服务0xFFF0下有几个特性,然后在连接上以后,调用GATT_DiscAllChars函数去扫它的特性,把结果打印出来,看到了其中的几个数据:
23 00 12 24 00 F1 FF
27 00 88 28 00 F2 FF
2B 00 9E 2C 00 F3 FF
30 00 BE 31 00 F4 FF
我想问的是,0xFFF1下的两个handle:0x0023和0x0024有什么区别,如果0xFFF1具有读写权限,那么我该用0x0023去读写还是用0x0024去读写呢,谢谢!
建议您用btool工具 然后就可以看见不同的UUID对应不用的handle
你好!
我用btool去连接,发现进行读写操作的handle是0x0024,只是我想知道0x0023是什么handle,可以用来干嘛的而已。
BLE协议规定特征包括三个部分:Declaration声明,value自身的值,Description描述。三个部分handle都不是一个地址的。
所以你看到了0x24是真实的可以操作的值,前后的都是只读的一个是declaration,一个是description
uint8 cmd // Command Flag
有人知道这个Command Flag是干啥用的么?
你好;
你调用establish——link函数是在case :GAP_DEVICE_INFO_EVENT里调用的吗?我调用了,结果并没有连接。没有返回GAP_LINK_ESTABLISHED_EVENT,所以想问你是在哪里调用的,条件是什么?