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

6个帖子/ 0新
最后一篇
亚历克斯罗
离线
最后一次露面:1年8个月前
专家
加入:2014-02-28 19:16
连接问题与未知错误,但建立良好的工作

嗨,支持团队,

我再次遇到了一个问题进行连接问题,这并不容易复制和报告。

我从Sample-128修改为外设,适用于我的应用程序。最近,广告数据由传感器检测更新,这也很好。但偶尔的连接不能回应!!

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

我找不到我身边的任何问题。我认为某处可能有一个错误的断开连接。我不确定是否存在通过stop_adverting和start_adverting更新的广告数据存在任何问题,但是发送广告数据,我的应用程序可以很好地接收。请帮忙!

谢谢!

tr_dialog.
离线
最后一次露面:2个月3个星期前
职员
加入:2014-06-30 23:52
嗨,亚历克斯:

嗨,亚历克斯:

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

谢谢,

tr_dialog.

亚历克斯罗
离线
最后一次露面:1年8个月前
专家
加入:2014-02-28 19:16
嗨,

嗨,

代码在大多数情况下运行良好,很少发生问题。如果发生这种情况,就不能一直连接,唯一的解决方法就是重置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_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的值属性
CHAR 2的+ 1客户端Spectsisitic Configuration属性

+ 1 char3的值属性
+ 1 CHAR 3客户端的Spectsisitic Configuration属性

= 6.
* /
nb_att_32 = 0; // no uuid32属性

nb_att_128 = 3;// 3 UUID128属性类型,一个用于三种自定义特征

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字节客户端配置的第一个特征(第一个char上没有通知或指示)

+ 19字节第二个特征的声明(1字节属性+ 2字节值句柄+ 16字节UUID = 19字节)
第二个特征的+ 1个数据数据
+ 2字节的第一个特征的客户端配置(在第二个特征上允许Notify)

+ 19字节第三个特征声明(1字节属性+ 2个字节值句柄+ 16字节UUID = 19字节)
+ 8字节的数据用于第三个特征
+ 2字节客户端配置第三个特征(第三个特征上允许通知)

= 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属性
status = attmdb_add_attribute(sample128_env.sample128_shdl,att_uuid_128_len + 3,// data size = 19(att_uuid_128_len + 3)
ATT_UUID_16_LEN, (uint8_t*) &att_decl_char, PERM(RD, ENABLE),
&(char_hdl));

//添加char1 val属性
status = attmdb_add_attribute(sample128_env.sample128_shdl,20,// sizeof(uint8_t);数据大小= 1
ATT_UUID_128_LEN,(UINT8_T *)和SAMPLE128_1_VAL.UUUID,PERM(RD,ENABLE)|perm(wr,启用),
&(val_hdl));

memcpy(sample128_1_char.attr_hdl,&val_hdl,sizeof(uint16_t));

status = attmdb_att_set_value(char_hdl,sizeof(sample128_1_char),(uint8_t *)和sample128_1_char);

/ / / / / /字符2
//添加char属性,第二个特征
status = attmdb_add_attribute(sample128_env.sample128_shdl,att_uuid_128_len + 3,// data size = 19(att_uuid_128_len + 3)
ATT_UUID_16_LEN, (uint8_t*) &att_decl_char, PERM(RD, ENABLE),
&(char_hdl));

//添加val属性,第二个特征
status = attmdb_add_attribute(sample128_env.sample128_shdl,sizeof(uint8_t),// data size = 1
ATT_UUID_128_LEN,(UINT8_T *)和SAMPLEX128_2_VAL.UUUID,PERM(RD,ENABLE)|perm(ntf,启用),
&(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属性,第三个特征
status = attmdb_add_attribute(sample128_env.sample128_shdl,att_uuid_128_len + 3,// data size = 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,perm(svc,disable));

//进入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-> status = status;
KE_MSG_SEND(CFM);

return(ke_msg_consumed);
}

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

请帮助!

vesan.
离线
最后一次露面:5年11个月前
大师 掌握
加入:2014-06-26 08:49
你好Alex Luo,

你好Alex Luo,

您确定问题是相关的软件吗?你在使用自己的设计吗?

您还可以尝试重置BLE子系统,其中包含分配和发送GAPM_RESET消息。

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。LightBlue工具报告了“在询问时的外设断开连接”...这意味着iPhone尝试连接后DA14580断开连接。

谢谢,