使用Swift IOS语言通过蓝牙发送信息

使用Swift IOS语言通过蓝牙发送信息,ios,swift,iphone,xcode,core-bluetooth,Ios,Swift,Iphone,Xcode,Core Bluetooth,事实上,我在信息学院学习,在我自己用Swift编码的自签名应用程序(Xcode 11.3和IOS 13.2设备)和插在Arduino上的BLE模块SH-HC-08之间的连接上遇到了一些问题。(UUID:FE60E626-C58C-69F5-324F-43C7C409A93D) 我对swift语言和自学这种语言思维方式是完全陌生的 我正在使用CoreBluetooth来检测我的iPhone上的蓝牙是打开还是关闭。 我无法检查我的外设是否被检测到,也无法通过我的应用发送任何信息。 (不了解如何在Co

事实上,我在信息学院学习,在我自己用Swift编码的自签名应用程序(Xcode 11.3和IOS 13.2设备)和插在Arduino上的BLE模块SH-HC-08之间的连接上遇到了一些问题。(UUID:FE60E626-C58C-69F5-324F-43C7C409A93D)

我对swift语言和自学这种语言思维方式是完全陌生的

我正在使用CoreBluetooth来检测我的iPhone上的蓝牙是打开还是关闭。 我无法检查我的外设是否被检测到,也无法通过我的应用发送任何信息。 (不了解如何在CoreBluetooth中配置方法)

我在app store上下载了名为LightBlue和BluetoothLE的应用程序。第一个模块向我提供有关蓝牙设备的fews信息,第二个模块允许我通过蓝牙模块向我的Arduino发送Ascii字符串

浅蓝色信息1:

浅蓝色信息2:

蓝牙应用程序:

正如我之前所说,我已经:

  • 导入核心蓝牙

  • 将CBCentralManagerDelegate和CBPeripheralDelegate添加到我的类ViewController

  • 实例化CBCentralManager和CBPeripheral

  • 设置CentralManagerDipDateState函数

    核心蓝牙代码:

我尝试使用其他方法,如DidDiscoveryPeripheral或didConnected,但我不明白自己在做什么,也找不到任何帮助,无法通过自制的蓝牙应用程序发送信息(首选字符串)

我试图发现我的模块,但我的日志中没有任何“打印”,也不知道我的请求是否完成。。。不管我做得好不好

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        print("Name: \(peripheral.name)")
        self.module = peripheral
        self.module.delegate = self
        
        if(peripheral.name == "SG-HC-08"){
            manager.stopScan()
            manager.connect(self.module, options: nil)
            print(peripheral.name)
        }
    }
有人在这方面有任何经验或提供任何帮助都会对我有很大帮助。
谢谢

请查找有关委派(1)和BLE(2)工作方式的一些信息

1) 实例化CBCentralObject管理器时,您将视图控制器(self)作为中央管理器的代理传递,这意味着中央管理器处理的某些蓝牙事件将转发给视图控制器

在您的情况下,似乎没有实现centralManager(uCentral:CBCentralManager,didDiscover peripheral:CBPeripheral,advertisementData:[String:Any],rssi rssi:NSNumber)方法,该方法在每次发现新外围设备时都会调用

一旦找到外围设备,就可以使用其他委托方法继续此过程

2) 如果要与可编程设备通信,请执行以下几个步骤:

  • 发现设备
  • 连接到它
  • 发现服务和 特征
  • 然后,您可以根据您想要的任何特性写入数据,或订阅以收听您的BLE设备发出的数据。

    Jikko

    我会小心使用全局变量

    全局变量是在类范围之外声明的两个变量

    var texteEnvoyer:String? 
    var test = false
    
    这些有时会导致程序出现问题,例如内存泄漏和保留。我并不是说你就是这样。但如果您继续开发和发布应用程序,这可能需要重新思考。我敢肯定,为了你的目的,现在这是完全好的

    对于“控制台中没有任何内容”这一点,我们可以尝试添加一些打印语句来帮助我们调试实际发生的事情

    首先:

    func centralManagerDidUpdateState(_ central: CBCentralManager){
       //.....
       print("ENTERED THE FUNCTION")
       if(peripheral.name == "SG-HC-08"){
            manager.stopScan()
            manager.connect(self.module, options: nil)
            print("REACHED HERE")
        }
    }
    
    如果在控制台中看到“到达此处”,那么我们知道代码已被调用并执行。但是,这并不意味着连接成功

    如果我们没有看到print语句“ENTERED the FUNCTION”或“reach HERE”,则表示存在基本错误。该函数从未被调用或执行

    我首先创建一个函数,如下所示:

    func startScan(){
      if let central = manager {
        central.scanForPeripheralsWithServices(nil, options: nil)
        print("started Scanning")
      }
    }
    
    然后在viewDidLoad()中 调用开始扫描

    override func viewDidLoad(){
        super.viewDidLoad(animated)
        startScan()
    }
    
    然后,一旦发现外围设备,使用
    didiscoverperipal
    方法(将首先调用该方法)

    一旦发现,您就可以连接到它

    希望这有帮助

    编辑----

    尝试将这两行添加到函数中

       peripheral.delegate = self
       peripheral.discoverServices(nil)
    
    像这样

    func centralManager(_ central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) {
      print("DISCOVERED PERIPHERAL", peripheral)
      // manager.connectPeripheral(peripheral, options: nil)
    }
    
    我忘了在函数参数中添加下划线“\u1”

    func centralManager(_ central: ....) {}
    
    --------------------^
    

    一般来说,问题涉及具体要求。您有必要提供一些代码来说明您已经尝试过的内容。通过提供一些您已经尝试过的代码,它将大大增加您的问题被回答的机会。例如,你说“我实际上无法检查我的外设是否被检测到,也无法通过我的应用程序发送任何信息”。如果我们看不到您的代码,社区将无法帮助调试。通过共享您用于执行此操作的代码,将有助于社区回答您的问题。老实说,我尝试添加一些代码,我不知道这是否是执行此操作的好方法…如果是执行此操作的错误方法,则无所谓。。。这是您学习的方式:)没错:)您在尝试运行代码时是否遇到任何错误?你的应用程序崩溃了吗?或者什么都没发生。另外:在代码中添加一个print语句,您可以在其中调用“manager.connect(self.module,options:nil)”,如果它打印,则只需说print(“到达此处”),表示代码已执行。简单的调试步骤对于步骤1,我确实实现了centralManager(…DidDiscoveryPeripheral…),但当我尝试在函数中添加一些打印来调试自己时,它甚至没有达到函数的要求对于第二步,感谢它帮助我更多地了解BLE的工作原理:)我们同时发布了消息,我没有看到您使用它:)我想您忘记了使用中央管理器启动扫描。好的,我将尝试避免全局变量^^^我也尝试了“初学者”调试方法:)但它没有显示任何内容(在centralManager(…DidDiscoveryPeripheral…)中)。因此我尝试了startScan()和yep日志,显示第一次打印(“开始扫描”),但没有其他内容。它似乎不想进入
    func centralManager(_ central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) {
      print("DISCOVERED PERIPHERAL", peripheral)
      // manager.connectPeripheral(peripheral, options: nil)
    }
    
    func centralManager(_ central: ....) {}
    
    --------------------^