跳到主要内容

在PXP报告管理器DA14681中发送大约20个字节

1年前

在PXP报告管理器DA14681中发送大约20个字节

张贴了Mahmed106.10分 1回复
0旋转

嗨对话框

我正在使用DA14681的自定义板,我正在使用PXP Reporter作为基础项目,并通过制作自定义服务通知,通过BLE发送数据。到目前为止,一切都在工作。现在我想发送超过1个字节,例如,我想在该特征上发送10或20个字节,但我无法做到这一点。

以下是服务代码,但它正在为单个字节的数据传输工作。我如何修改它以发送20个字节,或者是否有任何可以帮助我的示例代码。谢谢

typedef struct {
ble_service_t svc;

//处理
uint16_t templ_val_h;
uint16_t templ_ccc_h;
mmtn_service_t;

静态void handle_read_req(ble_service_t * svc,const ble_evt_gatts_read_req_t * evt)
{
mmtn_service_t * mmtn =(mmtn_service_t *)svc;

if(evt-> handle == mmtn-> templ_ccc_h))
{
UINT16_T CCC = 0x0000;

ble_storage_get_u16(evt-> conn_idx,mmtn-> templ_ccc_h,&ccc);

//我们很少 - endian,好的,直接从uint16_t写
BLE_GATTS_READ_CFM(EVT-> CONN_IDX,EVT->句柄,ATT_ERROR_OK,SIZEOF(CCC),&CCC);
} 别的
{
INT8_T TEMP_LEVEL = 0;

/ *默认警报级别 - '没有警报'* /
// pm_stay_alive();
temp_level = get_thermistor_temperature(temp_in_c,0);// 0 - > th4

// test_temp_counter ++;
BLE_GATTS_READ_CFM(EVT-> CONN_IDX,EVT->句柄,ATT_ERROR_OK,SIZEOF(TEMP_LEVEL),&TEMP_LEVEL);
// pm_resume_sleep();
}
}

