static void indicate_cb( const uint8_t *pdu, uint16_t len, gpointer user_data) { if (pdu[0] != ATT_OP_HANDLE_IND) { std::cout << "Invalid opecode for indicate. pdu[0]:" << std::hex << static_cast<unsigned int>(pdu[0]) << std::endl; return; } uint16_t handle = (pdu[2] << 8) | pdu[1]; std::cout << (boost::format("Indicate from %04x length:%d") % handle % len) << std::endl; for (std::size_t index = 3, address = 0; index < len; ++index, ++address) { if (address % 16 == 0) { std::cout << std::endl; std::cout << (boost::format("%08x:") % address); } if (address % 8 == 0) { std::cout << ' '; } std::cout << (boost::format("%02x ") % static_cast<unsigned int>(pdu[index])); } std::cout << std::endl; size_t plen; user_data_t* ud = static_cast<user_data_t*>(user_data); uint8_t* opdu = g_attrib_get_buffer(ud->attrib, &plen); uint16_t olen = enc_confirmation(opdu, plen); if (olen > 0) g_attrib_send(ud->attrib, 0, opdu, olen, NULL, NULL, NULL); }
static void events_handler(const uint8_t *pdu, uint16_t len, gpointer user_data) { uint8_t *opdu; uint8_t evt; uint16_t handle, i, olen; size_t plen; evt = pdu[0]; if ( evt != ATT_OP_HANDLE_NOTIFY && evt != ATT_OP_HANDLE_IND ) { printf("#Invalid opcode %02X in event handler??\n", evt); return; } assert( len >= 3 ); handle = att_get_u16(&pdu[1]); resp_begin( evt==ATT_OP_HANDLE_NOTIFY ? rsp_NOTIFY : rsp_IND ); send_uint( tag_HANDLE, handle ); send_data( pdu+3, len-3 ); resp_end(); if (evt == ATT_OP_HANDLE_NOTIFY) return; opdu = g_attrib_get_buffer(attrib, &plen); olen = enc_confirmation(opdu, plen); if (olen > 0) g_attrib_send(attrib, 0, opdu, olen, NULL, NULL, NULL); }
static void events_handler(const uint8_t *pdu, uint16_t len, gpointer user_data) { gatt_connection_t *conn = user_data; uint8_t opdu[ATT_MAX_MTU]; uint16_t handle, i, olen = 0; handle = att_get_u16(&pdu[1]); // printf("0x%02x\n", handle); switch (pdu[0]) { case ATT_OP_HANDLE_NOTIFY: if (conn->notification_handler) { conn->notification_handler(handle, &pdu[3], len, conn->notification_user_data); } break; case ATT_OP_HANDLE_IND: if (conn->indication_handler) { conn->indication_handler(handle, &pdu[3], len, conn->indication_user_data); } break; default: g_print("Invalid opcode\n"); return; } if (pdu[0] == ATT_OP_HANDLE_NOTIFY) return; olen = enc_confirmation(opdu, sizeof(opdu)); if (olen > 0) g_attrib_send(conn->attrib, 0, opdu[0], opdu, olen, NULL, NULL, NULL); }
static void events_handler(const uint8_t *pdu, uint16_t len, gpointer user_data) { uint8_t opdu[ATT_MAX_MTU]; uint16_t handle, i, olen; handle = att_get_u16(&pdu[1]); printf("\r"); switch (pdu[0]) { case ATT_OP_HANDLE_NOTIFY: printf("Notification handle = 0x%04x value: ", handle); break; case ATT_OP_HANDLE_IND: printf("Indication handle = 0x%04x value: ", handle); break; default: printf("Invalid opcode\n"); goto done; } for (i = 3; i < len; i++) printf("%02x ", pdu[i]); if (pdu[0] == ATT_OP_HANDLE_NOTIFY) goto done; olen = enc_confirmation(opdu, sizeof(opdu)); if (olen > 0) g_attrib_send(attrib, 0, opdu[0], opdu, olen, NULL, NULL, NULL); done: printf("\r%s", get_prompt()); fflush(stdout); }
static void events_handler(const uint8_t *pdu, uint16_t len, gpointer user_data) { GAttrib *attrib = user_data; uint8_t *opdu; uint16_t handle, i, olen = 0; size_t plen; handle = att_get_u16(&pdu[1]); switch (pdu[0]) { case ATT_OP_HANDLE_NOTIFY: g_print("Notification handle = 0x%04x value: ", handle); break; case ATT_OP_HANDLE_IND: g_print("Indication handle = 0x%04x value: ", handle); break; default: g_print("Invalid opcode\n"); return; } for (i = 3; i < len; i++) g_print("%02x ", pdu[i]); g_print("\n"); if (pdu[0] == ATT_OP_HANDLE_NOTIFY) return; opdu = g_attrib_get_buffer(attrib, &plen); olen = enc_confirmation(opdu, plen); if (olen > 0) g_attrib_send(attrib, 0, opdu, olen, NULL, NULL, NULL); }
static void events_handler(const uint8_t *pdu, uint16_t len, gpointer user_data) { uint8_t opdu[ATT_MAX_MTU]; uint16_t handle, i, olen; handle = att_get_u16(&pdu[1]); printf("\n"); switch (pdu[0]) { case ATT_OP_HANDLE_NOTIFY: printf("Notification handle = 0x%04x value: ", handle); break; case ATT_OP_HANDLE_IND: printf("Indication handle = 0x%04x value: ", handle); break; default: printf("Invalid opcode\n"); return; } for (i = 3; i < len; i++) printf("%02x ", pdu[i]); printf("\n"); rl_forced_update_display(); if (pdu[0] == ATT_OP_HANDLE_NOTIFY) return; olen = enc_confirmation(opdu, sizeof(opdu)); if (olen > 0) g_attrib_send(attrib, 0, opdu[0], opdu, olen, NULL, NULL, NULL); }
static void events_handler(const uint8_t *pdu, uint16_t len, gpointer user_data) { struct gatt_service *gatt = user_data; struct characteristic *chr; GSList *l; uint8_t opdu[ATT_MAX_MTU]; guint handle; uint16_t olen; if (len < 3) { DBG("Malformed notification/indication packet (opcode 0x%02x)", pdu[0]); return; } handle = att_get_u16(&pdu[1]); l = g_slist_find_custom(gatt->chars, GUINT_TO_POINTER(handle), characteristic_handle_cmp); if (!l) return; chr = l->data; if (chr == NULL) { DBG("Attribute handle 0x%02x not found", handle); return; } switch (pdu[0]) { case ATT_OP_HANDLE_IND: olen = enc_confirmation(opdu, sizeof(opdu)); g_attrib_send(gatt->attrib, 0, opdu[0], opdu, olen, NULL, NULL, NULL); case ATT_OP_HANDLE_NOTIFY: if (characteristic_set_value(chr, &pdu[3], len - 3) < 0) DBG("Can't change Characteristic 0x%02x", handle); g_slist_foreach(gatt->watchers, update_watchers_valuechange, chr); break; } }
static void events_handler(const uint8_t *pdu, uint16_t len, gpointer user_data) { uint8_t *opdu; uint16_t handle, i, olen; size_t plen; GString *s; handle = get_le16(&pdu[1]); switch (pdu[0]) { case ATT_OP_HANDLE_NOTIFY: s = g_string_new(NULL); g_string_printf(s, "Notification handle = 0x%04x value: ", handle); break; case ATT_OP_HANDLE_IND: s = g_string_new(NULL); g_string_printf(s, "Indication handle = 0x%04x value: ", handle); break; default: error("Invalid opcode\n"); return; } for (i = 3; i < len; i++) g_string_append_printf(s, "%02x ", pdu[i]); rl_printf("%s\n", s->str); g_string_free(s, TRUE); if (pdu[0] == ATT_OP_HANDLE_NOTIFY) return; opdu = g_attrib_get_buffer(attrib, &plen); olen = enc_confirmation(opdu, plen); if (olen > 0) g_attrib_send(attrib, 0, opdu, olen, NULL, NULL, NULL); }
static void controlpoint_ind_handler(const uint8_t *pdu, uint16_t len, gpointer user_data) { struct csc *csc = user_data; struct controlpoint_req *req = csc->pending_req; uint8_t opcode; uint8_t req_opcode; uint8_t rsp_code; uint8_t *opdu; uint16_t olen; size_t plen; if (len < ATT_HDR_LEN) { error("Invalid PDU received"); return; } /* skip ATT header */ pdu += ATT_HDR_LEN; len -= ATT_HDR_LEN; if (len < 1) { error("Op Code missing"); goto done; } opcode = *pdu; pdu++; len--; if (opcode != RESPONSE_CODE) { DBG("Unsupported Op Code received (%d)", opcode); goto done; } if (len < 2) { error("Invalid Response Code PDU received"); goto done; } req_opcode = *pdu; rsp_code = *(pdu + 1); pdu += 2; len -= 2; if (req == NULL || req->opcode != req_opcode) { DBG("Indication received without pending request"); goto done; } switch (req->opcode) { case SET_CUMULATIVE_VALUE: controlpoint_method_reply(req, rsp_code); break; case REQUEST_SUPPORTED_SENSOR_LOC: if (rsp_code == RSP_SUCCESS) { csc->num_locations = len; csc->locations = g_memdup(pdu, len); } else { error("Failed to read Supported Sendor Locations"); } break; case UPDATE_SENSOR_LOC: csc->location = req->pending_location; controlpoint_property_reply(req, rsp_code); g_dbus_emit_property_changed(btd_get_dbus_connection(), device_get_path(csc->dev), CYCLINGSPEED_INTERFACE, "Location"); break; } csc->pending_req = NULL; g_source_remove(req->timeout); g_free(req); done: opdu = g_attrib_get_buffer(csc->attrib, &plen); olen = enc_confirmation(opdu, plen); if (olen > 0) g_attrib_send(csc->attrib, 0, opdu, olen, NULL, NULL, NULL); }