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加持:

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

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

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

  1. Downloads sudo nmap -sS -p 22 192.168.31.0/24 | grep -B 5 -A 0 "Pi"
  2. Nmap scan report for 192.168.31.51
  3. Host is up (0.19s latency).
  4. PORT STATE SERVICE
  5. 22/tcp open ssh
  6. MAC Address: B8:27:EB:71:33:AE (Raspberry Pi Foundation)
  7. Downloads ssh pi@192.168.31.51
  8. 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的代码:

  1. examples git:(master) cat scan.py
  2. #!/usr/bin/env python
  3. # coding=utf-8
  4. from bluepy.btle import Scanner, DefaultDelegate
  5. class ScanDelegate(DefaultDelegate):
  6. def __init__(self):
  7. DefaultDelegate.__init__(self)
  8. def handleDiscovery(self, dev, isNewDev, isNewData):
  9. if isNewDev:
  10. print("Discovered device", dev.addr)
  11. elif isNewData:
  12. print("Received new data from", dev.addr)
  13. scanner = Scanner().withDelegate(ScanDelegate())
  14. devices = scanner.scan(10.0)
  15. for dev in devices:
  16. print("Device %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType, dev.rssi))
  17. for (adtype, desc, value) in dev.getScanData():
  18. print(" %s = %s" % (desc, value))
  • 其中Scanner([index=0])用于产生并初始化一个新的scanner对象,index 用来指名哪一个蓝牙设备就会被用(默认0表示使用/dev/hci0)。扫描知道调用start或scan函数之后才会开始;

  • 其中withDelegate(delegate)存储对委托对象的引用,委托对象在接收来自设备的广播时接收回调。有关详细信息,请参阅DefaultDelegate的文档;

  • 其中scan([timeout = 10])开始扫描并带有超时,在此扫描期间扫描到的设备会触发Delegate的回调函数,我们可以在其回调函数中实时获取并打印。当超时后会返回一个设备列表;

执行效果如下:

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


3.2 get services

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

将其中的getServices.py改造下:

  1. examples git:(master) cat get_setvices.py
  2. import sys
  3. from bluepy.btle import UUID, Peripheral
  4. if len(sys.argv) != 2:
  5. print("Fatal, must pass device address:", sys.argv[0], "<device address="">")
  6. quit()
  7. p = Peripheral(sys.argv[1],"public")
  8. services=p.getServices()
  9. #displays all services
  10. for service in services:
  11. print(service)
  • 其中Peripheral(sys.argv[1],"public")是用mac地址创建一个连接,由于我们上一步用scan搜索到的mac地址为public类型,因此这里第二个参数为"public",更详细的介绍见 LINK-6

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

执行效果如下:


3.3 get characteristics

同3.2获取characteristic的代码如下:

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

执行效果如下:


3.4 get device name

直接上代码:

  1. examples git:(master) cat get_device_name.py
  2. import sys
  3. from bluepy.btle import UUID, Peripheral
  4. dev_name_uuid = UUID(0x2A00)
  5. if len(sys.argv) != 2:
  6. print("Fatal, must pass device address:", sys.argv[0], "<device address="">")
  7. quit()
  8. p = Peripheral(sys.argv[1],"public")
  9. try:
  10. ch = p.getCharacteristics(uuid=dev_name_uuid)[0]
  11. if (ch.supportsRead()):
  12. print(ch.read())
  13. finally:
  14. p.disconnect()

运行效果如下:


小结

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


: 完~
大家觉得不错,可以点推荐给更多人~

LINKS

[1]. bluepy GITHUB 链接地址

[2]. bluepy 的文档地址

[3]. Scanner Demo 地址

[4]. python3和python2的print的区别

[5]. bluepy examples using nRF51822 width mbed

[6]. The Peripheral class


  1. @beautifulzzzz
  2. 智能硬件、物联网,热爱技术,关注产品
  3. 博客:http://blog.beautifulzzzz.com
  4. 园友交流群:414948975

[python] bluepy 一款python封装的BLE利器的更多相关文章

  1. python面向对象之继承/多态/封装

    老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...

  2. 创业公司都在使用的3款Python库

    Instavest上发表了一篇博文,文章分享了深受创业公司喜爱的3款Python库,该文章在Hacker News上引发了开发者的激烈探讨,如果你也对此感兴趣,不妨移步去看下.笔者将该文简译过来以分享 ...

  3. 孤荷凌寒自学python第二十三天python类的封装

    孤荷凌寒自学python第二十三天python类的封装 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.从怎么样访问类的内部代码块中定义的私有属性说起 类中定义的私有属性和私有方法是无法被 ...

  4. 推荐一款Python神器,5 行 Python 代码 实现一键批量扣图

    今天给大家分享一款Python装逼实用神器. 在日常生活或者工作中,经常会遇到想将某张照片中的人物抠出来,然后拼接到其他图片上去.专业点的人可以使用 PhotoShop 的"魔棒" ...

  5. 推荐一款Python开源库,技术人必备的造数据神器!

    1. 背景 在软件需求.开发.测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据.由于现在的业务系统数据多种多样,千变万化.在手动制造数据的 ...

  6. python中操作excel数据 封装成一个类

    本文用python中openpyxl库,封装成excel数据的读写方法 from openpyxl import load_workbook from openpyxl.worksheet.works ...

  7. 推荐一款 Python 微服务框架 - Nameko

    1. 前言 大家好,我是安果! 考虑到 Python 性能及效率性,Python Web 端一直不温不火,JAVA 和 Golang 的微服务生态一直很繁荣,也被广泛用于企业级应用开发当中 ​本篇文章 ...

  8. Python knife 一款伪菜刀

    Python knife ​ 一款伪菜刀. ​ 设计之初,本想只写个命令行的就可以了,但又想与众不同,想用python写代码,又不想用c#写前端(c#太卡了),万分无奈之下,找到一个替代品,Pyqt, ...

  9. Windows搭建python开发环境,python入门到精通[一]

    从大学开始玩python到现在参加工作,已经有5年了,现在的公司是一家.net的公司用到python的比较少,最近公司有新项目需要用到python,领导希望我来跟其他同事training,就有了这篇博 ...

随机推荐

  1. vue-router路由动态传参query和params的区别

    1.query方式传参和接收参数 //路由 { path: '/detail', //这里不需要参入参数 name: "detail", component: detail//这个 ...

  2. Ubuntu 16.04.3 安装jenkins

    # 需要java环境wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add - sudo sh -c ...

  3. C#学习-接口与抽象类

    接口与抽象类的区别 1.抽象类中可以包含虚方法.非抽象方法和静态成员: 当接口中不能包含虚方法和任何静态成员,并且接口中只能定义方法,不能有具体事项,方法的具体实现由实现类完成. 2.抽象类不能实现多 ...

  4. JS-两个空数组为什么不相等?

    var a = [], b = []; console.log(a==b); 控制台的打印结果是什么?答案是:false. 接下来看解析: 原始值的比较是值的比较: 它们的值相等时它们就相等(==) ...

  5. Metasploit中aggregator插件无法使用

    Metasploit中aggregator插件无法使用   aggregator是Metasploit自带的一个插件,用来管理会话Session.该插件使用metasploit-aggreator库. ...

  6. KMP模板实现

    看了出题知识点才发现自己连KMP都没有好好的理解,甚至一共就打过一次板子=-= 于是照着之前的课件学了一学...发现没怎么弄懂qwq 我太弱啦! 找了一篇自认为全网最好的介绍 觉得写得很棒 字符串匹配 ...

  7. 按月分表(create table)

    PHP 按月分表控制台命令(yii2版) <?php /** * @Purpose: 按月分表脚本 * @User: Chrdai * @Date: 2019/3/19 * @Time: 15: ...

  8. 3、java面向对象编程

    1.面向对象内存分析 栈的特点 (1)JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数.局部变量等) (2)栈属于线程私有,不能实现线程间的共享! (3)栈的存储特性是:先进后出,后 ...

  9. MicroSoft CryptoAPI data/file encrypt/decrypt

    linux 用第三方库 Crypto++, 还未实战. CryptoAPI使用两种密钥:会话密钥与公共/私人密钥对.会话密钥使用相同的加密和解密密钥,这种算法较快,但必须保证密钥的安全传递.公共/私人 ...

  10. 记录opencv编译过程

    准备学习opencv,参考了几个网页终于完成.编辑器和opencv版本都选择最新的版本. 记录过程如下 1. 下载准备: 1)         Opencv源码, 下载地址: https://sour ...