使用python查找低功耗蓝牙 [英] Finding Bluetooth low energy with python

查看:704
本文介绍了使用python查找低功耗蓝牙的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以将此代码修改为也包括低功耗蓝牙设备? https://code.google. com/p/pybluez/source/browse/trunk/examples/advanced/inquiry-with-rssi.py?r = 1

Is it possible for this code to be modified to include Bluetooth Low Energy devices as well? https://code.google.com/p/pybluez/source/browse/trunk/examples/advanced/inquiry-with-rssi.py?r=1

我可以找到诸如手机和其他蓝牙4.0设备之类的设备,但找不到任何BLE.如果无法修改,是否可以运行hcitool lescan并在python中从hci dump中提取数据?我可以使用这些工具查看所需的设备,并在hcidump中提供RSSI,这是我的最终目标.从BLE设备获取MAC地址和RSSI.

I can find devices like my phone and other bluetooth 4.0 devices, but not any BLE. If this cannot be modified, is it possible to run the hcitool lescan and pull the data from hci dump within python? I can use the tools to see the devices I am looking for and it gives an RSSI in hcidump, which is what my end goal is. To get a MAC address and RSSI from the BLE device.

谢谢!

推荐答案

该库不适用于BLE.

As I said in the comment, that library won't work with BLE.

以下是执行简单BLE扫描的示例代码:

Here's some example code to do a simple BLE scan:

import sys
import os
import struct
from ctypes import (CDLL, get_errno)
from ctypes.util import find_library
from socket import (
    socket,
    AF_BLUETOOTH,
    SOCK_RAW,
    BTPROTO_HCI,
    SOL_HCI,
    HCI_FILTER,
)

if not os.geteuid() == 0:
    sys.exit("script only works as root")

btlib = find_library("bluetooth")
if not btlib:
    raise Exception(
        "Can't find required bluetooth libraries"
        " (need to install bluez)"
    )
bluez = CDLL(btlib, use_errno=True)

dev_id = bluez.hci_get_route(None)

sock = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)
sock.bind((dev_id,))

err = bluez.hci_le_set_scan_parameters(sock.fileno(), 0, 0x10, 0x10, 0, 0, 1000);
if err < 0:
    raise Exception("Set scan parameters failed")
    # occurs when scanning is still enabled from previous call

# allows LE advertising events
hci_filter = struct.pack(
    "<IQH", 
    0x00000010, 
    0x4000000000000000, 
    0
)
sock.setsockopt(SOL_HCI, HCI_FILTER, hci_filter)

err = bluez.hci_le_set_scan_enable(
    sock.fileno(),
    1,  # 1 - turn on;  0 - turn off
    0, # 0-filtering disabled, 1-filter out duplicates
    1000  # timeout
)
if err < 0:
    errnum = get_errno()
    raise Exception("{} {}".format(
        errno.errorcode[errnum],
        os.strerror(errnum)
    ))

while True:
    data = sock.recv(1024)
    # print bluetooth address from LE Advert. packet
    print(':'.join("{0:02x}".format(x) for x in data[12:6:-1]))

我不得不通过查看Bluez随附的hcitoolgatttool源代码将所有内容拼凑在一起.该代码完全依赖于libbluetooth-dev,因此您必须确保先安装了该代码.

I had to piece all of that together by looking at the hcitool and gatttool source code that comes with Bluez. The code is completely dependent on libbluetooth-dev so you'll have to make sure you have that installed first.

更好的方法是使用dbus调用bluetoothd,但是我还没有机会进行研究.此外,建立dbus接口后,您只能通过BLE连接进行操作.

A better way would be to use dbus to make calls to bluetoothd, but I haven't had a chance to research that yet. Also, the dbus interface is limited in what you can do with a BLE connection after you make one.

MartinTramšak指出,在Python 2中,您需要将最后一行更改为print(':'.join("{0:02x}".format(ord(x)) for x in data[12:6:-1]))

Martin Tramšak pointed out that in Python 2 you need to change the last line to print(':'.join("{0:02x}".format(ord(x)) for x in data[12:6:-1]))

这篇关于使用python查找低功耗蓝牙的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