Core Bluetooth

swift 开发蓝牙项目 使用corebluetooth框架 在使用 peripheral.readValue(for: characteristic) 时,你需要从已连接的外设的服务中选择一个特征,并将其作为参数传递给这个方法。通常,你可以在外设的代理方法中获取特征,或者在外设连接之后,通过外设的服务(CBService)来获取特征。服务可以包含一个或多个特征。执行读取或写入操作,如使用 readValue(for: characteristic) 来读取特征的值,或使用 writeValue(_:for: characteristic) 来写入数据到特征。 阅读详情

去App Store搜索并下载“LightBlue”这个App,对调试你的app和理解Core Bluetooth会很有帮助。

================================

Demo下载地址:http://download.youkuaiyun.com/detail/jimoduwu/7146875

================================

Core Bluetooth for iOS 6

CoreBluetooth的API是基于BLE4.0的标准的。这个框架涵盖了BLE标准的所有细节。仅仅只有新的iOS设备和Mac是和BLE标准兼容的:iPhone4S,iPhone5,MacMini,New iPad,MacBook Air,MacBook Pro。还有iPhone iOS6的模拟器也支持。这是非常有用的,在你没有一个真正的iOS设备而用模拟器去调试你的程序。

相关的类

在CoreBluetooth框架中,有两个主要的角色:周边和中央(Peripheral and Central) ,整个框架都是围绕这两个主要角色设计的,他俩之间有一系列的回调交换数据。下图1展示了周边和中央(Peripheral and Central),还有他俩之间的关系。


周边(Peripheral)是生成或者保存了数据的设备,中央(Central)是使用这些数据的设备。所有可用的iOS设备可以作为周边(Peripheral)也可以作为中央(Central),但不可以同时既是周边也是中央。

周边和中央这两个角色在CoreBluetooth框架中是用两个类来表示的,CBPeripheralManager这个类代表周边,CBCentralManager 这个类代表中央。

在中央这边,一个CBPeripheral 对象代表着相应的和中央连接着的周边;同样的,在周边这边,一个CBCentral 对象代表着相应的和周边连接着的中央。

你可以认为周边是一个广播数据的设备,他广播到外部世界说他这儿有数据,并且也说明了能提供的服务。另一边,中央开始扫描附近有没有服务,如果中央发现了想要的服务,然后中央就会请求连接周边,一旦连接建立成功,两个设备之间就开始交换传输数据了。

除了中央和周边,我们还要考虑他俩交换的数据结构。这些数据在服务中被结构化,每个服务由不同的特征(Characteristics)组成,特征是包含一个单一逻辑值的属性类型。如果你去http://developer.bluetooth.org链接,你可以找到标准服务和特征的列表。

在中央这边,CBService 类代表服务,CBCharacteristic 类代表特征。在周边这边,CBMutableService 类代表服务,CBMutableCharacteristic 类代表特征。下图2展示了到目前为止我们所讲的所有类。


CBUUID 和CBATTRequest 是两个苹果公司给我们提供的帮助类,以便于开发者更简单地操作数据,稍后你将看到怎么使用这两个类。

用法

很不幸,苹果公司的CoreBluetooth文档目前不是很完整,一些复杂的类确实没有文档说明。你只能通过去看WWCD视频去理解这个框架是怎么工作的。因为在前一段时间我已经做过了这些,所以决定分享给大家。在NeuroSky,我们已经用CoreBluetooth框架开发了一些App。我很希望在这个教程可以帮到你。如果你想学到更多关于CoreBluetooth的知识,你可以出席我们的培训课,在这儿查看下一堂课: http://training.invasivecode.com

创建一个周边:

让我们开始创建一个完整的例子,你需要两个iOS设备。我将告诉你怎么连接2个iOS设备,通过蓝牙交换数据,记住检查你的iOS设备是不是在上边列出的支持BLE的列表中。

开始创建一个周边,跟着以下步骤(计划):

1.创建并且开始Peripheral Manager

2.设置并且发布这个周边的所提供的服务。

3.广播这个服务。

4.和中央相互作用。

