ble_address_type = { 'gap_address_type_public': 0, 'gap_address_type_random': 1 } gap_discoverable_mode = { 'non_discoverable': 0x00, 'limited_discoverable': 0x01, 'general_discoverable': 0x02, 'broadcast': 0x03, 'user_data': 0x04, 'enhanced_broadcasting': 0x80 } gap_connectable_mode = { 'non_connectable': 0x00, 'directed_connectable': 0x01, 'undirected_connectable': 0x02, 'scannable_non_connectable': 0x03, } gap_discover_mode = { 'limited': 0x00, 'generic': 0x01, 'observation': 0x02, } bonding = { # create bonding if devices not already bonded 'do_not_create_bonding': 0x00, 'create_bonding': 0x01, } bondable = { 'no': 0x00, 'yes': 0x01, } connection_status_flag = { 'connected': 0x01, 'encrypted': 0x02, 'completed': 0x04, 'parameters_change': 0x08, } scan_response_packet_type = { 0x00: 'connectable_advertisement_packet', 0x02: 'non-connectable_advertisement_packet', 0x04: 'scan_response_packet', 0x06: 'discoverable_advertisement_packet', } scan_response_data_type = { 0x01: 'flags', 0x02: 'incomplete_list_16-bit_service_class_uuids', 0x03: 'complete_list_16-bit_service_class_uuids', 0x04: 'incomplete_list_32-bit_service_class_uuids', 0x05: 'complete_list_32-bit_service_class_uuids', 0x06: 'incomplete_list_128-bit_service_class_uuids', 0x07: 'complete_list_128-bit_service_class_uuids', 0x08: 'shortened_local_name', 0x09: 'complete_local_name', 0x0A: 'tx_power_level', 0x0D: 'class_of_device', 0x0E: 'simple_pairing_hash_c/c-192', 0x0F: 'simple_pairing_randomizer_r/r-192', 0x10: 'device_id/security_manager_tk_value', 0x11: 'security_manager_out_of_band_flags', 0x12: 'slave_connection_interval_range', 0x14: 'list_of_16-bit_service_solicitation_uuids', 0x1F: 'list_of_32-bit_service_solicitation_uuids', 0x15: 'list_of_128-bit_service_solicitation_uuids', 0x16: 'service_data/service_data-16-bit_uuid', 0x20: 'service_data-32-bit_uuid', 0x21: 'service_data-128-bit_uuid', 0x22: 'LE_secure_connections_confirmation_value', 0x23: 'LE_secure_connections_random_value', 0x17: 'public_target_address', 0x18: 'random_target_address', 0x19: 'appearance', 0x1A: 'advertising_interval', 0x1B: 'LE_bluetooth_device_address', 0x1C: 'LE_role', 0x1D: 'simple_pairing_hash_c-256', 0x1E: 'simple_pairing_randomizer_r-256', 0x3D: '3D_information_data', 0xFF: 'manufacturer_specific_data', } # GATT gatt_service_uuid = { 'generic_access_profile': bytearray([0x18, 0x00]), 'generic_attribute_profile': bytearray([0x18, 0x01]), } gatt_attribute_type_uuid = { 'primary_service': bytearray([0x28, 0x00]), 'secondary_service': bytearray([0x28, 0x01]), 'include': bytearray([0x28, 0x02]), 'characteristic': bytearray([0x28, 0x03]), } gatt_characteristic_descriptor_uuid = { 'characteristic_extended_properties': bytearray([0x29, 0x00]), 'characteristic_user_description': bytearray([0x29, 0x01]), 'client_characteristic_configuration': bytearray([0x29, 0x02]), 'server_characteristic_configuration': bytearray([0x29, 0x03]), 'characteristic_format': bytearray([0x29, 0x04]), 'characteristic_aggregate_format': bytearray([0x29, 0x05]), } gatt_characteristic_type_uuid = { 'aerobic_heart_rate_lower_limit': bytearray([0x2A, 0x7E]), 'aerobic_heart_rate_upper_limit': bytearray([0x2A, 0x84]), 'aerobic_threshold': bytearray([0x2A, 0x7F]), 'age': bytearray([0x2A, 0x80]), 'aggregate': bytearray([0x2A, 0x5A]), 'alert_category_id': bytearray([0x2A, 0x43]), 'alert_category_id_bit_mask': bytearray([0x2A, 0x42]), 'alert_level': bytearray([0x2A, 0x06]), 'alert_notification_control_point': bytearray([0x2A, 0x44]), 'alert_status': bytearray([0x2A, 0x3F]), 'altitude': bytearray([0x2A, 0xB3]), 'anaerobic_heart_rate_lower_limit': bytearray([0x2A, 0x81]), 'anaerobic_heart_rate_upper_limit': bytearray([0x2A, 0x82]), 'anaerobic_threshold': bytearray([0x2A, 0x83]), 'analog': bytearray([0x2A, 0x58]), 'apparent_wind_direction': bytearray([0x2A, 0x73]), 'apparent_wind_speed': bytearray([0x2A, 0x72]), 'appearance': bytearray([0x2A, 0x01]), 'barometric_pressure_trend': bytearray([0x2A, 0xA3]), 'battery_level': bytearray([0x2A, 0x19]), 'blood_pressure_feature': bytearray([0x2A, 0x49]), 'blood_pressure_measurement': bytearray([0x2A, 0x35]), 'body_composition_feature': bytearray([0x2A, 0x9B]), 'body_composition_measurement': bytearray([0x2A, 0x9C]), 'body_sensor_location': bytearray([0x2A, 0x38]), 'bond_management_control_point': bytearray([0x2A, 0xA4]), 'bond_management_feature': bytearray([0x2A, 0xA5]), 'boot_keyboard_input_report': bytearray([0x2A, 0x22]), 'boot_keyboard_output_report': bytearray([0x2A, 0x32]), 'boot_mouse_input_report': bytearray([0x2A, 0x33]), 'central_address_resolution_support': bytearray([0x2A, 0xA6]), 'cgm_feature': bytearray([0x2A, 0xA8]), 'cgm_measurement': bytearray([0x2A, 0xA7]), 'cgm_session_run_time': bytearray([0x2A, 0xAB]), 'cgm_session_start_time': bytearray([0x2A, 0xAA]), 'cgm_specific_ops_control_point': bytearray([0x2A, 0xAC]), 'cgm_status': bytearray([0x2A, 0xA9]), 'csc_feature': bytearray([0x2A, 0x5C]), 'csc_measurement': bytearray([0x2A, 0x5B]), 'current_time': bytearray([0x2A, 0x2B]), 'cycling_power_control_point': bytearray([0x2A, 0x66]), 'cycling_power_feature': bytearray([0x2A, 0x65]), 'cycling_power_measurement': bytearray([0x2A, 0x63]), 'cycling_power_vector': bytearray([0x2A, 0x64]), 'database_change_increment': bytearray([0x2A, 0x99]), 'date_of_birth': bytearray([0x2A, 0x85]), 'date_of_threshold_assessment': bytearray([0x2A, 0x86]), 'date_time': bytearray([0x2A, 0x08]), 'day_date_time': bytearray([0x2A, 0x0A]), 'day_of_week': bytearray([0x2A, 0x09]), 'descriptor_value_changed': bytearray([0x2A, 0x7D]), 'device_name': bytearray([0x2A, 0x00]), 'dew_point': bytearray([0x2A, 0x7B]), 'digital': bytearray([0x2A, 0x56]), 'dst_offset': bytearray([0x2A, 0x0D]), 'elevation': bytearray([0x2A, 0x6C]), 'email_address': bytearray([0x2A, 0x87]), 'exact_time_256': bytearray([0x2A, 0x0C]), 'fat_burn_heart_rate_lower_limit': bytearray([0x2A, 0x88]), 'fat_burn_heart_rate_upper_limit': bytearray([0x2A, 0x89]), 'firmware_revision_string': bytearray([0x2A, 0x26]), 'first_name': bytearray([0x2A, 0x8A]), 'five_zone_heart_rate_limits': bytearray([0x2A, 0x8B]), 'floor_number': bytearray([0x2A, 0xB2]), 'gender': bytearray([0x2A, 0x8C]), 'glucose_feature': bytearray([0x2A, 0x51]), 'glucose_measurement': bytearray([0x2A, 0x18]), 'glucose_measurement_context': bytearray([0x2A, 0x34]), 'gust_factor': bytearray([0x2A, 0x74]), 'hardware_revision_string': bytearray([0x2A, 0x27]), 'heart_rate_control_point': bytearray([0x2A, 0x39]), 'heart_rate_max': bytearray([0x2A, 0x8D]), 'heart_rate_measurement': bytearray([0x2A, 0x37]), 'heat_index': bytearray([0x2A, 0x7A]), 'height': bytearray([0x2A, 0x8E]), 'hid_control_point': bytearray([0x2A, 0x4C]), 'hid_information': bytearray([0x2A, 0x4A]), 'hip_circumference': bytearray([0x2A, 0x8F]), 'http_control_point': bytearray([0x2A, 0xBA]), 'http_entity_body': bytearray([0x2A, 0xB9]), 'http_headers': bytearray([0x2A, 0xB7]), 'http_status_code': bytearray([0x2A, 0xB8]), 'https_security': bytearray([0x2A, 0xBB]), 'humidity': bytearray([0x2A, 0x6F]), 'ieee_11073-20601_regulatory_certification_data_list': bytearray([0x2A, 0x2A]), # noqa 'indoor_positioning_configuration': bytearray([0x2A, 0xAD]), 'intermediate_cuff_pressure': bytearray([0x2A, 0x36]), 'intermediate_temperature': bytearray([0x2A, 0x1E]), 'irradiance': bytearray([0x2A, 0x77]), 'language': bytearray([0x2A, 0xA2]), 'last_name': bytearray([0x2A, 0x90]), 'latitude': bytearray([0x2A, 0xAE]), 'ln_control_point': bytearray([0x2A, 0x6B]), 'ln_feature': bytearray([0x2A, 0x6A]), 'local_east_coordinate': bytearray([0x2A, 0xB1]), 'local_north_coordinate': bytearray([0x2A, 0xB0]), 'local_time_information': bytearray([0x2A, 0x0F]), 'location_and_speed': bytearray([0x2A, 0x67]), 'location_name': bytearray([0x2A, 0xB5]), 'longitude': bytearray([0x2A, 0xAF]), 'magnetic_declination': bytearray([0x2A, 0x2C]), 'magnetic_flux_density_2D': bytearray([0x2A, 0xA0]), 'magnetic_flux_density_3D': bytearray([0x2A, 0xA1]), 'manufacturer_name_string': bytearray([0x2A, 0x29]), 'maximum_recommended_heart_rate': bytearray([0x2A, 0x91]), 'measurement_interval': bytearray([0x2A, 0x21]), 'model_number_string': bytearray([0x2A, 0x24]), 'navigation': bytearray([0x2A, 0x68]), 'new_alert': bytearray([0x2A, 0x46]), 'object_action_control_point': bytearray([0x2A, 0xC5]), 'object_changed': bytearray([0x2A, 0xC8]), 'object_first_created': bytearray([0x2A, 0xC1]), 'object_id': bytearray([0x2A, 0xC3]), 'object_last_modified': bytearray([0x2A, 0xC2]), 'object_list_control_point': bytearray([0x2A, 0xC6]), 'object_list_filter': bytearray([0x2A, 0xC7]), 'object_name': bytearray([0x2A, 0xBE]), 'object_properties': bytearray([0x2A, 0xC4]), 'object_size': bytearray([0x2A, 0xC0]), 'object_type': bytearray([0x2A, 0xBF]), 'ots_feature': bytearray([0x2A, 0xBD]), 'peripheral_preferred_connection_parameters': bytearray([0x2A, 0x04]), 'peripheral_privacy_flag': bytearray([0x2A, 0x02]), 'plx_continuous_measurement': bytearray([0x2A, 0x5F]), 'plx_features': bytearray([0x2A, 0x60]), 'plx_spot_check_measurement': bytearray([0x2A, 0x5E]), 'pnp_id': bytearray([0x2A, 0x50]), 'pollen_concentration': bytearray([0x2A, 0x75]), 'position_quality': bytearray([0x2A, 0x69]), 'pressure': bytearray([0x2A, 0x6D]), 'protocol_mode': bytearray([0x2A, 0x4E]), 'rainfall': bytearray([0x2A, 0x78]), 'reconnection_address': bytearray([0x2A, 0x03]), 'record_access_control_point': bytearray([0x2A, 0x52]), 'reference_time_information': bytearray([0x2A, 0x14]), 'report': bytearray([0x2A, 0x4D]), 'report_map': bytearray([0x2A, 0x4B]), 'resting_heart_rate': bytearray([0x2A, 0x92]), 'ringer_control_point': bytearray([0x2A, 0x40]), 'ringer_setting': bytearray([0x2A, 0x41]), 'rsc_feature': bytearray([0x2A, 0x54]), 'rsc_measurement': bytearray([0x2A, 0x53]), 'sc_control_point': bytearray([0x2A, 0x55]), 'scan_interval_window': bytearray([0x2A, 0x4F]), 'scan_refresh': bytearray([0x2A, 0x31]), 'sensor_location': bytearray([0x2A, 0x5D]), 'serial_number_string': bytearray([0x2A, 0x25]), 'service_changed': bytearray([0x2A, 0x05]), 'software_revision_string': bytearray([0x2A, 0x28]), 'sport_type_for_aerobic_and_anaerobic_thresholds': bytearray([0x2A, 0x93]), 'supported_new_alert_category': bytearray([0x2A, 0x47]), 'supported_unread_alert_category': bytearray([0x2A, 0x48]), 'system_id': bytearray([0x2A, 0x23]), 'tds_control_point': bytearray([0x2A, 0xBC]), 'temperature': bytearray([0x2A, 0x6E]), 'temperature_measurement': bytearray([0x2A, 0x1C]), 'temperature_type': bytearray([0x2A, 0x1D]), 'three_zone_heart_rate_limits': bytearray([0x2A, 0x94]), 'time_accuracy': bytearray([0x2A, 0x12]), 'time_source': bytearray([0x2A, 0x13]), 'time_update_control_point': bytearray([0x2A, 0x16]), 'time_update_state': bytearray([0x2A, 0x17]), 'time_with_dst': bytearray([0x2A, 0x11]), 'time_zone': bytearray([0x2A, 0x0E]), 'true_wind_direction': bytearray([0x2A, 0x71]), 'true_wind_speed': bytearray([0x2A, 0x70]), 'two_zone_heart_rate_limit': bytearray([0x2A, 0x95]), 'tx_power_level': bytearray([0x2A, 0x07]), 'uncertainty': bytearray([0x2A, 0xB4]), 'unread_alert_status': bytearray([0x2A, 0x45]), 'uri': bytearray([0x2A, 0xB6]), 'user_control_point': bytearray([0x2A, 0x9F]), 'user_index': bytearray([0x2A, 0x9A]), 'uv_index': bytearray([0x2A, 0x76]), 'vo2_max': bytearray([0x2A, 0x96]), 'waist_circumference': bytearray([0x2A, 0x97]), 'weight': bytearray([0x2A, 0x98]), 'weight_measurement': bytearray([0x2A, 0x9D]), 'weight_scale_feature': bytearray([0x2A, 0x9E]), 'wind_chill': bytearray([0x2A, 0x79]), }