コード例 #1
0
ファイル: inquiry-with-rssi.py プロジェクト: cfong/IPD
def write_inquiry_mode(sock, mode):
    """returns 0 on success, -1 on failure"""
    # save current filter
    old_filter = sock.getsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, 14)

    # Setup socket filter to receive only events related to the
    # write_inquiry_mode command
    flt = bluez.hci_filter_new()
    opcode = bluez.cmd_opcode_pack(bluez.OGF_HOST_CTL, 
            bluez.OCF_WRITE_INQUIRY_MODE)
    bluez.hci_filter_set_ptype(flt, bluez.HCI_EVENT_PKT)
    bluez.hci_filter_set_event(flt, bluez.EVT_CMD_COMPLETE);
    bluez.hci_filter_set_opcode(flt, opcode)
    sock.setsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, flt )

    # send the command!
    bluez.hci_send_cmd(sock, bluez.OGF_HOST_CTL, 
            bluez.OCF_WRITE_INQUIRY_MODE, struct.pack("B", mode) )

    pkt = sock.recv(255)

    status = struct.unpack("xxxxxxB", pkt)[0]

    # restore old filter
    sock.setsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, old_filter )
    if status != 0: return -1
    return 0
コード例 #2
0
ファイル: inquiry-with-rssi.py プロジェクト: cfong/IPD
def read_inquiry_mode(sock):
    """returns the current mode, or -1 on failure"""
    # save current filter
    old_filter = sock.getsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, 14)

    # Setup socket filter to receive only events related to the
    # read_inquiry_mode command
    flt = bluez.hci_filter_new()
    opcode = bluez.cmd_opcode_pack(bluez.OGF_HOST_CTL, 
            bluez.OCF_READ_INQUIRY_MODE)
    bluez.hci_filter_set_ptype(flt, bluez.HCI_EVENT_PKT)
    bluez.hci_filter_set_event(flt, bluez.EVT_CMD_COMPLETE);
    bluez.hci_filter_set_opcode(flt, opcode)
    sock.setsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, flt )

    # first read the current inquiry mode.
    bluez.hci_send_cmd(sock, bluez.OGF_HOST_CTL, 
            bluez.OCF_READ_INQUIRY_MODE )

    pkt = sock.recv(255)

    status,mode = struct.unpack("xxxxxxBB", pkt)
    if status != 0: mode = -1

    # restore old filter
    sock.setsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, old_filter )
    return mode
コード例 #3
0
ファイル: ble.py プロジェクト: agodwinp/iot-omron
def hci_le_set_scan_parameters(sock,
                               scan_type=LE_SCAN_ACTIVE,
                               interval=0x10,
                               window=0x10,
                               own_bdaddr_type=LE_RANDOM_ADDRESS,
                               filter_type=LE_FILTER_ALLOW_ALL):
    # setting up scan

    # interval and window are uint_16, so we pad them with 0x0
    cmd_pkt = struct.pack("<BBBBBBB", scan_type, 0x0, interval, 0x0, window,
                          own_bdaddr_type, filter_type)
    bluez.hci_send_cmd(sock, OGF_LE_CTL, OCF_LE_SET_SCAN_PARAMETERS, cmd_pkt)
コード例 #4
0
ファイル: inquiry-with-rssi.py プロジェクト: cfong/IPD
def device_inquiry_with_with_rssi(sock):
    # save current filter
    old_filter = sock.getsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, 14)

    # perform a device inquiry on bluetooth device #0
    # The inquiry should last 8 * 1.28 = 10.24 seconds
    # before the inquiry is performed, bluez should flush its cache of
    # previously discovered devices
    flt = bluez.hci_filter_new()
    bluez.hci_filter_all_events(flt)
    bluez.hci_filter_set_ptype(flt, bluez.HCI_EVENT_PKT)
    sock.setsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, flt )

    duration = 4
    max_responses = 255
    cmd_pkt = struct.pack("BBBBB", 0x33, 0x8b, 0x9e, duration, max_responses)
    bluez.hci_send_cmd(sock, bluez.OGF_LINK_CTL, bluez.OCF_INQUIRY, cmd_pkt)

    results = []

    done = False
    while not done:
        pkt = sock.recv(255)
        ptype, event, plen = struct.unpack("BBB", pkt[:3])
        if event == bluez.EVT_INQUIRY_RESULT_WITH_RSSI:
            pkt = pkt[3:]
            nrsp = struct.unpack("B", pkt[0])[0]
            for i in range(nrsp):
                addr = bluez.ba2str( pkt[1+6*i:1+6*i+6] )
                rssi = struct.unpack("b", pkt[1+13*nrsp+i])[0]
                results.append( ( addr, rssi ) )
                print "[%s] RSSI: [%d]" % (addr, rssi)
        elif event == bluez.EVT_INQUIRY_COMPLETE:
            done = True
        elif event == bluez.EVT_CMD_STATUS:
            status, ncmd, opcode = struct.unpack("BBH", pkt[3:7])
            if status != 0:
                print "uh oh..."
                printpacket(pkt[3:7])
                done = True
        else:
            print "unrecognized packet type 0x%02x" % ptype


    # restore old filter
    sock.setsockopt(bluez.SOL_HCI, bluez.HCI_FILTER, old_filter )

    return results
