蓝牙4.0广播数据添加MAC地址

时间:2021-06-09 13:38:47

这里涉及两个数据包:广播包、扫描回应包


广播包Advertisement Data指设备在空闲、可发现模式下不断的对外广播的数据

扫描回应包Scan Response Data是指当主机扫描到设备后,向设备请求扫描回应时,设备返回给主机的数据。


这两个数据包最大长度都是31Byte,都是相同的数据格式,由多个连续的AD Structure组成。

每个AD Structure的格式为

{

AD Length,

AD Type,

AD Data*length

}


只要数据长度不超过31Byte,广播包中可以连续包含多个AD Structure,如 

对外声明本地服务UUID

0x03,   // length of this data
GAP_ADTYPE_16BIT_MORE, //在广播中对外声明本地包含的16bit uuid
LO_UINT16( SMART_SERVICE_UUID),
HI_UINT16( SMART_SERVICE_UUID ),

对外声明制造商自定义广播数据

0X07,//长度
GAP_ADTYPE_MANUFACTURER_SPECIFIC,//制造商自定义广播数据
0,0,0,0,0,0//AD data


我们可以在制造商广播数据中,填写本机的MAC地址即可,这样主机在扫描时便能通过制造商数据域获取到本机的MAC地址。

最后,我们需要在设备启动时(GAPROLE_STARTED),将MAC地址读取出来,并更新广播包

(PS:如果在初始化时通过GAPRole_GetParameter()读取MAC地址将会是000000,正确的做法应该是在状态回调中的GAPROLE_STARTED状态下读取MAC地址并修改广播包)

uint8 MAC[B_ADDR_LEN] = {0};//MAC地址长度为6Byte
GAPRole_GetParameter( GAPROLE_BD_ADDR, MAC);//获取设备MAC地址</span>
//将MAC地址添加到广播包自定义数据区域for(int i=1;i<=B_ADDR_LEN;i++){advertData[sizeof(advertData)-i] = MAC[B_ADDR_LEN-i];}
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );