bluepy 一款python封装的BLE利器简单介绍


Posted in Python onJune 25, 2019

1、bluepy 简介
bluepy 是github上一个很好的蓝牙开源项目,其地址在 LINK-1, 其主要功能是用python实现linux上BLE的接口。

This is a project to provide an API to allow access to Bluetooth Low Energy devices from Python. At present it runs on Linux only; I've mostly developed it using a Raspberry Pi, but it will also run on x86 Debian Linux.

支持python版本:The code is tested on Python 2.7 and 3.4; it should also work on 3.3.

2、安装

直接源码安装,python3加持:

sudo apt-get install git build-essential libglib2.0-dev
git clone https://github.com/IanHarvey/bluepy.git
cd bluepy
python3 setup.py build
sudo python3 setup.py install

注:不要用python2,这辈子都不会用python2!

注:进行到这一步突然惊醒我的台式机无蓝牙,遂开启我的无屏幕树莓派,用命令找其ip,并用ssh登录:

➜ Downloads sudo nmap -sS -p 22 192.168.31.0/24 | grep -B 5 -A 0 "Pi"
Nmap scan report for 192.168.31.51
Host is up (0.19s latency).
PORT STATE SERVICE
22/tcp open ssh
MAC Address: B8:27:EB:71:33:AE (Raspberry Pi Foundation)
➜ Downloads ssh pi@192.168.31.51
pi@192.168.31.51's password: 1234

3、看文档,玩DEMO

bluepy 的文档地址 LINK-2

在bluepy中新建一个examples文件夹,用来存放接下来我们的测试DEMO:

3.1 scan devices demo

这里第一个DEMO是BLE设备扫描,这里用到了Scanner对象,该对象可以用来搜索BLE设备的广播包数据。在大多数情况下该对象将会扫描出周围所有可连接设备。

下面是我改造为python3的代码:

