#include #include #include #include #include "gattlib.h" #define ENV_CHAR_PRESSURE "00002a6d-0000-1000-8000-00805f9b34fb" #define ENV_CHAR_TEMPERATURE "00002a6e-0000-1000-8000-00805f9b34fb" #define LED_CHAR_SWITCH "0000ff12-0000-1000-8000-00805f9b34fb" #define LED_CHAR_STATE "0000ff11-0000-1000-8000-00805f9b34fb" gatt_connection_t* m_connection; static int opt_handle = -1; char buffer[10]; uuid_t env_char_temperature_uuid; uuid_t env_char_pressure_uuid; uuid_t led_char_switch_uuid; uuid_t led_char_state_uuid; uuid_t g_uuid; //====================================================================== void notification_cb(const uuid_t* uuid, const uint8_t* data, size_t data_length, void* user_data) { char uuid_str[MAX_LEN_UUID_STR + 1]; int i; gattlib_uuid_to_string(uuid, uuid_str, MAX_LEN_UUID_STR + 1); printf("Notification uuid = %s value: ", uuid_str); for (i = 0; i < data_length; i++) { printf("%d", data[i]); } printf("\n"); } //====================================================================== static void usage(char *argv[]) { printf("%s \n", argv[0]); } //====================================================================== void int_handler(int dummy) { gattlib_disconnect(m_connection); exit(0); } //====================================================================== gatt_read_cb_t read_cb(void) { } //====================================================================== int main(int argc, char *argv[]) { char input[256]; char* input_ptr; uint16_t temperature_handle = 0, pressure_handle = 0, switchLed_handle = 0, stateLed_handle=0; int i, ret, total_length, length = 0; void* adapter; if (argc != 2) { usage(argv); return 1; } ret = gattlib_adapter_open(NULL, &adapter); if (ret) { fprintf(stderr, "ERROR: Failed to open adapter.\n"); return 1; } m_connection = gattlib_connect(adapter, argv[1], BDADDR_LE_PUBLIC, BT_SEC_LOW, 0, 0); if (m_connection == NULL) { fprintf(stderr, "Fail to connect to the bluetooth device.\n"); return 1; } // Convert characteristics to their respective UUIDs ret = gattlib_string_to_uuid(ENV_CHAR_TEMPERATURE, strlen(ENV_CHAR_TEMPERATURE) + 1, &env_char_temperature_uuid); ret = gattlib_string_to_uuid(ENV_CHAR_PRESSURE, strlen(ENV_CHAR_PRESSURE) + 1, &env_char_pressure_uuid); ret = gattlib_string_to_uuid(LED_CHAR_SWITCH, strlen(LED_CHAR_SWITCH) + 1, &led_char_switch_uuid); ret = gattlib_string_to_uuid(LED_CHAR_STATE, strlen(LED_CHAR_STATE) + 1, &led_char_state_uuid); // Look for handle for CHARACTERISTIC_UUID gattlib_characteristic_t* characteristics; int characteristic_count; ret = gattlib_discover_char(m_connection, &characteristics, &characteristic_count); if (ret) { fprintf(stderr, "Fail to discover characteristic.\n"); return 1; } for (i = 0; i < characteristic_count; i++) { if (gattlib_uuid_cmp(&characteristics[i].uuid, &env_char_temperature_uuid) == 0) { temperature_handle = characteristics[i].value_handle; printf("temperature handle = %d \n", temperature_handle); } else if (gattlib_uuid_cmp(&characteristics[i].uuid, &env_char_pressure_uuid) == 0) { pressure_handle = characteristics[i].value_handle; printf("pressure handle = %d \n", pressure_handle); } else if (gattlib_uuid_cmp(&characteristics[i].uuid, &led_char_switch_uuid) == 0) { switchLed_handle = characteristics[i].value_handle; printf("switch led handle = %d \n", switchLed_handle); } else if (gattlib_uuid_cmp(&characteristics[i].uuid, &led_char_state_uuid) == 0) { stateLed_handle = characteristics[i].value_handle; printf("state led handle = %d \n", stateLed_handle); } } free(characteristics); // Enable Status Notification uint16_t enable_notification = 0x0001; gattlib_write_char_by_handle(m_connection, temperature_handle + 1, &enable_notification, sizeof(enable_notification)); sleep(1); gattlib_write_char_by_handle(m_connection, pressure_handle + 1, &enable_notification, sizeof(enable_notification)); sleep(1); gattlib_write_char_by_handle(m_connection, stateLed_handle +1, &enable_notification, sizeof(enable_notification)); sleep(1); // Register notification handler gattlib_register_notification(m_connection, notification_cb, NULL); signal(SIGINT, int_handler); // Register handler to catch Ctrl+C while(1) { /*enable_notification = 0x0001; gattlib_write_char_by_handle(m_connection, switchLed_handle + 1, &enable_notification, sizeof(enable_notification)); sleep(1); enable_notification = 0x0000; gattlib_write_char_by_handle(m_connection,switchLed_handle + 1, &enable_notification, sizeof(enable_notification)); sleep(1); */ } return 0; } //======================================================================