嗨支持团队,
我再次遇到了一个问题进行连接问题,这并不容易复制和报告。
我从Sample-128修改为外设,适用于我的应用程序。最近,广告数据由传感器检测更新,这也很好。但偶尔的连接不能回应!!
今天,当我的应用程序/ iPhone尝试向DA14580设备发送命令时,根本没有回复,但我可以看到来自广告的数据。在另一个词,广告很好地运作。我试图使用LightBlue来测试它,结果相同(这意味着我的应用程序运作良好)。LightBlue的报告“在被询问时的外围断开连接”。重置DA14580后,它再次运行得很好,这种情况非常难以复制,但它是产品的致命问题。
我找不到我身边的任何问题。我认为某处可能有一个错误的断开连接。我不确定是否存在通过stop_adverting和start_adverting更新的广告数据存在任何问题,但是发送广告数据,我的应用程序可以很好地接收。请帮忙!
谢谢!
关键词:
嗨,亚历克斯:
我怀疑您的示例128配置文件不是正确的,特别是例程“Sample128_Create_db_req_handler”。你能发布你的日常生活吗?
谢谢,
tr_dialog.
嗨,
该代码在大部分时间内运作良好,问题很少发生。如果发生这种情况,则无法一直在进行连接,并将其修复其重置DA14580的唯一方法 - 这是致命的问题。请查看下面的例程。
静态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_CHAROMATION;
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主要服务属性
char1的+ 1值属性
char2的+ 1值属性
CHAR 2的+ 1客户端Spectsisitic Configuration属性
char3的+ 1值属性
+ 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字节客户端配置的第一个特征(第二个特征上允许通知)
+ 19字节第三个特征声明(1字节属性+ 2个字节值句柄+ 16字节UUID = 19字节)
第三个特征+ 8个字节的数据
+ 2字节客户端配置第三个特征(第三个特征上允许通知)
= 106字节
* /
if(status == att_err_no_error)
{
//添加SVC value属性
status = attmdb_add_attribute(sample128_env.sample128_shdl,att_uuid_128_len,// data size = 16(att_uuid_128_len)
ATT_UUID_16_LEN,(UINT8_T *)&ATT_DECL_SVC,PERM(RD,ENABLE),
&(sample128_env.sample128_shdl));
status = attmdb_att_set_value(sample128_env.sample128_shdl,att_uuid_128_len,(uint8_t *)sample128_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属性,第二个特征
status = attmdb_add_attribute(sample128_env.sample128_shdl,sizeof(uint16_t),
ATT_UUID_16_LEN,(UINT8_T *)&ATT_DECL_CFG,PERM(RD,ENABLE)|perm(wr,启用),
&(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属性,第三个特征
status = attmdb_add_attribute(sample128_env.sample128_shdl,8,// data size = 8字节
ATT_UUID_128_LEN,(UINT8_T *)和SAMPLE128_3_VAL.UUID,PERM(RD,ENABLE)|perm(ntf,启用),
&(val_hdl));
memcpy(sample128_3_char.attr_hdl,&val_hdl,sizeof(uint16_t));
status = attmdb_att_set_value(char_hdl,sizeof(sample128_3_char),(uint8_t *)和sample128_3_char);
//添加CFG属性,第三个特征
status = attmdb_add_attribute(sample128_env.sample128_shdl,sizeof(uint16_t),
ATT_UUID_16_LEN,(UINT8_T *)&ATT_DECL_CFG,PERM(RD,ENABLE)|perm(wr,启用),
&(val_hdl));
//禁用示例128服务
attmdb_svc_set_permission(sample128_env.sample128_shdl,perm(svc,disable));
//转到空闲状态
//如果我们在这里,数据库已经成功完成,转到空闲状态
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);
}
请帮忙!
你好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.
将再次设置设备配置,以便您无需担心。嗨Vesa,
谢谢你的建议。,
是的,它基于我的设计,问题是软件相关,但我无法弄清楚导致问题的原因是什么。
在我更新广告数据后,我发现最近2-3次的问题(在iPhone和DS14580之间无法连接)。重置后,它再次正常工作。
为您的建议,我认为S / W必须在分配和发送CAPM_RESET之前检测BLE是否无法连接。如果S / W可以检测到问题,则很容易修复它。知道BLE连接问题是否存在的任何想法或始终断开连接?
更多的线索:当我在iPhone和DA14580之间找到连接问题时,我使用LightBlue连接DA14580。LightBlue工具报告了“在询问时的外设断开连接”...这意味着iPhone尝试连接后DA14580断开连接。
谢谢,