def on_adv_report(gap_event): global connection_is_in_progress address_pointer = gap_event.params.adv_report.peer_addr.addr address_list = util.uint8_array_to_list(address_pointer, BLE_ADDRESS_LENGTH) address_string = "".join("{0:02X}".format(byte) for byte in address_list) adv_data_pointer = gap_event.params.adv_report.data adv_data_length = gap_event.params.adv_report.dlen adv_data_list = util.uint8_array_to_list(adv_data_pointer, adv_data_length) parsed_data = parse_adv_report( ble_driver.BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME, adv_data_list) if not parsed_data: parsed_data = parse_adv_report( ble_driver.BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME, adv_data_list) if not parsed_data: return peer_device_name = "".join(chr(element) for element in parsed_data) print "Received advertisment report, address: 0x{}, device_name: {}".format( address_string, peer_device_name) if peer_device_name != TARGET_DEV_NAME: return if central_connection_handle != ble_driver.BLE_CONN_HANDLE_INVALID: return if connection_is_in_progress: return err_code = ble_driver.sd_ble_gap_connect( gap_event.params.adv_report.peer_addr, scan_params, connection_params) if err_code != ble_driver.NRF_SUCCESS: print "Connection request failed, reason {}".format(err_code) return connection_is_in_progress = True
def on_adv_report(gap_event): global connection_is_in_progress address_pointer = gap_event.params.adv_report.peer_addr.addr address_list = util.uint8_array_to_list(address_pointer, BLE_ADDRESS_LENGTH) address_string = "".join("{0:02X}".format(byte) for byte in address_list) adv_data_pointer = gap_event.params.adv_report.data adv_data_length = gap_event.params.adv_report.dlen adv_data_list = util.uint8_array_to_list(adv_data_pointer, adv_data_length) parsed_data = parse_adv_report(ble_driver.BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME, adv_data_list) if not parsed_data: parsed_data = parse_adv_report(ble_driver.BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME, adv_data_list) if not parsed_data: return peer_device_name = "".join(chr(element) for element in parsed_data) print "Received advertisment report, address: 0x{}, device_name: {}".format( address_string, peer_device_name) if peer_device_name != TARGET_DEV_NAME: return if central_connection_handle != ble_driver.BLE_CONN_HANDLE_INVALID: return if connection_is_in_progress: return err_code = ble_driver.sd_ble_gap_connect(gap_event.params.adv_report.peer_addr, scan_params, connection_params) if err_code != ble_driver.NRF_SUCCESS: print "Connection request failed, reason {}".format(err_code) return connection_is_in_progress = True
def on_write(gatts_event): global send_notifications write_event = gatts_event.params.write if write_event.context.char_uuid.uuid == BLE_UUID_HEART_RATE_MEASUREMENT_CHAR: cccd_value_array = write_event.data cccd_value_list = util.uint8_array_to_list(cccd_value_array, write_event.len) cccd_value = cccd_value_list[0] set_hrm_cccd(cccd_value) send_notifications = (cccd_value == ble_driver.BLE_GATT_HVX_NOTIFICATION)
def on_write(gatts_event): global send_notifications write_evt = gatts_event.params.write length = write_evt.len data = write_evt.data data_list = util.uint8_array_to_list(data, length) if write_evt.context.char_uuid.uuid == 0x2A37: write_data = data_list[0] send_notifications = write_data == ble_driver.BLE_GATT_HVX_NOTIFICATION
def on_write(gatts_event): global send_notifications write_event = gatts_event.params.write if write_event.context.char_uuid.uuid == BLE_UUID_HEART_RATE_MEASUREMENT_CHAR: cccd_value_array = write_event.data cccd_value_list = util.uint8_array_to_list(cccd_value_array, write_event.len) cccd_value = cccd_value_list[0] set_hrm_cccd(cccd_value) send_notifications = ( cccd_value == ble_driver.BLE_GATT_HVX_NOTIFICATION)
def ble_evt_handler(ble_event): global connection_handle global advertisement_timed_out try: if ble_event is None: print "Received empty ble_event" return evt_id = ble_event.header.evt_id if evt_id == ble_driver.BLE_GAP_EVT_CONNECTED: connection_handle = ble_event.evt.gap_evt.conn_handle print "Connected, connection handle 0x{:04X}".format(connection_handle) elif evt_id == ble_driver.BLE_GAP_EVT_DISCONNECTED: print "Disconnected" start_advertising() elif evt_id == ble_driver.BLE_GAP_EVT_TIMEOUT: print "Advertisement timed out" advertisement_timed_out = True elif evt_id == ble_driver.BLE_GAP_EVT_SEC_PARAMS_REQUEST: print "Received Security Parameters request" ble_driver.sd_ble_gap_sec_params_reply(connection_handle, ble_driver.BLE_GAP_SEC_STATUS_SUCCESS, None, None) elif evt_id == ble_driver.BLE_GATTS_EVT_SYS_ATTR_MISSING: print "Received System Attribute Missing event" ble_driver.sd_ble_gatts_sys_attr_set(connection_handle, None, 0, 0) elif evt_id == ble_driver.BLE_GATTS_EVT_WRITE: write_evt = ble_event.evt.gatts_evt.params.write handle = write_evt.handle operation = write_evt.op offset = write_evt.offset length = write_evt.len data = write_evt.data data_list = util.uint8_array_to_list(data, length) print "Received Write event: Handle:{}, op:{}, offset:{}, len:{}, data:{}".format( handle, operation, offset, len, data_list) else: print "Received event with ID: 0x{0:02X}".format(evt_id) except Exception, ex: print "Exception: {}".format(str(ex)) print traceback.extract_tb(sys.exc_info()[2])
def on_hvx(gattc_event): if gattc_event.gatt_status != ble_driver.NRF_SUCCESS: print "Error. Handle value notification failed. Error code 0x{0:X}".format( gattc_event.gatt_status) return length = gattc_event.params.hvx.len data_array = gattc_event.params.hvx.data data_list = util.uint8_array_to_list(data_array, length) data_list_string = "".join("{0:02X}".format(el) for el in data_list) print "Received handle value notification, handle: 0x{0:04X}, value: 0x{1}".format( gattc_event.params.hvx.handle, data_list_string)
def on_hvx(gattc_event): if gattc_event.gatt_status != ble_driver.NRF_SUCCESS: print "Error. Handle value notification failed. Error code 0x{0:X}".format( gattc_event.gatt_status) return length = gattc_event.params.hvx.len data_array = gattc_event.params.hvx.data data_list = util.uint8_array_to_list(data_array, length) data_list_string = "".join("{0:02X}".format(el) for el in data_list) print "Received handle value notification, handle: 0x{0:04X}, value: 0x{1}".format( gattc_event.params.hvx.handle, data_list_string) if (peripheral_connection_handle != ble_driver.BLE_CONN_HANDLE_INVALID) and send_notifications: send_heart_rate_relay(length, data_array)
def on_adv_report(gap_event): adv_report = gap_event.params.adv_report length = adv_report.dlen data = adv_report.data data_list = util.uint8_array_to_list(data, length) ret_val = parse_adv_report(ble_driver.BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME, data_list, length) if ret_val == ble_driver.NRF_ERROR_NOT_FOUND: ret_val = parse_adv_report(ble_driver.BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME, data_list, length) if ret_val is None: print "Received advertisment report (no device name)" return device_name = "".join(chr(element) for element in ret_val) print "Received advertisment report, device_name: {}".format(device_name) if device_name not in target_list: return if peer_count >= max_peer_count: print "Max peer count reached" return peer_addr = adv_report.peer_addr ble_address = ble_driver.ble_gap_addr_t() ble_address.addr_type = peer_addr.addr_type ble_address.addr = peer_addr.addr error_code = ble_driver.sd_ble_gap_connect(ble_address, ble_scan_params, ble_conn_params) if error_code != ble_driver.NRF_SUCCESS: print "Failed to connect. Error code: 0x{0:02X}".format(error_code) return