ble

对智能佩戴装置的一次分析

这一生的挚爱 提交于 2019-12-31 21:26:44
你好,我是Sayli Ambure,刚进入信息安全领域的新人。网络应用和物联网/硬件的通信安全一直是我想探索的东西,而本文也是关于我对某款智能设备的研究。 我并不会过多描述低功耗蓝牙(BLE)的工作原理是啥(已经有很多人科普过了),就让我们直接开始吧。 此次目标是一个非常便宜且容易获得的智能手表(手环?),我将简单地分析它,并与其交互。 市面上不少智能手表的外表都极其相似,而我最常见到的是M4手表,只需5美元,来自中国。 得到通讯数据 第一步,尝试获得移动应用和设备之间的通信。 即使你没有任何专业、昂贵的嗅探器,也没关系,android可帮你嗅探蓝牙通信。 你可以在 开发者选项——>BT Snoop 中找到它。具体获得相关PCAP的方法可能取决于设备的不同。 一旦得到你的PCAP数据,在Wireshark中打开它,你会看到所有的蓝牙通信。我们只关注其中和BLE有关部分,即GATT或ATT协议。 通过 btatt 过滤器,就可以筛选出ATT协议,我们现在不需要任何其他种类的蓝牙通信。 现在寻找发送 写请求 的数据包,因为应用已发送一个 写请求 来设置时间和发送一些通知到设备。 从上图可以清晰看到“发送写请求”,现在选择 写请求 的操作码,将其作为过滤器,很快你就可以看到所有正在发送的数据。 这里请重点注意一下 Handle 和 Value ,我们将在下一节讨论它们的重要性。

Nordic的sdk和蓝牙协议栈的命名规则

眉间皱痕 提交于 2019-12-28 15:14:45
Softdevice命名规则一 Softdevice包括两种底层协议栈:BLE和ANT,BLE包括两种角色:central(又称master)和peripheral(又称slave),为此需要给这些不同类型的协议栈进行命名区分。协议栈命名格式为Sxyz,其中 x – 表示协议栈的类型,1表示BLE协议栈,2表示ANT协议栈,3表示同时支持BLE和ANT y – 表示BLE角色,1表示从设备,2表示主设备,3表示同时支持主设备和从设备 z – 表示芯片类型,0表示nRF51系列,2表示nRF52系列 比如S110,表示只支持从设备模式的nRF51 BLE协议栈 比如S130,表示既支持从设备模式又支持主设备模式的nRF51 BLE协议栈 比如S132,表示既支持从设备模式又支持主设备模式的nRF52 BLE协议栈 比如S212,表示nRF52 ANT协议栈 比如S332,表示nRF52既支持BLE协议栈又支持ANT协议栈,而且BLE协议栈既支持从设备模式又支持主设备模式 Softdevice命名规则二 大体上跟命名规则1相同,但是协议栈编号最后2位跟芯片型号一样,比如S140,代表这个协议栈专门用于nRF52840。由于52840 Flash空间很大,没有必要做各种细分的协议栈,S140协议栈是一个大而全的协议栈,包含蓝牙所有功能。 Softdevice版本编号,从1.0.0开始编号

蓝牙BLE之广播

孤街浪徒 提交于 2019-12-27 14:04:14
参考文章:作者大棋17 链接:https://www.jianshu.com/p/ac24239c1daf 作者 枫之星雨 原文链接:https://blog.csdn.net/zzfenglin/article/details/51165543 广播数据格式 广播包有两种: 广播包(Advertising Data) 响应包(Scan Response) 其中广播包是每个外设都必须广播的,而响应包是可选的。每个广播包的长度必须是31个字节,如果不到31个字节 ,则剩下的全用0填充。 补全。这部分的数据是无效的。 广播数据单元 广播包中包含若干个广播数据单元,广播数据单元也称为 AD Structure。 广播数据单元 = 长度值Length + AD type + AD Data。 长度值Length只占一个字节,并且位于广播数据单元的第一个字节。 概念的东西有些抽象,先看看下面的广播报文: 0x代表这串字符串是十六进制的字符串。两位十六进制数代表一个字节。 读取第一个广播数据单元。读取第一个字节:0x07,转换为十进制就是7,即表示后面的7个字节是这个广播数据单元的数据内容。超过这7个字节的数据内容后,表示是一个新的广播数据单元。 而第二个广播数据单元,第一个字节的值是0x16,转换为十进制就是22,表示后面22个字节为第二个广播数据单元。 在广播数据单元的数据部分中

ESP32的BLE_SPP