用Single-View Application模板创建一个新的Xcode工程。命名为BlueServer (使用ARC)。工程创建完成后,添加CoreBluetooth.framework 框架。然后打开ViewController.h文件,并且添加以下代码:

#import <CoreBluetooth/CoreBluetooth.h>

使view controller继承CBPeripheralManagerDelegate 协议,然后添加这个属性:

@property (nonatomic, strong) CBPeripheralManager *manager;

在ViewController.m中,添加以下代码到viewDidLoad方法中:

self.manager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];

这行代码创建了一个Peripheral Manager(计划中的第一项)。第一个参数是设置代理,这儿就是view controller,第二个参数设置为nil,因为Peripheral Manager将Run在主线程中。如果你想用不同的线程做更加复杂的事情,你需要创建一个队列(queue)并将它放在这儿。

一旦Peripheral Manager被创建,我们应该及时地检查它的状态,看正在运行App的这个设备是不是支持BLE标准。所以要实现以下这个代理方法,在这儿你可以做更复杂的一些事情和友好地提醒用户,如果设备不支持BLE。

- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral {

    switch (peripheral.state) {

        case CBPeripheralManagerStatePoweredOn:

            [self setupService];

            break;

        default:

            NSLog(@"Peripheral Manager did change state");

            break;

    }

}

这儿,我检查了周边的状态,如果他的状态是CBPeripheralManagerStatePoweredOn,这个设备是支持BLE并且可用的。

服务和特征(Service and Characteristic)

setupService 方法是一个帮助方法,我即将创建它,让它去准备服务和特征,对于这个例子,我们仅仅需要只有一个特征的一个服务。

每一个服务和特征都需要用一个UUID(unique identifier)去标识,UUID是一个16bit或者128bit的值。如果你要创建你的中央-周边App,你需要创建你自己的128bit的UUID。你必须要确定你自己的UUID不能和其他已经存在的服务冲突。如果你正要创建一个自己的设备,需要实现标准委员会需求的UUID;如果你只是创建一个中央-周边App(就像我们现在做的这样),我建议你打开Mac OS X的Terminal.app,用uuidgen命令生成一个128bit的UUID。你应该用该命令两次,生成两个UUID,一个是给服务用的,一个是给特征用的。然后,你需要添加他们到中央和周边App中。现在,在view controller的实现之前,我们添加以下的代码:

static NSString * const kServiceUUID = @"312700E2-E798-4D5C-8DCF-49908332DF9F";

static NSString * const kCharacteristicUUID = @"FFA28CDE-6525-4489-801C-1C060CAC9767";

注意:你自己用uuidgen生成的UUID和我的是不一样的。

现在,以下是setupService 方法的实现:

- (void)setupService {

    // Creates the characteristic UUID

    CBUUID *characteristicUUID = [CBUUID UUIDWithString:kCharacteristicUUID];

    // Creates the characteristic

    self.customCharacteristic = [[CBMutableCharacteristic alloc] initWithType:

characteristicUUID properties:CBCharacteristicPropertyNotify 

value:nil permissions:CBAttributePermissionsReadable];

    // Creates the service UUID

    CBUUID *serviceUUID = [CBUUID UUIDWithString:kServiceUUID];

    // Creates the service and adds the characteristic to it

    self.customService = [[CBMutableService alloc] initWithType:serviceUUID

 primary:YES];

    // Sets the characteristics for this service

    [self.customService setCharacteristics:

@[self.customCharacteristic]];

    // Publishes the service

    [self.peripheralManager addService:self.customService];

} 

首先,我用+UUIDWithString:方法给特征创建了一个UUID对象,然后我用这个UUID对象创建了一个特征。注意:我给初始化特征方法的第三个参数赋值nil,这是,我告诉CoreBluetooth,我将稍后添加一个特征的值。当你想要创建一个动态的数据,一般都这么做。如果你已经有了一直静态的值要,你可以将它赋值在这儿。

在初始化特征的方法中,第一个参数是刚刚创建的UUID,第二个参数决定这个特征怎么使用。一下是所有可能的值:

 ■CBCharacteristicPropertyBroadcast: permits broadcasts of 

