首页 > 其他分享 >设备地址

设备地址

时间:2024-09-18 18:03:49浏览次数:2  
标签:addr 静态 地址 随机 ble 设备

设备地址

BLE的设备地址可以使用公共地址(Public Device Adress)或者随机地址(Random Device Address),一个BLE至少使用一种地址类型,当然也可以同时使用两种地址类型。
公共地址和随机地址一样,都是48位(6字节),BLE设备地址关系如下:

  • 公共地址:从IEEE申请(购买),IEEE保证地址的唯一性;
  • 随机静态地址:自己定义,上电初始化完成后不能修改;
  • 随机不可解析私有地址:定时更新地址,蓝牙核心规范建议15分钟更新一次;
  • 随机可解析私有地址:通信双方使用共享的身份解析密钥(IRK:Indentity Resolving Key),生成和解析可解析私有地址。只有一台设备拥有另一台设备的IRK时,才能跟踪该广播设备的活动。

1. 公共地址

公共地址包含2部分:

公共地址能够明确的指示出设备,同时具有唯一性,但安全度不够,不法分子可以通过计数手段跟踪该唯一的公共地址,即可以跟踪到这设备的使用者。
为加强隐私,蓝牙核心规范中提供另外一种地址:随机地址,随机地址是随机产生的,不是固定分配的,随机地址又分为多种类型,以适用不同应用场景对隐私的要求。

2. 随机地址

2.1 随机静态地址
  1. 随机静态地址的定义;随机静态地址是随机生成的48位地址,随即地址必须符合以下要求:
  • 静态地址的最高2位有效位必须是1。
  • 静态地址最高2位有效位之外的其余部分不能全为0。
  • 静态地址最高2位有效位之外的其余部分不能全为1。
  • 一个上电周期内不变。
    静态地址的格式如下图,共48位,最高2位是固定的,必须是1。
  1. 代码中使用随机静态地址的方法
    程序中使用随机静态地址时,可以每次上电时重新设置随机地址,但是初始化完成后,不能修改地址。设置随机静态地址和读取随机静态地址的流程如下图所示。
    从上图中我们可以看到,读写随机静态地址需要用到地址结构体ble_gap_addr_t和两个
    API函数。其中地址结构体ble_gap_addr_t的声明如下。读和写的时候,都需要定义地址结
    构体,读的时候用来保存读取的设备地址和设备地址类型,写的时候用来将待写入的地址传
    递给API函数sd_ble_gap_addr_set().

    读写设备地址使用2个api函数,sd_ble_gap_addr_set() 和 sd_ble_gap_addr_get():


获取广播者使用的蓝牙地址使用该函数sd_ble_gap_adv_addr_get():

  • 写设备地址示例:
    定义地址结构体my_addr,然后设置需要写入的设备地址,并将地址类型设置位随机静态地址(BLE_GAP_ADDR_TYPE_RANDOM_STATIC),注意静态地址最高2位必须都是1.下面代码中使用的静态地址如下所示:

  • 都设备地址示例:
    定义地址结构体my_addr,用来保存读取的设备地址和类型,然后调用API函数sd_ble_gap_addr_get()获取设备地址,读取成功后,设备地址会保存到my_addr.

  • 读取广播PDU中设备地址示例:
    定义地址结构体my_addr,用来保存读取的设备地址和类型,然后调用API函数sd_ble_gap_adv_addr_get()获取设备地址,读取成功后,设备地址会保存到my_addr.

  1. 读取设备出厂时设置的地址:
    Nordic的BLE例子中都没有设置设备地址,原因是芯片出厂时已经设置了48位的地址和地址类型(地址类型为随机静态地址),应用程序可从下面2个寄存器读取设备地址及类型:


    SDK中的BLE例子使用的设备地址是初始化时协议栈从DEVICEADDR[n]寄存器中读
    出来的,DEVICEADDR[n]寄存器中存储的是随机静态地址,所以BLE例子中使用的都是
    随机静态地址。
    由此可见,如果应用程序不设置设备地址的话,设备就会使用协议栈默认从芯片读取的
    设备地址,地址类型为随机静态地址。
2.2 不可解析私有地址
  1. 定义如下:
  • 最高2为必须为0;
  • 其余位不能全0;
  • 也不能全1;
  • 不能和公共地址一样;

不可解析地址,周期性的改变地址,并且是完全随机的,很难被跟踪,安全性高,但是使用不多。
2. 代码使用:
ble_gap_privacy+params_t定义结构体变量,在使用sd_ble_gap_privacy_set()设置

