5#include <kindlebt/kindlebt_log.h>
12static bool read_characteristic =
false;
13static bool wrote_characteristic =
false;
16void print_uuid(
uuid_t* uuid) {
18 "UUID: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
19 uuid->uu[0], uuid->uu[1], uuid->uu[2], uuid->uu[3], uuid->uu[4], uuid->uu[5], uuid->uu[5],
20 uuid->uu[7], uuid->uu[8], uuid->uu[9], uuid->uu[10], uuid->uu[11], uuid->uu[12],
21 uuid->uu[13], uuid->uu[14], uuid->uu[15]
31 for (
int idx = 0; idx < value->size; idx++)
32 printf(
"%02x ", value->data[idx]);
37 if (chars_value == NULL || chars_value->blobValue.data == NULL)
return;
39 free(chars_value->blobValue.data);
40 chars_value->blobValue.data = NULL;
41 chars_value->blobValue.size = 0;
42 chars_value->blobValue.offset = 0;
45void setGattBlobFromBytes(
48 if (chars_value == NULL || data == NULL || size == 0)
return;
50 free(chars_value->blobValue.data);
52 uint8_t* blob = malloc(size);
53 if (blob == NULL)
return;
55 memcpy(blob, data, size);
57 chars_value->blobValue.data = blob;
58 chars_value->blobValue.size = size;
59 chars_value->blobValue.offset = 0;
64void bleGattcNotifyCharsCallback(
67 printf(
"Callback %s(): conn_handle %p", __func__, conn_handle);
68 print_uuid(&chars_value.gattRecord.uuid);
69 print_data(&chars_value.blobValue);
72void bleGattcReadCharsCallback(
75 printf(
"Callback %s(): status %d conn_handle %p\n", __func__, status, conn_handle);
76 print_uuid(&chars_value.gattRecord.uuid);
77 print_data(&chars_value.blobValue);
78 read_characteristic =
true;
81void bleGattcWriteCharsCallback(
84 printf(
"Callback %s(): conn_handle %p status %d", __func__, conn_handle, status);
85 wrote_characteristic =
true;
90 .notify_characteristics_cb = bleGattcNotifyCharsCallback,
91 .on_ble_gattc_read_characteristics_cb = bleGattcReadCharsCallback,
92 .on_ble_gattc_write_characteristics_cb = bleGattcWriteCharsCallback,
101 if (setgid((gid_t)1003) || setuid((uid_t)1003)) {
102 fprintf(stderr,
"Can't drop privileges to bluetooth user/group\n");
106 printf(
"Hello World from Kindle!\n");
111 printf(
"Is BLE enabled: %d\n", isBLE);
113 fprintf(stderr,
"BLE is not enabled\n");
121 status =
openSession(ACEBT_SESSION_TYPE_DUAL_MODE, &bt_session);
123 "Opened session status %d, session %p (u32 %u)\n", status, bt_session, (uint32_t)bt_session
125 if (status != ACE_STATUS_OK) {
126 fprintf(stderr,
"Cannot open Bluetooth session, status: %d\n", status);
133 printf(
"Registered BLE: %d\n", status);
134 if (status != ACE_STATUS_OK) {
135 fprintf(stderr,
"Cannot register BLE, status: %d\n", status);
142 printf(
"Registered GATT Client status: %d\n", status);
143 if (status != ACE_STATUS_OK) {
144 fprintf(stderr,
"Cannot register GATT Client, status: %d\n", status);
150 bdAddr_t ble_addr = {.address = {0x2C, 0xCF, 0x67, 0xB8, 0xDC, 0x3F}};
152 bt_session, &conn_handle, &ble_addr, ACE_BT_BLE_CONN_PARAM_BALANCED,
153 ACEBT_BLE_GATT_CLIENT_ROLE, ACE_BT_BLE_CONN_PRIO_MEDIUM
155 printf(
"Connected to BLE status:%d\n", status);
156 if (status != ACE_STATUS_OK) {
157 fprintf(stderr,
"Cannot connect to BLE device, status: %d\n", status);
164 printf(
"Discovered all services: %d\n", status);
165 if (status != ACE_STATUS_OK) {
166 fprintf(stderr,
"Cannot discover services of BLE device, status: %d\n", status);
175 printf(
"Requested GATT DB status: %d\n", status);
176 if (status != ACE_STATUS_OK) {
177 fprintf(stderr,
"Cannot retrieve services of BLE device, status: %d\n", status);
187 {0xFF, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
189 .type = ACEBT_UUID_TYPE_16,
192 if (charac == NULL) {
193 printf(
"Couldn't find the characteristic");
199 if (status != ACE_STATUS_OK) {
201 stderr,
"Cannot enable notifications on BLE device/characteristic, status: %d\n", status
210 if (status != ACE_STATUS_OK) {
212 stderr,
"Cannot disable notifications on BLE device/characteristic, status: %d\n",
221 for (
int i = 0; i < 20; i++) {
224 if (status != ACE_STATUS_OK) {
225 fprintf(stderr,
"Cannot read characteristic, status: %d\n", status);
228 for (
int j = 0; j < 10; j++) {
229 if (read_characteristic)
break;
232 if (!read_characteristic) {
233 fprintf(stderr,
"Timed out waiting to read characteristic, status: %d\n", status);
236 read_characteristic =
false;
238 freeGattBlob(&charac->value);
242 uint8_t off[] = {
'O',
'F',
'F'};
243 uint8_t on[] = {
'O',
'N'};
244 uint8_t* states[] = {off, on};
245 size_t lengths[] = {
sizeof(off),
sizeof(on)};
248 setGattBlobFromBytes(&charac->value, states[i % 2], lengths[i % 2]);
251 bt_session, conn_handle, &charac->value, ACEBT_BLE_WRITE_TYPE_RESP_REQUIRED
253 if (status != ACE_STATUS_OK) {
254 fprintf(stderr,
"Cannot write characteristic, status: %d\n", status);
257 for (
int j = 0; j < 10; j++) {
258 if (wrote_characteristic)
break;
261 if (!wrote_characteristic) {
262 fprintf(stderr,
"Timed out waiting to write characteristic, status: %d\n", status);
265 wrote_characteristic =
false;
266 freeGattBlob(&charac->value);
272 printf(
"Disconnected from BLE status: %d\n", status);
275 printf(
"Deregistered GATT Client status: %d\n", status);
278 printf(
"Deregistered BLE status: %d\n", status);
281 printf(
"Closed session status: %d\n", status);
aceBT_bleGattClientCallbacks_t bleGattClientCallbacks_t
Callback struct of GATT Client Bluetooth operations.
aceBT_bdAddr_t bdAddr_t
Bluetooth address.
ace_status_t status_t
Bluetooth API status codes.
aceBT_bleGattBlobValue_t bleGattBlobValue_t
BLE blob value.
aceBT_bleGattsService_t bleGattsService_t
Structure for a GATT Server service.
aceBT_uuid_t uuid_t
Bluetooth UUID struct.
aceBT_bleConnHandle bleConnHandle
Connection handle for the lifetime of a Bluetooth connection.
#define BLE_FORMAT_BLOB
BLOB format.
aceBT_sessionHandle sessionHandle
Session handle for the lifetime of the Bluetooth application.
aceBT_bleGattCharacteristicsValue_t bleGattCharacteristicsValue_t
BLE GATT Characteristic.
status_t bleWriteCharacteristic(sessionHandle session_handle, bleConnHandle conn_handle, bleGattCharacteristicsValue_t *chars_value, responseType_t request_type)
Write a Characteristic from a BLE device.
void kindlebt_set_log_level(log_level_t level)
Set the log level for log.c.
status_t bleGetDatabase(bleConnHandle conn_handle, bleGattsService_t *p_gatt_service)
Retrieve all services of a remote GATT Server.
status_t openSession(sessionType_t session_type, sessionHandle *session_handle)
Open a Bluetooth session.
status_t bleRegisterGattClient(sessionHandle session_handle, bleGattClientCallbacks_t *callbacks)
Register as a BLE GATT Client.
struct aceBT_gattCharRec_t * utilsFindCharRec(uuid_t uuid, uint8_t uuid_len)
Find a GATT Characteristic Record by UUID.
status_t bleRegister(sessionHandle session_handle)
Register as BLE client.
status_t bleSetNotification(sessionHandle session_handle, bleConnHandle conn_handle, bleGattCharacteristicsValue_t chars_value, bool enable)
Set notifications on a Characteristic from a BLE device.
status_t closeSession(sessionHandle session_handle)
Close a Bluetooth session.
status_t bleDeregister(sessionHandle session_handle)
Deregister as BLE client.
bool isBLESupported(void)
Is BLE supported by the hardware Bluetooth adapter.
status_t bleReadCharacteristic(sessionHandle session_handle, bleConnHandle conn_handle, bleGattCharacteristicsValue_t chars_value)
Read a Characteristic from a BLE device.
status_t bleDiscoverAllServices(sessionHandle session_handle, bleConnHandle conn_handle)
Discover all services of a remote GATT Server.
status_t bleConnect(sessionHandle session_handle, bleConnHandle *conn_handle, bdAddr_t *p_device, bleConnParam_t conn_param, bleConnRole_t conn_role, bleConnPriority_t conn_priority)
Connect to a BLE device.
status_t bleDisconnect(bleConnHandle conn_handle)
Disconnect from a BLE device.
status_t bleDeregisterGattClient(sessionHandle session_handle)
Deregister as a BLE GATT Client.
Bluetooth library for Kindles.