连接问题与未知的错误,但广告工作良好

6个员额/ 0个新员额
最后发表
亚历克斯·罗
离线
最后看到:1年8个月前
专家
加入:2014-02-28 19:16
连接问题与未知的错误,但广告工作良好

嗨,支持团队,

我又遇到了连接问题,以前不容易复制和报告。

我从sample-128修改为一个外围设备,在我的应用程序中工作得很好。最近通过传感器检测更新广告数据,效果也很好。但偶尔连接无法回应!!

今天我用我的App/iPhone向DA14580设备发送命令时,没有任何响应,但是我可以看到来自广告的数据。换句话说,广告效果很好。我尝试使用LightBlue进行测试,结果是一样的(这意味着我的应用程序运行良好)。浅蓝发来一份报告"在审问时外围设备断开"重置DA14580后,它再次工作得很好,这种情况是非常困难的复制,但它是一个产品的致命问题。

我这边找不到任何问题。我想可能是某个地方有个断开连接的窃听器。我不确定stop_advertising和start_advertising更新的广告数据是否有问题,但广告数据已经发送,我的app可以接收,请帮忙!

谢谢!

TR_Dialog
离线
最后看到:2个月3个星期前
工作人员
加入:2014-06-30 23:52
嗨,亚历克斯:

嗨,亚历克斯:

我怀疑您的sample128配置文件没有正确执行,特别是例程“sample128_create_db_req_handler”。你能把你的日程贴出来吗?

谢谢,

TR_DIALOG

亚历克斯·罗
离线
最后看到:1年8个月前
专家
加入:2014-02-28 19:16
嗨TR,

嗨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);

亚历克斯·罗
离线
最后看到:1年8个月前
专家
加入:2014-02-28 19:16
请帮助!

请帮助!

VesaN
离线
最后看到:5年11个月前
大师 主
加入:2014-06-26 08:49
你好亚历克斯·罗

你好亚历克斯·罗

您确定这个问题与软件有关吗?你在用自己的设计吗?

您还可以尝试通过分配和发送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将再次设置设备配置,所以你不需要担心。

亚历克斯·罗
离线
最后看到:1年8个月前
专家
加入:2014-02-28 19:16
嗨视频电子设备标准协会,

嗨视频电子设备标准协会,

谢谢你的建议。

是的,这是基于我的设计,问题与软件有关,但我不知道是什么原因造成的问题。

最近更新广告数据后发现问题2-3次(iPhone和DS14580无法连接)。复位后,恢复正常工作。

对于你的建议,我认为s/w必须在分配和发送CAPM_RESET之前检测BLE是否不能连接。如果s/w可以检测到问题,就很容易修复它。知道BLE连接是否有问题或总是断开吗?

更多提示:当我发现我的iphone和DA14580之间存在连接问题时,我使用了LightBlue连接DA14580。浅蓝色工具报告“被询问时外围设备断开”……这意味着在iPhone尝试连接后DA14580断开。

谢谢,