the characteristic value using a characteristic configuration

 descriptor. Not allowed for local characteristics.

 

 ■CBCharacteristicPropertyRead: permits reads of the 

characteristic value.

 ■CBCharacteristicPropertyWriteWithoutResponse:

 permits writes of the characteristic value, 

without a response.

 ■CBCharacteristicPropertyWrite: permits writes of

 the characteristic value.

 ■CBCharacteristicPropertyNotify: permits notifications 

of the characteristic value, without a response.

 ■CBCharacteristicPropertyIndicate: permits indications

 of the characteristic value.

 ■CBCharacteristicPropertyAuthenticatedSignedWrites: 

permits signed writes of the characteristic value

 ■CBCharacteristicPropertyExtendedProperties: if set, 

additional characteristic properties are defined in 

the characteristic extended properties descriptor. 

Not allowed for local characteristics.

 ■CBCharacteristicPropertyNotifyEncryptionRequired  : 

if set, only trusted devices can enable notifications

 of the characteristic value.

 ■CBCharacteristicPropertyIndicateEncryptionRequired:

 if set, only trusted devices can enable indications 

of the characteristic value.

 

最后一个参数是属性的读、写、加密的权限,可能的值是以下的:

 ■CBAttributePermissionsReadable

 ■CBAttributePermissionsWriteable

 ■CBAttributePermissionsReadEncryptionRequired

 ■CBAttributePermissionsWriteEncryptionRequired

 

在创建了一个特征以后,又用了一次+UUIDWithString:方法,创建了一个服务。最后,我将特征添加到了服务上。记住,每一个服务可以包含多个特征。参见下图3.


因此,我们需要创建一个特征的数组并且把这个数组传给服务。在这个例子中,数组仅仅包含一个特征。

代码的最后一行把服务添加到周边管理者(Peripheral Manager)是用于发布服务。一旦完成这个,周边管理者会通知他的代理方法-peripheralManager:didAddService:error:。现在,如果没有Error,你可以开始广播服务了:

- (void)peripheralManager:(CBPeripheralManager *)peripheral

 didAddService:(CBService *)service error:(NSError *)error {

    if (error == nil) {

        // Starts advertising the service

        [self.peripheralManager startAdvertising:

@{ CBAdvertisementDataLocalNameKey : 

@"ICServer", CBAdvertisementDataServiceUUIDsKey :

 @[[CBUUID UUIDWithString:kServiceUUID]] }];

    }

}

当周边管理者开始广播服务,他的代理接收-peripheralManagerDidStartAdvertising:error: 消息,并且当中央预定了这个服务,他的代理接收 -peripheralManager:central:didSubscribeToCharacteristic:消息,这儿是你给中央生成动态数据的地方。

现在,要发送数据到中央,你需要准备一些数据,然后发送updateValue:forCharacteristic:onSubscribedCentrals: 到周边。


创建一个中央

现在,我们已经有了一个周边,让我们创建我们的中央。中央就是那个处理周边发送来的数据的设备。在下图1中,CBCentralManager对象代表中央。

创建一个新的Xcode工程,命名为BlueClient,记得使用ARC。添加CoreBluetooth.framework框架到你的工程,并且导入头文件到view controller,以下代码:

#import <CoreBluetooth/CoreBluetooth.h>

在中央这边,你的类必须要继承这两个协议:CBCentralManagerDelegate和CBPeripheralDelegate,以下代码:

@interface ViewController : UIViewController <CBCentralManagerDelegate,

 CBPeripheralDelegate>

并且添加以下两个属性:

@property (nonatomic, strong) CBCentralManager *manager;

@property (nonatomic, strong) NSMutableData *data;

现在,我要创建一个中央对象了:

self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

和创建周边时一样,第一个参数代表CBCentralManager 代理,在这个例子中就是这个view controller;第二个参数设置为nil,因为Peripheral Manager将Run在主线程中。如果你想用不同的线程做更加复杂的事情,你需要创建一个队列(queue)并将它放在这儿。

