zoukankan      html  css  js  c++  java
  • NORDIC BLE MAC ADDR

     
    一个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
  • 相关阅读:
    廖雪峰python 摘录1
    python web 测试CGI脚本
    AttributeError: 'Athlete' object has no attribute 'top3'
    python类定义小问题
    def函数安装调用的疑惑
    print_lol函数调用
    实现键盘输入信息,按enter键调用摄像头自动拍照
    EditText不能输入表情
    使用videoview播放资源文件夹下的视频
    使用videoview连续自动播放网络视屏
  • 原文地址:https://www.cnblogs.com/yeshenmeng/p/12010319.html
Copyright © 2011-2022 走看看