这更像是一个C编程问题,而不是蓝牙问题。
我有一个自定义的128位UUID服务,其中包含具有读/通知属性的属性。 notify属性配置为每个通知数据包发送20个字节的数据。目前,我正在使用for
循环填充一个包含20个成员的8位无符号整数数组,然后通过蓝牙链接发送它。
此过程大约需要1秒,这太慢了(我试图最大化吞吐量)。有没有比在数组中移动20个字节更好的方法?当我只使用一个uint64_t
来保存数据时,我能够达到大约9k bit / s,但这只能达到8个字节。我的目标是以相同的速度填充通知特性的完整20字节容量。
我的通知方法如下:这会填写值(val[]
)以通知客户端。它还向配置文件发送内核消息,然后发送通知。
void app_sample128_set_char2_val(uint8_t* value)//(uint64_t value)
{
// Allocate the message
struct sample128_upd_char2_req * req = KE_MSG_ALLOC(SAMPLE128_UPD_CHAR2_REQ, TASK_SAMPLE128, TASK_APP, sample128_upd_char2_req);
// Fill in the parameter structure
req->conhdl = app_env.conhdl;
for (int x=0; x<20; x++)
{
req->val[x] = value[x];
}
ke_msg_send(req);
}
特征更新处理函数如下:此函数调用负责发送通知的prf_server_send_event()
。
static int sample128_upd_char2_req_handler(ke_msg_id_t const msgid,
struct sample128_upd_char2_req const *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
uint8_t status = PRF_ERR_OK;
// Check provided values
if(param->conhdl == gapc_get_conhdl(sample128_env.con_info.conidx))
{
// Update value in DB
attmdb_att_set_value(sample128_env.sample128_shdl + SAMPLE128_2_IDX_VAL,
20, (uint8_t *)¶m->val);
//maximum data value size for a notification attribute = 20 bytes
if((sample128_env.feature & PRF_CLI_START_NTF))
// Send notification through GATT
prf_server_send_event((prf_env_struct *)&sample128_env, false, sample128_env.sample128_shdl + SAMPLE128_2_IDX_VAL);
}
else
{
status = PRF_ERR_INVALID_PARAM;
}
if (status != PRF_ERR_OK)
{
sample128_upd_char2_cfm_send(status);
}
return (KE_MSG_CONSUMED);
}