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 相关文章推荐
深入探究Django中的Session与Cookie
Jul 30 Python
python内置函数:lambda、map、filter简单介绍
Nov 16 Python
Python 判断奇数偶数的方法
Dec 20 Python
Python使用百度api做人脸对比的方法
Aug 28 Python
关于Python内存分配时的小秘密分享
Sep 05 Python
windows环境中利用celery实现简单任务队列过程解析
Nov 29 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
python+gdal+遥感图像拼接(mosaic)的实例
Mar 10 Python
Python urlopen()参数代码示例解析
Dec 10 Python
Python 实现二叉查找树的示例代码
Dec 21 Python
python pyg2plot的原理知识点总结
Feb 28 Python
python geopandas读取、创建shapefile文件的方法
Jun 29 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
mysql总结之explain
2012/02/27 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
2014/04/18 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
PHP与Web页面的交互示例详解二
2020/08/04 PHP
让焦点自动跳转
2006/07/01 Javascript
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
Vue3 中的数据侦测的实现
2019/10/09 Javascript
Javascript如何实现双指控制图片功能
2020/02/25 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
Python程序员开发中常犯的10个错误
2014/07/07 Python
python关闭windows进程的方法
2015/04/18 Python
将Python代码打包为jar软件的简单方法
2015/08/04 Python
python开发之list操作实例分析
2016/02/22 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
使用python对文件中的数值进行累加的实例
2018/11/28 Python
python实现简单飞行棋
2020/02/06 Python
《山谷中的谜底》教学反思
2014/04/26 职场文书
优秀求职信
2014/05/29 职场文书
工作求职信
2014/07/04 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
个人党性锻炼总结
2015/03/05 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
java代码实现空间切割
2022/01/18 Java/Android
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL