似乎这个问题被“回答”了 here,但没有任何代码来表明他们做了不同的事情,我不得不问一个新问题.

我有自己的代码具有相同的行为,在OS X上使用Core Bluetooth的CBCentralManager扫描特定的CBUUID并没有发现一个iOS设备充当CBPeripheralManager的外围设备(除非它及其服务先前已被发现).为了查看我的代码是否有问题,我下载了Apple’s sample code.在两台iOS设备上运行示例代码按预期工作,但是当将CBCentralManager代码复制到OS X应用程序时,它无法找到iOS设备.

我已经为OS X应用程序上传了一个Xcode项目,它是hosted on WikiUpload,因为它似乎是最不狡猾的.如果人们愿意,还有a copy on my hosting.

这是OS X项目中的AppDelegate.m代码(CoreBluetooth框架在项目中链接):

#import <CoreBluetooth/CoreBluetooth.h>

@interface AppDelegate () <CBCentralManagerDelegate,CBPeripheralDelegate>

@property (strong,nonatomic) CBCentralManager      *centralManager;
@property (strong,nonatomic) CBPeripheral          *discoveredPeripheral;
@property (strong,nonatomic) NSMutableData         *data;

@property (weak) IBOutlet NSWindow *window;
@end

@implementation AppDelegate

@synthesize centralManager = _centralManager,discoveredPeripheral = _discoveredPeripheral,data = _data;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application
    // Start up the CBCentralManager
    _centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

    // And somewhere to store the incoming data
    _data = [[NSMutableData alloc] init];
}

- (void)applicationWillTerminate:(NSNotification *)aNotification {
    // Insert code here to tear down your application
}


#pragma mark - Central Methods



/** centralManagerDidUpdateState is a required protocol method.
 *  Usually,you'd check for other states to make sure the current device supports LE,is powered on,etc.
 *  In this instance,we're just using it to wait for CBCentralManagerStatePoweredOn,which indicates
 *  the Central is ready to be used.
 */
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    if (central.state != CBCentralManagerStatePoweredOn) {
        // In a real app,you'd deal with all the states correctly
        return;
    }

    // The state must be CBCentralManagerStatePoweredOn...

    // ... so start scanning
    [self scan];

}


/** Scan for peripherals - specifically for our service's 128bit CBUUID
 */
- (void)scan
{
    // This brings up nothing,unlike on iOS where it finds the device straight away

    [self.centralManager scanForperipheralsWithServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]]
                                                options:@{ CBCentralManagerScanoptionAllowDuplicatesKey : @YES }];

//    [self.centralManager scanForperipheralsWithServices:nil
//                                                options:@{ CBCentralManagerScanoptionAllowDuplicatesKey : @YES }];

    NSLog(@"Scanning started");
}


/** This callback comes whenever a peripheral that is advertising the TRANSFER_SERVICE_UUID is discovered.
 *  We check the RSSI,to make sure it's close enough that we're interested in it,and if it is,*  we start the connection process
 */
- (void)centralManager:(CBCentralManager *)central diddiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{

    NSLog(@"discovered %@ at %@",peripheral.name,RSSI);

    //Took out RSSI check

    if (self.discoveredPeripheral != peripheral) {

        // Save a local copy of the peripheral,so CoreBluetooth doesn't get rid of it
        self.discoveredPeripheral = peripheral;

        // And connect
        NSLog(@"Connecting to peripheral %@",peripheral);



        [self.centralManager connectPeripheral:peripheral options:nil];
    }
}


/** If the connection fails for whatever reason,we need to deal with it.
 */
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    NSLog(@"Failed to connect to %@. (%@)",peripheral,[error localizedDescription]);
    [self cleanup];
}


/** We've connected to the peripheral,Now we need to discover the services and characteristics to find the 'transfer' characteristic.
 */
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
    NSLog(@"Peripheral Connected");

    // Stop scanning
    [self.centralManager stopScan];
    NSLog(@"Scanning stopped");

    // Clear the data that we may already have
    [self.data setLength:0];

    // Make sure we get the discovery callbacks
    peripheral.delegate = self;

    // Search only for services that match our UUID
    [peripheral discoverServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]]];
}


/** The Transfer Service was discovered
 */
- (void)peripheral:(CBPeripheral *)peripheral diddiscoverServices:(NSError *)error
{
    if (error) {
        NSLog(@"Error discovering services: %@",[error localizedDescription]);
        [self cleanup];
        return;
    }

    // discover the characteristic we want...

    // Loop through the newly filled peripheral.services array,just in case there's more than one.
    for (CBService *service in peripheral.services) {
        [peripheral discovercharacteristics:@[[CBUUID UUIDWithString:TRANSFER_CHaraCTERISTIC_UUID]] forService:service];
    }
}


/** The Transfer characteristic was discovered.
 *  Once this has been found,we want to subscribe to it,which lets the peripheral kNow we want the data it contains
 */
