zoukankan      html  css  js  c++  java
  • 手机连接外设蓝牙4.0失败,发送消息失败遇到的问题总结

    步骤

    1.引用库

    #import <CoreBluetooth/CoreBluetooth.h>

    2.遵循两个代理

    @interface ZMOpenViewController ()<CBCentralManagerDelegate,CBPeripheralDelegate>

    3.声明属性

    NSMutableArray*_peripherals;//保存直连设备的数组

    //系统蓝牙设备管理对象,可以把他理解为主设备,通过他,可以去扫描和链接外设

        CBCentralManager *_manager;

     

    4.

    - (void)viewDidLoad {

     //初始化并设置委托和线程队列,最好一个线程的参数可以为nil,默认会就main线程

        _manager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()];

     

    5.判断蓝牙状态

    -(void)centralManagerDidUpdateState:(CBCentralManager *)central{

         

         switch (central.state) {

             case CBCentralManagerStateUnknown:

                 NSLog(@">>>CBCentralManagerStateUnknown");

                 break;

             case CBCentralManagerStateResetting:

                 NSLog(@">>>CBCentralManagerStateResetting");

                 break;

             case CBCentralManagerStateUnsupported:

                 NSLog(@">>>CBCentralManagerStateUnsupported");

                 break;

             case CBCentralManagerStateUnauthorized:

                 NSLog(@">>>CBCentralManagerStateUnauthorized");

                 break;

             case CBCentralManagerStatePoweredOff:

                 NSLog(@">>>CBCentralManagerStatePoweredOff");

                 break;

             case CBCentralManagerStatePoweredOn:

                 NSLog(@">>>CBCentralManagerStatePoweredOn");

                 //开始扫描周围的外设

                 [_manager scanForPeripheralsWithServices:nil options:nil];

                 break;

             default:

                 break;

       }

    }

     

    6.

    //扫描到设备会进入方法

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

    //蓝牙名称

     NSString * blueTouchName1 = peripheral.name;

     

    //判断设备是否符合你的条件

    //符合条件的加到数组存储 (注意一定要加,不然会蹦溃)

      [_peripherals addObject:peripheral];

     

    // 连接设备

      //连接直连设备

               [_manager connectPeripheral:peripheral options:nil];

     

    7.设备连接成功

    #pragma 外设设备连接状态判断

    -(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{

        NSLog(@">>>连接到名称为(%@)的设备-成功",peripheral.name);

        //设置代理

        [peripheral setDelegate:self];

        [peripheral discoverServices:nil];

    }

    失败调用

    -(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{

        

        [SVProgressHUD dismiss];

        [self.navigationController.view makeToast:@"连接设备失败"];

       NSLog(@">>>连接到名称为(%@)的设备-失败,原因:%@",[peripheral name],[error localizedDescription]);

    }

    连接成功之后断开调用

    -(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{

    //    [self.navigationController.view makeToast:@"连接断开"];

        [SVProgressHUD dismiss];

        NSLog(@"error11--%@",error);

    }

     

    8.

    #pragma 扫描外设服务

    -(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{

        

        for (CBService *service in peripheral.services) {

          [service.peripheral discoverCharacteristics:nil forService:service];

        }

    }

    //9.扫描到Characteristics,特征回调

    -(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{

     

        for (CBCharacteristic *characteristic in service.characteristics)

        {

            [peripheral readValueForCharacteristic:characteristic];

        

            //截取设备uuid

            NSString *UID =[UUIDSERVICE substringWithRange:NSMakeRange(4, 4)];

            //转化为大写

            NSString*UUIDString =[UID uppercaseString];

            

            if ([characteristic.UUID.UUIDString isEqualToString:UUIDString]) {

                // 拿到特征,和外围设备进行交互   保存写的特征

                _writeDataCharacteristic = characteristic;

                Byte b = 0xff;

                NSData *data = [NSData dataWithBytes:&b length:sizeof(b)];

                [peripheral writeValue:data forCharacteristic:_writeDataCharacteristic type:0];

                

                [peripheral setNotifyValue:YES forCharacteristic:characteristic];

            }

        }

    }

    10写入数据成功回调方法

    - (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:

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

    //手动断开连接方法

    -(void)disconnectPeripheral:(CBCentralManager *)centralManager

                     peripheral:(CBPeripheral *)peripheral{

        

    }

     

    我在学习过程中遇到好几个大坑,以下是注意点

    1.数组没有添加,程序会崩溃,目前找不到原因

     [_peripherals addObject:peripheral];

     

    2.写数据的时候必须是NSData类型,不然会收不到数据

    因为之前我们公司设备安卓可以接收字符串和16进制,然后安卓传了字符串,老大叫我也传字符串,然后我测了好久没发送成功,如果遇到这问题,叫硬件部的修改接收类型

    3.设备特征码不对,一直连不上

    因为硬件拿回去改了接收类型,特征码也改了,一直没连上,连了几个小时的坑,记得一定要问老大要特征码是什么

    4.设备功率太小,连接成功,但是一直收不到数据

    这是因为设备功率太小,距离太远,你拿到硬件旁边测试就可以了,叫硬件部调大功率

    5.写数据的时候要求必须传特定字符,看你们公司蓝牙协议,有些可能要求20位的

    建议各位如果有厂家demo的一定要看下,如果不行的可以去下载app来测试,蓝牙有特定的app可以测试数据发送

     

    我们公司用的是华麦设备

  • 相关阅读:
    【go语言】Windows下go语言beego框架安装
    分页
    MongoDB用户与权限管理
    MongoDB安装在Centos7下安装
    centos7安装mysql5.7.33 tar包方式
    文件路径分隔符
    python之批量打印网页为pdf文件
    Python驱动SAP GUI完成自动化(五)
    动态内存与智能指针
    关联容器
  • 原文地址:https://www.cnblogs.com/xiwanxiang190351/p/6056967.html
Copyright © 2011-2022 走看看