打印
[CC2640]

CC2640之广播MAC地址

[复制链接]
377|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
磨砂|  楼主 | 2019-12-31 14:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
测试环境


协议栈版本: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地址。


使用特权

评论回复

相关帖子

沙发
磨砂|  楼主 | 2019-12-31 14:22 | 只看该作者
操作步骤


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



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


// GAP - SCAN RSP data (max size = 31 bytes)
static uint8_t scanRspData[] =
{
        // complete name
        0x07,   // length of this data
        GAP_ADTYPE_LOCAL_NAME_COMPLETE,
        0x53,   // 'S'
        0x69,   // 'i'
        0x6d,   // 'm'
        0x70,   // 'p'
        0x6c,   // 'l'
        0x65,   // 'e'

        // mac address
        0x07,
        GAP_ADTYPE_MANUFACTURER_SPECIFIC,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
       
        // connection interval range
        0x05,   // length of this data
        GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,
        LO_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL),   // 100ms
        HI_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL),
        LO_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL),   // 1s
        HI_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL),

        // Tx power level
        0x02,   // length of this data
        GAP_ADTYPE_POWER_LEVEL,
        0       // 0dBm
};


注意:因为扫描回应数据最大长度是31个字节,为了测试添加MAC地址,上面将设备名进行了修改。


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



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


使用特权

评论回复
板凳
磨砂|  楼主 | 2019-12-31 14:23 | 只看该作者

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





使用特权

评论回复
地板
磨砂|  楼主 | 2019-12-31 14:24 | 只看该作者
所以,我们获取MAC地址的接口可以按照下面代码中的方式实现:


static void readMac(uint8_t * mac_address)
{   
        uint32_t mac0 = HWREG(FCFG1_BASE + FCFG1_O_MAC_BLE_0);  
        uint32_t mac1 = HWREG(FCFG1_BASE + FCFG1_O_MAC_BLE_1);  

        *mac_address++ = HI_UINT16(mac1);
        *mac_address++ = LO_UINT16(mac1);
        *mac_address++ = BREAK_UINT32(mac0, 3);
        *mac_address++ = BREAK_UINT32(mac0, 2);
        *mac_address++ = BREAK_UINT32(mac0, 1);
        *mac_address++ = BREAK_UINT32(mac0, 0);
}

将上述接口放到“simpleBLEPeripheral.c”文件的最后即可,然后在该c文件的开头声明该方法:static void readMac(uint8_t * mac_address);


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

readMac(&scanRspData[10]);
GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData), scanRspData);

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


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







使用特权

评论回复
5
磨砂|  楼主 | 2019-12-31 14:24 | 只看该作者
测试结果

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




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




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


使用特权

评论回复
6
qcliu| | 2020-1-6 11:38 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
7
tfqi| | 2020-1-6 11:42 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
8
wiba| | 2020-1-6 11:47 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
9
zljiu| | 2020-1-6 11:51 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
10
coshi| | 2020-1-6 11:54 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

94

主题

4126

帖子

2

粉丝