- (void)peripheral:(CBPeripheral *)peripheral diddiscovercharacteristicsForService:(CBService *)service error:(NSError *)error
{
    // Deal with errors (if any)
    if (error) {
        NSLog(@"Error discovering characteristics: %@",[error localizedDescription]);
        [self cleanup];
        return;
    }

    // Again,we loop through the array,just in case.
    for (CBCharacteristic *characteristic in service.characteristics) {

        // And check if it's the right one
        if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:TRANSFER_CHaraCTERISTIC_UUID]]) {

            // If it is,subscribe to it
            [peripheral setNotifyValue:YES forCharacteristic:characteristic];
        }
    }

    // Once this is complete,we just need to wait for the data to come in.
}


/** This callback lets us kNow more data has arrived via notification on the characteristic
 */
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
    if (error) {
        NSLog(@"Error discovering characteristics: %@",[error localizedDescription]);
        return;
    }

    Nsstring *stringFromData = [[Nsstring alloc] initWithData:characteristic.value encoding:NSUTF8StringEncoding];

    // Have we got everything we need?
    if ([stringFromData isEqualToString:@"EOM"]) {

        // We have,so show the data,//[self.textview setText:[[Nsstring alloc] initWithData:self.data encoding:NSUTF8StringEncoding]];
        NSLog(@"Text: %@",[[Nsstring alloc] initWithData:self.data encoding:NSUTF8StringEncoding]);
        // Cancel our subscription to the characteristic
        [peripheral setNotifyValue:NO forCharacteristic:characteristic];

        // and disconnect from the peripehral
        [self.centralManager cancelPeripheralConnection:peripheral];
    }

    // Otherwise,just add the data on to what we already have
    [self.data appendData:characteristic.value];

    // Log it
    NSLog(@"Received: %@",stringFromData);
}


/** The peripheral letting us kNow whether our subscribe/unsubscribe happened or not
 */
- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
    if (error) {
        NSLog(@"Error changing notification state: %@",error.localizedDescription);
    }

    // Exit if it's not the transfer characteristic
    if (![characteristic.UUID isEqual:[CBUUID UUIDWithString:TRANSFER_CHaraCTERISTIC_UUID]]) {
        return;
    }

    // Notification has started
    if (characteristic.isnotifying) {
        NSLog(@"Notification began on %@",characteristic);
    }

    // Notification has stopped
    else {
        // so disconnect from the peripheral
        NSLog(@"Notification stopped on %@.  disconnecting",characteristic);
        [self.centralManager cancelPeripheralConnection:peripheral];
    }
}


/** Once the disconnection happens,we need to clean up our local copy of the peripheral
 */
- (void)centralManager:(CBCentralManager *)central diddisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    NSLog(@"Peripheral disconnected");
    self.discoveredPeripheral = nil;

    // We're disconnected,so start scanning again
    [self scan];
}


/** Call this when things either go wrong,or you're done with the connection.
 *  This cancels any subscriptions if there are any,or straight disconnects if not.
 *  (didUpdateNotificationStateForCharacteristic will cancel the connection if a subscription is involved)
 */
- (void)cleanup
{
    // Don't do anything if we're not connected
    if (!self.discoveredPeripheral.isConnected) {
        return;
    }

    // See if we are subscribed to a characteristic on the peripheral
    if (self.discoveredPeripheral.services != nil) {
        for (CBService *service in self.discoveredPeripheral.services) {
            if (service.characteristics != nil) {
                for (CBCharacteristic *characteristic in service.characteristics) {
                    if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:TRANSFER_CHaraCTERISTIC_UUID]]) {
                        if (characteristic.isnotifying) {
                            // It is notifying,so unsubscribe
                            [self.discoveredPeripheral setNotifyValue:NO forCharacteristic:characteristic];

                            // And we're done.
                            return;
                        }
                    }
                }
            }
        }
    }

    // If we've got this far,we're connected,but we're not subscribed,so we just disconnect
    [self.centralManager cancelPeripheralConnection:self.discoveredPeripheral];
}

在AppDelegate.h中有UUID定义:

#ifndef LE_Transfer_TransferService_h
#define LE_Transfer_TransferService_h

#define TRANSFER_SERVICE_UUID           @"E20A39F4-73F5-4BC4-A12F-17D1AD07A961"
#define TRANSFER_CHaraCTERISTIC_UUID    @"08590F7E-DB05-467E-8757-72F6FAEB13D4"

#endif

这有什么问题?根据上面的链接问题,服务必须是广告包的一部分,但据我所知,这正是iOS外设正在做的事情

[self.peripheralManager startAdvertising:@{ CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]] }];

解决方法

CoreBluetooth可能非常令人沮丧.这里有几件事要尝试:

#1:已连接的外围设备停止广告.如果您成功连接到外围设备,则需要重新开始广告.

#2:iOS缓存已发现状态和提供的服务.没有编程方式来刷新/清除缓存.尝试在iOS设备和Mac上禁用BT并重新启用它.然后尝试另一个连接.

#3:您的UUID存在问题.尝试扫描UUID参数设置为nil的外围设备.然后,您应该发现范围内的所有外围设备.

