From a435582038a32ebc8bce4a1784032ba9a37d86e4 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Tue, 8 Nov 2016 21:30:36 +0100 Subject: [PATCH 1/5] GATT Server: implement Device Information Service Server --- .../device_information_service.gatt | 14 ++ .../device_information_service_server.c | 227 ++++++++++++++++++ .../device_information_service_server.h | 130 ++++++++++ 3 files changed, 371 insertions(+) create mode 100644 src/ble/gatt-service/device_information_service.gatt create mode 100644 src/ble/gatt-service/device_information_service_server.c create mode 100644 src/ble/gatt-service/device_information_service_server.h diff --git a/src/ble/gatt-service/device_information_service.gatt b/src/ble/gatt-service/device_information_service.gatt new file mode 100644 index 000000000..1f62b6047 --- /dev/null +++ b/src/ble/gatt-service/device_information_service.gatt @@ -0,0 +1,14 @@ +// Specification Type org.bluetooth.service.device_information +// https://www.bluetooth.com/api/gatt/xmlfile?xmlFileName=org.bluetooth.service.device_information.xml + +// Device Information 180A +PRIMARY_SERVICE, ORG_BLUETOOTH_SERVICE_DEVICE_INFORMATION +CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_MANUFACTURER_NAME_STRING, DYNAMIC | READ, +CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_MODEL_NUMBER_STRING, DYNAMIC | READ, +CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_SERIAL_NUMBER_STRING, DYNAMIC | READ, +CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_HARDWARE_REVISION_STRING, DYNAMIC | READ, +CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_FIRMWARE_REVISION_STRING, DYNAMIC | READ, +CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_SOFTWARE_REVISION_STRING, DYNAMIC | READ, +CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_SYSTEM_ID, DYNAMIC | READ, +CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_IEEE_11073_20601_REGULATORY_CERTIFICATION_DATA_LIST, DYNAMIC | READ, +CHARACTERISTIC, ORG_BLUETOOTH_CHARACTERISTIC_PNP_ID, DYNAMIC | READ, diff --git a/src/ble/gatt-service/device_information_service_server.c b/src/ble/gatt-service/device_information_service_server.c new file mode 100644 index 000000000..cb782ed27 --- /dev/null +++ b/src/ble/gatt-service/device_information_service_server.c @@ -0,0 +1,227 @@ +/* + * Copyright (C) 2014 BlueKitchen GmbH + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * 4. Any redistribution, use, or modification is done solely for + * personal benefit and not for any commercial purpose or for + * monetary gain. + * + * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS + * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Please inquire about commercial licensing options at + * contact@bluekitchen-gmbh.com + * + */ + +/** + * Implementation of the Device Information Service Server + * + * To use with your application, add '#import > 32; + little_endian_store_16(device_information_system_id, 5, organizationally_unique_identifier); + device_information_system_id[7] = organizationally_unique_identifier >> 16; +} + +/** + * @brief Set IEEE 11073-20601 regulatory certification data list + * @note: format duint16. duint16 is two uint16 values concatenated together. + * @param ieee_regulatory_certification + */ +void device_information_service_server_set_ieee_regulatory_certification(uint16_t value_a, uint16_t value_b){ + device_information_fields[IEEE_REGULATORY_CERTIFICATION].data = device_information_ieee_regulatory_certification; + device_information_fields[IEEE_REGULATORY_CERTIFICATION].len = 4; + + little_endian_store_16(device_information_ieee_regulatory_certification, 0, value_a); + little_endian_store_16(device_information_ieee_regulatory_certification, 2, value_b); +} + +/** + * @brief Set PNP ID + * @param vendor_source_id + * @param vendor_id + * @param product_id + */ +void device_information_service_server_set_pnp_id(uint8_t vendor_source_id, uint16_t vendor_id, uint16_t product_id, uint16_t product_version){ + device_information_fields[PNP_ID].data = device_information_pnp_id; + device_information_fields[PNP_ID].len = 7; + + device_information_pnp_id[0] = vendor_source_id; + little_endian_store_16(device_information_pnp_id, 1, vendor_source_id); + little_endian_store_16(device_information_pnp_id, 3, vendor_id); + little_endian_store_16(device_information_pnp_id, 5, product_id); +} diff --git a/src/ble/gatt-service/device_information_service_server.h b/src/ble/gatt-service/device_information_service_server.h new file mode 100644 index 000000000..23c88c88d --- /dev/null +++ b/src/ble/gatt-service/device_information_service_server.h @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2014 BlueKitchen GmbH + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * 4. Any redistribution, use, or modification is done solely for + * personal benefit and not for any commercial purpose or for + * monetary gain. + * + * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS + * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Please inquire about commercial licensing options at + * contact@bluekitchen-gmbh.com + * + */ +#ifndef __DEVICE_INFORMATION_SERVICE_SERVER_H +#define __DEVICE_INFORMATION_SERVICE_SERVER_H + +#include + +#if defined __cplusplus +extern "C" { +#endif + +/* API_START */ + +/** + * Implementation of the Device Information Service Server + * + * To use with your application, add '#import Date: Wed, 9 Nov 2016 15:22:30 +0100 Subject: [PATCH 2/5] github page: link to builders --- README.md | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 1a461e94f..f883808a4 100644 --- a/README.md +++ b/README.md @@ -55,24 +55,25 @@ Coming next: HID, HOGP, A2DP, and more. #### Embedded Platforms: Status | Platform -------------- | ------ -![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-ez430-rf2560-develop) | [EZ430-RF256x Bluetooth Evaluation Tool for MSP430](http://www.ti.com/tool/ez430-rf256x) -![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-msp-exp430f5438-cc2564b-develop) | [MSP430F5438 Experimenter Board for MSP430](http://www.ti.com/tool/msp-exp430f5438) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) -![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-msp430f5229lp-cc2564b-develop) | [MSP-EXP430F5529LP LaunchPad](http://www.ti.com/ww/en/launchpad/launchpads-msp430-msp-exp430f5529lp.html#tabs) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) and [EM Adapter BoosterPack](http://www.ti.com/tool/boost-ccemadapter) with additional 32768Hz quartz oscillator -![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-stm32-f103rb-nucleo-develop) | [STM32 Nucleo development board NUCLEO-F103RB](http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF259875) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) and [EM Adapter BoosterPack](http://www.ti.com/tool/boost-ccemadapter) with additional 32768Hz quartz oscillator -![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-pic32-harmony-develop) | [Microchip's PIC32 Bluetooth Audio Development Kit](http://www.microchip.com/Developmenttools/ProductDetails.aspx?PartNO=DV320032) -![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-wiced-develop) | [RedBear Duo](https://github.com/redbear/WICED-SDK) with Broadcom BCM43438 A1 + +[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-ez430-rf2560-develop) | [EZ430-RF256x Bluetooth Evaluation Tool for MSP430](http://www.ti.com/tool/ez430-rf256x) +[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-msp-exp430f5438-cc2564b-develop) | [MSP430F5438 Experimenter Board for MSP430](http://www.ti.com/tool/msp-exp430f5438) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) +[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-msp430f5229lp-cc2564b-develop) | [MSP-EXP430F5529LP LaunchPad](http://www.ti.com/ww/en/launchpad/launchpads-msp430-msp-exp430f5529lp.html#tabs) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) and [EM Adapter BoosterPack](http://www.ti.com/tool/boost-ccemadapter) with additional 32768Hz quartz oscillator +[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-stm32-f103rb-nucleo-develop) | [STM32 Nucleo development board NUCLEO-F103RB](http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF259875) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) and [EM Adapter BoosterPack](http://www.ti.com/tool/boost-ccemadapter) with additional 32768Hz quartz oscillator +[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-pic32-harmony-develop) | [Microchip's PIC32 Bluetooth Audio Development Kit](http://www.microchip.com/Developmenttools/ProductDetails.aspx?PartNO=DV320032) +[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-wiced-develop) | [RedBear Duo](https://github.com/redbear/WICED-SDK) with Broadcom BCM43438 A1 #### Other Platforms: Status | Platform -------------- | ------ -![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-posix-h4-develop)| posix: Unix-based system talking to Bluetooth module via serial port -![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-libusb-develop)| libusb: Unix-based system talking via USB Bluetooth dongle -![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-daemon-develop)| daemon: TCP and Unix domain named socket client-server architecture supporting multiple clients -![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=java-develop)| java: Java wrapper for daemon -![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-ios-develop)| iOS: daemon for iOS jailbreak devices, C client-server API -![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-mtk-develop)| mtk: daemon for rooted Android devices, based on Mediatek MT65xx processor, Java and C client-server API -![buildstatus](http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-wiced-develop) | wiced: Broadcom platforms that support the WICED SDK +[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-posix-h4-develop) | posix: Unix-based system talking to Bluetooth module via serial port +[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-libusb-develop) | libusb: Unix-based system talking via USB Bluetooth dongle +[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-daemon-develop) | daemon: TCP and Unix domain named socket client-server architecture supporting multiple clients +[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/java-develop) | java: Java wrapper for daemon +[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-ios-develop) | iOS: daemon for iOS jailbreak devices, C client-server API +[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-mtk-develop) | mtk: daemon for rooted Android devices, based on Mediatek MT65xx processor, Java and C client-server API +[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-wiced-develop) | wiced: Broadcom platforms that support the WICED SDK ## Supported Chipsets Chipsets | Status From d69d1d4efd8e933d596489774232b67f7437cdb3 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Wed, 9 Nov 2016 15:25:18 +0100 Subject: [PATCH 3/5] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index f883808a4..53f7e0830 100644 --- a/README.md +++ b/README.md @@ -55,8 +55,7 @@ Coming next: HID, HOGP, A2DP, and more. #### Embedded Platforms: Status | Platform -------------- | ------ - -[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-ez430-rf2560-develop) | [EZ430-RF256x Bluetooth Evaluation Tool for MSP430](http://www.ti.com/tool/ez430-rf256x) +[](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-ez430-rf2560-develop) | [EZ430-RF256x Bluetooth Evaluation Tool for MSP430](http://www.ti.com/tool/ez430-rf256x) [](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-msp-exp430f5438-cc2564b-develop) | [MSP430F5438 Experimenter Board for MSP430](http://www.ti.com/tool/msp-exp430f5438) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) [](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-msp430f5229lp-cc2564b-develop) | [MSP-EXP430F5529LP LaunchPad](http://www.ti.com/ww/en/launchpad/launchpads-msp430-msp-exp430f5529lp.html#tabs) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) and [EM Adapter BoosterPack](http://www.ti.com/tool/boost-ccemadapter) with additional 32768Hz quartz oscillator [](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-stm32-f103rb-nucleo-develop) | [STM32 Nucleo development board NUCLEO-F103RB](http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF259875) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) and [EM Adapter BoosterPack](http://www.ti.com/tool/boost-ccemadapter) with additional 32768Hz quartz oscillator From 59ef3efeb864d80b951428dfbf7f96f52ea0ea5e Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Wed, 9 Nov 2016 15:27:50 +0100 Subject: [PATCH 4/5] README.md: update to docs for develop branch --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 53f7e0830..26114bd40 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,8 @@ It has been qualified with the the Bluetooth SIG for GAP, IOP, HFP, HSP, SPP, PA GATT, SM of the Bluetooth 4.2 LE Central and Peripheral roles (QD ID 25340). ## Documentation -- [HTML](http://bluekitchen-gmbh.com/btstack) -- [PDF](http://bluekitchen-gmbh.com/btstack.pdf) +- [HTML](http://bluekitchen-gmbh.com/btstack/develop/) +- [PDF](http://bluekitchen-gmbh.com/btstack_develop.pdf) ## Supported Protocols * L2CAP From d2fb0b945a198f236666cc412db22e76a4c88cda Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Wed, 9 Nov 2016 15:46:13 +0100 Subject: [PATCH 5/5] java: support D (8 bytes) and Q (32 bytes) format types --- tool/java_binding.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/tool/java_binding.py b/tool/java_binding.py index 4b11f5cd3..6db69c347 100755 --- a/tool/java_binding.py +++ b/tool/java_binding.py @@ -111,6 +111,12 @@ java_event_getter_data = \ System.arraycopy(data, {1}, result, 0, len); return result;''' +java_event_getter_data_fixed = \ +'''int len = {0}; + byte[] result = new byte[len]; + System.arraycopy(data, {1}, result, 0, len); + return result;''' + java_event_getter_remaining_data = \ '''int len = getPayloadLen() - {0}; byte[] result = new byte[len]; @@ -140,7 +146,7 @@ defines_used = set() def java_type_for_btstack_type(type): param_types = { '1' : 'int', '2' : 'int', '3' : 'int', '4' : 'long', 'H' : 'int', 'B' : 'BD_ADDR', 'D' : 'byte []', 'E' : 'byte [] ', 'N' : 'String' , 'P' : 'byte []', 'A' : 'byte []', - 'R' : 'byte []', 'S' : 'byte []', + 'R' : 'byte []', 'S' : 'byte []', 'Q' : 'byte []', 'J' : 'int', 'L' : 'int', 'V' : 'byte []', 'U' : 'BT_UUID', 'X' : 'GATTService', 'Y' : 'GATTCharacteristic', 'Z' : 'GATTCharacteristicDescriptor', 'T' : 'String'} @@ -148,7 +154,7 @@ def java_type_for_btstack_type(type): def size_for_type(type): param_sizes = { '1' : 1, '2' : 2, '3' : 3, '4' : 4, 'H' : 2, 'B' : 6, 'D' : 8, 'E' : 240, 'N' : 248, 'P' : 16, - 'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1} + 'A' : 31, 'S' : -1, 'V': -1, 'J' : 1, 'L' : 2, 'Q' : 32, 'U' : 16, 'X' : 20, 'Y' : 24, 'Z' : 18, 'T':-1} return param_sizes[type] def create_command_java(fout, name, ogf, ocf, format, params): @@ -166,6 +172,7 @@ def create_command_java(fout, name, ogf, ocf, format, params): 'D' : 'Util.storeBytes(command, offset, %s, 8);', 'E' : 'Util.storeBytes(command, offset, %s, 240);', 'P' : 'Util.storeBytes(command, offset, %s, 16);', + 'Q' : 'Util.storeBytes(command, offset, %s, 32);', 'A' : 'Util.storeBytes(command, offset, %s, 31);', 'S' : 'Util.storeBytes(command, offset, %s);', 'B' : 'Util.storeBytes(command, offset, %s.getBytes());', @@ -278,7 +285,8 @@ def create_event(event_name, format, args): 'Z' : 'return Util.readGattCharacteristicDescriptor(data, %u);', 'T' : 'int offset = %u; \n return Util.getText(data, offset, getPayloadLen()-offset);', 'N' : 'return Util.getText(data, %u, 248);', - # 'D' : 'Util.storeBytes(data, %u, 8);', + 'D' : 'Util.storeBytes(data, %u, 8);', + 'Q' : 'Util.storeBytes(data, %u, 32);', # 'E' : 'Util.storeBytes(data, %u, 240);', # 'P' : 'Util.storeBytes(data, %u, 16);', # 'A' : 'Util.storeBytes(data, %u, 31);', @@ -302,6 +310,9 @@ def create_event(event_name, format, args): elif f == 'V': access = java_event_getter_data.format(length_name, offset) size = 0 + elif f in ['D', 'Q']: + size = size_for_type(f) + access = java_event_getter_data_fixed.format(size, offset) else: access = param_read[f] % offset size = size_for_type(f)