static int gatt_svr_chr_access_sec_test(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { const ble_uuid_t *uuid; int rand_num; int rc; uuid = ctxt->chr->uuid; /* Determine which characteristic is being accessed by examining its * 128-bit UUID. */ if (ble_uuid_cmp(uuid, &gatt_svr_chr_sec_test_rand_uuid.u) == 0) { assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR); /* Respond with a 32-bit random number. */ rand_num = rand(); rc = os_mbuf_append(ctxt->om, &rand_num, sizeof rand_num); return rc == 0 ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES; } if (ble_uuid_cmp(uuid, &gatt_svr_chr_sec_test_static_uuid.u) == 0) { switch (ctxt->op) { case BLE_GATT_ACCESS_OP_READ_CHR: rc = os_mbuf_append(ctxt->om, &gatt_svr_sec_test_static_val, sizeof gatt_svr_sec_test_static_val); return rc == 0 ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES; case BLE_GATT_ACCESS_OP_WRITE_CHR: rc = gatt_svr_chr_write(ctxt->om, sizeof gatt_svr_sec_test_static_val, sizeof gatt_svr_sec_test_static_val, &gatt_svr_sec_test_static_val, NULL); return rc; default: assert(0); return BLE_ATT_ERR_UNLIKELY; } } /* Unknown characteristic; the nimble stack should not have called this * function. */ assert(0); return BLE_ATT_ERR_UNLIKELY; }
static int gatt_svr_chr_access_rw_demo( uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { puts("service 'rw demo' callback triggered"); (void) conn_handle; (void) attr_handle; (void) arg; int rc = 0; ble_uuid_t* write_uuid = (ble_uuid_t*) &gatt_svr_chr_rw_demo_write_uuid.u; ble_uuid_t* readonly_uuid = (ble_uuid_t*) &gatt_svr_chr_rw_demo_readonly_uuid.u; if (ble_uuid_cmp(ctxt->chr->uuid, write_uuid) == 0) { puts("access to characteristic 'rw demo (write)'"); switch (ctxt->op) { case BLE_GATT_ACCESS_OP_READ_CHR: puts("read from characteristic"); printf("current value of rm_demo_write_data: '%s'\n", rm_demo_write_data); /* send given data to the client */ rc = os_mbuf_append(ctxt->om, &rm_demo_write_data, strlen(rm_demo_write_data)); break; case BLE_GATT_ACCESS_OP_WRITE_CHR: puts("write to characteristic"); printf("old value of rm_demo_write_data: '%s'\n", rm_demo_write_data); uint16_t om_len; om_len = OS_MBUF_PKTLEN(ctxt->om); /* read sent data */ rc = ble_hs_mbuf_to_flat(ctxt->om, &rm_demo_write_data, sizeof rm_demo_write_data, &om_len); /* we need to null-terminate the received string */ rm_demo_write_data[om_len] = '\0'; printf("new value of rm_demo_write_data: '%s'\n", rm_demo_write_data); break; case BLE_GATT_ACCESS_OP_READ_DSC: puts("read from descriptor"); break; case BLE_GATT_ACCESS_OP_WRITE_DSC: puts("write to descriptor"); break; default: puts("unhandled operation!"); rc = 1; break; } puts(""); return rc; } else if (ble_uuid_cmp(ctxt->chr->uuid, readonly_uuid) == 0) { puts("access to characteristic 'rw demo (read-only)'"); if (ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR) { char random_digit; /* get random char between '0' and '9' */ random_digit = 48 + (rand() % 10); snprintf(str_answer, STR_ANSWER_BUFFER_SIZE, "new random number: %c", random_digit); puts(str_answer); rc = os_mbuf_append(ctxt->om, &str_answer, strlen(str_answer)); puts(""); return rc; } return 0; } puts("unhandled uuid!"); return 1; }