use*_*887 7 python bluetooth-lowenergy bluez
是否可以修改此代码以包含蓝牙低功耗设备? 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.
谢谢!
Tim*_*all 24
正如我在评论中所说,该库不适用于BLE.
以下是一些执行简单BLE扫描的示例代码:
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]))
Run Code Online (Sandbox Code Playgroud)
我不得不通过查看拼凑所有的一起hcitool,并gatttool附带配合bluez源代码.代码完全依赖于libbluetooth-dev您,因此您必须确保首先安装该代码.
更好的方法是使用dbus拨打电话bluetoothd,但我还没有机会研究它.此外,dbus接口仅限于您在制作BLE连接后可以执行的操作.
MartinTramšak指出,在Python 2中你需要将最后一行更改为 print(':'.join("{0:02x}".format(ord(x)) for x in data[12:6:-1]))
你也可以试试pygattlib。它可用于发现设备,并且(目前)有对读/写特性的基本支持。暂时没有RSSI。
您可以使用以下代码段发现:
from gattlib import DiscoveryService
service = DiscoveryService("hci0")
devices = service.discover(2)
Run Code Online (Sandbox Code Playgroud)
DiscoveryService接受设备的名称,并且该方法discover接受等待响应的超时(以秒为单位)。devices是一个字典,以BL地址为键,名称为值。
pygattlib是为 Debian(或 Ubuntu)打包的,也可以作为 pip 包使用。
| 归档时间: |
|
| 查看次数: |
31889 次 |
| 最近记录: |