这里涉及两个数据包:广播包、扫描回应包
广播包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
最后,我们需要在设备启动时(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 );