一个ble设备,地址可以分成2大类
  1、Public Device Address(公共设备地址)
    公共设备地址 Public Device Address是48bits的数字,就和电脑mac地址一样,是全球唯一的,一般传统蓝牙用这种地址。
  2、Random Device Address(随机设备地址)
    不是固定分配,而是设备启动后随机分配,Random Device Address(随机设备地址)又可以分成2类
    1)Static Device Address( 静态设备地址)
      最高2bits为“11”,
      剩余46bits是随机数,不能全0或全1
      在一个上电周期保持不变
      下一次上电可以变也可以不变(可以用随机数发生器产生MAC地址
    2)Private Device Address(私密设备地址),分为2类
      a、Non-resolvable private address(不可解析私密地址)
        最高2bits为“00”
        剩余46bits是随机数,不能全0或全1
        每隔T_GAP周期更新
      b、Resolvable private address(不可解析私密地址)
        高24bits是随机数,最高2bits为“10”
        低24bits是随机数和IRK进过hash运算得到hash值,hash=ah(IRK,prand)
        对端BLE扫描到该类型地址后,用本地IRK和该地址的prand进行ah运算,如果得到值和该类型地址低24bits一致才进行后续操作。
 
总结下就4中类型地址:
  Public Device Address(公共设备地址)
  Static Device Address( 静态设备地址) 11 —nrf52832默认是用这种
  Non-resolvable private address(不可解析私密地址) 00
  Resolvable private address(不可解析私密地址) 10
 
sdk中相关api:
 获得本地mac地址
[out] p_addr
uint32_t sd_ble_gap_address_get(ble_gap_addr_t *p_addr);
 
ble_gap_addr_t 结构体如下
/**@brief Bluetooth Low Energy address. */
typedef struct{ 
//地址类型 
uint8_t addr_type;                    /**< See @ref BLE_GAP_ADDR_TYPES. */ 
//存放地址的数组 6字节 
uint8_t addr[BLE_GAP_ADDR_LEN];       /**< 48-bit address, LSB format. */
} ble_gap_addr_t;
 
[in]addr_cycle_mode :
/**< Set addresses directly, no automatic address cycling. */
BLE_GAP_ADDR_CYCLE_MODE_NONE      0x00 
/**< Automatically generate and update private addresses. */
BLE_GAP_ADDR_CYCLE_MODE_AUTO      0x01
注意当用他设置成静态随机地址Static Device Address时,地址的最高2bits必须为“11”,否则无效
uint32_t sd_ble_gap_address_set(uint8_t addr_cycle_mode, ble_gap_addr_t const *p_addr);
 
下面是把默认地址+1后设置的函数
void mac_set(void)
  ble_gap_addr_t addr;  //获得地址 
  uint32_t  err_code = sd_ble_gap_address_get(&addr); 
  APP_ERROR_CHECK(err_code); 
  addr.addr[0] += 1; 
  //写地址 
  err_code = sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_NONE, &addr); 
  APP_ERROR_CHECK(err_code);
}
原文链接:https://blog.csdn.net/loosen17/article/details/98184652

最新文章

  1. Linux系统编程之IO_缓冲和非缓冲
  2. Docker Architecture、Docker Usage
  3. Unity3D脚印6——模型动画
  4. QTP 参数化
  5. IOS设计模式之三(适配器模式,观察者模式)
  6. JS模块化编程
  7. 转:Unity3D的四种坐标系
  8. CentOS使用sudo提示用户不在sudoers文件中的解决方法
  9. 使用libCurl实现断点下载
  10. 【集训笔记】二分图及其应用【HDOJ1068【HDOJ1150【HDOJ1151
  11. UVA 10404 Bachet&#39;s Game(dp + 博弈?)
  12. MySQL Replicationation进阶
  13. php curl详细解析和常见大坑
  14. vue环境搭建与创建第一个vuejs文件
  15. 沉默的螺旋--digest
  16. 精读《useEffect 完全指南》
  17. [Winform-WebBrowser]-在html页面中js调用winForm类方法
  18. jQuery属性--html([val|fn])、text([val|fn])和val([val|fn|arr])
  19. 莫烦tensorflow(2)-Session
  20. Android分组子级的不同视图布局之BUG奇遇记

热门文章

  1. WebGL半透明物体的绘制
  2. 原装win8系统电脑崩溃问题解决
  3. TiKV事务实现浅析
  4. Spring Maven工程引入css,js
  5. Spring + Atomikos 分布式事务实现方式
  6. 【转】git2.9.2使用总结
  7. canvas画箭头demo
  8. iframe里访问父级里的方法属性
  9. React native 放大点击区域 hitSlop属性的使用
  10. python之 -&gt; 的含义