关于led蓝牙控制器ble通信分析
前言
前几天在网上买了一个led蓝牙控制器,可以用手机app通过蓝牙连接控制rgb led灯,当然这个也是属于ble通信。之前我写过一篇体重称蓝牙通信的,不过那个较为简单,数据也是靠分析出来的。
这次通过手机蓝牙抓包,对蓝牙通信数据进行分析,然后通过python的bluepy库实现了通信,从而可以实现电脑控制rgb灯的效果。
初步分析
这里我用的是手机上的软件,BLE Scanner , 可以查看到低功耗蓝牙及与其通信。
连接到对应的服务:

我们可以看到,有2个服务,3个 Characteristic , 而且只有一个characteristic 有写入权限,那么此时可以确定控制rgb灯带必然是与最后这个characteristic 通信。数据包分析会进一步证明。
一个物理ble蓝牙设备包含多个server, 而一个server有包含多个 characteristic, 进行具体通信的时候都是对 其中的characteristic进行读取和写入,从而达到通信的目的。
手机蓝牙数据抓包
我用的是小米手机抓取的蓝牙数据包,开发者模式中的那个抓包一直不好使,这个跟手机品牌有关,还好小米手机有一个测试抓包用的功能,在拨号键中输入 *#*#5959#*#*:

然后可以进入app, 进行一些修改,进行一些蓝牙通信:

通信结束后,再次输入:*#*#5959#*#* 结束抓包。
蓝牙数据包存储在 /sdcard/MIUI/debug_log/ 目录下,是一个压缩包,将其转移到电脑:
adb pull /sdcard/MIUI/debug_log/bugreport-2021-08-16-181040.zip .
解压,在common文件下可以找到蓝牙的数据包:

这个文件可以在wireshark中打开。
蓝牙数据包分析

这里我简单写了一条过滤命令:bluetooth.dst == be:58:50:00:69:f2,指定目的蓝牙mac地址。
可以看到我选中的是 Write Command, 可以确定是这个数据包进行修改了rgb灯效,找到 Handle:

可以看到 service uuid为:0xfff0, Characteristic uuid为:0xfff3, 对应我们前面初步分析中的结论。也就是最后一个characteristic 实现控制rgb灯, 而这个通信的数据就是: 7e070503ff003710ef 。
python 代码实现:
from bluepy.btle import Peripheral
p = Peripheral("be:58:50:00:69:f2")
p.getCharacteristics(uuid="0000fff3-0000-1000-8000-00805f9b34fb")[0].write(b"\x7e\x07\x05\x03\xff\x00\x37\x10\xef")
uuid 是通过 BLE Scanner得到的,当然你不知道uuid的话也可以先获取所有的server, 然后遍历所有 server中的所有 Characteristic得到所有的 Characteristic的 uuid。
执行代码后,发现灯的颜色已经改变了。 (linux有时需要root运行,否则会报错权限不足)
通过反复抓包以及分析,最后我得到几个 灯效 的数据,还有一个速度的控制:
data = {
"静态黄色":b"\x7e\x05\x03\x84\x03\xff\xff\x00\xef",
"静态紫色":b"\x7e\x05\x03\x85\x03\xff\xff\x00\xef",
"静态白色":b"\x7e\x05\x03\x86\x03\xff\xff\x00\xef",
"七色跳变":b"\x7e\x05\x03\x88\x03\xff\xff\x00\xef",
"三色跳变":b"\x7e\x05\x03\x87\x03\xff\xff\x00\xef",
"三色渐变":b"\x7e\x05\x03\x89\x03\xff\xff\x00\xef",
"七色渐变":b"\x7e\x05\x03\x8a\x03\xff\xff\x00\xef",
}
结合PyQt5 简单写一个软件控制灯效及速度:
import re
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from bluepy.btle import Peripheral
data = {
"静态黄色":b"\x7e\x05\x03\x84\x03\xff\xff\x00\xef",
"静态紫色":b"\x7e\x05\x03\x85\x03\xff\xff\x00\xef",
"静态白色":b"\x7e\x05\x03\x86\x03\xff\xff\x00\xef",
"七色跳变":b"\x7e\x05\x03\x88\x03\xff\xff\x00\xef",
"三色跳变":b"\x7e\x05\x03\x87\x03\xff\xff\x00\xef",
"三色渐变":b"\x7e\x05\x03\x89\x03\xff\xff\x00\xef",
"七色渐变":b"\x7e\x05\x03\x8a\x03\xff\xff\x00\xef",
}
class MyMainWindow(QWidget):
def __init__(self):
super(MyMainWindow, self).__init__()
p = Peripheral("be:58:50:00:69:f2")
self.characteristic = p.getCharacteristics(uuid="0000fff3-0000-1000-8000-00805f9b34fb")[0]
vlayout = QVBoxLayout()
hlyaout = QHBoxLayout()
self.label = QLabel('0')
self.combox = QComboBox()
self.combox.addItems([i for i in data])
self.combox.currentIndexChanged['QString'].connect(self.updateMode)
self.slider = QSlider()
self.slider.setOrientation(1)
self.slider.setMaximum(100)
self.slider.valueChanged['int'].connect(self.updateSpeed)
hlyaout.addWidget(self.slider)
hlyaout.addWidget(self.label)
vlayout.addWidget(self.combox)
vlayout.addLayout(hlyaout)
self.setLayout(vlayout)
def updateSpeed(self,speed):
self.label.setText(str(speed))
WriteData = b"\x7e\x04\x02%s\xff\xff\xff\x00\xef" % chr(speed).encode()
# print(WriteData)
self.characteristic.write(WriteData,withResponse=False)
def updateMode(self,mode):
# print(data[mode])
self.characteristic.write(data[mode],withResponse=False)
if __name__=='__main__':
app = QApplication(sys.argv)
mywin = MyMainWindow()
mywin.show()
sys.exit(app.exec_())