当Central Manager被初始化,我们要检查它的状态,以检查运行这个App的设备是不是支持BLE。实现以下的代理方法:

- (void)centralManagerDidUpdateState:

(CBCentralManager *)central {

    switch (central.state) {

        case CBCentralManagerStatePoweredOn:

            // Scans for any peripheral

            [self.manager scanForPeripheralsWithServices:

@[ [CBUUID UUIDWithString:kServiceUUID] ]

 options:@{CBCentralManagerScanOptionAllowDuplicatesKey :

 @YES }];

            break;

        default:

            NSLog(@"Central Manager did change state");

            break;

    }

}

-scanForPeripheralsWithServices:options: 方法是用于告诉Central Manager,要开始寻找一个指定的服务了。如果你将第一个参数设置为nil,Central Manager就会开始寻找所有的服务。

kServiceUUID 和创建周边的那个工程中用的是一样的UUID。所以,再添加一次以下两行代码:

static NSString * const kServiceUUID = @"312700E2-E798-4D5C-8DCF-49908332DF9F";

static NSString * const kCharacteristicUUID = @"FFA28CDE-6525-4489-801C-1C060CAC9767";

记住UUID是你自己用uuidgen命令生成的。

一旦一个周边在寻找的时候被发现,中央的代理会收到以下回调:

- (void)centralManager:(CBCentralManager *)

central didDiscoverPeripheral:(CBPeripheral *)peripheral

 advertisementData:(NSDictionary *)advertisementData

 RSSI:(NSNumber *)RSSI   

这个调用通知Central Manager代理(在这个例子中就是view controller),一个附带着广播数据和信号质量(RSSI-Received Signal Strength Indicator)的周边被发现。这是一个很酷的参数,知道了信号质量,你可以用它去判断远近。

任何广播、扫描的响应数据保存在advertisementData 中,可以通过CBAdvertisementData 来访问它。现在,你可以停止扫描,而去连接周边了:

- (void)centralManager:(CBCentralManager *)central

 didDiscoverPeripheral:(CBPeripheral *)peripheral

 advertisementData:(NSDictionary *)advertisementData

 RSSI:(NSNumber *)RSSI {

    // Stops scanning for peripheral

    [self.manager stopScan];

    if (self.peripheral != peripheral) {

        self.peripheral = peripheral;

        NSLog(@"Connecting to peripheral %@", peripheral);

        // Connects to the discovered peripheral

        [self.manager connectPeripheral:peripheral options:nil];

    }

}

options 参数是一个可选的NSDictionary,如果需要,可以用以下的键(Key),它们的值始终是一个boolean。

 ■CBConnectPeripheralOptionNotifyOnConnectionKey. 

This is a NSNumber (Boolean) indicating that the 

system should display an alert for a given peripheral,

 if the application is suspended when a successful 

connection is made. This is useful for applications

 that have not specified the Central background mode 

and cannot display their own alert. If more than one 

application has requested notification for a given 

peripheral, the one that was most recently in the 

foreground will receive the alert.

 ■CBConnectPeripheralOptionNotifyOnDisconnectionKey. 

This is a NSNumber (Boolean) indicating that the 

system should display a disconnection alert for a 

given peripheral, if the application is suspended 

at the time of the disconnection. This is useful for

applications that have not specified the Central 

background mode and cannot display their own 

alert. If more than one application has requested

 notification for a given peripheral, the one that was

 most recently in the foreground will receive the alert.

 ■CBConnectPeripheralOptionNotifyOnNotificationKey. 

This is a NSNumber (Boolean) indicating that the 

system should display an alert for all notifications 

received from a given peripheral, if the application

is suspended at the time. This is useful for 

applications that have not specified the Central 

background mode and cannot display their own

alert. If more than one application has requested

notification for a given peripheral, the one that 

was most recently in the foreground will receive the alert.

 

基于连接的结果,代理(这个例子中是view controller)会接收centralManager:didFailToConnectPeripheral:error:或者centralManager:didConnectPeripheral:。如果成功了,你可以问广播服务的那个周边。因此,在didConnectPeripheral 回调中,你可以写以下代码:

- (void)centralManager:(CBCentralManager *)central 

