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中的ConfigParser模块使用详解
May 04 Python
在Django的模型和公用函数中使用惰性翻译对象
Jul 27 Python
Python优先队列实现方法示例
Sep 21 Python
Python3.5文件读与写操作经典实例详解
May 01 Python
python pickle存储、读取大数据量列表、字典数据的方法
Jul 07 Python
Python Django view 两种return的实现方式
Mar 16 Python
解决jupyter运行pyqt代码内核重启的问题
Apr 16 Python
Python 如何创建一个简单的REST接口
Jul 30 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
python爬虫泛滥的解决方法详解
Nov 25 Python
matplotlib画混淆矩阵与正确率曲线的实例代码
Jun 01 Python
python状态机transitions库详解
Jun 02 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
如何让CI框架支持service层
2014/10/29 PHP
浅析php适配器模式(Adapter)
2014/11/25 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
yii框架搜索分页modle写法
2016/12/19 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
js 替换
2008/02/19 Javascript
JSON 和 JavaScript eval使用说明
2010/06/13 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
Javascript模块化编程(一)模块的写法最佳实践
2013/01/17 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
jQuery插件扩展测试实例
2016/06/21 Javascript
JS三目运算(三元运算)方法详解
2017/03/01 Javascript
jQuery使用ajax_动力节点Java学院整理
2017/07/05 jQuery
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
2018/09/03 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
Python Web框架Flask信号机制(signals)介绍
2015/01/01 Python
python创建列表和向列表添加元素的实现方法
2017/12/25 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
python中实现控制小数点位数的方法
2019/01/24 Python
python logging日志模块原理及操作解析
2019/10/12 Python
python实现二分类的卡方分箱示例
2019/11/22 Python
python操作cfg配置文件方式
2019/12/22 Python
python 负数取模运算实例
2020/06/03 Python
工程材料采购方案
2014/05/18 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
售后服务承诺函格式
2015/01/21 职场文书
被告代理词范文
2015/05/25 职场文书
运动会1000米加油稿
2015/07/21 职场文书
孩子满月酒答谢词
2015/09/30 职场文书
2019年英语版感谢信(8篇)
2019/09/29 职场文书