2.3 可解析私有地址

定义:

  • 最高两位必须是0和1;
  • 其余不能全为0;
  • 其余不能全为1;
  • 不能和公共地址一样。

代码只用和不可解析私有地址类似。

标签:addr,静态,地址,随机,ble,设备
From: https://www.cnblogs.com/maodoudou/p/18418960

相关文章

  • MAC地址+网络层
    进制二进制和十六进制之间1个16进制可以用4个二进制表示,1:4关系1111是否取值8421取值所代表的数值 在一台交换机上每台设备间的物理链路:不是直连--直接连接逻辑状态:都处于互联状态,处于一条链路上MAC地址由两部分组成,前24位代表该供应商代码,由IEEE管理和......
  • 分布式光伏发电站数据采集设备管理硬件解决方案
     随着全球能源结构的转型和可再生能源的快速发展,光伏发电作为重要的清洁能源之一,在能源市场中占据了越来越重要的位置。AcrelCoud-1200分布式光伏运维云平台通过监测光伏站点的逆变器设备,气象设备以及摄像头设备,帮助用户管理分散在各地的光伏站点、主要功能包括:站点监测,逆变......
  • 安卓手机改ip地址改到其他市
    在数字化时代,IP地址作为设备在网络上的唯一标识,其重要性不言而喻。有时,出于测试、学习或特定服务访问的需求,用户可能希望将安卓手机的IP地址修改为其他城市的地址。本文旨在探讨如何在安卓手机上修改IP地址至其他城市,并提供合规使用的建议。一、修改IP地址的方法要在安卓手......
  • zblog升级数据库版本 zblog数据库地址修改
    当你需要升级Z-Blog的数据库或修改数据库地址时,可以按照以下步骤操作:升级数据库版本备份现有数据库在进行任何升级操作之前,强烈建议先备份现有的数据库。这样即使升级过程中出现问题,也可以快速恢复到之前的状态。下载最新版本访问Z-Blog官方网站或其他可信来源下......
  • Rust中的&运算符取一个变量的地址与C/C++中意义相同么?如果不同又有什么区别呢?
    Rust中的&运算符与C/C++中的&运算符有相似之处,但它们的行为和作用有一些关键区别,特别是在所有权、内存安全和编译期检查方面。1.相似之处在Rust和C/C++中,&运算符都用于获取变量的地址,即生成一个指针或引用。它们的作用可以概括为:将一个值的引用或地址作为结果,而不......
  • Rust有指针类型数据吗?是否可以查看一个变量的内存地址?
    在Rust中,虽然不像C/C++那样直接使用传统的指针类型,但Rust依然有指针的概念,且提供了多种安全的方式来操作和管理内存。你可以通过一些Rust的特性查看变量的内存地址并安全地进行指针操作。1.引用(References)Rust的引用(&和&mut)可以理解为一种安全的、受所有权规则和借......
  • zblog域名后无法访问 zblog数据库地址修改
    当Z-Blog在修改域名后无法访问时,这通常意味着数据库中的某些配置没有正确更新。以下是解决此类问题的一些建议步骤:1.检查数据库配置问题描述:数据库配置可能未正确更新。解决方法:登录到数据库管理工具(如phpMyAdmin)。找到Z-Blog的数据库。检查数据库中的 zbp_config......
  • 只有公网IP地址可以申请SSL证书吗?
    是的,只有公网IP地址可以申请SSL证书。这是因为SSL证书主要用于加密互联网上的数据传输,确保通信的安全性和数据的完整性。而公网IP地址是互联网通信的核心,具有全球唯一性,允许互联网上的用户通过它们访问互联网上的资源。具体来说,申请SSL证书时,必须确保拥有一个合法的公网IP地......
  • Linux修改进入终端的默认地址
    1:进入到要修改的用户目录下,我要修改root的,我进入到root目录下cdroot/进入目录后,发现目录下只有anaconda-ks.cfg配置文件,没有.bashrc文件,因为这个文件是隐藏的 2:我们执行编辑文件命令vim.bashrc  3:在文件中添加cd命令:例如,添加以下行以设置默认路径:cd/you......
  • 使用 Wake Lock API:保持设备唤醒的最佳实践
    在现代Web应用中,尤其是涉及视频播放、实时通信、地图导航等长时间运行的任务时,用户常常希望设备不要因为空闲而自动进入睡眠模式或屏幕变暗。为了解决这一问题,WebAPI提供了一个名为WakeLock的接口,允许开发者请求设备保持唤醒状态。本文将详细介绍如何使用WakeLockAPI......