测试环境
协议栈版本:BLE-STACK V2.1
IAR开发环境版本:IAR for Arm 7.40
示例测试Demo工程:simpleBLEPeripheral工程
需求介绍
默认情况下,同一款产品的多个设备的设备名是一样的,这样,用户如果同时拥有多个此款设备,那就不容易判断哪个是哪个了。所以,我们可以在原来定义的设备名后面加上MAC地址的后两个字节的数据,用于区分同款不同设备,后两个字节就可以表示 65536 个设备,如果你的产品数量超过这个,可以再多加上MAC地址的几个字节,原理和方法都一样,根据自己的情况来实际操作即可。
实现方法
之前有篇博文,我们介绍了如何在广播的扫描回应数据中添加MAC地址,请先看一下那篇博文,链接如下:
操作步骤:
1.在广播扫描回应数据数组的设备名AD部分,预留MAC地址后两个字节存放空间,代码如下:
// GAP - SCAN RSP data (max size = 31 bytes)
static uint8_t scanRspData[] =
{
// complete name
0x0C, // length of this data
GAP_ADTYPE_LOCAL_NAME_COMPLETE,
0x53, // 'S'
0x69, // 'i'
0x6d, // 'm'
0x70, // 'p'
0x6c, // 'l'
0x65, // 'e'
'-',
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
};
原来的设备名是“Simple”,设备名和MAC地址之间加上了一个“-”用于分隔,预留4个字节来显示MAC地址的后两个字节的字符。
2.添加一个获取MAC地址并将后两个字节的16进制数据转换成对应的字符(并且是大写)的接口,源码如下:
static void readMacAndConvert(uint8_t * data)
{
char mac_address[6];
char str[2];
uint32_t mac0 = HWREG(FCFG1_BASE + FCFG1_O_MAC_BLE_0);
uint32_t mac1 = HWREG(FCFG1_BASE + FCFG1_O_MAC_BLE_1);
mac_address[0] = HI_UINT16(mac1);
mac_address[1] = LO_UINT16(mac1);
mac_address[2] = BREAK_UINT32(mac0, 3);
mac_address[3] = BREAK_UINT32(mac0, 2);
mac_address[4] = BREAK_UINT32(mac0, 1);
mac_address[5] = BREAK_UINT32(mac0, 0);
sprintf(str,"%02x",mac_address[4]);
*data++ = toupper(str[0]);
*data++ = toupper(str[1]);
sprintf(str,"%02x",mac_address[5]);
*data++ = toupper(str[0]);
*data++ = toupper(str[1]);
}
将上述接口放到“simpleBLEPeripheral.c”文件的最后即可,为了编译通过,需要在该c文件的开头添加下列头文件引用:
#include <stdarg.h>
#include <stdio.h>
#include <ctype.h>
然后在该c文件的开头声明该方法:
static void readMacAndConvert(uint8_t * data);
3.在“simpleBLEPeripheral.c”文件的初始化接口“SimpleBLEPeripheral_init”中设置扫描回应数据之前添加如下代码:
readMacAndConvert(&scanRspData[9]);
GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData), scanRspData);
上面第一行代码是添加的,至于数组下标的确定,可以从前面的扫描回应数据数组中查到。
4.如上修改之后,重新编译,然后烧录到从设备中即可。
测试结果
用BLE调试工具搜索烧录上述软件的从设备,显示如下:
从上面的截图中可以看出,之前的设备名是“Simple”,修改之后的是“Simple-08A7”,修改成功。