gpt4 book ai didi

IOS 蓝牙 LE 扫描设备未添加到 uitableview

转载 作者:行者123 更新时间:2023-11-28 22:02:51 24 4
gpt4 key购买 nike

我想用uitableview实现IOS的蓝牙扫描和连接模块。在执行时,没有任何项目被添加到列表中。你能告诉我我还需要做什么来显示带有设备名称、uuid 等的蓝牙设备列表吗?

例如,1. 如何将我的对象数组设置为 uitableview 的数据源?2.点击时如何处理设备间蓝牙连接?

 _currentperipheral = peripheral; <--also fails at Thread 1 EXC_BREAKPOINT

下面是我的控制台消息

  2014-07-11 16:34:18.286 marker[6060:60b] Scanning started
2014-07-11 17:53:14.056 marker[6115:60b] Discovered WiT Power Meter at -67

下面是我的模型类:

@interface BTDevice : NSObject {
NSString *name;
NSString *macAddress;
}


@property(nonatomic, retain) NSString *name;
@property(nonatomic, retain) NSString *macAddress;

- (NSString *)getName;
- (NSString *)getMacAddress;

- (void)setName:(NSString *)valueName;
- (void)setMacAddress:(NSString *)valueMacAddress;

@end

下面是我的工作:

- (void)viewDidLoad
{
[super viewDidLoad];

_pendingInit = YES;

_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];
_currentperipheral=[[CBPeripheral alloc]init];
_founddevice=FALSE;
_foundPeripherals = [[NSMutableArray alloc] init];
_connectedServices = [[NSMutableArray alloc] init];

}

- (void)viewWillDisappear:(BOOL)animated {

[_centralManager stopScan];
NSLog(@"Scanning stopped");
[super viewWillDisappear:animated];
}


#pragma mark - Table view data source

- (void)tableView: (UITableView *)tableView
didSelectRowAtIndexPath: (NSIndexPath *)indexPath
{
int idx=indexPath.row;
BTSentCommandViewController * sliderVC = [self.storyboard instantiateViewControllerWithIdentifier:@"BTSentCommandViewController"];
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
#warning Potentially incomplete method implementation.
// Return the number of sections.
return [_foundPeripherals count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
// Return the number of rows in the section.
return [_foundPeripherals count];
}



- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
// You should test all scenarios
if (central.state != CBCentralManagerStatePoweredOn) {
return;
}

if (central.state == CBCentralManagerStatePoweredOn) {
// Scan for devices

[_centralManager scanForPeripheralsWithServices:nil options:nil];
NSLog(@"Scanning started");
}
}


- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {

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

if (_currentperipheral != peripheral) {
// Save a local copy of the peripheral, so CoreBluetooth doesn't get rid of it
_currentperipheral = peripheral;

BTDevice *myDevice=[[BTDevice alloc] init];
[myDevice setName: peripheral.name];

NSString * macAddress = [NSString stringWithFormat:@"%@" , peripheral.RSSI];
[myDevice setMacAddress: macAddress] ;

[_foundPeripherals addObject:myDevice ] ;

[self.tableView reloadData];
NSLog(@"Connecting to peripheral %@", peripheral);
[_centralManager connectPeripheral:peripheral options:nil];
}
}

- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
NSLog(@"Failed to connect");
[self cleanup];
}


- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
NSLog(@"Connected");

[_centralManager stopScan];
NSLog(@"Scanning stopped");

peripheral.delegate = self;

[peripheral discoverServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]]];
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
if (error) {
[self cleanup];
return;
}

for (CBService *service in peripheral.services) {
[peripheral discoverCharacteristics:@[[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID]] forService:service];
}
// Discover other characteristics
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error {
if (error) {
[self cleanup];
return;
}

for (CBCharacteristic *characteristic in service.characteristics) {
if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID]]) {
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
}
}
}


- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
if (error) {
NSLog(@"Error");
return;
}

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

if ([stringFromData isEqualToString:@"EOM"]) {


[peripheral setNotifyValue:NO forCharacteristic:characteristic];

[_centralManager cancelPeripheralConnection:peripheral];
}

//[_data appendData:characteristic.value];
}


- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {

if (![characteristic.UUID isEqual:[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID]]) {
return;
}

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

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
_foundPeripherals = nil;

[_centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]] options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];
}

- (void)cleanup {

// See if we are subscribed to a characteristic on the peripheral
if (_currentperipheral.services != nil) {
for (CBService *service in _currentperipheral.services) {
if (service.characteristics != nil) {
for (CBCharacteristic *characteristic in service.characteristics) {
if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID]]) {
if (characteristic.isNotifying) {
[_currentperipheral setNotifyValue:NO forCharacteristic:characteristic];
return;
}
}
}
}
}
}

[_centralManager cancelPeripheralConnection:_currentperipheral];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}




- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuseIdentifier" forIndexPath:indexPath];

if (cell == nil) {
cell = [ [UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"reuseIdentifier"] ;

cell.selectionStyle = UITableViewCellSelectionStyleGray;
}

cell.textLabel.text = [_foundPeripherals objectAtIndex:indexPath.row];
// Configure the cell...

return cell;
}

最佳答案

这里的代码比较多,不过大体上看起来还可以。然而,有两件事确实很突出。您的 numberOfSectionsInTableView 返回 0 - 因此您的表格中将没有内容。你应该有 -

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}

我建议您只将 CBPeripheral 存储在数据数组中。

另外,一旦你发现了一个外围设备并将它添加到你的数组中,你应该通知 TableView 数据源已经更新(这段代码假设你有属性 tableView 持有你的引用表格 View )-

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {

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

if (![_foundPeripherals containsObject:peripheral]) {
[_foundPeripherals addObject:myDevice ] ;

[self.tableView reloadData]; // Tell the tableview that the data source has changed
}

}

然后你的 cellForRowAtIndexPath 变成 -

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuseIdentifier" forIndexPath:indexPath];

if (cell == nil) {
        cell =  [ [UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"reuseIdentifier"] ;


        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }


CBPeripheral *peripheral=[_foundPeripherals objectAtIndex:indexPath.row];

    cell.textLabel.text = peripheral.name;
    // Configure the cell...

    return cell;
}

选中表格行时连接外设-

- (void)tableView: (UITableView *)tableView
didSelectRowAtIndexPath: (NSIndexPath *)indexPath
{

[self performSegueWithIdentifier:@"connectSegue" sender:[_foundPeripherals objectAtIndex:indexPath.row]]; // This is a segue to your BTSentCommandViewController
}

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
BTSentCommandViewController* sliderVC=( BTSentCommandViewController *)segue.destinationViewController;
sliderVC.centralManager=_centralManager;
sliderVC.periperhal=_sender;

}

在您的 BTSentCommandViewController 中,您可以连接到外围设备。您还应该将 BTSentCommandViewController 实例设置为外围设备委托(delegate),并在那里实现所有 CBPeripheralDelegate 方法

关于IOS 蓝牙 LE 扫描设备未添加到 uitableview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24693231/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com