我想开发的应用程序,检测了很多信标设备,而不知道uuid。然而,我找不到办法做到这一点。我必须在代码中定义uuid。
我已经开发了一个POC,它可以与已知的设备一起工作。
我的视图控制器代码:
-(void)setUpview
{
// Regardless of whether the device is a transmitter or receiver, we need a beacon region.
NSUUID * uid = [[NSUUID alloc] initWithUUIDString:@"78CDC73D-D678-4B35-A88A-C2E09E5B963F"];//[UIDevice currentDevice].identifierForVendor;
treasureId = @"com.eden.treasure";
self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uid identifier:treasureId];
// Location manager.
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[self.locationManager requestAlwaysAuthorization];
}
[self.locationManager startMonitoringForRegion:self.beaconRegion];
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
[self locationManager:self.locationManager didStartMonitoringForRegion:self.beaconRegion];
[self.beaconRegion setNotifyEntryStateOnDisplay:YES];
[self.beaconRegion setNotifyOnEntry:YES];
[self.beaconRegion setNotifyOnExit:YES];
// self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
if ([UIDevice currentDevice].userInterfaceIdiom==UIUserInterfaceIdiomPad || [[[UIDevice currentDevice] model] isEqualToString:@"iPad Simulator"])
{
[self configureTransmitter];
}
else {
[self configureReceiver];
}
}
-(void)configureTransmitter
{
// The received signal strength indicator (RSSI) value (measured in decibels) for the device. This value represents the measured strength of the beacon from one meter away and is used during ranging. Specify nil to use the default value for the device.
NSNumber * power = [NSNumber numberWithInt:-63];
self.peripheralData = [self.beaconRegion peripheralDataWithMeasuredPower:power];
// Get the global dispatch queue.
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// Create a peripheral manager.
self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:queue];
}
-(void)configureReceiver {
// Location manager.
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
[self.locationManager requestAlwaysAuthorization];
[self.locationManager startMonitoringForRegion:self.beaconRegion];
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}
#pragma mark - CBPeripheralManagerDelegate methods
-(void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral
{
// The peripheral is now active, this means the bluetooth adapter is all good so we can start advertising.
if (peripheral.state == CBPeripheralManagerStatePoweredOn)
{
[self.peripheralManager startAdvertising:self.peripheralData];
}
else if (peripheral.state == CBPeripheralManagerStatePoweredOff)
{
NSLog(@"Powered Off");
[self.peripheralManager stopAdvertising];
}
}
-(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
if(state == CLRegionStateInside)
{
NSLog(@"%@",[NSString stringWithFormat:@"You are inside region %@", region.identifier]);
}
else if(state == CLRegionStateOutside)
{
NSLog(@"%@",[NSString stringWithFormat:@"You are outside region %@", region.identifier]);
}
else
{
return;
}
}
-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
{
if ([beacons count] == 0)
return;
NSString * message;
UIColor * bgColor;
CLBeacon * beacon = [beacons firstObject];
switch (beacon.proximity) {
case CLProximityUnknown:
message = [NSString stringWithFormat:@"ProximityUnknown -- %ld", (long)beacon.proximity];
bgColor = [UIColor blueColor];
break;
case CLProximityFar:
message = [NSString stringWithFormat:@"ProximityFar -- %ld", (long)beacon.proximity];
bgColor = [UIColor colorWithRed:.0f green:.0f blue:230.0f alpha:1.0f];
break;
case CLProximityNear:
message = [NSString stringWithFormat:@"ProximityNear -- %ld", (long)beacon.proximity];
bgColor = [UIColor orangeColor];
break;
case CLProximityImmediate:
default:
message = [NSString stringWithFormat:@"ProximityImmediate -- %ld", (long)beacon.proximity];
bgColor = [UIColor redColor];
break;
}
if (beacon.proximity != self.previousProximity)
{
[lblStatus setText:message];
[self.view setBackgroundColor:bgColor];
self.previousProximity = beacon.proximity;
}
}
那么,有没有办法在不知道uuid的情况下检测iBeacon呢?
注意:使用与检查这个链接广播信号相同功能的示例应用程序(虚拟信标)。
任何帮助都将不胜感激。
发布于 2016-05-11 14:16:52
iOS中没有公共API来检测信标,而不首先知道信标的ProximityUUID。这是设计出来的--苹果只想让你看到你自己的信标,这意味着你知道ProximityUUID。
也就是说,操作系统当然知道如何查看任何信标,而且可能有您可以使用的私有API来执行这个。请理解,您不能使用私有API为approve开发应用程序,因为Apple不会批准使用这些代码。您可以使用私有APIs来创建一个实用程序来使用您自己的iOS设备,但是私有APIs可能停止使用任何iOS升级。
有了这些说明,使用CoreLocation
可能可以定义通配符CLBeaconRegion
,可以使用私有API查找任何信标。看这里是一种方法。
发布于 2017-03-20 14:34:35
您需要使用CoreBluetooth
库来扫描设备。一旦您从已发现的设备列表中找到您的iBeacon,您将查询iBeacon的服务和特性以找到UUID。我就是这样做的:
import CoreBluetooth
import CoreLocation
extension Data {
public var hexString: String {
var str = ""
enumerateBytes { (buffer, index, stop) in
for byte in buffer {
str.append(String(format: "%02X", byte))
}
}
return str
}
}
class viewController: UIViewController, CLLocationManagerDelegate, CBCentralManagerDelegate, CGPeripheralDelegate {
var locationManager: CLLocationManager = CLLocationManager()
var myBeaconRegion: CLBeaconRegion!
var centralManager: CBCentralManager!
var discoveredPeripheral: CBPeripheral?
override viewDidLoad() {
centralManager = CBCentralManager(delegate: self, queue: nil)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state != .poweredOn {
return
}
centralManager.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicateKeys: true])
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber) {
if (RSSI.intValue > -15 || RSSI.intValue < -35) {
return // With those RSSI values, probably not an iBeacon.
}
if peripheral != discoveredPeripheral {
discoveredPeripheral = peripheral // Need to retain a reference to connect to the beacon.
centralManager.connect(peripheral, options: nil)
central.stopScan() // No need to scan anymore, we found it.
}
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
peripheral.discoverServices(nil)
}
func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
discoveredPeripheral = nil
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
guard error == nil else {
return
}
if let services = peripheral.services {
for service in services {
peripheral.discoverCharacteristics(nil, for: service)
}
}
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
guard error == nil else {
return
}
if let characteristics = service.characteristics {
for characteristic in characteristics {
if characteristic.uuid.uuidString == "2B24" { // UUID
peripheral.readValue(for: characteristic)
}
}
}
}
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
guard error == nil else {
return;
}
if value = characteristic.value {
// value will be a Data object with bits that represent the UUID you're looking for.
print("Found beacon UUID: \(value.hexString)")
// This is where you can start the CLBeaconRegion and start monitoring it, or just get the value you need.
}
}
发布于 2018-02-08 13:07:27
我也在寻找同样的答案&我在这个例子在这里输入链接描述上得到了答案
这是搜索所有没有UUID的iBeacons
https://stackoverflow.com/questions/37164085
复制相似问题