完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
首先,要“听”和“听”的区别,
可以将设备设备或说从机(通常作为服务器)的数据传给主机(通常为有设备方式: 1、从机主动上报包括通知或指示; 2、主机端去读,这时候主动权在主机侧,而不是从机侧。 这里我们先来讨论下,通知 notify 先能解决的问题,然后才可以从机端解决,然后我们才能从机端解决问题。 目录cccd的uuid是0x2902 我们根据主服务查到的句柄区间,再去通过GATT_ReadUsingCharUUID查到cccd的句柄: attReadByTypeReq_t 请求; req.startHandle = centralSvcStartHdl; req.endHandle = centralSvcEndHdl; req.type.len = ATT_BT_UUID_SIZE; req.type.uuid[0] = LO_UINT16(GATT_CLIENT_CHAR_CFG_UUID); req.type.uuid[1] = HI_UINT16(GATT_CLIENT_CHAR_CFG_UUID); 结果 = GATT_ReadUsingCharUUID(centralConnHandle, &req, centralTaskId); 然后在 gatt_discivery 的事件里面去把发现所有的带有 cccd 的句柄记录下来: 案例 BLE_DISC_STATE_CCCD: 如果(pMsg->方法== ATT_READ_BY_TYPE_RSP){ if(pMsg->msg.readByTypeRsp.numPairs > 0 ) { centralCCCDHdl = BUILD_UINT16(pMsg->msg.readByTypeRsp.pDataList[0], pMsg->msg.readByTypeRsp.pDataList[1] ); for(unsigned char i = 0; i < pMsg->msg.readByTypeRsp.numPairs ; i++){ char_value_handle_list[cccd_handle_index++] = BUILD_UINT16(pMsg->msg.readByTypeRsp.pDataList[pMsg->msg.readByTypeRsp.len * i], pMsg->msg.readByTypeRsp.pDataList[pMsg->msg.readByTypeRsp.len * i+1]); } } ble_db_dis_state = BLE_DISC_STATE_IDLE; } 然后再把char_handle_handle_handle的cccd_handle_index++的把柄_handle_handle存能清单[: uint8_t 数据[2] = {0x01,0x00}; 返回 central_gatt_write_char_value(connection_handle,notify_handle,data,2); 其中: uint8_t central_gatt_write_char_value(uint16_t connection_handle,uint16_t char_handle,uint8_t *data,uint16_t 长度){ uint8_t 结果; attWriteReq_t 请求; req.cmd = 假; req.sig = 假; req.handle = char_handle; req.len = 长度; req.pValue = GATT_bm_alloc(connection_handle,ATT_WRITE_REQ,req.len,NULL,0); if ( req.pValue != NULL ){ tmos_memcpy(req.pValue,data,length); 结果 = GATT_WriteCharValue(centralConnHandle,&req,centralTaskId); 如果(成功 == 结果){ 返回成功; }别的{ GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ); write_data_when_failed.connection_handle = connection_handle; write_data_when_failed.char_handle = char_handle; write_data_when_failed.data_length = 长度; tmos_memcpy(write_data_when_failed.data,data,write_data_when_failed.data_length); PRINT("data0 data1=%02x %02x rn",write_data_when_failed.data[0],write_data_when_failed.data[1]); tmos_start_task(centralTaskId,START_WRITE_EVT,80); 返回结果; } } 返回 0xff; } 使能cccd之后,就可以在 GATT的事件里面有类似的处理函数内,接收到通知数据了 静态无效centralProcessGATTMsg(gattMsgEvent_t *pMsg){ 如果(中央状态!= BLE_STATE_CONNECTED){ // 如果在连接断开后收到 GATT 消息, // 忽略消息 返回; } 开关(pMsg->方法){ 案例 ATT_HANDLE_VALUE_NOTI: PRINT("ATT_HANDLE_VALUE_NOTI->"); for(uint16_t i=0;imsg.handleValueNoti.len;i++){ PRINT("%02X",pMsg->msg.handleValueNoti.pValue); } 打印("rn"); 读读 这里是类似的类似cccd的句柄,需要查询,把char值的句柄查到,,然后根据句柄,调用 extern bStatus_t GATT_ReadCharValue(uint16 connHandle, attReadReq_t *pReq, uint8 taskId); 然后在 GATT 的事件里面有下面类似的处理函数里面, 接收到 ATT_READ_RSP 的值: 静态无效centralProcessGATTMsg(gattMsgEvent_t *pMsg){ 如果(中央状态!= BLE_STATE_CONNECTED){ // 如果在连接断开后收到 GATT 消息, // 忽略消息 返回; } 开关(pMsg->方法){ 案例 ATT_READ_RSP: PRINT("接收到ATT_READ_RSP的值->"); for(uint16_t i=0;imsg.readRsp.len;i++){ PRINT("%02X",pMsg->msg.readRsp.pValue); } 打印("rn"); |
|
|
|
只有小组成员才能发言,加入小组>>
446 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2862 浏览 2 评论
2350 浏览 1 评论
794浏览 2评论
CH565W以太网,是必须有SKCKET中断才能发送数据吗?
425浏览 1评论
329浏览 1评论
用DVP采集图像,用UDP传给PC端,采集两帧后图像报错是什么原因?
465浏览 1评论
CH569通过HSPI实现USB3.0和FPGA高速双向通讯
617浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-14 13:17 , Processed in 0.997619 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号