使用Swift IOS语言通过蓝牙发送信息
事实上,我在信息学院学习,在我自己用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: 蓝牙应用程序: 正如我之前所说,我已经:使用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
- 导入核心蓝牙
- 将CBCentralManagerDelegate和CBPeripheralDelegate添加到我的类ViewController
- 实例化CBCentralManager和CBPeripheral
- 设置CentralManagerDipDateState函数 核心蓝牙代码:
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) 如果要与可编程设备通信,请执行以下几个步骤:
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: ....) {}
--------------------^