TI中文支持网
TI专业的中文技术问题搜集分享网站

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里面的函数描述,也看得很迷糊。

请问我该怎么解决以上提出的几点问题呢,谢谢!

Barbara Wu:

官方central例程是和官方peripheral例程配合使用的,使用的都是samplegattprofile

central例程里面写了如何对peripheral进行读写操作的例子,注意看central代码里面对向上的按键处理的部分

kqian0327:

你好,

你需要好好研究一下代码中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;

希望对你有帮助。

user4184198:

回复 kqian0327:

你好,我用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去读写呢,谢谢!

Barbara Wu:

回复 user4184198:

建议您用btool工具 然后就可以看见不同的UUID对应不用的handle

user4184198:

回复 Barbara Wu:

你好!

我用btool去连接,发现进行读写操作的handle是0x0024,只是我想知道0x0023是什么handle,可以用来干嘛的而已。

Barbara Wu:

回复 user4184198:

BLE协议规定特征包括三个部分:Declaration声明,value自身的值,Description描述。三个部分handle都不是一个地址的。

所以你看到了0x24是真实的可以操作的值,前后的都是只读的一个是declaration,一个是description

tomol:

回复 Barbara Wu:

uint8 cmd // Command Flag

 有人知道这个Command Flag是干啥用的么?

shuzhou wong:

你好;

      你调用establish——link函数是在case :GAP_DEVICE_INFO_EVENT里调用的吗?我调用了,结果并没有连接。没有返回GAP_LINK_ESTABLISHED_EVENT,所以想问你是在哪里调用的,条件是什么?

赞(0)
未经允许不得转载:TI中文支持网 » central 如何对peripheral进行数据的读和写?
分享到: 更多 (0)