你好,团队对话,
我已经编写了一个基于ble_central项目的程序,它查找具有特殊名称或MAC地址的BLE设备。
如果找到了一个设备,我就把它连接起来,然后写入一个特征。
我的问题是:
每次我试图写入外设时,在write - completed事件中状态是3 (att_error_write_not_allowed)。
当我尝试用我的手机通过nRF连接应用程序,我可以读和写没有任何问题。
我试用了覆盆子派、我的手机和Dialog 14680作为外设。
每次状态为3。
printf("开始写\ r \ n ");Uint16_t * mtu = 0;ble_gattc_get_mtu (evt - > conn_idx、mtu);printf("MTU Rate: %u\r\n", * MTU);Uint8_t test = 0x00;printf (" uuid: % s \ r \ n”,format_uuid(生产[0].uuid));printf(“写\ r \ n”);ble_gattc_write (evt - > conn_idx,生产[0]。句柄,false, sizeof(test),&test);
字符[0]包含来自特征的处理程序。
提前感谢您的努力。
顺致敬意,
HDR
设备:
嗨hdr,
感谢您在BLE论坛上提出的问题。你能告诉我外围设备是什么吗?是另一个DA14682吗?
谢谢,PM_Dialog
我用的是PyBluez外设的Raspberry Pi,用的是上面提到的应用程序的手机和Dialog 14680。我现在尝试DA 14682,因为我无法访问14680,因为设备是盆栽。
嗨,hdr
我也有同样的要求
你能告诉我什么是写完成事件和如何使用吗?
谢谢
如果我正确理解这一点,当我调用ble_gattc_write并且它已经被执行时,Write_Completed_Event将被调用。在返回conn_idx、处理程序和状态代码的情况下。在我的例子中,状态代码是3,代表att_error_write_not_allowed。
为了描述如何使用该事件,我将参考ble_central示例项目。
嗨,hdr
我也使用ble_gattc_write和我添加Write_Completed_Event到app_task.c如下,当ble_gattc_write完成时,这是正确的吗?
静态const struct ke_msg_handler app_gap_process_handler[]=
{
(ke_msg_func_t) gapm_device_ready_ind_handler}, {GAPM_DEVICE_READY_IND
(ke_msg_func_t) gapm_cmp_evt_handler}, {GAPM_CMP_EVT
(ke_msg_func_t) gapc_cmp_evt_handler}, {GAPC_CMP_EVT
(ke_msg_func_t) gapc_connection_req_ind_handler}, {GAPC_CONNECTION_REQ_IND
(ke_msg_func_t) gapc_disconnect_ind_handler}, {GAPC_DISCONNECT_IND
{GAPC_GET_DEV_INFO_REQ_IND,(ke_msg_func_t)GAPC_GET_DEV_INFO_REQ indu handler},
(ke_msg_func_t) gapc_set_dev_info_req_ind_handler}, {GAPC_SET_DEV_INFO_REQ_IND
(ke_msg_func_t) gapm_profile_added_ind_handler}, {GAPM_PROFILE_ADDED_IND
{GAPM_ADV_REPORT_IND,(keu msg_func_t)GAPM_ADV_REPORT_IND_handler},
{GAPC_PARAM_UPDATE_REQ_IND,(ke_msg_func_t)GAPC_PARAM_UPDATE_REQ_IND_handler},
{GAPC_LE_PKT_SIZE_IND,(ke_msg_func_t)GAPC_LE_PKT_SIZE_IND_handler},
{GAPC_CON_RSSI_IND,(ke_msg_func_t)GAPC_get_CON_RSSI_IND_handler},//Alex Add 20191030
{GATTC_READ_IND, (ke_msg_func_t)app_read_ind_handler}, //alex test 2020 0710
{GATTC_SDP_SVC_IND, (ke_msg_func_t)app_disc_all_svc}, //alex test 2020 0710
{GATTC_CMP_EVT,(ke_msg_func_t)alex_GATTC_CMP_EVT_handler},//alex test 2020 0716
//{GAPC_PEER_ATT_INFO_IND, (ke_msg_func_t)app_read_dev_ver_ind_handler}, //alex test 2020 0710
#如果(BLE_APP_SEC)
(ke_msg_func_t) gapc_security_ind_handler}, {GAPC_SECURITY_IND
# endif
};
我想你用的是另一个SDK和对话芯片。
嗨hdr,
感谢您的详细回复。根据蓝牙LE规范:
“如果由于权限原因无法写入属性值,则应发送错误响应,错误代码为«写入不允许»。”
请检查一下(外设侧)的特性是否有写权限?如果是,那么我建议再次检查Central (DA14682)是否写入了正确的处理程序(字符[0].handle)。
此外,有一个BLE嗅探器日志将是非常有用的,这样我们就可以了解在空中发生了什么。
谢谢,PM_Dialog
你好,
外围设备中的特征具有写入权限,处理程序应该是正确的。
这里是我的代码从对话框14682外围(相同的结果状态是3):
有了我的手机,我可以在特色中写作。
嗨,亚历克斯,
谢谢你的评论,但请提出另一个论坛线程。具体论坛主题与DA14682和SDK1.0.14相关。据我所知,您在设计中使用的是DA14585和SDK6,因此请使用您的问题创建另一张票证。
谢谢,PM_Dialog
嗨hdr,
谢谢你回来。你能提供一个BLE嗅探捕获/
谢谢,PM_Dialog
你好,
不幸的是,我们没有嗅探的可能。
我们将继续搜索错误,如果我们发现任何新的信息,将与您联系。
嗨hdr,
好的,任何进一步的信息都会很有帮助的。
谢谢,PM_Dialog
你好,
非常感谢你的帮助。我发现了我的错误。
我的处理方法确实错了。我应该在handle\u evt\u gattc\u discover\u char方法中将evt->value\u handle分配给句柄。
非常感谢
hdr
嗨hdr,
很高兴你发现了这一点,谢谢你的提示。
谢谢,PM_Dialog