didConnectPeripheral:(CBPeripheral *)peripheral {

    // Clears the data that we may already have

    [self.data setLength:0];

    // Sets the peripheral delegate

    [self.peripheral setDelegate:self];

    // Asks the peripheral to discover the service

    [self.peripheral discoverServices:

@[ [CBUUID UUIDWithString:kServiceUUID] ]];

}

现在,周边开始用一个回调通知它的代理。在上一个方法中,我请求周边去寻找服务,周边代理接收-peripheral:didDiscoverServices:。如果没有Error,可以请求周边去寻找它的服务所列出的特征,像以下这么做:

- (void)peripheral:(CBPeripheral *)aPeripheral

 didDiscoverServices:(NSError *)error {

    if (error) {

        NSLog(@"Error discovering service:

 %@", [error localizedDescription]);

        [self cleanup];

        return;

    }

    for (CBService *service in aPeripheral.services) {

        NSLog(@"Service found with UUID: %@",

 service.UUID);

        // Discovers the characteristics for a given service

        if ([service.UUID isEqual:[CBUUID 

UUIDWithString:kServiceUUID]]) {

            [self.peripheral discoverCharacteristics:

@[[CBUUID UUIDWithString:

kCharacteristicUUID]] forService:service];

        }

    }

}   

现在,如果一个特征被发现,周边代理会接收-peripheral:didDiscoverCharacteristicsForService:error:。现在,一旦特征的值被更新,用-setNotifyValue:forCharacteristic:,周边被请求通知它的代理。

- (void)peripheral:(CBPeripheral *)peripheral 

didDiscoverCharacteristicsForService:

(CBService *)service error:(NSError *)error {

    if (error) {

        NSLog(@"Error discovering characteristic:

 %@", [error localizedDescription]);

        [self cleanup];

        return;

    }

    if ([service.UUID isEqual:[CBUUID UUIDWithString:

kServiceUUID]]) {

        for (CBCharacteristic *characteristic in 

service.characteristics) {

            if ([characteristic.UUID isEqual:[CBUUID 

UUIDWithString:kCharacteristicUUID]]) {

                [peripheral setNotifyValue:YES 

forCharacteristic:characteristic];

            }

        }

    }

}

这儿,如果一个特征的值被更新,然后周边代理接收-peripheral:didUpdateNotificationStateForCharacteristic:error:。你可以用-readValueForCharacteristic:读取新的值:

- (void)peripheral:(CBPeripheral *)peripheral 

didUpdateNotificationStateForCharacteristic:

(CBCharacteristic *)characteristic error:(NSError *)error {

    if (error) {

        NSLog(@"Error changing notification state:

 %@", error.localizedDescription);

    }

    // Exits if it's not the transfer characteristic

    if (![characteristic.UUID isEqual:[CBUUID 

UUIDWithString:kCharacteristicUUID]]) {

        return;

    }

    // Notification has started

    if (characteristic.isNotifying) {

        NSLog(@"Notification began on %@", characteristic);

        [peripheral readValueForCharacteristic:characteristic];

    } else { // Notification has stopped

        // so disconnect from the peripheral

        NSLog(@"Notification stopped on %@.

  Disconnecting", characteristic);

        [self.manager cancelPeripheralConnection:self.peripheral];

    }

}

当周边发送新的值,周边代理接收-peripheral:didUpdateValueForCharacteristic:error:。这个方法的第二个参数包含特征。你可以用value属性读取他的值。这是一个包含特征的值的NSData。

 结语:

I showed you a basic example on how to use the 

Core Bluetooth framework. I hope that this 

small tutorial, the WWDC videos and the 

documentation (the available one) can help 

you create new iOS applications using the 

Bluetooth LE. Check also the examples 

coming with the documentation. There, 

you will find all the delegate methods

 I used in this tutorial.

顶
3
Bluetooth Core specification 4.2 主要更新 Bluetooth 4.2 makes Bluetooth Smart even smarter, faster and the ideal wireless technology for the Internet of Things(IoT). 阅读详情

相关推荐

iOS蓝牙开发进阶:从Core Bluetooth到AccessorySetupKit的实战解析

本文深入解析iOS蓝牙开发从Core Bluetooth到AccessorySetupKit的进阶实战技巧。涵盖双模设备连接优化、大流量传输方案对比、权限管理演进等核心内容,特别针对iOS 18新特性提供实战案例,帮助开发者提升蓝牙设备连接效率和用户体验。

weixin_33701251的博客 319

浅谈iOS中的蓝牙技术(二) -- CoreBluetooth

在上篇文章中我们提到了 iOS 开发中,使用GameKit 框架实现相同网络的 iOS 设备之间传输数据.但是 GameKit 框架在 iOS7 之后就过时了,那么本文将介绍另一种关于蓝牙的框架 CoreBluetooth. CoreBluetooth 简介 CoreBlueTooth.framework 使用 CoreBluetooth 要求设备必须要支持蓝牙4.0(一般也叫BL

努力,可能成功!放弃,注定失败! 4897

iOS蓝牙功能及Core Bluetooth框架实战指南

蓝牙技术是一种无线通信技术,用于在短距离内连接和交换信息。iOS平台对于蓝牙通信的支持以苹果自家的Core Bluetooth框架为核心,该框架为开发者提供了强大的API接口,使开发者能够实现iOS设备与其他蓝牙设备的连接、数据交换和通信管理。Core Bluetooth是苹果公司为iOS设备开发的一套蓝牙通信框架,它允许开发者通过编程实现iOS设备与其他蓝牙低功耗(BLE)设备之间的数据交换。

weixin_33308579的博客 1285

iOS CoreBluetooth 教程

Core Bluetooth for iOS 6 CoreBluetooth的API是基于BLE4.0的标准的。这个框架涵盖了BLE标准的所有细节。仅仅只有新的iOS设备和Mac是和BLE标准兼容的:iPhone4S,iPhone5,MacMini,New iPad,MacBook Air,MacBook Pro。还有iPhone iOS6的模拟器也支持。这是非常有用的,在你没有一个真正的iOS

jimoduwu的专栏 3万+

iOS蓝牙技术开发实战:Core Bluetooth框架与编程指南

在移动应用开发中,蓝牙技术已成为连接可穿戴设备、传感器和其他外设的重要方式。Apple推出的Core Bluetooth框架为iOS开发者提供了一种机制,以实现设备间的蓝牙低功耗(BLE)通信。本章将引导读者了解Core Bluetooth框架的基本概念,以及如何在iOS平台上使用它进行BLE设备间的通信。Core Bluetooth框架允许开发者利用BLE进行无线通信,非常适合对功耗有严格要求的应用场景。

weixin_33759613的博客 1477

保姆级教程:用GMT6.1绘制专业地形起伏图(从数据下载到出图避坑)

本文提供了一份详细的GMT6.1绘制地形起伏图的保姆级教程,从环境搭建到数据下载,再到核心绘图命令解析,帮助用户避开常见错误。特别适合科研人员和地理信息爱好者快速掌握专业地形图的绘制技巧,提升工作效率。

weixin_42549723的博客 278

iOS 蓝牙开发基础

参考SDK:Core Bluetooth Programming Guide1,框架总览 2,中心和外设 中心:需要数据方 外设:提供数据方3,中心,外设,外设数据的表示 3.1 中心侧对象 3.2 外设侧对象 4,中心侧任务 4.1 建立中心管理者对象 myCentralManager = [[CBCentralManager alloc] initWithDel

阿党的专栏 642

告别深度学习!用5个麦克风搞定多说话人分离:ReTM算法保姆级教程

本文详细介绍了ReTM算法,这是一种无需深度学习、仅需5个麦克风即可实现多说话人语音分离的创新信号处理方法。它通过估计相对传递矩阵,利用空间物理信息在混响环境中分离语音,具有数据需求低、计算复杂度小、无需先验几何信息等优势,特别适合嵌入式设备和资源受限场景。

desk3的博客 160

core bluetooth

去App Store搜索并下载“LightBlue”这个App,对调试你的app和理解Core Bluetooth会很有帮助。 ================================ Core Bluetooth for iOS 6 CoreBluetooth的API是基于BLE4.0的标准的。这个框架涵盖了BLE标准的所有细节。仅仅只有新的iOS设备和Mac是和B

AppleEngineer 427

BUCK电路三种工作模式全解析:CCM、BCM、DCM到底怎么选?

本文深入解析BUCK电路的CCM、DCM和BCM三种工作模式,通过对比其电流波形、效率、纹波及环路特性,提供基于计算公式的量化判断方法。文章结合电池供电、高精度模拟等具体应用场景,给出明确的模式选型策略与实战设计指南,帮助工程师根据核心需求做出最优决策。

ee345的博客 489

基于 Python Flask 的智能个人财务系统

4.财务分析与报告:自动生成财务分析报告,提供图表展示(如饼图、柱状图)帮助用户了解收支状况和财务趋势。9.管理员管理功能:提供管理员模块,允许管理员查看用户财务数据、生成统计报告,并进行用户管理与权限控制。5.资产管理:用户可以记录并追踪个人资产(如房产、车辆、投资等),系统提供资产价值增减情况和趋势分析。3.预算制定与管理:用户根据收入设定每月预算,系统自动对比实际支出与预算差异,实时提醒预算完成情况。6.信用卡管理:提供信用卡账单记录与管理功能,提醒用户信用卡还款日期,避免逾期,帮助管理信用卡消费。

weixin_68689665的博客 424

iOS Core Bluetooth 基础知识

本文假设您了解蓝牙低能耗(BLE)和iOS编程的基础知识(包括许多iOS原生API常见的异步调用的委托模式),并旨在作为iOS核心蓝牙库来龙去向的综合指南。我们将指导您了解API的主要组件,包括扫描、连接和与BLE外围设备交互的基本步骤,以及iOS上BLE的常见陷阱和要了解的事情。

小桥流水哗啦啦,iOS Coder 哒哒哒 4336

禁止使用服务器 IP 访问 Apache 环境下的 Web 站点

通过在 Apache 的配置文件中添加适当的指令,我们可以轻松地禁止使用服务器 IP 地址访问我们的 Web 站点。在 Apache 环境下,有时我们希望禁止用户使用服务器的 IP 地址直接访问我们的 Web 站点,而只允许使用域名进行访问。现在,当用户尝试使用服务器的 IP 地址来访问你的网站时,他们将会被拒绝访问,只有通过域名才能正常访问。为了实现这个目标,我们可以通过 Apache 的配置文件进行相应的设置。表示禁止对根目录的访问权限,即禁止使用服务器的 IP 地址进行访问。

TpCode的博客 946

【亲测免费】 Core Bluetooth Mock:简化蓝牙应用测试的利器

Core Bluetooth Mock:简化蓝牙应用测试的利器 项目介绍 Core Bluetooth Mock 是一个专为模拟 Core Bluetooth 对象而设计的开源库,旨在为开发者提供一个便捷的方式来测试蓝牙应用。由于原生的蓝牙API在模拟器上不受支持,开发者通常需要依赖物理设备进行测试,这不仅增加了测试的复杂性,还延长了开发周期。Core Bluetooth Mock 的出现,彻底改...

gitblog_00119的博客 1115

29、固态变压器拓扑、设计及其应用深度解析

本文深入解析了固态变压器(SST)的拓扑结构、设计方法及其在智能电网和能源互联网中的应用。重点探讨了机器学习在SST优化设计中的应用,包括中高频变压器设计、整体系统优化与建模研究。文章详细介绍了多端口SST的拓扑特点、功率传输机制及其作为能源路由器的关键作用,分析了不同端口数量下的控制复杂度与应用场景,并通过案例研究展示了四端口SST在分布式能源系统中的实际应用。最后,文章总结了多端口SST面临的技术挑战,并展望了未来在先进控制策略、集成化设计和标准化方面的发展方向。

study的专栏 3795

OpenClaw第2章:快速安装

本章将手把手教你安装 OpenClaw。

Maynor的博客 3236

Core Bluetooth Programming Guide

https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.h...

weixin_30588675的博客 125

基于 51 单片机的智能手势控制小车设计与实现

智能手势控制小车以STC89C52RC 单片机为控制核心,通过手势识别模块采集用户手势指令,经单片机处理后驱动电机执行前进、后退、左转、右转等动作。该项目融合了传感器技术、单片机编程和电机驱动技术,具有成本低、易实现、互动性强的特点,适合作为嵌入式系统入门实践案例。本项目成功实现了基于 51 单片机的智能手势控制小车,通过 APDS-9960 模块采集手势信号,经单片机处理后驱动电机完成基本动作,验证了 “传感器 + 单片机 + 执行器” 的嵌入式系统设计思路。

weixin_42300449的博客 180

Core Bluetooth for iOS 6

去App Store搜索并下载“LightBlue”这个App,对调试你的app和理解Core Bluetooth会很有帮助。 ================================ Demo下载地址:http://download.youkuaiyun.com/detail/jimoduwu/7146875 ================================

wenzfcsdn的专栏 640

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

从混乱到清晰:Swift代码组织与Core Bluetooth集成的终极指南

Swift作为苹果生态系统的核心编程语言,其代码风格和组织方式直接影响项目的可维护性和扩展性。本文将为你提供一套完整的Swift代码组织方案,结合自动化工具和最佳实践,帮助你从混乱的代码结构转变为清晰、高效的开发流程。无论你是Swift新手还是有经验的开发者,这些实用技巧都能显著提升你的编码效率和代码质量。 ## 为什么代码组织对Swift开发至关重要 🧐 在Swift开发中,良好的代码组织

gitblog_00619的博客 720

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Core Bluetooth 使用教程

去App Store搜索并下载“LightBlue”这个App,对调试你的app和理解Core Bluetooth会很有帮助。 ================================ Core Bluetooth for iOS 6 CoreBluetooth的API是基于BLE4.0的标准的。这个框架涵盖了BLE标准的所有细节。仅仅只有新的iOS设备和Mac是和B

li_yangyang_li的博客 1139

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

低功耗蓝牙BLE 之Bluetooth Core System Architecture

本文章主要根据 《BLUETOOTH CORE SPECIFICATION Version 5.2 | Vol 1, Part A》规范描叙来分析BLE Core Architecture 以及相关内容;

叔婆面 1017

蓝牙协议文档Bluetooth Core Spec下载仓库

蓝牙协议文档Bluetooth Core Spec下载仓库 【下载地址】蓝牙协议文档BluetoothCoreSpec下载仓库 探索蓝牙技术的核心奥秘,尽在这份详尽的《Bluetooth Core Spec》文档中。无论您是致力于低功耗蓝牙(BLE)、传统蓝牙(BT)还是蓝牙网状网络(mesh)的开发,这份文档都能为您提...

gitblog_06747的博客 456

RZBluetooth:简化Core Bluetooth操作与测试

RZBluetooth:简化Core Bluetooth操作与测试 项目介绍 RZBluetooth 是一个开源项目,其目标是简化 Core Bluetooth 的使用和测试过程。它提供了一个基于块的 API,包含了状态管理、自动发现和对公共协议的支持。此外,RZMockBluetooth 提供了一系列 Core Bluetooth 的模拟对象,使得开发者可以在应用内通过连接 CBCentralM...

gitblog_00619的博客 375

从零构建蓝牙项目:XcodeGen自动化配置与Core Bluetooth调试指南

你是否还在为Xcode项目配置蓝牙权限时反复修改plist文件?是否因团队成员使用不同版本的Xcode导致项目文件冲突?本文将通过XcodeGen实现蓝牙项目的全自动化配置,结合Core Bluetooth框架,让你在15分钟内完成从项目搭建到设备通信的全流程。读完本文你将掌握: - 用YAML定义蓝牙项目结构,消除xcodeprojmerge冲突 - 自动配置Core Bluetooth所需的...

gitblog_00576的博客 1038
上一篇: unity 游戏开发 链接
下一篇: ipv6
董其林
博客等级 码龄11年 1粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值