Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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)
Beispiel #4
0
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
Beispiel #5
0
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
Beispiel #6
0
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)
Beispiel #7
0
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])
Beispiel #8
0
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)
Beispiel #9
0
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)
Beispiel #10
0
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)
Beispiel #11
0
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