China☆狼群 提交于 2019-12-27 13:52:29
最近在捣鼓这个ESP32的BLE的SPP功能,把自己的心得体会写下来,如果有什么不对的地方欢迎大家来留言讨论。 首先是乐鑫官方的源码地址: https://github.com/espressif/espidf/tree/30372f5a4ff2c0dfdaad95f544dc36bcdda30b75/examples/bluetooth/bluedroid/ble/ble_spp_server 这个模式的蓝牙是低功耗蓝牙串口传输,它的工作流程是: 1、初始化蓝牙控制器 ret = esp_bt_controller_init(&bt_cfg); 然后使能蓝牙控制器 ret = esp_bt_controller_enable(ESP_BT_MODE_BLE); 这个ESP_BTMODE_BLE是使能的模式选择,可以是BLE也可以是BT还可以是两者的共存。 2、初始化蓝牙堆栈 ret = esp_bluedroid_init(); 并使能堆栈 ret = esp_bluedroid_enable(); 经过以上两个步骤,蓝牙就已经初始化完成了,是不是很简单。 接下来就是一些回调函数了, 这个是GATT的注册回调函数 esp_ble_gatts_register_callback(gatts_event_handler); 这个是GAP的注册回调函数 esp_ble_gap

BLE蓝牙的连接和配对过程

 ̄綄美尐妖づ 提交于 2019-12-25 09:27:59
一 连接 连接过程参考: https://blog.csdn.net/iini01/article/details/80147232 二 配对 区别于传统蓝牙的配对过程,BLE的配对过程发生在连接过程之后 配对是一个三阶段的过程。前两个阶段是必须的,第三阶段是可选的。 第一阶段:配对特征交换 第二阶段:短期秘钥(STK)生成 第三阶段: 传输特定秘钥分配 STK生成规则 Just work: 没有加密 TK=0x00 passkey entry: 密码输入如果 passkey 是 ‘019655’ TK的值就是0x00000000000000000000000000004CC7。 将输入的值作为一个6位数的十进制,转换成16字节的十六进制。 OOB: 带外的TK值是一个16字节的随机数,通过非BLE的方式传递给对端。 2.1 第一阶段 设备首先在配对特征交换阶段交换IO能力来决定在第二阶段使用下面哪种方法: JustWorks:只工作 PasskeyEntry:输入密码 OutOfBand(OOB):带外 LE Legacy Pairing - Just Works Just Works方式不能抵抗窃听者和中间人攻击,只有在配对过程时没有遭受攻击,后面加密的链路的数据传输才是可信的。安全级别很低。 LE Legacy Pairing - Passkey Entry

BLE体系架构说明

旧时模样 提交于 2019-12-18 18:09:09
1. 控制器:蓝牙控制器由同时包含了数字和模拟部分射频器件和负责收发数据包的硬件组成。控制器和外界通过天线相连,与主机通过主机控制接口(HCI)相连。 1.1. 物理层(PHY):物理层负责传输和接收电磁辐射,无线电波通常可以在给定的某个频段内通过改变幅度、频率、相位携带信息。在低功耗蓝牙中,采用高斯频移键控(GFSK)的调制方式改变无线电波的频率,传输0或1的信息。频移键控是指把1和0通过轻微升高或者降低信号频率进行编码。调制指示表示围绕信道的中心频率的上下频率之间的宽度。传输无线电信号时,从中心频率出发超过185KHz的正向偏移代表值为1的比特;超过185KHz的负向偏移代表值为0的比特。 1.2. 直接测试模式(DTM):允许测试者让控制器的物理层发送一系列测试数据包或接收一系列数据包。测试者随后可以分析接收到的数据包,或根据接收的数据包数量判断物理层是否遵循RF规范。 1.3. 链路层(LL):链路层是低功耗蓝牙最复杂的部分。它负责广播、扫描、建立和维护连接,以及确保数据包按照正确的方式组织、正确地计算校验值以及加密序列等。为了实现上述功能,定义下列三个基本概念:信道、报文和过程 。 1.4. 主机/控制器接口(HCI):提供主机和控制器的标准接口。HCI实际由两个独立的部分组成:逻辑接口和物理接口;逻辑接口定义命令和事件及其相关的行为

BLE低功耗蓝牙学习笔记-概述

