SDK5(版本5.0.3)-当APP_DIS_FEATURES中的部分标志被设置时,设备信息服务中断。
默认情况下,app_dis_features被定义为具有所有相关位集。
当我注释掉一些位时,糟糕的事情发生了——值出现在错误的特征中。
我觉得这跟diss_create_db_cfm_handler(…)
在app_diss_task.c尝试设置所有可能的DIS字符的字符,并忽略app_dis_features位掩码。
关键词:
设备:
嗨,奥伦,
我在5.0.3模板项目中看不到这样的东西,我已经注释掉了一些APP_DIS_FEATURES,在服务中显示的特征是,我在APP_DIS_FEATURES中声明的和显示的值是正确的。也许您应该重新启动客户端设备中的ble模块,因为客户端缓存从外设检索的数据,有时事情会搞砸,有时这就是导致糟糕事情发生的原因。
由于MT_dialog
我能够在模板项目中重新创建错误。例如,如果我在我的应用程序或模板项目中只尝试dis_manufacer_name_char_sup,设备信息服务将显示一个未知的特征。有时候,一切都如预期的那样运行。如果我只删除dis_manufacer_name_char_sup,那么其他所有特征都会正确显示。从我所做的测试来看,当它发生时,似乎只有一个特性被破坏了。每次我看到未知的特征,它总是有相同的UUID。我在ios和android上测试了3个不同的应用程序,它们都返回了相同的结果。
我有同样的问题。
嗨,大卫。首轮,
当DIS_MANUFACTURER_NAME_CHAR_SUP只定义时,我可以确认DISS服务的奇怪行为,尽管我不能重现模板的问题,但我可以看到它在ble_app_peripheral项目中有一些错误。团队会检查,然后通知你。
由于MT_dialog
基于ble_app_peripheral项目,修复步骤如下:
1.在结构“diss_create_db_cfm”中添加特性项,文件“diss_task.h”
/// @ref DISS_CREATE_DB_CFM消息参数
struct diss_create_db_cfm
{
/ / /状态
uint8_t状态;
uint16_t特性;/ /新添加的
};
2.当检查参数>特性时,为每个项目添加if条件,文件" app_diss_task.c"
Int diss_create_db_cfm_handler(ke_msg_id_t const msgid,
Struct diss_create_db_cfm const *param
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
uint8 len;
if (ke_state_get(dest_id) == APP_DB_INIT)
{
if (param->status == CO_ERROR_NO_ERROR)
{
//进入空闲状态
if(param->features & dis_manufacer_name_char_sup) //添加
{
// sactuer DB中的名称值
struct dis_set_char_val_req *req_name = KE_MSG_ALLOC_DYN(dis_set_char_val_req,
TASK_DISS TASK_APP,
diss_set_char_val_req,
APP_DIS_MANUFACTURER_NAME_LEN);
//填充参数结构
req_name - > char_code = DIS_MANUFACTURER_NAME_CHAR;
req_name - > val_len = APP_DIS_MANUFACTURER_NAME_LEN;
memcpy (&req_name - > val [0], APP_DIS_MANUFACTURER_NAME, APP_DIS_MANUFACTURER_NAME_LEN);
//发送消息
ke_msg_send (req_name);
}
if(param->features & DIS_MODEL_NB_STR_CHAR_SUP) //添加
{
struct dis_set_char_val_req *req_mod = KE_MSG_ALLOC_DYN(dis_set_char_val_req,
TASK_DISS TASK_APP,
diss_set_char_val_req,
APP_DIS_MODEL_NB_STR_LEN);
//填充参数结构
req_mod - > char_code = DIS_MODEL_NB_STR_CHAR;
req_mod-> val_len = app_dis_model_nb_str_len;
memcpy (&req_mod - > val [0], APP_DIS_MODEL_NB_STR, APP_DIS_MODEL_NB_STR_LEN);
//发送消息
ke_msg_send(req_mod);
}
..........
3.添加MSG send info "cfm->features = param->features;" in function "diss_create_db_req_handler"。文件“diss_task.c”
Static int diss_create_db_req_handler(ke_msg_id_t const msgid,
struct vist_create_db_req const * param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
........
//发送响应到应用程序
struct dis_create_db_cfm * cfm = KE_MSG_ALLOC(dis_create_db_cfm, src_id, TASK_DISS,
diss_create_db_cfm);
cfm - >状态=状态;
cfm - >功能=参数- >功能;/ /添加
ke_msg_send (cfm);
返回(KE_MSG_CONSUMED);
}
而不是使用
param - >特性
,并检查每一项If (param->features &…)
我做了:if (APP_DIS_FEATURES &…)
.我看不出有什么理由不及格
特性
作为一个变量,除非你想做一些动态的DIS服务,字符可以在初始化后添加或删除(我真的看不到这样做的实际原因)。嗨,奥伦
你是对的。推荐给你的方法