使用蓝牙以 Swift IOS 语言发送信息
Send informations with Bluetooth in Swift IOS language
我实际上在信息学学校,我在 Swift(Xcode 11.3 和 IOS 13.2 设备中编码的我自己的自签名应用程序之间的连接存在一些问题和一个插入 Arduino 的 BLE 模块 SH-HC-08。 (UUID:FE60E626-C58C-69F5-324F-43C7C409A93D)
我对 swift 语言完全陌生,并且正在用这种语言自学这种思维方式。
我正在使用 CoreBluetooth 来检测 iPhone 上的蓝牙是打开还是关闭。
我实际上无法检查是否检测到我的外围设备,也无法通过我的应用程序发送任何信息。
(不明白如何配置CoreBluetooth中的方法)
我在应用商店下载了名为 LightBlue 和 BluetoothLE 的应用。第一个给我一些关于我的蓝牙设备的信息,第二个允许我通过我的蓝牙模块向我的 Arduino 发送 Ascii 字符串。
浅蓝信息1:
浅蓝资料2:
BluetoothLE 应用程序:
正如我之前所说,我已经:
导入核心蓝牙
将 CBCentralManagerDelegate 和 CBPeripheralDelegate 添加到我的 class ViewController
实例化CBCentralManager和CBPeripheral
设置 centralManagerDidUpdateState 函数
核心蓝牙代码:
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)
}
}
如果有人对此有任何经验或提供任何帮助,将会对我有很大帮助。
谢谢
请查找有关委派 (1) 和 BLE (2) 如何工作的一些信息。
1) 当您实例化您的 CBCentralObject 管理器时,您将您的视图控制器(自身)作为中央管理器的 委托 传递,这意味着您的中央管理器处理了一些蓝牙事件将被转发到您的视图控制器。
在你的情况下,你似乎没有实现 centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) 每次发现新外围设备时调用的方法。
获得发现的外围设备后,您可以使用其他委托方法继续该过程
2) 如果您想与 BLE 设备通信,您需要执行几个步骤:
- 发现设备
- 连接到它
- 发现服务和
特征
然后您可以在任何您想要的特征上写入数据,或订阅收听您的 BLE 设备发出的数据。
日光,
我会小心使用全局变量。
您的全局变量是在 class 范围之外声明的两个变量。
var texteEnvoyer:String?
var test = false
这些有时会导致您的程序出现问题,例如内存泄漏和保留。我并不是说你就是这种情况。但如果您继续开发和发布应用程序,这可能需要重新考虑。我确定现在就您的目的而言,这完全没问题。
对于您 "nothing in the console form the peripheral" 的观点,我们可以尝试添加一些打印语句来帮助我们调试实际发生的情况。
初学者:
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: ....) {}
--------------------^
我实际上在信息学学校,我在 Swift(Xcode 11.3 和 IOS 13.2 设备中编码的我自己的自签名应用程序之间的连接存在一些问题和一个插入 Arduino 的 BLE 模块 SH-HC-08。 (UUID:FE60E626-C58C-69F5-324F-43C7C409A93D)
我对 swift 语言完全陌生,并且正在用这种语言自学这种思维方式。
我正在使用 CoreBluetooth 来检测 iPhone 上的蓝牙是打开还是关闭。 我实际上无法检查是否检测到我的外围设备,也无法通过我的应用程序发送任何信息。 (不明白如何配置CoreBluetooth中的方法)
我在应用商店下载了名为 LightBlue 和 BluetoothLE 的应用。第一个给我一些关于我的蓝牙设备的信息,第二个允许我通过我的蓝牙模块向我的 Arduino 发送 Ascii 字符串。
浅蓝信息1:
浅蓝资料2:
BluetoothLE 应用程序:
正如我之前所说,我已经:
导入核心蓝牙
将 CBCentralManagerDelegate 和 CBPeripheralDelegate 添加到我的 class ViewController
实例化CBCentralManager和CBPeripheral
设置 centralManagerDidUpdateState 函数
核心蓝牙代码:
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)
}
}
如果有人对此有任何经验或提供任何帮助,将会对我有很大帮助。 谢谢
请查找有关委派 (1) 和 BLE (2) 如何工作的一些信息。
1) 当您实例化您的 CBCentralObject 管理器时,您将您的视图控制器(自身)作为中央管理器的 委托 传递,这意味着您的中央管理器处理了一些蓝牙事件将被转发到您的视图控制器。
在你的情况下,你似乎没有实现 centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) 每次发现新外围设备时调用的方法。
获得发现的外围设备后,您可以使用其他委托方法继续该过程
2) 如果您想与 BLE 设备通信,您需要执行几个步骤:
- 发现设备
- 连接到它
- 发现服务和 特征
然后您可以在任何您想要的特征上写入数据,或订阅收听您的 BLE 设备发出的数据。
日光,
我会小心使用全局变量。
您的全局变量是在 class 范围之外声明的两个变量。
var texteEnvoyer:String?
var test = false
这些有时会导致您的程序出现问题,例如内存泄漏和保留。我并不是说你就是这种情况。但如果您继续开发和发布应用程序,这可能需要重新考虑。我确定现在就您的目的而言,这完全没问题。
对于您 "nothing in the console form the peripheral" 的观点,我们可以尝试添加一些打印语句来帮助我们调试实际发生的情况。
初学者:
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: ....) {}
--------------------^