コード例 #5
0
ファイル: ble.py プロジェクト: agodwinp/iot-omron
def hci_le_connect(sock,
                   peer_bdaddr,
                   interval=0x0004,
                   window=0x004,
                   initiator_filter=LE_FILTER_ALLOW_ALL,
                   peer_bdaddr_type=LE_RANDOM_ADDRESS,
                   own_bdaddr_type=LE_PUBLIC_ADDRESS,
                   min_interval=0x000F,
                   max_interval=0x000F,
                   latency=0x0000,
                   supervision_timeout=0x0C80,
                   min_ce_length=0x0001,
                   max_ce_length=0x0001):

    package_bdaddr = get_packed_bdaddr(peer_bdaddr)
    cmd_pkt = struct.pack("<HHBB", interval, window, initiator_filter,
                          peer_bdaddr_type)
    cmd_pkt += package_bdaddr
    cmd_pkt += struct.pack("<BHHHHHH", own_bdaddr_type, min_interval,
                           max_interval, latency, supervision_timeout,
                           min_ce_length, max_ce_length)
    bluez.hci_send_cmd(sock, OGF_LE_CTL, OCF_LE_CREATE_CONN, cmd_pkt)
コード例 #6
0
def read_local_bdaddr(hci_sock):
    old_filter = hci_sock.getsockopt(_bt.SOL_HCI, _bt.HCI_FILTER, 14)
    flt = _bt.hci_filter_new()
    opcode = _bt.cmd_opcode_pack(_bt.OGF_INFO_PARAM, _bt.OCF_READ_BD_ADDR)
    _bt.hci_filter_set_ptype(flt, _bt.HCI_EVENT_PKT)
    _bt.hci_filter_set_event(flt, _bt.EVT_CMD_COMPLETE)
    _bt.hci_filter_set_opcode(flt, opcode)
    hci_sock.setsockopt(_bt.SOL_HCI, _bt.HCI_FILTER, flt)

    _bt.hci_send_cmd(hci_sock, _bt.OGF_INFO_PARAM, _bt.OCF_READ_BD_ADDR)

    pkt = hci_sock.recv(255)

    status, raw_bdaddr = struct.unpack("xxxxxxB6s", pkt)
    assert status == 0

    t = ["%02X" % ord(b) for b in raw_bdaddr]
    t.reverse()
    bdaddr = ":".join(t)

    # restore old filter
    hci_sock.setsockopt(_bt.SOL_HCI, _bt.HCI_FILTER, old_filter)
    return bdaddr
コード例 #7
0
def read_local_bdaddr(hci_sock):
	old_filter = hci_sock.getsockopt( _bt.SOL_HCI, _bt.HCI_FILTER, 14)
	flt = _bt.hci_filter_new()
	opcode = _bt.cmd_opcode_pack(_bt.OGF_INFO_PARAM, 
			_bt.OCF_READ_BD_ADDR)
	_bt.hci_filter_set_ptype(flt, _bt.HCI_EVENT_PKT)
	_bt.hci_filter_set_event(flt, _bt.EVT_CMD_COMPLETE);
	_bt.hci_filter_set_opcode(flt, opcode)
	hci_sock.setsockopt( _bt.SOL_HCI, _bt.HCI_FILTER, flt )

	_bt.hci_send_cmd(hci_sock, _bt.OGF_INFO_PARAM, _bt.OCF_READ_BD_ADDR )

	pkt = hci_sock.recv(255)

	status,raw_bdaddr = struct.unpack("xxxxxxB6s", pkt)
	assert status == 0

	t = [ "%02X" % ord(b) for b in raw_bdaddr ]
	t.reverse()
	bdaddr = ":".join(t)

	# restore old filter
	hci_sock.setsockopt( _bt.SOL_HCI, _bt.HCI_FILTER, old_filter )
	return bdaddr
コード例 #8
0
ファイル: ble.py プロジェクト: agodwinp/iot-omron
def hci_le_toggle_scan(sock, enable):
    # toggle scan
    cmd_pkt = struct.pack("<BB", enable, 0x00)
    bluez.hci_send_cmd(sock, OGF_LE_CTL, OCF_LE_SET_SCAN_ENABLE, cmd_pkt)
コード例 #9
0
ファイル: ble.py プロジェクト: agodwinp/iot-omron
def hci_disconnect(sock, handle, reason=HCI_OE_USER_ENDED_CONNECTION):
    cmd_pkt = struct.pack("<HB", handle, reason)
    bluez.hci_send_cmd(sock, bluez.OGF_LINK_CTL, bluez.OCF_DISCONNECT, cmd_pkt)
コード例 #10
0
ファイル: ble.py プロジェクト: agodwinp/iot-omron
def hci_le_read_remote_used_features(sock, handle):
    cmd_pkt = struct.pack("<H", handle)
    bluez.hci_send_cmd(sock, OGF_LE_CTL, OCF_LE_READ_REMOTE_USED_FEATURES,
                       cmd_pkt)
コード例 #11
0
ファイル: ble.py プロジェクト: agodwinp/iot-omron
def hci_le_read_local_supported_features(sock):
    cmd_pkt = ""
    bluez.hci_send_cmd(sock, OGF_LE_CTL, OCF_LE_READ_LOCAL_SUPPORTED_FEATURES,
                       cmd_pkt)