我实际上是在信息学校学习的,我在用Swift(Xcode 11.3和IOS 13.2设备)编码的自签名应用程序与插入Arduino的BLE模块SH-HC-08之间的连接遇到了一些麻烦。 (UUID:FE60E626-C58C-69F5-324F-43C7C409A93D)
我对速成语言完全陌生,并以这种语言自学这种思维方式。
我正在使用CoreBluetooth检测iPhone上的蓝牙是打开还是关闭。 我实际上无法检查是否检测到我的外围设备,也无法通过我的应用程序发送任何信息。 (不了解如何在CoreBluetooth中配置方法)
我在应用商店下载了标有 LightBlue 和 BluetoothLE 的应用。第一个给我一些有关蓝牙设备的信息,第二个让我通过蓝牙模块将Ascii字符串发送到Arduino。
LightBlue信息1:
LightBlue信息2:
BluetoothLE应用程序:
正如我之前所说,我已经:
设置 centralManagerDidUpdateState 函数
CoreBluetooth代码:
import UIKit
import CoreBluetooth
var texteEnvoyer:String?
var test = false
class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate {
var manager:CBCentralManager!
var module : CBPeripheral!
@IBOutlet weak var labelConnection: UILabel!
@IBOutlet weak var switchConnection: UISwitch!
@IBOutlet weak var labelTextField: UITextField!
@IBOutlet weak var labelTest: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
refresh()
manager = CBCentralManager(delegate: self, queue: nil)
}
func centralManagerDidUpdateState(_ central: CBCentralManager)
{
if(central.state == .poweredOff)
{
let alertController = UIAlertController(title: "Bluetooth", message: "Le bluetooth est déconnecté, veuillez l'activer et vous connecter au module.", preferredStyle: UIAlertController.Style.alert)
alertController.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
present(alertController, animated: true, completion: nil)
test = false
}
if(central.state == .poweredOn)
{
test = true
}
refresh()
}
我尝试使用其他方法,例如 didDiscoverPeripheral 或 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)
}
}
对此有任何经验或帮助的人将对我有很大帮助。 谢谢
答案 0 :(得分:1)
请找到一些有关委派(1)和BLE(2)如何工作的信息。
1)实例化CBCentralObject管理器时,您将视图控制器(自身)作为中央管理器的 delegate 传递,这意味着由中央管理器处理的某些蓝牙事件将被转发到您的视图控制器。
在您的情况下,您似乎没有实现 centralManager(_ central:CBCentralManager,didDiscover外设:CBPeripheral,advertiseData:[String:Any],rssi RSSI:NSNumber)方法每当发现新的外围设备时都会调用它。
一旦找到了发现的外围设备,就可以使用其他委托方法继续该过程
2)如果要与BLE设备通信,则需要执行以下几个步骤:
然后,您可以根据所需的任何特征写入数据,或订阅以侦听BLE设备发出的数据。
答案 1 :(得分:1)
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")
}
}
如果在控制台中看到“ REACHED HERE”,那么我们知道代码已被调用并执行。但是,这并不意味着连接成功。
如果没有看到打印语句“ ENTERED THE FUNCTION”或“ REACHED HERE”,则表示存在基本错误。该函数从未被调用或执行。
我首先要创建一个像这样的函数:
func startScan(){
if let central = manager {
central.scanForPeripheralsWithServices(nil, options: nil)
print("started Scanning")
}
}
然后在viewDidLoad()中 调用开始扫描
override func viewDidLoad(){
super.viewDidLoad(animated)
startScan()
}
然后,一旦发现外围设备,请使用didDiscoverPeripheral
方法(将首先调用该方法)
func centralManager(_ central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) {
print("DISCOVERED PERIPHERAL", peripheral)
// manager.connectPeripheral(peripheral, options: nil)
}
发现后即可连接到它。
希望这会有所帮助
编辑----
尝试将这两行添加到函数中。
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)
}
我忘记在功能参数中添加下划线“ _”
func centralManager(_ central: ....) {}
--------------------^