diff --git a/example/Makefile.inc b/example/Makefile.inc index d8b0ca71b..325b71ec4 100644 --- a/example/Makefile.inc +++ b/example/Makefile.inc @@ -338,6 +338,9 @@ clean: rm -f ancs_client_demo.h profile.h spp_and_le_counter.h le_counter.h le_streamer.h hog_keyboard_demo.h hog_mouse_demo.h rm -f gatt_battery_query.h gatt_browser.h sm_pairing_peripheral.h spp_and_le_streamer.h rm -f le_data_channel_server.h sm_pairing_central.h + rm -f nordic_spp_le_counter.h nordic_spp_le_streamer.h nordic_spp_le_counter nordic_spp_le_streamer + rm -f le_streamer_and_counter_client.h le_streamer_and_counter_client + rm -f sco_output.msbc sco_input.msbc rm -rf *.dSYM rm -rf ${BTSTACK_ROOT}/src/*.o rm -rf ${BTSTACK_ROOT}/src/ble/*.o diff --git a/example/nordic_spp_le_counter.c b/example/nordic_spp_le_counter.c index 2a27bbf0b..f931ffed7 100644 --- a/example/nordic_spp_le_counter.c +++ b/example/nordic_spp_le_counter.c @@ -48,7 +48,7 @@ #include #include -#include "nordic_le_counter.h" +#include "nordic_spp_le_counter.h" #include "btstack.h" #include "ble/gatt-service/nordic_spp_service_server.h" @@ -76,7 +76,7 @@ const uint8_t adv_data[] = { // Flags general discoverable, BR/EDR not supported 2, BLUETOOTH_DATA_TYPE_FLAGS, 0x06, // Name - 6, BLUETOOTH_DATA_TYPE_COMPLETE_LOCAL_NAME, 'A', 'M', 'B', 'E', 'R', + 8, BLUETOOTH_DATA_TYPE_COMPLETE_LOCAL_NAME, 'n', 'R', 'F',' ', 'S', 'P', 'P', // UUID ... 17, BLUETOOTH_DATA_TYPE_COMPLETE_LIST_OF_128_BIT_SERVICE_CLASS_UUIDS, 0x6e, 0x40, 0x0, 0x1, 0xc3, 0x52, 0x11, 0xe5, 0x95, 0x3d, 0x0, 0x2, 0xa5, 0xd5, 0xc5, 0x1b, }; diff --git a/example/nordic_spp_le_counter.gatt b/example/nordic_spp_le_counter.gatt index a999c091d..a7b47da38 100644 --- a/example/nordic_spp_le_counter.gatt +++ b/example/nordic_spp_le_counter.gatt @@ -1,4 +1,4 @@ PRIMARY_SERVICE, GAP_SERVICE -CHARACTERISTIC, GAP_DEVICE_NAME, READ, "Nordic" +CHARACTERISTIC, GAP_DEVICE_NAME, READ, "Nordic SPP Counter" #import \ No newline at end of file diff --git a/example/nordic_spp_le_streamer.c b/example/nordic_spp_le_streamer.c index 36d3c0503..8c20b216b 100644 --- a/example/nordic_spp_le_streamer.c +++ b/example/nordic_spp_le_streamer.c @@ -73,7 +73,7 @@ const uint8_t adv_data[] = { // Flags general discoverable, BR/EDR not supported 2, BLUETOOTH_DATA_TYPE_FLAGS, 0x06, // Name - 6, BLUETOOTH_DATA_TYPE_COMPLETE_LOCAL_NAME, 'A', 'M', 'B', 'E', 'R', + 8, BLUETOOTH_DATA_TYPE_COMPLETE_LOCAL_NAME, 'n', 'R', 'F',' ', 'S', 'P', 'P', // UUID ... 17, BLUETOOTH_DATA_TYPE_COMPLETE_LIST_OF_128_BIT_SERVICE_CLASS_UUIDS, 0x6e, 0x40, 0x0, 0x1, 0xc3, 0x52, 0x11, 0xe5, 0x95, 0x3d, 0x0, 0x2, 0xa5, 0xd5, 0xc5, 0x1b, }; @@ -280,9 +280,7 @@ static void nordic_data_received(hci_con_handle_t tx_con_handle, const uint8_t * } int btstack_main(void); -int btstack_main(void) -{ - +int btstack_main(void){ // register for HCI events hci_event_callback_registration.callback = &packet_handler; hci_add_event_handler(&hci_event_callback_registration); diff --git a/example/nordic_spp_le_streamer.gatt b/example/nordic_spp_le_streamer.gatt index a999c091d..759d06888 100644 --- a/example/nordic_spp_le_streamer.gatt +++ b/example/nordic_spp_le_streamer.gatt @@ -1,4 +1,4 @@ PRIMARY_SERVICE, GAP_SERVICE -CHARACTERISTIC, GAP_DEVICE_NAME, READ, "Nordic" +CHARACTERISTIC, GAP_DEVICE_NAME, READ, "Nordic SPP Streamer" #import \ No newline at end of file diff --git a/port/libusb/.gitignore b/port/libusb/.gitignore index 7f9e31632..6c44856f3 100644 --- a/port/libusb/.gitignore +++ b/port/libusb/.gitignore @@ -77,3 +77,7 @@ spp_counter spp_streamer spp_streamer_client build* +nordic_spp_le_counter +nordic_spp_le_counter.h +nordic_spp_le_streamer +nordic_spp_le_streamer.h \ No newline at end of file diff --git a/src/ble/gatt-service/Makefile.inc b/src/ble/gatt-service/Makefile.inc index f85fe5fd0..7f0353887 100644 --- a/src/ble/gatt-service/Makefile.inc +++ b/src/ble/gatt-service/Makefile.inc @@ -3,7 +3,9 @@ SRC_BLE_GATT-SERVICE_FILES = \ battery_service_server.c \ device_information_service_server.c \ - heart_rate_service_server.c \ + heart_rate_service_server.c \ hids_device.c \ nordic_spp_service_server.c \ + ublox_spp_service_server.c \ + diff --git a/src/ble/gatt-service/nordic_spp_service.gatt b/src/ble/gatt-service/nordic_spp_service.gatt index 234406707..0f2b29ea7 100644 --- a/src/ble/gatt-service/nordic_spp_service.gatt +++ b/src/ble/gatt-service/nordic_spp_service.gatt @@ -2,6 +2,6 @@ // Nordic SPP-like PRIMARY_SERVICE, 6E400001-B5A3-F393-E0A9-E50E24DCCA9E -CHARACTERISTIC, 6E400002-B5A3-F393-E0A9-E50E24DCCA9E, DYNAMIC | NOTIFY, -CHARACTERISTIC, 6E400003-B5A3-F393-E0A9-E50E24DCCA9E, DYNAMIC | WRITE | WRITE_WITHOUT_RESPONSE, +CHARACTERISTIC, 6E400002-B5A3-F393-E0A9-E50E24DCCA9E, DYNAMIC | WRITE | WRITE_WITHOUT_RESPONSE, +CHARACTERISTIC, 6E400003-B5A3-F393-E0A9-E50E24DCCA9E, DYNAMIC | NOTIFY, diff --git a/src/ble/gatt-service/nordic_spp_service_server.c b/src/ble/gatt-service/nordic_spp_service_server.c index 6d65f2bf4..90a3b8cd6 100644 --- a/src/ble/gatt-service/nordic_spp_service_server.c +++ b/src/ble/gatt-service/nordic_spp_service_server.c @@ -44,11 +44,17 @@ * and call all functions below. All strings and blobs need to stay valid after calling the functions. */ +#include +#include +#include +#include + #include "btstack_defines.h" #include "ble/att_db.h" #include "ble/att_server.h" #include "btstack_util.h" #include "bluetooth_gatt.h" +#include "btstack_debug.h" #include "ble/gatt-service/nordic_spp_service_server.h" @@ -60,18 +66,19 @@ static const uint8_t nordic_spp_tx_uuid128[] = { 0x6E, 0x40, 0x00, 0x03, 0xB5 static att_service_handler_t nordic_spp_service; static void (*client_callback)(hci_con_handle_t con_handle, const uint8_t * data, uint16_t size); -static uint16_t nordic_spp_tx_value_handle; static uint16_t nordic_spp_rx_value_handle; -static uint16_t nordic_spp_rx_client_configuration_handle; -static uint16_t nordic_spp_rx_client_configuration_value; +static uint16_t nordic_spp_tx_value_handle; +static uint16_t nordic_spp_tx_client_configuration_handle; +static uint16_t nordic_spp_tx_client_configuration_value; static uint16_t nordic_spp_service_read_callback(hci_con_handle_t con_handle, uint16_t attribute_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){ UNUSED(con_handle); UNUSED(offset); UNUSED(buffer_size); - if (attribute_handle == nordic_spp_rx_client_configuration_handle){ + + if (attribute_handle == nordic_spp_tx_client_configuration_handle){ if (buffer){ - little_endian_store_16(buffer, 0, nordic_spp_rx_client_configuration_value); + little_endian_store_16(buffer, 0, nordic_spp_tx_client_configuration_value); } return 2; } @@ -82,16 +89,18 @@ static int nordic_spp_service_write_callback(hci_con_handle_t con_handle, uint16 UNUSED(transaction_mode); UNUSED(offset); UNUSED(buffer_size); - - if (attribute_handle == nordic_spp_tx_value_handle){ + + if (attribute_handle == nordic_spp_rx_value_handle){ + printf_hexdump(buffer, buffer_size); client_callback(con_handle, &buffer[0], buffer_size); } - if (attribute_handle == nordic_spp_rx_client_configuration_handle){ - nordic_spp_rx_client_configuration_value = little_endian_read_16(buffer, 0); - if (nordic_spp_rx_client_configuration_value){ + if (attribute_handle == nordic_spp_tx_client_configuration_handle){ + nordic_spp_tx_client_configuration_value = little_endian_read_16(buffer, 0); + if (nordic_spp_tx_client_configuration_value){ client_callback(con_handle, NULL, 0); } } + return 0; } @@ -104,15 +113,19 @@ void nordic_spp_service_server_init(void (*callback)(hci_con_handle_t con_handle // get service handle range uint16_t start_handle = 0; - uint16_t end_handle = 0xfff; + uint16_t end_handle = 0xffff; int service_found = gatt_server_get_get_handle_range_for_service_with_uuid128(nordic_spp_profile_uuid128, &start_handle, &end_handle); if (!service_found) return; // get characteristic value handle and client configuration handle - nordic_spp_tx_value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid128(start_handle, end_handle, nordic_spp_tx_uuid128); nordic_spp_rx_value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid128(start_handle, end_handle, nordic_spp_rx_uuid128); - nordic_spp_rx_client_configuration_handle = gatt_server_get_client_configuration_handle_for_characteristic_with_uuid128(start_handle, end_handle, nordic_spp_rx_uuid128); + nordic_spp_tx_value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid128(start_handle, end_handle, nordic_spp_tx_uuid128); + nordic_spp_tx_client_configuration_handle = gatt_server_get_client_configuration_handle_for_characteristic_with_uuid128(start_handle, end_handle, nordic_spp_tx_uuid128); + log_info("nordic_spp_rx_value_handle 0x%02x", nordic_spp_rx_value_handle); + log_info("nordic_spp_tx_value_handle 0x%02x", nordic_spp_tx_value_handle); + log_info("nordic_spp_tx_client_configuration_handle 0x%02x", nordic_spp_tx_client_configuration_handle); + // register service with ATT Server nordic_spp_service.start_handle = start_handle; nordic_spp_service.end_handle = end_handle; @@ -137,6 +150,6 @@ void nordic_spp_service_server_request_can_send_now(btstack_context_callback_reg * @param size */ int nordic_spp_service_server_send(hci_con_handle_t con_handle, const uint8_t * data, uint16_t size){ - return att_server_notify(con_handle, nordic_spp_rx_value_handle, &data[0], size); + return att_server_notify(con_handle, nordic_spp_tx_value_handle, (uint8_t *)&data[0], size); }