实际使用中,我们经常会修改服务号和特征值号,这里以SDK中simple_server为例子,介绍修改方法 现在想修改成如下的服务特征: 1)找到simple_server.h文件 这个是原示例对应的服务的UUID #define ATT_SVC_SIMPLE_SERVER_SERVICE {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF} #define ATT_SVC_SIMPLE_SERVER_CHAC1 0x5F01 #define ATT_SVC_SIMPLE_SERVER_CHAC2 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF} 现在修改成如下新的UUID #define ATT_SVC_SIMPLE_SERVER_SERVICE \ { \ 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00 \ } #define ATT_SVC_SIMPLE_SERVER_CHAC1 \ { \ 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0xdc, 0x00, 0x00 \ } #define ATT_SVC_SIMPLE_SERVER_CHAC2 \ { \ 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x02, 0xdc, 0x00, 0x00 \ } 2)找到simple_server.c文件 同时修改 /// Full SIMPLE_SERVER Database Description - Used to add attributes into the database const struct attm_desc_128 simple_server_att_db[SIMPLE_SERVER_IDX_NB] = { // Service Declaration [SIMPLE_SERVER_IDX_SVC] = {ATT_16_TO_128_ARRAY(ATT_DECL_PRIMARY_SERVICE), PERM(RD, ENABLE), 0, 0}, // Characteristic Declaration [SIMPLE_SERVER_IDX_DEMO_CHAR1] = {ATT_16_TO_128_ARRAY(ATT_DECL_CHARACTERISTIC), PERM(RD, ENABLE), 0, 0}, // Characteristic Value [SIMPLE_SERVER_IDX_DEMO_VAL1] = {ATT_SVC_SIMPLE_SERVER_CHAC1, PERM(WRITE_REQ, ENABLE) | PERM(NTF, ENABLE) | PERM(IND, ENABLE), PERM(RI, ENABLE) | PERM(UUID_LEN, UUID_128), SIMPLE_SERVER_MAX_CHAC_LEN}, // Characteristic - Client Characteristic Configuration Descriptor [SIMPLE_SERVER_IDX_DEMO_NTF_CFG] = {ATT_16_TO_128_ARRAY(ATT_DESC_CLIENT_CHAR_CFG), PERM(RD, ENABLE)|PERM(WRITE_REQ, ENABLE), 0, 0}, // Characteristic Declaration [SIMPLE_SERVER_IDX_DEMO_CHAR2] = {ATT_16_TO_128_ARRAY(ATT_DECL_CHARACTERISTIC), PERM(RD, ENABLE), 0, 0}, // Characteristic Value [SIMPLE_SERVER_IDX_DEMO_VAL2] = {ATT_SVC_SIMPLE_SERVER_CHAC2, PERM(RD, ENABLE) | PERM(WRITE_REQ, ENABLE), PERM(RI, ENABLE) | PERM(UUID_LEN, UUID_128), SIMPLE_SERVER_MAX_CHAC_LEN}, }; 3)app_simple_sever.c文件找到如下函数,屏蔽其内容 static int simple_server_timeout_timer_handler(ke_msg_id_t const msgid, void const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) { // log_debug("%s@%d\n", __func__, __LINE__); // uint8_t ntf_data[] = "SIMPLE_SERVER_SEND_NTF_CMD"; // ke_timer_set(SIMPLE_SERVER_TIMEOUT_TIMER, TASK_APP, 500); // // Allocate the message // struct simple_server_send_ntf_cmd * cmd = KE_MSG_ALLOC_DYN(SIMPLE_SERVER_SEND_NTF_CMD, // prf_get_task_from_id(TASK_ID_SIMPLE_SERVER), // TASK_APP, // simple_server_send_ntf_cmd, // sizeof(ntf_data)); // cmd->conidx = app_simple_server_env.conidx; // cmd->length = sizeof(ntf_data); // memcpy(cmd->value, ntf_data, sizeof(ntf_data)); // // Send the message // ke_msg_send(cmd); return (KE_MSG_CONSUMED); } 4)定义发送接口函数,在main.c中 #include "app_simple_server.h" // Application Module Definitions #include "simple_server_task.h" // health thermometer functions #include "prf.h" // health thermometer functions #include "ke_event.h" uint8_t ntf_data[500] = {0}; void send_to_app(uint8_t *data,uint8_t length) { log_debug("%s@%d\n", __func__, __LINE__); //uint8_t ntf_data[] = "SIMPLE_SERVER_SEND_NTF_CMD"; memcpy(ntf_data,data,length); // Allocate the message struct simple_server_send_ntf_cmd * cmd = KE_MSG_ALLOC_DYN(SIMPLE_SERVER_SEND_NTF_CMD, prf_get_task_from_id(TASK_ID_SIMPLE_SERVER), TASK_APP, simple_server_send_ntf_cmd, sizeof(ntf_data)); cmd->conidx = app_simple_server_env.conidx; cmd->length = length; memcpy(cmd->value, ntf_data, length); // Send the message ke_msg_send(cmd); log_debug_array_ex("ntf_data\n",ntf_data, length); } 5)我们示例是APP发送什么数据,设备回复什么数据 __STATIC int gattc_write_req_ind_handler(ke_msg_id_t const msgid, struct gattc_write_req_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) { struct gattc_write_cfm *cfm; uint8_t att_idx = 0; uint8_t conidx = KE_IDX_GET(src_id); // retrieve handle information uint8_t status = simple_server_get_att_idx(param->handle, &att_idx); log_debug("%s handle:%d(idx:%d).\n", __func__, param->handle, att_idx); // If the attribute has been found, status is GAP_ERR_NO_ERROR if (status == GAP_ERR_NO_ERROR) { struct simple_server_env_tag *simple_server_env = PRF_ENV_GET(SIMPLE_SERVER, simple_server); // Only update configuration if value for stop or notification enable if (att_idx == SIMPLE_SERVER_IDX_DEMO_NTF_CFG) { // Extract value before check uint16_t ntf_cfg = co_read16p(¶m->value[0]); if ((ntf_cfg == PRF_CLI_STOP_NTFIND) || (ntf_cfg == PRF_CLI_START_NTF) || (ntf_cfg == PRF_CLI_START_IND)) { // Conserve information in environment simple_server_env->ntf_cfg[conidx] = ntf_cfg; } // Inform APP of configuration change struct simple_server_demo_ntf_cfg_ind *ind = KE_MSG_ALLOC(SIMPLE_SERVER_NTF_CFG_IND, prf_dst_task_get(&(simple_server_env->prf_env), conidx), dest_id, simple_server_demo_ntf_cfg_ind); ind->conidx = conidx; ind->ntf_cfg = simple_server_env->ntf_cfg[conidx]; ke_msg_send(ind); } else if (att_idx == SIMPLE_SERVER_IDX_DEMO_VAL1 || att_idx == SIMPLE_SERVER_IDX_DEMO_VAL2) { log_debug("Offset:%2d. ", param->offset); // send fron app extern void send_to_app(uint8_t * data, uint8_t length); //增加接口 send_to_app((uint8_t *)(param->value), param->length); //调用 log_debug_array_ex("write data", param->value, param->length); } else { status = PRF_APP_ERROR; } } // Send write response cfm = KE_MSG_ALLOC(GATTC_WRITE_CFM, src_id, dest_id, gattc_write_cfm); cfm->handle = param->handle; cfm->status = status; ke_msg_send(cfm); return (KE_MSG_CONSUMED); } 6)测试结果 |