4 posts / 0 new
Last post
ziv324
Offline
Last seen:1 month 1 week ago
加入:2016-01-08 07:36
DA14585讀取資料方法

您好
目前已完成在DA14580透過atts_read_req_ind_handlerd,Write Characteristic後讀取資料的功能。
現在考慮要轉移到DA14585。

但在程式上的搬移,DA14585 SDK和DA14580缺少的部分太多的...

有建議的方法或步驟嗎?

Device:
CYibin
Offline
Last seen:4 months 3 weeks ago
工作人员
加入:2017-12-14 02:48
你好,

你好,

可以参考以下文档:

//www.xmece.com/sites/default/files/training_03_cus...

ziv324
Offline
Last seen:1 month 1 week ago
加入:2016-01-08 07:36
你好,謝謝回覆。

你好,謝謝回覆。

但這份文件裡面只有註明怎麼對custom profile去write data。
並沒有針對如何Read data做任何的說明。

目前清楚使用Notification也可以回覆,但現在需要的是Read data。

CYibin
Offline
Last seen:4 months 3 weeks ago
工作人员
加入:2017-12-14 02:48
你好,

你好,

抱歉误解你的意思,你想问的是,如何在 peripheral 端支持 central 发送过来的 gatt_read 命令吧?

首先,需要给 attitude 添加 read 属性,例如下面的 CUST1_IDX_RECV_VALUE attitude:

struct attm_desc_128 custs1_att_db[CUST1_IDX_NB] = { [CUST1_IDX_SVC] = {(uint8_t*)&att_decl_svc, ATT_UUID_16_LEN, PERM(RD, ENABLE), sizeof(custs1_svc), sizeof(custs1_svc), (uint8_t*)&custs1_svc}, [CUST1_IDX_SEND_CHAR] = {(uint8_t*)&att_decl_char, ATT_UUID_16_LEN, PERM(RD, ENABLE), sizeof(custs1_send_char), sizeof(custs1_send_char), (uint8_t*)&custs1_send_char}, [CUST1_IDX_SEND_VALUE] = {CUST1_SEND_UUID_128, ATT_UUID_128_LEN, PERM(RD, ENABLE) | PERM(WR, ENABLE), DEF_CUST1_SEND_CHAR_LEN, 0, NULL}, [CUST1_IDX_RECV_CHAR] = {(uint8_t*)&att_decl_char, ATT_UUID_16_LEN, PERM(RD, ENABLE), sizeof(custs1_recv_char), sizeof(custs1_recv_char), (uint8_t*)&custs1_recv_char}, [CUST1_IDX_RECV_VALUE] = {CUST1_RECV_UUID_128, ATT_UUID_128_LEN, PERM(RD, ENABLE) | PERM(NTF, ENABLE), DEF_CUST1_RECV_CHAR_LEN, 0, NULL}, [CUST1_IDX_RECV_NTF_CFG] = {(uint8_t*)&att_decl_cfg, ATT_UUID_16_LEN, PERM(RD, ENABLE) | PERM(WR, ENABLE), sizeof(uint16_t), 0, NULL}, };

然后,在profile 的 task 文件中,添加 GATTC_READ_CMD_IND 命令,和其对应的 handler,例如:

// 在 cust1_task.c 中 const struct ke_msg_handler custs1_connected[] = { {GATTC_READ_CMD_IND, (ke_msg_func_t)gattc_read_cmd_ind_handler}, {GATTC_WRITE_CMD_IND, (ke_msg_func_t)gattc_write_cmd_ind_handler}, {GATTC_CMP_EVT, (ke_msg_func_t)gattc_cmp_evt_handler}, {CUSTS1_VAL_NTF_REQ, (ke_msg_func_t)custs1_val_ntf_req_handler}, {CUSTS1_VAL_SET_REQ, (ke_msg_func_t)custs1_val_set_req_handler}, {CUSTS1_VAL_IND_REQ, (ke_msg_func_t)custs1_val_ind_req_handler}, }; static int gattc_read_cmd_ind_handler(ke_msg_id_t const msgid, struct gattc_read_cmd_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) { uint16_t att_idx, value_hdl; if (KE_IDX_GET(src_id) == custs1_env.con_info.conidx) { att_idx = param->handle - custs1_env.shdl; if( att_idx == CUST1_IDX_RECV_VALUE ) { // got a read request, the data in the database have been read. } } return (KE_MSG_CONSUMED); }

以上。

每次 central(手机 app)发起一次 read request, peripheral(580)的协议栈就会把相应的 attitube database 的内容返回给 central。数据返回成功后,协议栈就会向上层发送一条 GATTC_READ_CMD_IND 消息。

注意,read 是被动的,peripheral 无法知道 central 发起 read 的时机而提前将数据准备好,然后交给 central 去 read