➜ examples git:(master) ✗ cat scan.py 
#!/usr/bin/env python
# coding=utf-8
from bluepy.btle import Scanner, DefaultDelegate
class ScanDelegate(DefaultDelegate):
def __init__(self):
DefaultDelegate.__init__(self)
def handleDiscovery(self, dev, isNewDev, isNewData):
if isNewDev:
print("Discovered device", dev.addr)
elif isNewData:
print("Received new data from", dev.addr)
scanner = Scanner().withDelegate(ScanDelegate())
devices = scanner.scan(10.0)
for dev in devices:
print("Device %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType, dev.rssi))
for (adtype, desc, value) in dev.getScanData():
print(" %s = %s" % (desc, value))
  • 其中Scanner([index=0])用于产生并初始化一个新的scanner对象,index 用来指名哪一个蓝牙设备就会被用(默认0表示使用/dev/hci0)。扫描知道调用start或scan函数之后才会开始;
  • 其中withDelegate(delegate)存储对委托对象的引用,委托对象在接收来自设备的广播时接收回调。有关详细信息,请参阅DefaultDelegate的文档;
  • 其中scan([timeout = 10])开始扫描并带有超时,在此扫描期间扫描到的设备会触发Delegate的回调函数,我们可以在其回调函数中实时获取并打印。当超时后会返回一个设备列表;

执行效果如下:

bluepy 一款python封装的BLE利器简单介绍

注:注意用sudo运行,更详细的接口见 LINK-3

3.2 get services

bluepy 的DEMO有点少,我又找了个专是DEMO的github项目:LINK-5

将其中的getServices.py改造下:

➜ examples git:(master) ✗ cat get_setvices.py 
import sys
from bluepy.btle import UUID, Peripheral
if len(sys.argv) != 2:
print("Fatal, must pass device address:", sys.argv[0], "<device address="">")
quit()
p = Peripheral(sys.argv[1],"public")
services=p.getServices()
#displays all services
for service in services:
print(service)

其中Peripheral(sys.argv[1],"public")是用mac地址创建一个连接,由于我们上一步用scan搜索到的mac地址为public类型,因此这里第二个参数为"public",更详细的介绍见 LINK-6;

其中getServices会返回所连接设备的服务;

执行效果如下:

bluepy 一款python封装的BLE利器简单介绍

3.3 get characteristics

同3.2获取characteristic的代码如下:

➜ examples git:(master) ✗ cat get_characteristics.py 
import sys
from bluepy.btle import UUID, Peripheral
if len(sys.argv) != 2:
print("Fatal, must pass device address:", sys.argv[0], "<device address="">")
quit()
p = Peripheral(sys.argv[1],"public")
chList = p.getCharacteristics()
print("Handle UUID Properties")
print("-------------------------------------------------------") 
for ch in chList:
print(" 0x"+ format(ch.getHandle(),'02X') +" "+str(ch.uuid) +" " + ch.propertiesToString())

执行效果如下:

bluepy 一款python封装的BLE利器简单介绍

3.4 get device name

直接上代码:

➜ examples git:(master) ✗ cat get_device_name.py 
import sys
from bluepy.btle import UUID, Peripheral
dev_name_uuid = UUID(0x2A00)
if len(sys.argv) != 2:
print("Fatal, must pass device address:", sys.argv[0], "<device address="">")
quit()
p = Peripheral(sys.argv[1],"public")
try:
ch = p.getCharacteristics(uuid=dev_name_uuid)[0]
if (ch.supportsRead()):
print(ch.read())
finally:
p.disconnect()

运行效果如下:

bluepy 一款python封装的BLE利器简单介绍

小结

bluepy 是非常棒的一款蓝牙BLE工具,掌握它会为你节省比较多的时间~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的批量远程管理和部署工具Fabric用法实例
Jan 23 Python
Python映射拆分操作符用法实例
May 19 Python
Python实现给文件添加内容及得到文件信息的方法
May 28 Python
Python获取央视节目单的实现代码
Jul 25 Python
python开发之thread实现布朗运动的方法
Nov 11 Python
PyQt5每天必学之布局管理
Apr 19 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
django之使用celery-把耗时程序放到celery里面执行的方法
Jul 12 Python
Python 函数绘图及函数图像微分与积分
Nov 20 Python
Python时间差中seconds和total_seconds的区别详解
Dec 26 Python
Python动态导入模块和反射机制详解
Feb 18 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
Mar 27 Python
PyQt5下拉式复选框QComboCheckBox的实例
Jun 25 #Python
在Pandas中处理NaN值的方法
Jun 25 #Python
python实现websocket的客户端压力测试
Jun 25 #Python
python中metaclass原理与用法详解
Jun 25 #Python
python实现接口并发测试脚本
Jun 25 #Python
Python实现EXCEL表格的排序功能示例
Jun 25 #Python
python实现动态创建类的方法分析
Jun 25 #Python
You might like
一个显示天气预报的程序
2006/10/09 PHP
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
PHP下通过file_get_contents的代理使用方法
2011/02/16 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
用php来改写404错误页让你的页面更友好
2013/01/24 PHP
php实现可以设置中奖概率的抽奖程序代码分享
2014/01/19 PHP
修改destoon会员公司的伪静态中的com目录的方法
2014/08/21 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
php实现json编码的方法
2015/07/30 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
2011/05/28 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
2016/07/14 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
在Python中处理时间之clock()方法的使用
2015/05/22 Python
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
Python综合应用名片管理系统案例详解
2020/01/03 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
Python接口开发实现步骤详解
2020/04/26 Python
Python-for循环的内部机制
2020/06/12 Python
详解Python多线程下的list
2020/07/03 Python
python中sys模块是做什么用的
2020/08/16 Python
国际书籍零售商:Wordery
2017/11/01 全球购物
荷兰电脑专场:Paradigit
2018/05/05 全球购物
节电标语大全
2014/06/23 职场文书
医疗专业毕业生求职信
2014/08/28 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书
唐山大地震观后感
2015/06/05 职场文书
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
Mysql案例刨析事务隔离级别
2021/09/25 MySQL