CC2640之广播MAC地址

转自:http://blog.csdn.net/zzfenglin/article/details/56064808


测试环境


协议栈版本:BLE-STACK V2.1

IAR开发环境版本:IAR for Arm 7.40

示例测试Demo工程:simpleBLEPeripheral工程




介绍


MAC地址是芯片的唯一标识,在芯片出厂的时候,厂商烧录到芯片内的6个字节的16进制数字。


CC2640作为从设备的开发过程中,有时候上位机需要在搜索的时候就知道CC2640从设备的MAC地址。对于安卓设备的上位机,可以通过调用官方API来获取扫描到的设备的MAC地址。而对于苹果设备的上位机,因为官方并未提供相关接口,所以无法获取到MAC地址。因此,我们需要在CC2640从设备的广播数据中加入MAC地址,便于上位机搜索的时候便可以获取到CC2640从设备的MAC地址。




操作步骤 


我们以simpleBLEPeripheral工程为例,来看一下如何在广播数据中添加MAC地址数据。

 

1.在CC2640从设备的扫描回应数据数组中预留MAC地址的存放空间,修改显示如下:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // GAP - SCAN RSP data (max size = 31 bytes)  
  2. static uint8_t scanRspData[] =  
  3. {  
  4.     // complete name  
  5.     0x07,   // length of this data  
  6.     GAP_ADTYPE_LOCAL_NAME_COMPLETE,  
  7.     0x53,   // 'S'  
  8.     0x69,   // 'i'  
  9.     0x6d,   // 'm'  
  10.     0x70,   // 'p'  
  11.     0x6c,   // 'l'  
  12.     0x65,   // 'e'  
  13.   
  14.     // mac address  
  15.     0x07,  
  16.     GAP_ADTYPE_MANUFACTURER_SPECIFIC,  
  17.     0x00,  
  18.     0x00,  
  19.     0x00,  
  20.     0x00,  
  21.     0x00,  
  22.     0x00,  
  23.       
  24.     // connection interval range  
  25.     0x05,   // length of this data  
  26.     GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,  
  27.     LO_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL),   // 100ms  
  28.     HI_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL),  
  29.     LO_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL),   // 1s  
  30.     HI_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL),  
  31.   
  32.     // Tx power level  
  33.     0x02,   // length of this data  
  34.     GAP_ADTYPE_POWER_LEVEL,  
  35.     0       // 0dBm  
  36. };  
注意:因为扫描回应数据最大长度是31个字节,为了测试添加MAC地址,上面将设备名进行了修改。

 

说明:可能有的人会问,添加到扫描回应数据中的AD类型为什么选择GAP_ADTYPE_MANUFACTURER_SPECIFIC,在Gap定义的类型中明明有GAP_ADTYPE_LE_BD_ADDR类型来表示蓝牙设备地址。

 

原因:在实际的测试中发现,用GAP_ADTYPE_LE_BD_ADDR的话,苹果设备的上位机搜到的广播数据中并不显示MAC地址,怀疑是不认这个类型。最后,只能用GAP_ADTYPE_MANUFACTURER_SPECIFIC类型。

 

2.由于设置广播数据的操作发生在初始化的过程中,所以,我们只能从寄存器中来读取MAC地址,查看手册发现寄存器中MAC地址的存放地址如下:





所以,我们获取MAC地址的接口可以按照下面代码中的方式实现:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. static void readMac(uint8_t * mac_address)  
  2. {      
  3.     uint32_t mac0 = HWREG(FCFG1_BASE + FCFG1_O_MAC_BLE_0);    
  4.     uint32_t mac1 = HWREG(FCFG1_BASE + FCFG1_O_MAC_BLE_1);    
  5.   
  6.     *mac_address++ = HI_UINT16(mac1);  
  7.     *mac_address++ = LO_UINT16(mac1);  
  8.     *mac_address++ = BREAK_UINT32(mac0, 3);  
  9.     *mac_address++ = BREAK_UINT32(mac0, 2);  
  10.     *mac_address++ = BREAK_UINT32(mac0, 1);  
  11.     *mac_address++ = BREAK_UINT32(mac0, 0);  
  12. }  

将上述接口放到simpleBLEPeripheral.c文件的最后即可,然后在该c文件的开头声明该方法:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. static void readMac(uint8_t * mac_address);  

3.在simpleBLEPeripheral.c文件的初始化接口SimpleBLEPeripheral_init中设置扫描回应数据之前添加如下代码:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. readMac(&scanRspData[10]);  
  2. GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData), scanRspData);  

上面第一行代码是添加的,至于数组下标的确定,可以从前面的扫描回应数据数组中查到。


4.如上修改之后,重新编译,然后烧录到从设备中即可。




测试结果


1.苹果设备的上位机,搜索烧录上述软件的从设备时,会获取到如下广播数据:



2.安卓app获取的广播数据如下:



这样,上位机就可以在广播的扫描回应数据中获取到设备端的MAC地址。

 

 

 

关于BLE广播的有关内容,可以参看下面的博文:

点击此处打开链接
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值