#4:如果Wifi打开,Mac上的BT连接可能很挑剔.尝试在Mac上禁用Wifi,然后重试.我发现BTLE在启用Wifi时完全无法使用,因此我在MacBook上执行任何BTLE开发时都必须使用以太网.

ios – 扫描特定CBUUID时,Core Bluetooth无法找到外围设备的更多相关文章

  1. ios – 订阅来自CBC特性的通知不起作用

    现在控制台输出到这里看起来像这样:嘿!它说updateNotification是假的.它来自哪里?为什么,这是我对setNotify的回调…我告诉它要通知!让我们在println的行中设置一个断点并检查错误对象:好的,所以这让我没有想法.我无法找到有关该错误代码的相关线索.自从我尝试为之前发现的特征设置通知以来,我无法理解描述本身,因此它必须存在,对吧?此外,在Android上似乎可以订阅通知,所以我想我可以排除设备的问题……有关这方面的任何线索都非常感谢!

  2. ios – 连接两个BLE外设的流程是什么样的?

    我在论坛上一直在阅读很多帖子,我看到了很多与我的案例相关的帖子.但是我仍然没有找到我想要的清晰度.我想连接两个CBperipherals并将数据写入它们.根据我的阅读,我认为在连接第二个设备之前,我必须断开当前的外围设备.好吧,假设我要将一个命令写入其中一个外设,然后我想将另一个命令写入另一个外设,我是否必须断开与当前外设的连接?如果我断开连接到另一个,前一个命令是否仍然有效?iOS上最好的做法是什么?

  3. ios – 为什么NSManagedObjectID会发生变化?

    我不确定这个问题的格式对这个网站是否有用.基本上,有没有人知道什么使得Apple确保在每次将数据保存到持久存储时NSManagedobjectID发生变化的设计决策?我最大的问题是为什么提供临时的managedobjectID.它有什么意义吗?解决方法我有点困惑为什么你一直说NSManagedobjectID特别是UUID.URI表示可能具有与UUID格式类似的外观,但我没有在文档中看到它表示“NSManagedobjectID是UUID”.为什么Apple以这种方式设计它超出了StackOverflow

  4. ios – 修复ARC中潜在的内存泄漏

    以下单例类帮助器方法可能会导致保留周期.在静态分析器中获取警告:“在线路上分配的对象的潜在泄漏……”我确实尝试过使用ivaruuid__weak但是当我分析时仍会出现警告.谢谢像这样在课堂上被召唤:解决方法这会删除警告吗?

  5. ios – 如何从核心蓝牙设备读取信息

    >如何阅读蓝牙设备的其他信息?

  6. ios – 在开发过程中应该如何使用identifierForVendor?

    解决方法在模拟器中构建和运行时,这个值将会改变.在真实的设备上,只有当用户从设备中删除所有应用并重新安装应用时,才会更改.如果您希望模拟器应用程序在开发期间使用一致的标识符,您可以定义该UUID,并将其用于模拟器构建:请注意,您需要用真实的UUID字符串替换SOME-STATIC-UUID-STRING.

  7. ios – 通过UUID编写CBC特征

    我试图用CoreBluetooth写一个特定的,已知的特征.我觉得这应该是可能的,因为我使用了一个德州仪器BLE实用程序,您可以在连接的外设上选择一个“写值”操作,只需输入特征UUID和您要编写的值,并且执行没有问题.据我了解,为了做到这一点,我必须打电话配置为具有正确的UUID的CBC特征对象.我已经尝试使用正确的UUID进行CBMutableCharacteristic,甚至正确的权限,我知道

  8. ios – 扫描特定CBUUID时,Core Bluetooth无法找到外围设备

    似乎这个问题被“回答”了here,但没有任何代码来表明他们做了不同的事情,我不得不问一个新问题.我有自己的代码具有相同的行为,在OSX上使用CoreBluetooth的CBCentralManager扫描特定的CBUUID并没有发现一个iOS设备充当CBPeripheralManager的外围设备(除非它及其服务先前已被发现).为了查看我的代码是否有问题,我下载了Apple’ssamplecode

  9. 如何在不使用登录系统的情况下识别唯一用户(iOS)

    我可以从设备获得的任何类型,而无需用户填写任何字段.解决方法您可以尝试使用存储在用户的iCloud中的键值存储中的一些唯一随机字符串.因此,当用户第一次启动您的应用时,您会发现他的iCloud没有存储任何值,因此您生成并存储它.当用户下次启动应用程序时,您将看到此值,并将采取相应措施.更重要的是,即使用户将重新安装您的应用程序或将重置设备,您仍然可以在他的iCloud中按值识别用户.

  10. ios – CoreBluetooth didWriteValueForCharacteristic返回旧值

    连接到蓝牙设备后,我正在尝试通过调用以下方法为特征写入值:正在调用正确的回调(外围设备:didWriteValueForCharacteristic:error:)但是当我从特征中查看数据时,似乎旧数据持久存在于characteristic.value中.但是,当我断开连接并重新连接到设备时,会显示新数据.这仅发生在iOS7上.当我将呼叫发送到外围设备时,有什么东西可能会丢失吗?解决方法你看到的行

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部