ble_service_t * mmtn_init(const ble_service_config_t * config,const mm_tempsense_info_t * info)
{
uint16_t num_descr;
uint16_t num_attr;
uint16_t cpf_h = 0;
mmtn_service_t * mmtn;
ATT_UUID_T UUID;
INT8_T级别= 0;

mmtn = os_malloc(sizeof(* mmtn));
MEMSET(MMTN,0,SIZEOF(* MMTN));

mmtn-> svc.connected_evt = handle_connected_evt;
mmtn-> svc.read_req = handle_read_req;
mmtn-> svc.write_req = handle_write_req;

//如果设置为“info”,则内容呈现格式描述符
num_descr =(信息?2:1);
num_attr = ble_service_get_num_attr(config,1,num_descr);

ble_uuid_from_string(UUID_MMTN,&UUID);
ble_gatts_add_service(&uuid,gatt_service_primary,num_attr);

ble_service_config_add_includes(config);

ble_uuid_from_string(UUID_MMTN_TEMPRATURE_LEVEL,&UUID);
BLE_GATTS_ADD_CHAROURATIC(&UUID,GATT_PROP_READ | GATT_PROP_NOTIFY,
ble_service_config_elevate_perm(att_perm_read,config),
1,0,null,&mmtn-> templ_val_h);

ble_uuid_create16(UUID_Gatt_Client_Char_Char_Configuration,&UUID);
ble_gatts_add_descriptor(&uuid,att_perm_rw,1,0,&mmtn-> templ_ccc_h);

如果(信息){
BLE_UUID_CREATE16(UUID_GATT_CHAR_PRESENTATION_FORMAT,&UUID);
ble_gatts_add_descriptor(&uuid,
ble_service_config_elevate_perm(att_perm_read,config),
7,0,&cpf_h);
}

ble_gatts_register_service(&mmtn-> svc.start_h,&mmtn-> templ_val_h,mmtn-> templ_ccc_h,&cpf_h,0);

/ *为电池电量设置初始值,因此我们始终具有正确的特征值。* /
ble_gatts_set_value(mmtn-> templ_val_h,sizeof(

ble_service_t * mmtn_init(const ble_service_config_t * config,const mm_tempsense_info_t * info)
{
uint16_t num_descr;
uint16_t num_attr;
uint16_t cpf_h = 0;
mmtn_service_t * mmtn;
ATT_UUID_T UUID;
INT8_T级别= 0;

mmtn = os_malloc(sizeof(* mmtn));
MEMSET(MMTN,0,SIZEOF(* MMTN));

mmtn-> svc.connected_evt = handle_connected_evt;
mmtn-> svc.read_req = handle_read_req;
mmtn-> svc.write_req = handle_write_req;

//如果设置为“info”,则内容呈现格式描述符
num_descr =(信息?2:1);
num_attr = ble_service_get_num_attr(config,1,num_descr);

ble_uuid_from_string(UUID_MMTN,&UUID);
ble_gatts_add_service(&uuid,gatt_service_primary,num_attr);

ble_service_config_add_includes(config);

ble_uuid_from_string(UUID_MMTN_TEMPRATURE_LEVEL,&UUID);
BLE_GATTS_ADD_CHAROURATIC(&UUID,GATT_PROP_READ | GATT_PROP_NOTIFY,
ble_service_config_elevate_perm(att_perm_read,config),
1,0,null,&mmtn-> templ_val_h);

ble_uuid_create16(UUID_Gatt_Client_Char_Char_Configuration,&UUID);
ble_gatts_add_descriptor(&uuid,att_perm_rw,1,0,&mmtn-> templ_ccc_h);

如果(信息){
BLE_UUID_CREATE16(UUID_GATT_CHAR_PRESENTATION_FORMAT,&UUID);
ble_gatts_add_descriptor(&uuid,
ble_service_config_elevate_perm(att_perm_read,config),
7,0,&cpf_h);
}

ble_gatts_register_service(&mmtn-> svc.start_h,&mmtn-> templ_val_h,mmtn-> templ_ccc_h,&cpf_h,0);

/ *为电池电量设置初始值,因此我们始终具有正确的特征值。* /
ble_gatts_set_value(mmtn-> templ_val_h,sizeof(temp_level),&temp_level);

如果(信息){
UINT8_T CPF_VAL [7];
uint8_t * p = cpf_val;

put_u8_inc(&p,0x04);//格式=无符号8位整数
put_u8_inc(&p,0x00);// exponent = 0
put_u16_inc(&p,0x27ad);//单位=百分比
put_u8_inc(&p,info->命名空间);
put_u16_inc(&p,信息 - >描述符);

//内容呈现格式描述符具有静态值
ble_gatts_set_value(cpf_h,sizeof(cpf_val),cpf_val);
}

mmtn-> svc.end_h = mmtn-> svc.start_h + num_attr;

返回和MMTN-> SVC;
}

), &大批);

如果(信息){
UINT8_T CPF_VAL [7];
uint8_t * p = cpf_val;

put_u8_inc(&p,0x04);//格式=无符号8位整数
put_u8_inc(&p,0x00);// exponent = 0
put_u16_inc(&p,0x27ad);//单位=百分比
put_u8_inc(&p,info->命名空间);
put_u16_inc(&p,信息 - >描述符);

//内容呈现格式描述符具有静态值
ble_gatts_set_value(cpf_h,sizeof(cpf_val),cpf_val);
}

mmtn-> svc.end_h = mmtn-> svc.start_h + num_attr;

返回和MMTN-> SVC;
}

静态void notify_level(ble_service_t * svc,uint16_t conn_idx,Int8_t级别)
{
mmtn_service_t * mmtn =(mmtn_service_t *)svc;
UINT16_T CCC = 0x0000;

ble_storage_get_u16(conn_idx,mmtn-> templ_ccc_h,&ccc);

if(!(ccc&gatt_ccc_notifications)){
返回;
}

ble_gatts_send_event(conn_idx,mmtn-> templ_val_h,gatt_event_notification,sizeof(级别)和级别);
}

接受答案!

1年前

PM_DIALOG.

嗨mahmed106,

谢谢你的意见。我通过了您提供的代码片段,我发现最大特征值长度为1字节。BLE_GATTS_ADD_CHARACTY()的MAX_LEN参数设置为1,这意味着最大长度为1字节。你能改变吗?

谢谢,PM_DIALOG.