Deadly 提交于 2019-12-17 08:54:44
声明:BLE低功耗蓝牙系列博客来自个人的学习总结,其中肯定会包含很多错误,如果发现欢迎帮忙指正。BLE内容比较多,我现在还没有完全学完,好在其分层设计,所以可以每学完一个部分就可以做相应的总结。需要说明的是该系列博客的大部分内容来自《低功耗蓝牙开发权威指南》这本书,还会包含韦东山蓝牙系列课程的部分内容。该系列博客可以提供些什么?该系列博客是对BLE相关的知识点做归纳总结,注释个人在学习过程中的观点、理解。以后的内容计划有BLE应用的使用和实现过程,尽可能的在博客内容加入协议分析的过程,总之是从作者的学习历程记录BLE学习、理解的过程。通过对BLE低功耗蓝牙的学习弥补了我对无线通讯技术的空白,今后持续学习BLE这项技术,博客也会不断完善,必要时进行调整,修改。 什么是低功耗蓝牙(BLE)? 低功耗蓝牙是一种全新的技术,是当前可以用来设计和使用功率最低的无线技术。 作为经典蓝牙的拓展,低功耗蓝牙沿用了蓝牙商标,并且借鉴了很多父辈的技术,然而,由于针对的设计目标和市场领域均与经典蓝牙有所不同,低功耗蓝牙应被视为一种不同的技术。 低功耗蓝牙在速率与功耗,更朝着降低功耗方面优化。 在设计之初,低功耗蓝牙的目标在于尽可能创造一种最低功耗的、短距离的无线技术。为了实现这一目标,低功耗蓝牙技术对体系结构的每一层都进行了优化,以降低执行任务所需的能耗。例如,与经典蓝牙相比

NRF51822蓝牙服务(6)——显示设备信息

ぐ巨炮叔叔 提交于 2019-12-10 23:05:00
前言 有时候开发项目,我们希望能通过蓝牙直接读取到设备的信息,例如制造商、固件版本、硬件版本和软件版本等信息。所以,今天我们就直接使用官方提供的服务来实现这个需求。 实验分析 首先,我们需要把官方驱动例程添加到我们的工程(这里使用前面用到的串口例程)目录里面: 路径是:工程目录\components\ble\ble_services\ble_dis 接着,我们去看看官方提供给我们的接口函数: ble_dis.h: /**@brief Device Information Service init structure. This contains all possible characteristics * needed for initialization of the service. */ typedef struct { ble_srv_utf8_str_t manufact_name_str; /**< Manufacturer Name String. */ ble_srv_utf8_str_t model_num_str; /**< Model Number String. */ ble_srv_utf8_str_t serial_num_str; /**< Serial Number String. */ ble_srv_utf8_str_t hw_rev_str;

NORDIC BLE MAC ADDR

China☆狼群 提交于 2019-12-09 12:50:11
一个ble设备,地址可以分成2大类 Public Device Address(公共设备地址) 公共设备地址 Public Device Address是48bits的数字,就和电脑mac地址一样,是全球唯一的,一般传统蓝牙用这种地址。 Random Device Address(随机设备地址) 不是固定分配,而是设备启动后随机分配,Random Device Address(随机设备地址)又可以分成2类 Static Device Address( 静态设备地址) 最高2bits为“11”, 剩余46bits是随机数,不能全0或全1 在一个上电周期保持不变 下一次上电可以变也可以不变 Private Device Address(私密设备地址) 分为2类 Non-resolvable private address(不可解析私密地址) 最高2bits为“00” 剩余46bits是随机数,不能全0或全1 每隔T_GAP周期更新 Resolvable private address(不可解析私密地址) 高24bits是随机数,最高2bits为“10” 低24bits是随机数和IRK进过hash运算得到hash值,hash=ah(IRK,prand) 对端BLE扫描到该类型地址后,用本地IRK和该地址的prand进行ah运算,如果得到值和该类型地址低24bits一致才进行后续操作。

Ble蓝牙设备之(搜索/链接/获取uuid数据)思路分析以及完整Demo

一个人想着一个人 提交于 2019-12-09 09:02:53
1,本文主要讲解蓝牙数据的搜索–链接–获取数据值–写入数据值; 蓝牙Demo 一:搜索蓝牙设备名称 二:建立链接 三:读取传递过来的值 四:写入数据 蓝牙项目该配置的具体事件 <!-- 检测蓝牙状态 --> < uses-feature android:name = "android.hardware.bluetooth_le" android:required = "true" /> < uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" /> < uses-permission android:name = "android.permission.INTERNET" > </ uses-permission > <!-- 增加蓝牙所需要的权限 --> < uses-permission android:name = "android.permission.BLUETOOTH" /> < uses-permission android:name = "android.permission.BLUETOOTH_ADMIN" /> 结合自己最近的项目需求,和自身所学所得,代码基本上利用官方的sever服务和gatt链接,只是通过修改获得自己想要的结果,下面就简单介绍一下自己的理解。 一