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 图片验证码代码分享
Jul 04 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
Apr 11 Python
Python搜索引擎实现原理和方法
Nov 27 Python
Python使用zip合并相邻列表项的方法示例
Mar 17 Python
基于pandas将类别属性转化为数值属性的方法
Jul 25 Python
python+selenium实现简历自动刷新的示例代码
May 20 Python
python实现的读取网页并分词功能示例
Oct 29 Python
python使用paramiko实现ssh的功能详解
Mar 06 Python
Python爬虫爬取、解析数据操作示例
Mar 27 Python
Selenium基于PIL实现拼接滚动截图
Apr 10 Python
python实现移动木板小游戏
Oct 09 Python
Django websocket原理及功能实现代码
Nov 14 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导出Redis数据到另一个Redis中的代码
2014/03/12 PHP
CI框架中zip类应用示例
2014/06/17 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
2015/03/03 PHP
基于php编程规范(详解)
2017/08/17 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
js 判断checkbox是否选中的操作方法
2012/11/09 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
Javascript弹出窗口的各种方法总结
2013/11/11 Javascript
Jquery 动态生成表格示例代码
2013/12/24 Javascript
javascript判断office版本示例
2014/04/11 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
深入理解JavaScript 参数按值传递
2017/05/24 Javascript
详解angularjs popup-table 弹出框表格指令
2017/09/20 Javascript
vue+element UI实现树形表格带复选框的示例代码
2019/04/16 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
vue实现轮播图帧率播放
2021/01/26 Vue.js
[51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
python下载微信公众号相关文章
2019/02/26 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
Python qqbot 实现qq机器人的示例代码
2019/07/11 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
Python代码注释规范代码实例解析
2020/08/14 Python
python openCV自制绘画板
2020/10/27 Python
Python 2.6.6升级到Python2.7.15的详细步骤
2020/12/14 Python
使用HTML5和CSS3制作一个模态框的示例
2018/03/07 HTML / CSS
Mansur Gavriel官网:纽约市的一个设计品牌
2019/05/02 全球购物
校园公益广告语
2014/03/13 职场文书
中学生检讨书1000字
2014/10/28 职场文书
党员进社区活动总结
2015/05/07 职场文书
Rhit高效可视化Nginx日志查看工具
2021/11/01 Servers
利用 JavaScript 构建命令行应用
2021/11/17 Javascript
idea下配置tomcat避坑详解
2022/04/12 Servers