嗨,支持团队,
我又遇到了连接问题,以前不容易复制和报告。
我从sample-128修改为一个外围设备,在我的应用程序中工作得很好。最近通过传感器检测更新广告数据,效果也很好。但偶尔连接无法回应!!
今天我用我的App/iPhone向DA14580设备发送命令时,没有任何响应,但是我可以看到来自广告的数据。换句话说,广告效果很好。我尝试使用LightBlue进行测试,结果是一样的(这意味着我的应用程序运行良好)。浅蓝发来一份报告"在审问时外围设备断开"重置DA14580后,它再次工作得很好,这种情况是非常困难的复制,但它是一个产品的致命问题。
我这边找不到任何问题。我想可能是某个地方有个断开连接的窃听器。我不确定stop_advertising和start_advertising更新的广告数据是否有问题,但广告数据已经发送,我的app可以接收,请帮忙!
谢谢!
关键词:
嗨,亚历克斯:
我怀疑您的sample128配置文件没有正确执行,特别是例程“sample128_create_db_req_handler”。你能把你的日程贴出来吗?
谢谢,
TR_DIALOG
嗨TR,
代码在大多数情况下运行良好,很少发生问题。如果发生这种情况,就不能一直连接,唯一的解决方法就是重置DA14580——这是一个致命的问题。请查看下面的程序。
Static int sample128_create_db_req_handler(ke_msg_id_t const msgid,
Struct sample128_create_db_req const *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
/ /创建数据库的状态
uint8_t状态;
uint8_t nb_att_16;
uint8_t nb_att_128;
uint8_t nb_att_32;
uint16_t att_decl_svc = ATT_DECL_PRIMARY_SERVICE;
uint16_t att_decl_char = ATT_DECL_CHARACTERISTIC;
uint16_t att_decl_cfg = ATT_DESC_CLIENT_CHAR_CFG;
uint16_t val_hdl;
uint16_t char_hdl;
/ /保存概要文件ID
sample128_env.con_info。prf_id = TASK_SAMPLE128;
/*---------------------------------------------------*
Sample128服务创建
*---------------------------------------------------*/
//将服务添加到数据库
nb_att_16 = 6;
/* 1主服务属性
+ 1 char1的值属性
+ 1 char2的值属性
+ 1客户端特征配置属性的char 2
+ 1 char3的值属性
+ 1客户端特征配置属性的char 3
= 6
*/
nb_att_32 = 0
nb_att_128 = 3;//3 uid128属性类型,三个自定义特征各一个
status = attmdb_add_service(&(sample128_env.sample128_shdl), TASK_SAMPLE128,
Nb_att_16, nb_att_32, nb_att_128, 106);// 106:从1B更改为20Byte,总大小为87字节
/*
服务UUID的值为16字节
+ 19字节第一个特征的声明(1字节属性+ 2字节值句柄+ 16字节UUID = 19字节)
+ 20/1字节的数据的第一个特征
第一个特征的+ 0字节客户端配置(没有通知或在第一个字符上指示)
+ 19字节第二个特征的声明(1字节属性+ 2字节值句柄+ 16字节UUID = 19字节)
+ 1字节的数据用于第二个特征
+ 2字节的第一个特征的客户端配置(在第二个特征上允许Notify)
+ 19字节第三个特征的声明(1字节属性+ 2字节值句柄+ 16字节UUID = 19字节)
+ 8字节的数据用于第三个特征
+ 2字节的第三个特征的客户端配置(在第三个特征上允许Notify)
= 106字节
*/
status == ATT_ERR_NO_ERROR
{
//添加SVC值属性
= attmdb_add_attribute (sample128_env地位。sample128_shdl, ATT_UUID_128_LEN, //数据大小= 16 (ATT_UUID_128_LEN)
ATT_UUID_16_LEN, (uint8_t*)&att_decl_svc, PERM(RD, ENABLE),
& (sample128_env.sample128_shdl));
= attmdb_att_set_value (sample128_env地位。采样128_shdl, ATT_UUID_128_LEN, (uint8_t *)采样128_svc.uuid;
/ / / / / /字符1
/ /添加char1属性
= attmdb_add_attribute (sample128_env地位。sample128_shdl, ATT_UUID_128_LEN + 3, //数据大小= 19 (ATT_UUID_128_LEN + 3)
ATT_UUID_16_LEN, (uint8_t*) &att_decl_char, PERM(RD, ENABLE),
& (char_hdl));
//添加char1 val属性
= attmdb_add_attribute (sample128_env地位。sample128_shdl 20 / / sizeof (uint8_t);数据大小= 1
&sample128_1_val ATT_UUID_128_LEN (uint8_t *)。uuid, PERM(RD, ENABLE) | PERM(WR, ENABLE),
& (val_hdl));
memcpy (sample128_1_char。attr_hdl &val_hdl, sizeof (uint16_t));
状态= attmdb_att_set_value(char_hdl, sizeof(sample128_1_char), (uint8_t *)&sample128_1_char);
/ / / / / /字符2
//添加char属性,第二个特征
= attmdb_add_attribute (sample128_env地位。sample128_shdl, ATT_UUID_128_LEN + 3, //数据大小= 19 (ATT_UUID_128_LEN + 3)
ATT_UUID_16_LEN, (uint8_t*) &att_decl_char, PERM(RD, ENABLE),
& (char_hdl));
//添加val属性,第二个特征
= attmdb_add_attribute (sample128_env地位。sample128_shdl, sizeof(uint8_t), //数据大小= 1
&sample128_2_val ATT_UUID_128_LEN (uint8_t *)。uuid, PERM(RD, ENABLE) | PERM(NTF, ENABLE),
& (val_hdl));
memcpy (sample128_2_char。attr_hdl &val_hdl, sizeof (uint16_t));
Status = attmdb_att_set_value(char_hdl, sizeof(sample128_2_char), (uint8_t *)&sample128_2_char);
//添加cfg属性,第二个特征
= attmdb_add_attribute (sample128_env地位。sample128_shdl, sizeof (uint16_t),
ATT_UUID_16_LEN, (uint8_t*) &att_decl_cfg, PERM(RD, ENABLE) | PERM(WR, ENABLE),
& (val_hdl));
/ / / / / /字符3
//添加char属性,第三个特征
= attmdb_add_attribute (sample128_env地位。sample128_shdl, ATT_UUID_128_LEN + 3, //数据大小= 19 (ATT_UUID_128_LEN + 3)
ATT_UUID_16_LEN, (uint8_t*) &att_decl_char, PERM(RD, ENABLE),
& (char_hdl));
//添加val属性,第三个特征
= attmdb_add_attribute (sample128_env地位。sample128_shdl, 8, //数据大小= 8字节
&sample128_3_val ATT_UUID_128_LEN (uint8_t *)。uuid, PERM(RD, ENABLE) | PERM(NTF, ENABLE),
& (val_hdl));
memcpy (sample128_3_char。attr_hdl &val_hdl, sizeof (uint16_t));
状态= attmdb_att_set_value(char_hdl, sizeof(sample128_3_char), (uint8_t *)&sample128_3_char);
//添加cfg属性,第三个特征
= attmdb_add_attribute (sample128_env地位。sample128_shdl, sizeof (uint16_t),
ATT_UUID_16_LEN, (uint8_t*) &att_decl_cfg, PERM(RD, ENABLE) | PERM(WR, ENABLE),
& (val_hdl));
/ /禁用sample128服务
attmdb_svc_set_permission (sample128_env。禁用sample128_shdl烫(SVC));
//进入Idle状态
//如果我们在这里,数据库已完成与成功,转到空闲状态
ke_state_set (TASK_SAMPLE128 SAMPLE128_IDLE);
}
//发送CFM申请
struct sample128_create_db_cfm * cfm = KE_MSG_ALLOC(sample128_create_db_cfm, src_id,
TASK_SAMPLE128 sample128_create_db_cfm);
cfm - >状态=状态;
ke_msg_send (cfm);
返回(KE_MSG_CONSUMED);
}
请帮助!
你好亚历克斯·罗
您确定这个问题与软件有关吗?你在用自己的设计吗?
您还可以尝试通过分配和发送GAPM_RESET消息来重置BLE子系统。
struct gapm_reset_cmd* cmd = KE_MSG_ALLOC(gapm_reset_cmd, TASK_GAPM, TASK_APP, gapm_reset_cmd);
cmd - >操作= GAPM_RESET;
ke_msg_send (cmd);
gapm_cmp_evt_handler
将再次设置设备配置,所以你不需要担心。嗨视频电子设备标准协会,
谢谢你的建议。
是的,这是基于我的设计,问题与软件有关,但我不知道是什么原因造成的问题。
最近更新广告数据后发现问题2-3次(iPhone和DS14580无法连接)。复位后,恢复正常工作。
对于你的建议,我认为s/w必须在分配和发送CAPM_RESET之前检测BLE是否不能连接。如果s/w可以检测到问题,就很容易修复它。知道BLE连接是否有问题或总是断开吗?
更多提示:当我发现我的iphone和DA14580之间存在连接问题时,我使用了LightBlue连接DA14580。浅蓝色工具报告“被询问时外围设备断开”……这意味着在iPhone尝试连接后DA14580断开。
谢谢,