将一个 iOS 设备变成 iBeacon

Turning an iOS Device into an iBeacon

学习如何在iOS设备上播放 iBeacon 信号。

第1节 概述

任何支持使用蓝牙低功耗共享数据的 iOS 设备都可以转换成 iBeacon 。使用 iOS 设备作为 iBeacon 的应用程序必须在前台运行。因此,对于应用程序来说,无论如何都要在前台运行该功能。对于其他类型的 iBeacon 实现,请使用来自第三方制造商的专用信标硬件。
要将 iOS 设备用作 iBeacon,请执行以下操作:

  1. 为设备获取或生成一个128位的 UUID。
  2. 创建一个包含 UUID 值的 CLBeaconRegion 对象,以及适合信标的 major 和 minor 值。
  3. 使用 Core Bluetooth 框架来发送信标信息。

第2节 获取设备的 UUID

识别 iBeacon 的主要方式是来自其 UUID 。在部署一个或多个信标时,需要为每个信标分配一个 UUID,以将信标的用途传达给客户端。你定义的内容决定信标的用途。例如,百货商店可能为其所有已部署的信标使用相同的 UUID,或者每个商店可能会分配一个不同的 UUID。因为检测涉及使用区域监视来查找具有特定 UUID 的信标,所以使用更少的 UUID 更容易管理。

要为 iBeacon 部署创建一个新的 UUID ,请使用 uuidgen 命令行工具。打开终端,在命令行上输入 uuidgen,并按 Return。
该工具生成一个惟一的128位值,并将其格式化为一个ASCII字符串,该字符串被连字符分割断,如清单1所示。

清单1 从命令行生成一个UUID
$ uuidgen
39ED98FF-2900-441A-802F-9C398FC199D2 

第3节 配置 CLBeaconRegion 对象

使用 CLBeaconRegion 对象来配置信标的身份。可以使用信标区域生成一个信息字典,可以稍后通过蓝牙进行广播。清单2显示了如何创建一个信标区域对象并填充信息。

清单2 配置信标的身份
//Swift
func createBeaconRegion() -> CLBeaconRegion? {
    let proximityUUID = UUID(uuidString:
                "39ED98FF-2900-441A-802F-9C398FC199D2")
    let major : CLBeaconMajorValue = 100
    let minor : CLBeaconMinorValue = 1
    let beaconID = "com.example.myDeviceRegion"

    return CLBeaconRegion(proximityUUID: proximityUUID!, 
                major: major, minor: minor, identifier: beaconID)
}


//Objective-C
NSUUID *proximityUUID = [[NSUUID alloc] initWithUUIDString:@"39ED98FF-2900-441A-802F-9C398FC199D2"];
CLBeaconMajorValue  majorValue = 100;
CLBeaconMinorValue  minorValue = 10;
CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:majorValue minor:minorValue identifier:@"com.example.myDeviceRegion"];

UUID,major,minor 值是特定于 iBeacon 实施的。你决定这些值的含义,并决定检测信标的应用程序如何解读使用这些值。

第4节 通过蓝牙发送 iBeacon 广播

要从 iOS 设备上广播信标的身份,请使用 Core Bluetooth 框架将 iOS 设备配置为蓝牙外设。当配置为外设时,iOS 设备将使用蓝牙硬件向其他设备广播其信标信息。其他设备使用该信息来执行测距并检测其与 iOS 设备的距离。

将 Core Bluetooth 框架添加到 Xcode 工程中。在代码中,创建一个 CBPeripheralManager 对象并调用它 startAdvertising: 方法来开始广播信标数据。startAdvertising: 方法使用包含信标信息的字典作为参数。调用之前创建的 CLBeaconRegionperipheralDataWithMeasuredPower: 方法,以获取包含与信标相关联的数据的字典。

清单3 通过蓝牙广播设备
//Swift
func advertiseDevice(region : CLBeaconRegion) {
    let peripheral = CBPeripheralManager(delegate: self, queue: nil)
    let peripheralData = region.peripheralData(withMeasuredPower: nil)

    peripheral.startAdvertising(((peripheralData as NSDictionary) as! [String : Any]))
}

//Objective-C
NSDictionary *peripheraData = [beaconRegion peripheralDataWithMeasuredPower:nil];
CBPeripheralManager *peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
[peripheralManager startAdvertising:peripheraData];

调用 peripheralDataWithMeasuredPower: 方法获取数据字典时,通常会传递 nil 来指定与 iOS 设备关联的默认接收信号强度指示(RSSI)值。此参数表示从离设备一米远处测得的信号强度(以分贝为单位)。如果需要在某些环境中校准设备以获得更好的测距性能,则可以指定自定义值。

在创建外围管理器对象时,它会调用其委托对象的 peripheralManagerDidUpdateState: 方法。必须实施此代表方法,以确保在 iOS 设备上支持并使用 BLE 。

重要提示

在将应用作为一个 iBeacon 进行广播之后,应用必须继续在前台运行,以播放所需的蓝牙信号。如果用户退出应用,系统就会停止在蓝牙设备上做广播。

在测距期间,可能会有一段短暂的时间,Core Location 为同一个 iOS 设备创建两个 CLBeacon 对象。出现这种情况的原因是 iOS 定期更改设备的 Bluetooth 标识符以保护用户的隐私,一个信标代表旧标识符,一个信标代表新标识符。在标识符更改的2秒内,具有旧标识符的信标将其接近度属性设置为 CLProximityUnknown。在10秒钟之内,旧的标识符不再被报告。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开发一个iOS系统的蓝牙串口助手可以通过以下步骤实现: 1. 创建新的iOS项目:在Xcode中创建一个新的iOS项目。 2. 导入CoreBluetooth框架:在项目设置中导入CoreBluetooth框架,以便在代码中使用蓝牙相关的功能。 3. 设置蓝牙权限:在Info.plist文件中添加NSBluetoothAlwaysUsageDescription和NSBluetoothPeripheralUsageDescription键值对,并提供相应的描述信息,以获取蓝牙权限。 4. 初始化CBCentralManager:在应用程序的适当位置创建CBCentralManager对象,用于管理蓝牙设备的扫描和连接。 5. 实现CBCentralManagerDelegate:作为CBCentralManager的代理,实现相应的代理方法来处理蓝牙设备的扫描和连接状态变化。 6. 扫描蓝牙设备:使用CBCentralManager开始扫描周围的蓝牙设备,并在代理方法中获取扫描到的设备信息。 7. 连接蓝牙设备:选择要连接的蓝牙设备,使用CBCentralManager连接到目标设备,并在连接成功或失败时得到相应的回调。 8. 发送和接收数据:通过CBPeripheral对象与连接的蓝牙设备进行数据交互,可以发送数据到设备或从设备接收数据。 9. 处理数据:根据需要对接收到的数据进行解析和处理。可以将接收到的数据显示在界面上或执行其他操作。 10. 断开连接:当需要断开蓝牙设备连接时,使用CBCentralManager断开连接,并释放相关资源。 以上是一个简要的步骤,可以根据具体需求和功能进行进一步的开发和优化。需要注意的是,蓝牙通信涉及到一些技术细节和协议,需要对蓝牙相关知识有一定的了解和掌握。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值