ios 8.3 BLE设备在连接objective-c后保持断开连接

时间:2015-05-05 01:25:46

标签: ios objective-c bluetooth disconnected

我有一台Shearwell棒读取器,通过BLE读取牛标签,羊标签和山羊标签。连接BLE设备时,设备列表显示在SDLBluetoothConnectViewController的tableView中,然后消失。我也无法使用segue从设备中获取信息。蓝牙图标闪烁3次,不与设备配对。任何人都可以看到我的错误在哪里,我已经看了几个小时!提前谢谢!

这是SDLStickreader.m

query!.whereKey(etc)

和我的SDLBluetoothConnectViewController.m

 // A StickReader is a wrapper for a CBPeripheral that has been discovered using a filter for StickReader UUID.
#import "SDLStickReader.h"
#import "SDLStickReaderManager.h"
#import "SDLStickReaderPrivate.h"
#import "SDLSerialPort.h"
//#import "SDLIdentifier.h"

@interface SDLStickReader () <SerialPortDelegate>
@property (strong, nonatomic) CBPeripheral *peripheral;
@end

@implementation SDLStickReader

static SDLStickReaderManager * _manager;
NSMutableData *_data;
SDLSerialPort *serialPort;
BOOL waitingForConfigInfo = YES;
NSMutableString *configString;


+(SDLStickReaderManager *)manager {
if (nil == _manager) {
    _manager = [[SDLStickReaderManager alloc] init];


}
return _manager;
}

+ (instancetype)forPeripheral: (CBPeripheral *)peripheral {
return [[self alloc] initWithPeripheral:peripheral];
}

- (instancetype)initWithPeripheral: (CBPeripheral *)peripheral {
self = [super init];
if (self) {
    _detail = @"";
    self.peripheral = peripheral;
    //peripheral.delegate = self;
    __tagReadService = [CBUUID UUIDWithString:SDL_STICKREADER_TAGREAD_UUID];
            if (peripheral.state == CBPeripheralStateConnected) {
                NSLog(@"periperal is connected");
            } else {
                NSLog(@"periperal is NOT connected");
            }
    _data = [[NSMutableData alloc] init];
    serialPort = [[SDLSerialPort alloc] initWithPeripheral:peripheral     andDelegate:self];
    peripheral.delegate = self;
    [serialPort open ];

    }
    return self;
}

-(BOOL)hasPeripheral: (CBPeripheral *)peripheral {
return [self.peripheral isEqual: peripheral];
}

-(NSUUID *)identifier {
return self.peripheral.identifier;
}

-(NSString *)name {
return self.peripheral.name;
}

-(NSString *)description {
return [NSString stringWithFormat: @"Peripheral: %@", self.name];
}

-(NSString *)state {
switch (self.peripheral.state) {
    case CBPeripheralStateConnected:
        return SDL_STICKREADER_STATE_CONNECTED;
    case CBPeripheralStateConnecting:
        return SDL_STICKREADER_STATE_CONNECTING;
    case CBPeripheralStateDisconnected:
        return SDL_STICKREADER_STATE_DISCONNECTED;
 }
}
// Every time the peripheral sends new data, it calls the delegate         peripheral:didUpdateValueForCharacteristic:error: method. The second argument     contains the characteristic that you can read.
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:    (CBCharacteristic *)characteristic error:(NSError *)error {
if (error) {
    NSLog(@"Error");
    return;
}
if ([self.characteristics containsObject: characteristic.UUID]) {
    NSString *stringFromData = [[NSString alloc]     initWithData:characteristic.value encoding:NSUTF8StringEncoding];
    // Have we got everything we need?
    NSUInteger startOfEom = [stringFromData rangeOfString:     SDL_STICKREADER_EOM].location;
    if (NSNotFound == startOfEom) {
        // it is not the EOM so append the data to what we have so far and     wait for more.
        [_data appendData: characteristic.value];
    } else {
        // contains EOM, so remove the
        NSString *lastPart = [stringFromData substringToIndex:startOfEom];
        NSString *message = [[NSString alloc] initWithData: _data     encoding:NSUTF8StringEncoding];
        if (nil != lastPart && lastPart.length > 0) {
            message = [message stringByAppendingString:lastPart];
        }
        if (nil != self.listener) {
            [self.listener stickReader:self didReadTag:message];
        }
        [_data setLength:0];
    }
 }
}

// Method that ensures that the CBCentral knows when a notification state for a given characteristic changes. Track it in order to understand when a characteristic state changes (update app values). You should check if the characteristic notification has stopped. If it has, you should disconnect from it:
- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {

if (![self.characteristics containsObject: characteristic.UUID]) {
    return;
}

if (characteristic.isNotifying) {
    NSLog(@"Notification began ");
} else {
    // Notification has stopped
    NSLog(@"Notification stopped ");
    //[_manager cancelPeripheralConnection:peripheral];
}
}

/////////////////////////////////////////////////////////////////////////////////////
- (void) port: (SDLSerialPort*) serialPort event : (SPEvent) ev error: (NSInteger)err {
if (SP_EVT_OPEN == ev) {
    //NSLog(@"serialPortOpened");
    configString = [[NSMutableString alloc] init];

    [serialPort write: [@"c\r" dataUsingEncoding: NSUTF8StringEncoding]];
} else {
    NSLog(@"serialPortClosed");
 }
}

- (void) writeComplete: (SDLSerialPort*) serialPort withError: (NSInteger)err     {
NSLog(@"writeComplete");
}

- (void) port: (SDLSerialPort*) serialPort receivedData: (NSData*)data {

if (data.length > 0) {
    NSCharacterSet *charSet = [NSCharacterSet     characterSetWithCharactersInString: @"|()#"];


    NSString *str = [[NSString alloc] initWithData: data encoding:     NSUTF8StringEncoding];

    NSLog(@"receivedData: %@", str);
    if ([str hasPrefix: @"Shearwell"]) {
        _detail = str;
        //NSLog(@"updating: %@", str);

        [[SDLStickReader manager] addedShearwellStickReader: self];
    } else if (NSNotFound != [str rangeOfCharacterFromSet: charSet].location )     {
        // Data
        if (waitingForConfigInfo) {
            [configString appendString:str];
            if (NSNotFound != [configString rangeOfString: @"(cS)"].location)     {
                // got end of config string, parse config.
                NSRange found = [configString rangeOfString: @"#18|"];
                if (NSNotFound != found.location) {
                    NSRange getRange = NSMakeRange(found.location +     found.length, 1);
                    NSString *str = [configString substringWithRange:     getRange];
                    self.eidFormat = [str integerValue];
                    NSLog(@"StickReader format: %d", self.eidFormat); 
                }
                waitingForConfigInfo = NO;
                [serialPort write: [@"v\r" dataUsingEncoding:     NSUTF8StringEncoding]];
            }
        } else {
            // Users data
            [self.listener stickReader:self didReadData: str];
        }
    } else {
        // Tag
        if (nil != self.listener) {
            [self.listener stickReader:self didReadTag: str];
        }
    }
}
}

0 个答案:

没有答案