- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 CoreBlueTooth 框架写入 Peripheral 的可写特性之一。我在中央实现“didWriteValueForCharacteristic:错误:”委托(delegate),它总是在错误之下返回我。尽管我已经在我的外围设备上收到了数据。
Error Domain=CBErrorDomain Code=0 "Unknown error." UserInfo=0x166762e0 {NSLocalizedDescription=Unknown error.}
在我的代码中,我的 self.data 是一个具有 3 个键和值的 NSDictionary。
// Central
- (void)centralManagerDidUpdateState:(CBCentralManager *)iCentral {
if (iCentral.state != CBCentralManagerStatePoweredOn) {
return;
}
[self.centralManager scanForPeripheralsWithServices:self.peripheralServices options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES}];
}
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)iPeripheral advertisementData:(NSDictionary *)iAdvertisementData RSSI:(NSNumber *)iRSSI {
if (self.discoveredPeripheral != iPeripheral) {
// Save a local copy of the peripheral, so CoreBluetooth doesn't get rid of it
self.discoveredPeripheral = iPeripheral;
// Connect to the discovered peripheral
[self.centralManager connectPeripheral:iPeripheral options:nil];
}
}
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)iPeripheral advertisementData:(NSDictionary *)iAdvertisementData RSSI:(NSNumber *)iRSSI {
if (self.discoveredPeripheral != iPeripheral) {
// Save a local copy of the peripheral, so CoreBluetooth doesn't get rid of it
self.discoveredPeripheral = iPeripheral;
// Connect to the discovered peripheral
[self.centralManager connectPeripheral:iPeripheral options:nil];
}
}
// We've connected to the peripheral, now we need to discover the services and characteristics to find the 'writeable' characteristic.
- (void)centralManager:(CBCentralManager *)iCentral didConnectPeripheral:(CBPeripheral *)iPeripheral {
// Stop scanning
[self.centralManager stopScan];
// Make sure we get the discovery callbacks
iPeripheral.delegate = self;
// Search only for services that match our UUID
[iPeripheral discoverServices:self.peripheralServices];
}
- (void)peripheral:(CBPeripheral *)iPeripheral didDiscoverServices:(NSError *)iError {
if (iError) {
[self cleanup];
return;
}
// Loop through the newly filled peripheral.services array, just in case there's more than one.
for (CBService *service in iPeripheral.services) {
[iPeripheral discoverCharacteristics:@[self.writeableCharactersticsUUID] forService:service];
}
}
// Write the data into peripheral's characterstics
- (void)peripheral:(CBPeripheral *)iPeripheral didDiscoverCharacteristicsForService:(CBService *)iService error:(NSError *)iError {
if (iError) {
[self cleanup];
return;
}
// Find out the writable characterstics
for (CBCharacteristic *characteristic in iService.characteristics) {
if ([characteristic.UUID isEqual:self.writeableCharactersticsUUID]) {
NSData *dataToWrite = [NSJSONSerialization dataWithJSONObject:self.data options:0 error:nil];
NSInteger dataSize = [[NSByteCountFormatter stringFromByteCount:dataToWrite.length countStyle:NSByteCountFormatterCountStyleFile] integerValue];
if (dataSize > 130) {
NSLog(@"Cannot send more than 130 bytes");
return;
}
[self.discoveredPeripheral writeValue:dataToWrite forCharacteristic:self.centralWriteableCharacteristic type:CBCharacteristicWriteWithResponse];
break;
}
}
}
- (void)peripheral:(CBPeripheral *)iPeripheral didWriteValueForCharacteristic:(CBCharacteristic *)iCharacteristic error:(NSError *)iError {
NSLog(@"Error = %@", iError);
}
- (void)cleanup {
// Don't do anything if we're not connected
if (self.discoveredPeripheral.state != CBPeripheralStateConnected) {
return;
}
// If we've got this far, we're connected, but we're not subscribed, so we just disconnect
[self.centralManager cancelPeripheralConnection:self.discoveredPeripheral];
}
// Peripheral
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)iPeripheral {
if (iPeripheral.state != CBPeripheralManagerStatePoweredOn) {
return;
}
CBMutableCharacteristic *characteristic = [[CBMutableCharacteristic alloc] initWithType:iCID properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteable];
CBMutableService *writableService = [[CBMutableService alloc] initWithType:iServiceId primary:YES];
writableService.characteristics = @[characteristic];
//[self.peripheralManager removeAllServices];
[self.peripheralManager addService:writableService];
[self.peripheralManager startAdvertising:@{ CBAdvertisementDataServiceUUIDsKey : @[iServiceId]}];
}
- (void)peripheralManager:(CBPeripheralManager *)iPeripheral didReceiveWriteRequests:(NSArray *)iRequests {
CBATTRequest *aRequest = iRequests[0];
NSData *aData = aRequest.value;
NSDictionary *aResponse = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:aData options:NSJSONReadingMutableContainers error:nil];
NSLog(@"Received Data = %@", aResponse);
}
最佳答案
我想通了。问题在于特征类型。我使用了“CBCharacteristicWriteWithoutResponse”而不是“CBCharacteristicWriteWithResponse”并且它起作用了。
我是在读完这篇文章后这样做的:
writeValue forCharacteristic writeType,此函数是写入设备上的特征的主要函数。 writeType 属性设置为无响应写入或有响应写入。使用 write with response 时,在 iOS 设备等待接收 ok 响应和回调时,所有对外围设备的写入都会被缓存。当使用write no response时,数据不会被缓存。这在使用需要低延迟的东西时很重要,例如 RC 汽车或直升机等。当使用带响应的写入时,iOS 设备有时可能会滞后,这不会产生很好的响应……对于每次写入,都会调用 didWriteCharacteristic 回调。
关于ios - 核心蓝牙 : Getting error even if data is written into writable characteristics,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17846261/
我正在使用 SAF(存储访问框架)将文件写入 SD 卡。在 Marshmallow 上,文件的写入和更新实际上有很大的延迟(大约 10 秒)。 当我使用例如: android.support.v4.p
我不明白的意思 The original Java AWT was implemented by having widgets written in Java which delegated to p
我的 ASP.NET Core 应用程序使用“开箱即用”的外部登录身份验证。我想要实现的 - 在 facebook 挑战中,我想包装重定向 url 并将其作为 json 返回以在 jquery 前端使
我正在尝试安装 MySql Workbench 并下载 mysql-installer-web-community-5.7.13.0.msi。当我运行此文件时出现以下错误: "The instruct
考虑以下代码: #include int main() { int i = 0; printf("hello%n%d\n", &i, i); } 为什么打印hello0而不是hello5?
我是一名 Java/C++ 程序员,Ruby 是我的第一门脚本语言。有时我发现我在某些领域没有尽可能高效地使用它,例如: 目标:仅解析文件中的某些行。我要使用的模式是有一条非常大的线,尺寸大于 15,
尝试执行命令“vagrant up”时收到以下错误: --------------------------- VBoxHeadless.exe - Application Error --------
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
我正在创建一个程序,需要从仍在写入的文件中读取。 主要问题是:如果使用在单独线程上运行的 InputStream 和 OutputStream 类执行读取和写入,有什么问题和问题为了防止数据损坏,我需
问题 我有一个 HTML5/JavaScript 应用程序。我想将它提交给苹果商店。 有没有办法将它嵌入到 Safari/Webkit 中,并让 apple 接受它作为应用程序? 上下文 这个项目最初
我正在文件 btree.h 中编写一个 btree 实现类“btree”,并在文件 btree_iterator.h 中使用外部迭代器类“btree_iterator”在 btree.tem 中实现,
我正在使用 Python 3.4 将 unicode 字符串写入文件。文件写入后,打开一看,完全是另外一组字符。 代码:- # -*- coding: utf-8 -*- with open('tes
我们编写的应用程序在 XP 中运行良好,但在迁移到 Vista 和 Windows 7 时遇到了严重的问题,这可能是由于用户数据的写入位置。 用例是这样的:个人用户需要登录机器并使用它来获取数据。主管
假设我有一个名为“REVIEWS”的表 此表包含客户为各种产品撰写的评论。 我希望能够对每个客户撰写的所有评论进行“计数”,所以我写: SELECT count(*) AS counter FROM
我正在使用一个应用程序创建一个 csv 文件,然后我想导出并在手机上阅读。但是,我将其保存到的位置不可见,并且难以传输。 有没有办法将其保存到更容易访问的位置,例如电话上的/documents ? (
我写了一个小工具,用于将给定目录下的所有目录和文件名打印到文件中。程序编译正常,但运行程序后,文件未写入。这对我来说看起来很奇怪。程序代码如下所示。 在代码的第49行,当我仅使用file作为方法的参数
所以我在 c 中有以下枚举方法: enum enum_type GetInfo (int socket, unsigned char *data) { } 在 api 中我可以找到这个: 接收到的数据
我不明白下面的 C 转换函数是如何工作的(以及为什么要这样写);我相当确定原作者知道他在做什么: typedef union TValue { uint64_t u64; double n;
这个问题已经有答案了: Node.js - Find home directory in platform agnostic way (6 个回答) 已关闭 3 年前。 我正在使用fs文件系统 JS
我正在构建一个 rest api,它从其他 api 收集数据,用它做一些逻辑并发送回客户端: 我的主课: public class Main { public static void main(Str
我是一名优秀的程序员,十分优秀!