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中关键字is与==的区别简述
Jul 31 Python
Python中Django框架下的staticfiles使用简介
May 30 Python
python目录与文件名操作例子
Aug 28 Python
python实现按任意键继续执行程序
Dec 30 Python
python 寻找优化使成本函数最小的最优解的方法
Dec 28 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
python爬取网页转换为PDF文件
Jun 07 Python
元组列表字典(莫烦python基础)
Apr 03 Python
python tkinter实现界面切换的示例代码
Jun 14 Python
详解pandas数据合并与重塑(pd.concat篇)
Jul 09 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
浅谈python中的多态
Jun 15 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
php打乱数组二维数组多维数组的简单实例
2016/06/17 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
Js基础学习资料
2010/11/23 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
js实现图片旋转的三种方法
2014/04/10 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
angularJS 入门基础
2015/02/09 Javascript
Js控制滑轮左右滑动实例
2015/02/13 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
微信小程序实现签到功能
2018/10/31 Javascript
vue webpack重写cookie路径的方法
2019/07/10 Javascript
JS实现图片切换特效
2019/12/23 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
[03:01]2014DOTA2国际邀请赛 小组赛7月13日TOPPLAY
2014/07/14 DOTA
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
Python 含参构造函数实例详解
2017/05/25 Python
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
Python数据可视化库seaborn的使用总结
2019/01/15 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
Python实现动态给类和对象添加属性和方法操作示例
2020/02/29 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
python识别验证码的思路及解决方案
2020/09/13 Python
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
自我介绍演讲稿
2014/01/15 职场文书
教学个人的自我评价分享
2014/02/16 职场文书
调查研究项目计划书
2014/04/29 职场文书
十八大演讲稿
2014/05/22 职场文书
校运会口号
2014/06/18 职场文书
实习计划书范文
2015/01/16 职场文书
人生遥控器观后感
2015/06/11 职场文书
python树莓派通过队列实现进程交互的程序分析
2021/07/04 Python
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS