CC2640之广播设备名上添加MAC地址

测试环境


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

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

示例测试Demo工程:simpleBLEPeripheral工程




需求介绍

 

默认情况下,同一款产品的多个设备的设备名是一样的,这样,用户如果同时拥有多个此款设备,那就不容易判断哪个是哪个了。所以,我们可以在原来定义的设备名后面加上MAC地址的后两个字节的数据,用于区分同款不同设备,后两个字节就可以表示 65536 个设备,如果你的产品数量超过这个,可以再多加上MAC地址的几个字节,原理和方法都一样,根据自己的情况来实际操作即可。




实现方法


之前有篇博文,我们介绍了如何在广播的扫描回应数据中添加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,修改成功。


















以下是使用bleak库实现循环扫描指定MAC的BLE设备广播数据的Python代码: ```python import asyncio from bleak import discover, BleakScanner async def scan_for_device(mac_address): while True: devices = await discover() for d in devices: if d.address == mac_address: print(f"Device found: {d}") print(f"Advertising data: {d.metadata['manufacturer_data']}\n") async def main(mac_address): scanner = BleakScanner() scanner.register_detection_callback(lambda d: print(f"Scanned device: {d}")) scanner.start() await scan_for_device(mac_address) scanner.stop() if __name__ == "__main__": mac_address = "AA:BB:CC:DD:EE:FF" # 替换为要扫描的设备MAC地址 loop = asyncio.get_event_loop() loop.run_until_complete(main(mac_address)) ``` 在这个例子中,我们定义了一个为`scan_for_device`的协程函数,该函数使用`discover`方法扫描周围的BLE设备,并对每个设备进行检查以查看其MAC地址是否与指定的MAC地址匹配。 如果匹配,则打印设备信息和广播数据。 接下来,我们定义了一个为`main`的协程函数,该函数启动了一个`BleakScanner`实例,并使用`register_detection_callback`方法注册一个回调函数,以便在扫描到新设备时打印设备信息。 然后,我们调用了`scan_for_device`函数来循环扫描指定MAC设备,并最终停止扫描。 最后,我们定义了一个`mac_address`变量,用于指定要扫描的设备MAC地址,并使用`asyncio`库运行`main`协程函数。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值