IOS蓝牙连接和发送数据
2017-04-12 08:57
204 查看
首先要确定蓝牙是否打开
本文使用的是 Objective-C语言
1.新建一个蓝牙帮助类BlueHelp
并导入
- (void)peripheral:(CBPeripheral )peripheral didDiscoverServices:(NSError )error{
if (error){
NSLog(@”扫描服务出现错误,错误原因:%@”,error);
}else{
//获取外设中所扫描到的服务
NSArray *services = peripheral.services;
for (CBService *service in services){
//拿到需要扫描的服务,例如打印一些服务数据
//把所有的service打印出来
NSLog(@”service is :%@”,service);
//从需要的服务中查找需要的特征
//从peripheral的services中扫描特征
[peripheral discoverCharacteristics:nil forService:service];
}
}
}
//只要扫描到特征就会调用,其中的外设和服务就是特征所在的外设和服务
- (void)peripheral:(CBPeripheral )peripheral didDiscoverCharacteristicsForService:(CBService )service error:(NSError *)error{
if (error){
NSLog(@”扫描特征出现错误,错误原因:%@”,error);
}else{
//拿到服务中所有的特征
NSArray *characteristics = service.characteristics;
//遍历特征,拿到需要的特征进行处理
for (CBCharacteristic *characteristic in characteristics){
NSLog(@”所有的特征为:%@”,characteristic.UUID.UUIDString);
//如果是温度数据处理
if([characteristic.UUID.UUIDString isEqualToString:@”你自己的特征值”]){
//将全部的特征信息打印出来
_peripheral = peripheral;
scperipheral = peripheral;
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
NSLog(@”%@”,characteristic);
}
//这里是发送 设备设置蓝牙发送温度数据的值
else if([characteristic.UUID.UUIDString isEqualToString:@”你自己的特征值”]){
writecharacteristic = characteristic;
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
NSLog(@”写入的值为:%@”,characteristic);
}
//如果是ota进行ota升级
else if([characteristic.UUID.UUIDString isEqualToString:@”你需要的特征值”]){
_peripheral = peripheral;
scperipheral = peripheral;
writeOtacharacteristic = characteristic;
//设置通知
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
//NSLog(@”OTA升级了”);
isOTA = TRUE;
NSString *s = @”OTA”;
NSDictionary *tempOta = [NSDictionary dictionaryWithObject:s forKey:@”ota”];
[[NSNotificationCenter defaultCenter] postNotificationName:@”tempOTA” object:nil userInfo:tempOta];
}
//无键按钮DFU
else if([characteristic.UUID.UUIDString isEqualToString:@”你自己需要的特征值”]){
writeDfucharacteristic = characteristic;
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
NSLog(@”写入的OTA值为:%@”,characteristic);
}
}
}
}
/*
* 获取所有的温度更新数据
* 接收蓝牙发送过来的温度数据 并经过解析和转换
*/
- (void)peripheral:(CBPeripheral )peripheral didUpdateValueForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error
{
if ([characteristic.UUID isEqual:BOOT_LOADER_CHARACTERISTIC_UUID])
{
uint8_t dataPointer = (uint8_t ) [characteristic.value bytes];
NSString *errorCode = [NSString stringWithFormat:@”0x%2x”,dataPointer[1]];
errorCode = [errorCode stringByReplacingOccurrencesOfString:@” ” withString:@”0”];
}
上面这些代码可以不看 我写的是一些数据的转换
下面我们可以看下蓝牙写入数据
//也可以自定义主要是给外部调用
//发送数据
-(void)writeBlueValue:(NSString *)value{
_isSendData = TRUE;
[self writeValue:value forCharacteristic:writecharacteristic];
}
/*
这个是给蓝牙发送数据用的
*/
-(void)writeValue:(NSString )value forCharacteristic:(CBCharacteristic )characteristic
{
// NSData *data = [value dataUsingEncoding:4];
NSData *data = [_normalUtil stringToBytes:value];
NSLog(@”send data is:%@:characteristic:%@”,data,writecharacteristic);
//is no write bluetooth data
if(writecharacteristic.properties & CBCharacteristicPropertyWriteWithoutResponse)
{
//send phone on bluetooth data
[selectPeriperal writeValue:data forCharacteristic:writecharacteristic type:CBCharacteristicWriteWithoutResponse];
}else
{
[selectPeriperal writeValue:data forCharacteristic:writecharacteristic type:CBCharacteristicWriteWithResponse];
}
一般发送数据都需要用到 NSData数据类型格式下面我有几个方法
/**
* Method to convert hex to byteArray。这里是将16进制转换为NSData
*/
-(NSMutableData )dataFromHexString:(NSString )string
{
NSMutableData *data = [NSMutableData new];
NSCharacterSet *hexSet = [[NSCharacterSet characterSetWithCharactersInString:@”0123456789ABCDEF “] invertedSet];
}
还有一种是
//字符串转为数组
-(NSData )stringToBytes:(NSString )string{
int a = [string intValue];
NSData *aData = [string dataUsingEncoding: NSUTF8StringEncoding];
Byte testByte = (Byte )[aData bytes];
testByte[0] = (Byte)(a>>24&0xff);
testByte[1] = (Byte) (a>>16&0xff);
testByte[2] = (Byte)(a>>8&0xff);
testByte[3] = (Byte)(a&0xff);
}
这些方法比较常用的
好了基本思路就这样 源代码 过段时间放上来 。
本文使用的是 Objective-C语言
1.新建一个蓝牙帮助类BlueHelp
并导入
pragma mark - CBPeripheralDelegate
//只要扫描到服务就会调用,其中的外设就是服务所在的外设- (void)peripheral:(CBPeripheral )peripheral didDiscoverServices:(NSError )error{
if (error){
NSLog(@”扫描服务出现错误,错误原因:%@”,error);
}else{
//获取外设中所扫描到的服务
NSArray *services = peripheral.services;
for (CBService *service in services){
//拿到需要扫描的服务,例如打印一些服务数据
//把所有的service打印出来
NSLog(@”service is :%@”,service);
//从需要的服务中查找需要的特征
//从peripheral的services中扫描特征
[peripheral discoverCharacteristics:nil forService:service];
}
}
}
//只要扫描到特征就会调用,其中的外设和服务就是特征所在的外设和服务
- (void)peripheral:(CBPeripheral )peripheral didDiscoverCharacteristicsForService:(CBService )service error:(NSError *)error{
if (error){
NSLog(@”扫描特征出现错误,错误原因:%@”,error);
}else{
//拿到服务中所有的特征
NSArray *characteristics = service.characteristics;
//遍历特征,拿到需要的特征进行处理
for (CBCharacteristic *characteristic in characteristics){
NSLog(@”所有的特征为:%@”,characteristic.UUID.UUIDString);
//如果是温度数据处理
if([characteristic.UUID.UUIDString isEqualToString:@”你自己的特征值”]){
//将全部的特征信息打印出来
_peripheral = peripheral;
scperipheral = peripheral;
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
NSLog(@”%@”,characteristic);
}
//这里是发送 设备设置蓝牙发送温度数据的值
else if([characteristic.UUID.UUIDString isEqualToString:@”你自己的特征值”]){
writecharacteristic = characteristic;
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
NSLog(@”写入的值为:%@”,characteristic);
}
//如果是ota进行ota升级
else if([characteristic.UUID.UUIDString isEqualToString:@”你需要的特征值”]){
_peripheral = peripheral;
scperipheral = peripheral;
writeOtacharacteristic = characteristic;
//设置通知
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
//NSLog(@”OTA升级了”);
isOTA = TRUE;
NSString *s = @”OTA”;
NSDictionary *tempOta = [NSDictionary dictionaryWithObject:s forKey:@”ota”];
[[NSNotificationCenter defaultCenter] postNotificationName:@”tempOTA” object:nil userInfo:tempOta];
}
//无键按钮DFU
else if([characteristic.UUID.UUIDString isEqualToString:@”你自己需要的特征值”]){
writeDfucharacteristic = characteristic;
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
NSLog(@”写入的OTA值为:%@”,characteristic);
}
}
}
}
/*
* 获取所有的温度更新数据
* 接收蓝牙发送过来的温度数据 并经过解析和转换
*/
- (void)peripheral:(CBPeripheral )peripheral didUpdateValueForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error
{
if ([characteristic.UUID isEqual:BOOT_LOADER_CHARACTERISTIC_UUID])
{
uint8_t dataPointer = (uint8_t ) [characteristic.value bytes];
NSString *errorCode = [NSString stringWithFormat:@”0x%2x”,dataPointer[1]];
errorCode = [errorCode stringByReplacingOccurrencesOfString:@” ” withString:@”0”];
// Checking the error code from the response if ([errorCode isEqualToString:SUCCESS]&&commandArray.count>0) { if ([[commandArray objectAtIndex:0] isEqual:@(ENTER_BOOTLOADER)]) { [self getBootLoaderDataFromCharacteristic:characteristic]; } else if ([[commandArray objectAtIndex:0] isEqual:@(GET_FLASH_SIZE)]) { [self getFlashDataFromCharacteristic:characteristic]; } else if ([[commandArray objectAtIndex:0] isEqual:@(SEND_DATA)]) { _isWritePacketDataSuccess = YES; [_userDefaults setBool:_isWritePacketDataSuccess forKey:@"WriteSuccess"]; } else if ([[commandArray objectAtIndex:0] isEqual:@(PROGRAM_ROW)]) { _isWritePacketDataSuccess = YES; [_userDefaults setBool:_isWritePacketDataSuccess forKey:@"WriteSuccess"]; } else if ([[commandArray objectAtIndex:0] isEqual:@(VERIFY_ROW)]) { [self getRowCheckSumFromCharacteristic:characteristic]; } else if([[commandArray objectAtIndex:0] isEqual:@(VERIFY_CHECKSUM)]) { [self checkApplicationCheckSumFromCharacteristic:characteristic]; } if (cbCharacteristicUpdationHandler != nil) { cbCharacteristicUpdationHandler(YES,[commandArray objectAtIndex:0],nil); [commandArray removeObjectAtIndex:0]; } } else { if(commandArray.count>0){ if ([[commandArray objectAtIndex:0] isEqual:@(PROGRAM_ROW)]) { _isWritePacketDataSuccess = NO; } else if ([[commandArray objectAtIndex:0] isEqual:@(SEND_DATA)]) { _isWritePacketDataSuccess = NO; } if (cbCharacteristicUpdationHandler != nil) { cbCharacteristicUpdationHandler(YES,[commandArray objectAtIndex:0],nil); [commandArray removeObjectAtIndex:0]; } } } } if(!isOTA&&!_isSendData){ NSString *temps=[self getTempData:characteristic]; NSArray *ss = [temps componentsSeparatedByString:@","]; NSString *tempWendu =ss[0]; NSString *tempSymbol = ss[1]; self.currentDate = [NSDate date]; NSString *dateString = [_dateformatter stringFromDate:self.currentDate]; NSLog(@" ==save is time=== :%@",dateString); NSDate *logDate = [_dateformatter dateFromString:dateString]; long logTime= (long)[logDate timeIntervalSince1970]; if(temps!=nil&&![_bluename isEqualToString:@""]&&_bluename!=nil&&_bluename!=NULL){ //把数据存入到数据库 NSString *a = [_userDefaults objectForKey:@"tempUnit"]; //如果是华氏度的时候一定要把它转为摄氏度之后再来保存数据 以便数据的统一性 if([a isEqualToString:@"°F"]){ float floatString = [tempWendu floatValue]; float aa = [_normalUtil convertFahrenheitToCelcius:floatString]; NSString *ftempWendu = [NSString stringWithFormat:@"%.1f",aa]; NSString *ftempSymbol = @"°C"; [_tempDao saveTempname:_bluename saveTempaddre:_blueaddre saveTempwenduname:ftempSymbol saveTempwendu:ftempWendu saveTemptime:logTime]; }else{ [_tempDao saveTempname:_bluename saveTempaddre:_blueaddre saveTempwenduname:tempSymbol saveTempwendu:tempWendu saveTemptime:logTime]; } NSLog(@" ==save is success=== :%ld",logTime); } //当读取到数据的时候就要存入数据 以后用来蓝牙自动的去连接 if(_saveAutoOnce){ [_userDefaults setObject:_bluename forKey:@"autoBlueName"]; [_userDefaults setObject:_blueaddre forKey:@"autoBlueAddre"]; _saveAutoOnce = false; } NSString * tp = [temps stringByAppendingString:@","]; NSString * tempp = [tp stringByAppendingString:_blueaddre]; NSDictionary *tempDict = [NSDictionary dictionaryWithObject:tempp forKey:@"temp"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"tempNofiction" object:nil userInfo:tempDict]; }
}
上面这些代码可以不看 我写的是一些数据的转换
下面我们可以看下蓝牙写入数据
//也可以自定义主要是给外部调用
//发送数据
-(void)writeBlueValue:(NSString *)value{
_isSendData = TRUE;
[self writeValue:value forCharacteristic:writecharacteristic];
}
/*
这个是给蓝牙发送数据用的
*/
-(void)writeValue:(NSString )value forCharacteristic:(CBCharacteristic )characteristic
{
// NSData *data = [value dataUsingEncoding:4];
NSData *data = [_normalUtil stringToBytes:value];
NSLog(@”send data is:%@:characteristic:%@”,data,writecharacteristic);
//is no write bluetooth data
if(writecharacteristic.properties & CBCharacteristicPropertyWriteWithoutResponse)
{
//send phone on bluetooth data
[selectPeriperal writeValue:data forCharacteristic:writecharacteristic type:CBCharacteristicWriteWithoutResponse];
}else
{
[selectPeriperal writeValue:data forCharacteristic:writecharacteristic type:CBCharacteristicWriteWithResponse];
} //发送完成后 又要它归位 _isSendData = FALSE; NSLog(@"已经向外设%@的特征值%@写入数据",selectPeriperal.name,writecharacteristic.description);
}
一般发送数据都需要用到 NSData数据类型格式下面我有几个方法
/**
* Method to convert hex to byteArray。这里是将16进制转换为NSData
*/
-(NSMutableData )dataFromHexString:(NSString )string
{
NSMutableData *data = [NSMutableData new];
NSCharacterSet *hexSet = [[NSCharacterSet characterSetWithCharactersInString:@”0123456789ABCDEF “] invertedSet];
// Check whether the string is a valid hex string. Otherwise return empty data if ([string rangeOfCharacterFromSet:hexSet].location == NSNotFound) { string = [string lowercaseString]; unsigned char whole_byte; char byte_chars[3] = {'\0','\0','\0'}; int i = 0; int length = (int)string.length; while (i < length-1) { char c = [string characterAtIndex:i++]; if (c < '0' || (c > '9' && c < 'a') || c > 'f') continue; byte_chars[0] = c; byte_chars[1] = [string characterAtIndex:i++]; whole_byte = strtol(byte_chars, NULL, 16); [data appendBytes:&whole_byte length:1]; } } return data;
}
还有一种是
//字符串转为数组
-(NSData )stringToBytes:(NSString )string{
int a = [string intValue];
NSData *aData = [string dataUsingEncoding: NSUTF8StringEncoding];
Byte testByte = (Byte )[aData bytes];
testByte[0] = (Byte)(a>>24&0xff);
testByte[1] = (Byte) (a>>16&0xff);
testByte[2] = (Byte)(a>>8&0xff);
testByte[3] = (Byte)(a&0xff);
NSData *adata = [[NSData alloc] initWithBytes:testByte length:4]; return adata;
}
这些方法比较常用的
好了基本思路就这样 源代码 过段时间放上来 。
相关文章推荐
- 【iOS官方文档翻译】iOS的蓝牙连接、数据接收及发送
- iOS蓝牙开发 —— 连接打印机发送16进制数据的问题
- iOS的蓝牙连接、数据接收及发送
- 【iOS官方文档翻译】iOS的蓝牙连接、数据接收及发送
- ios socket第三方框架 AsyncSocket使用简介,连接,心跳,断线,数据发送与接收
- iOS蓝牙开发:蓝牙连接和数据读写
- iOS 蓝牙外设检索、发送、接受数据问题。
- Android 6.0后蓝牙的开发,搜索,配对,连接发送数据等(一)
- RxBluetooth一个很好的开源蓝牙操作类(扫描、状态监听、连接、发送、接收数据)
- iOS 蓝牙分段发送数据代码
- iOS蓝牙开发:蓝牙连接和数据读写
- iOS蓝牙开发:蓝牙连接和数据读写
- [iOS蓝牙]蓝牙连接并通过特征CBCharacteristic读写数据
- iOS蓝牙开发:蓝牙连接和数据读写
- Socket —>AsyncSocket(ios socket第三方框架 AsyncSocket使用简介,连接,心跳,断线,数据发送与接收)
- iOS学习,蓝牙,iOS设备模拟BLE发送数据
- Android 6.0后蓝牙的开发,搜索,配对,连接发送数据等(二)
- android 蓝牙编程重点---如何发送和接收16进制数据
- ios开发之发送UDP广播并接收数据
- CE下蓝牙连接 虚拟串口 发送命令