Hi dialog
我正在基于DA14681的定制板上工作,我正在使用pxp reporter作为基础项目,并通过使定制服务成为可通知的方式通过可报告文件发送数据。到目前为止,一切都很顺利。现在我想发送1个以上的字节,例如,我想发送10或20个字节,但我无法发送。
这是服务代码,但它适用于单字节的数据传输。我如何修改它以发送20个字节,或者是否有任何示例代码可以在这方面帮助我。感谢
typedef结构{
ble_服务\u t svc
//句柄
uint16模板
}mmtn\u服务
static 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->;手柄==mmtn->;模板ccc=0x0000
ble_存储_get_16(evt->;连接idx,mmtn->;templ_ccc_h&;(ccc)
//我们是little endian,可以直接从uint16写入;连接idx,evt->;句柄、附件错误、大小(ccc)和;(ccc)
}else
{
int8\t temp\u level=0
/*默认警报级别-“无警报”*/
temp_level=获取热敏电阻温度(temp_IN_C,0);//0->;TH4
//测试温度计数器++
ble_gatts_read_cfm(evt->;连接idx,evt->;句柄、ATT_ERROR_OK、sizeof(临时级别)和;温度水平)
}
}
ble_service_t*mmtn_init(const ble_service_config_t*config,const mm_tempsense_info_t*info)
{
uint16_t num_descr
uint16\u t num\u attr
uint16\u t cpf\u h=0
mmtn\u服务*mmtn
att_uuid_t uuid
int8_t level=0
mmtn=OS_MALLOC(sizeof(*mmtn))
memset(mmtn,0,sizeof(*mmtn))
mmtn->;svc.connected_evt=手柄_connected_evt
mmtn->;svc.read_req=句柄读取_req
mmtn->;svc.write_req=句柄_write_req
//如果设置了'info',则显示内容表示格式描述符
num_descr=(info?2 : 1);
num\u attr=ble\u service\u get\u num\u attr(配置,1,num\u descr)
ble_uuid_from_string(uuid_MMTN,&;uuid)
ble_gatts_add_service(&;uuid、GATT服务(主要、数量属性)
ble_服务配置添加包括(配置)
ble_uuid_from_string(uuid_MMTN_TEMPRATURE_LEVEL,&;uuid)
ble_gatts_add_特性(&;uuid、GATT属性读取、GATT属性通知、ble服务配置提升perm(ATT perm读取、配置),
1、0、NULL和amp;mmtn->;templ_val_h)
ble_uuid_create16(uuid_GATT_CLIENT_CHAR_配置,&;uuid)
ble_gatts_add_描述符(&;uuid、ATT_PERM_RW、1、0和;mmtn->;templ_ccc_h)
if(info){
ble_uuid_create16(uuid_GATT_CHAR_PRESENTATION_格式,&;uuid)
ble_gatts_add_描述符(&;uuid,
ble_service_config_elevate_perm(ATT_perm_READ,config),
7,0,&;中央公积金
}
ble\u gatts\u register\u service(&;mmtn->;svc.start_h和;mmtn->;templ_val_h&;mmtn->;templ_ccc_h&;cpf_h,0)
/*设置电池电量的初始值,以便始终设置正确的特性值*/
ble_gatts_set_值(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\u t num\u attr
uint16\u t cpf\u h=0
mmtn\u服务*mmtn
att_uuid_t uuid
int8_t level=0
mmtn=OS_MALLOC(sizeof(*mmtn))
memset(mmtn,0,sizeof(*mmtn))
mmtn->;svc.connected_evt=手柄_connected_evt
mmtn->;svc.read_req=句柄读取_req
mmtn->;svc.write_req=句柄_write_req
//如果设置了'info',则显示内容表示格式描述符
num_descr=(info?2 : 1);
num\u attr=ble\u service\u get\u num\u attr(配置,1,num\u descr)
ble_uuid_from_string(uuid_MMTN,&;uuid)
ble_gatts_add_service(&;uuid、GATT服务(主要、数量属性)
ble_服务配置添加包括(配置)
ble_uuid_from_string(uuid_MMTN_TEMPRATURE_LEVEL,&;uuid)
ble_gatts_add_特性(&;uuid,GATT属性读取,GATT属性通知,ble服务配置提升perm(ATT perm读取,配置),
1, 0, NULL, &mmtn->templ_val_h);
ble_uuid_create16(UUID_GATT_CLIENT_CHAR_CONFIGURATION, &uuid);
ble_gatts_add_descriptor(&uuid, ATT_PERM_RW, 1, 0, &mmtn->templ_ccc_h);
if (info) {
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);
/* Set initial value for battery level so we always have proper characteristic value set. */
ble_gatts_set_value(mmtn->templ_val_h, sizeof(temp_level ), &temp_level );
if (info) {
uint8_t cpf_val[7];
uint8_t *p = cpf_val;
put_u8_inc(&p, 0x04); // Format=unsigned 8-bit integer
put_u8_inc(&p, 0x00); // Exponent=0
put_u16_inc(&p, 0x27AD); // Unit=percentage
put_u8_inc(&p, info->namespace);
put_u16_inc(&p, info->descriptor);
// Content Presentation Format descriptor has static value
ble_gatts_set_value(cpf_h, sizeof(cpf_val), cpf_val);
}
mmtn->svc.end_h = mmtn->svc.start_h + num_attr;
return &mmtn->svc;
}
), &array);
if (info) {
uint8_t cpf_val[7];
uint8_t *p = cpf_val;
put_u8_inc(&p, 0x04); // Format=unsigned 8-bit integer
put_u8_inc(&p, 0x00); // Exponent=0
put_u16_inc(&p, 0x27AD); // Unit=percentage
put_u8_inc(&p, info->namespace);
put_u16_inc(&p, info->descriptor);
// Content Presentation Format descriptor has static value
ble_gatts_set_value(cpf_h, sizeof(cpf_val), cpf_val);
}
mmtn->svc.end_h = mmtn->svc.start_h + num_attr;
return &mmtn->svc;
}
static void notify_level(ble_service_t *svc, uint16_t conn_idx, int8_t level)
{
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)) {
return;
}
ble_gatts_send_event(conn_idx, mmtn->templ_val_h, GATT_EVENT_NOTIFICATION, sizeof(level), &level);
}