关于led蓝牙控制器ble通信分析的更多相关文章
- 物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探
物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探 唐朝实验室 · 2015/10/30 10:22 Author: FengGou 0x00 目录 0x00 目录 0x01 前言 0x02 BLE概 ...
- [nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)
蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体 ...
- 【转】Android4.4(MT8685)源码蓝牙解析--BLE搜索
原文网址:http://blog.csdn.net/u013467735/article/details/41962075 BLE:全称为Bluetooth Low Energy.蓝牙规范4.0最重要 ...
- 浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(转载)
转载来至beautifulzzzz,网址http://www.cnblogs.com/zjutlitao/,推荐学习 蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到 ...
- TI低功耗蓝牙(BLE)介绍
TI低功耗蓝牙(BLE)介绍 本文档翻译和修改自参考资料:CC2540Bluetooth Low Energy Software Developer’s Guide (Rev. B),部分图片直接引用 ...
- TI低功耗蓝牙(BLE)介绍【转】
转自:http://blog.csdn.net/ooakk/article/details/7302425 TI低功耗蓝牙(BLE)介绍 本文档翻译和修改自参考资料:CC2540Bluetooth L ...
- 低功耗蓝牙(BLE)透传模块 ——RF-BM-S01(BQB认证)
本文来源深圳信驰达科技www.szrfstar.com,技术交流群336720020. 低功耗蓝牙(BLE)透传模块 ——RF-BM-S01(BQB认证) 深圳市信驰达科技有限公司 2013年3月18 ...
- 原创翻译:蓝牙(BLE)for iOS
About Core Bluetooth 简要:核心蓝牙框架提供了iOS和MAC 应用程序与BLE 设备进行无线通信所需要的类.通过该框架,应用程序可以扫描.发现BLE 外设,如心率.电子温度传感器等 ...
- 【Android应用开发】Android 蓝牙低功耗 (BLE) ( 第一篇 . 概述 . 蓝牙低功耗文档 翻译)
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50515359 参考 : -- 官方文档 : https://develope ...
- iOS蓝牙BLE4.0通信功能
概述 iOS蓝牙BLE4.0通信功能,最近刚学的苹果,为了实现蓝牙门锁的项目,找了一天学习了下蓝牙的原理,亲手测试了一次蓝牙的通信功能,结果成功了,那么就把我学习的东西分享一下. 详细 代码下载:ht ...
随机推荐
- 最新一线大厂Redis使用21条军规及详细解读
说明:个人原创,本人在一线互联网大厂维护着几千套集群,关于redis使用的一些坑进行了经验总结,希望能给大家带来一些帮助 适用场景:并发量大.访问量大的业务 规范:介绍军规内容 解读:讲解军规设置原因 ...
- Python数据科学手册-Pandas:向量化字符串操作、时间序列
向量化字符串操作 Series 和 Index对象 的str属性. 可以正确的处理缺失值 方法列表 正则表达式. Method Description match() Call re.match() ...
- frp内网穿透实战
什么是frp frp是一个使用非常简单的开源内网穿透软件,代码地址:https://github.com/fatedier/frp ,使用条前提你需要有一台公网服务器,大致原理是:公网服务器监听某个端 ...
- Elastic:菜鸟上手指南
文章链接:https://elasticstack.blog.csdn.net/article/details/102728604
- 搭建Elasitc stack集群需要注意的日志问题
文章转载自:https://blog.csdn.net/u013613428/article/details/84943577 {{uploading-image-736853.png(uploadi ...
- MinIO分布式集群部署方式
文章转载自:https://blog.51cto.com/u_10950710/4843738 关于分布式集群MinIo 单机Minio服务存在单点故障,如果是一个有N块硬盘的分布式Minio,只要有 ...
- Grafana配置Alert监控告警
1.添加告警途径 这里以slack为例 测试是否可用 在slack上收到告警通知了 安装插件 # grafana-cli plugins install grafana-image-renderer ...
- Jenkins和Gitlab CI/CD自动更新k8s中pod使用的镜像说明
Jenkins 使用Jenkins的话,完成的工作主要有如下步骤: 1.从Gogs或Gitlab仓库上拉取代码 2.使用Maven编译代码,打包成jar文件 3.根据jar文件使用相对应的Docker ...
- Python中class内置方法__init__与__new__作用与区别探究
背景 最近尝试了解Django中ORM实现的原理,发现其用到了metaclass(元类)这一技术,进一步又涉及到Python class中有两个特殊内置方法__init__与__new__,决定先尝试 ...
- Spring mvc源码分析系列--Servlet的前世今生
Spring mvc源码分析系列--Servlet的前世今生 概述 上一篇文章Spring mvc源码分析系列--前言挖了坑,但是由于最近需求繁忙,一直没有时间填坑.今天暂且来填一个小坑,这篇文章我们 ...