对于ble ios作为中心设备收不到蓝牙外设广播信息的解决办法

主从设备交互模式:

扫描过程:

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,有不对的地方欢迎指正,互相学习,共勉!!

你可能感兴趣的:(ios,ble)