主从设备交互模式:
扫描过程:
1、外设(peripheral)不断发送广播(advertData[]),处于广播状态。
2、中心设备接收到外设的广播后发送扫描请求(scan request)。
4、外设接收扫描请求后,发送扫描回应(scanRspData[])到主机。
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{...}
对于ios端通过这个函数来获取advertisementData外设广播信息,advertisementData中的内容包括:scanRspData[](扫描回应包)和advertData[](广播包)两部分的和。但是扫描回应包可能在扫描时有,但在一次连接过后就会没有了,广播包是始终存在。
对于收不到广播信息;
极大的原因是:你把外设设置成了iBeacon模式了,ibeacon会限制ios可接受的广播信息。
首先你去蓝牙外设部分的simpleBLEPeripheral.c中的:
了解BLE协议栈和广播包格式:http://www.ti.com.cn/cn/lit/an/swra475/swra475.pdf
static uint8 advertData[] =
{
// Flags; this sets the device to use limited discoverable
// mode (advertises for 30 seconds at a time) instead of general
// discoverable mode (advertises indefinitely)
0x02, // length of this data
GAP_ADTYPE_FLAGS,
DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
//GAP_ADTYPE_FLAGS_LIMITED | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
0x1A, // length of this data 26byte
GAP_ADTYPE_MANUFACTURER_SPECIFIC, //厂家自定义数据 (关键所在)
//苹果公司的标识0X004C
0x4C,
0x00,
0x02,//特指iBeacon
0x15,
/*Device UUID (16 Bytes)*/
0xE2, 0xC5, 0x6D, 0xB5, 0xDF, 0xFB, 0x48,0xD2, 0xB0, 0x60, 0xD0, 0xF5, 0xA7, 0x10, 0x96, 0xE0,
/*Major Value (2 Bytes)*/
0xA5, 0x5A,
/*Minor Value (2 Bytes)*/
0x5F,0xF5,0xC5,
/*Measured Power @ 1m distance */
0xC8,
0x03, // length of this data
GAP_ADTYPE_16BIT_MORE, //16位的service UUID
LO_UINT16( SIMPLEPROFILE_SERV_UUID ),
HI_UINT16( SIMPLEPROFILE_SERV_UUID ),
};
看一下你的外设的发送广播包里面的 GAP_ADTYPE_MANUFACTURER_SPECIFIC, //厂家自定义数据 (关键所在),看你自己的需要是否是要把外设设成只广播的iBeacon模式(iBeacon模式需要的是airlocation框架),如果你是想设置成可连接的主从机模式(即用corebluetooth框架),就不要在自定义数据段里面加以下字段:
//苹果公司的标识0X004C
0x4C,
0x00,
0x02,//特指iBeacon
0x15,
major minor也不用
里面的数据可以自己定义,然后自己解析就行啦!!
公司标识可以用其他的http://eportfolio.lib.ksu.edu.tw/~T093000170/blog?category=2724&node=000000217
对于ios ble外设还是要广播出来一个16位的serviceUUID,因为扫描的时候要用(如果不指定特定服务的UUID,没有办法进行后台持续扫描连接)
刚开始接触IOS BLE,有不对的地方欢迎指正,互相学习,共勉!!