You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Xamarin iOS中连接GATT服务器及BLE工作机制咨询

iOS下Xamarin Forms的GATT服务器与BLE工作机制

iOS平台的BLE(蓝牙低功耗)交互完全依赖CoreBluetooth框架,GATT服务器在iOS中对应CBPeripheralManager角色,核心工作逻辑如下:

  • 角色定义:GATT服务器负责发布BLE服务、特征及描述符,并响应客户端(CBCentralManager)的读写、订阅请求
  • iOS平台限制:
    • 作为GATT服务器时,需在Info.plist配置蓝牙权限,并开启后台模式(勾选Uses Bluetooth LE accessories和Acts as a Bluetooth LE accessory)
    • 后台状态下,GATT服务器的广播UUID会被系统隐藏,仅能被已配对或曾连接过的客户端发现
  • GATT层级结构:服务器以服务(CBService)为顶层单元,每个服务包含多个特征(CBCharacteristic),特征可附加描述符(CBDescriptor),所有元素通过唯一UUID标识,客户端通过UUID定位目标资源
iOS中连接GATT服务器的具体步骤(Xamarin Forms实现)

由于Xamarin Forms是跨平台框架,BLE操作需基于iOS原生API实现,以下是核心步骤及代码示例:

1. 配置权限与后台模式

在iOS项目的Info.plist中添加蓝牙权限说明:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要蓝牙连接GATT服务器以获取数据</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>需要蓝牙连接GATT服务器以获取数据</string>

同时在项目Capabilities中开启Background Modes,勾选Uses Bluetooth LE accessories选项。

2. 初始化CBCentralManager(客户端)

创建BLE管理类,继承CBCentralManagerDelegate:

using CoreBluetooth;
using Foundation;
using System;

public class BLECentralHandler : CBCentralManagerDelegate
{
    private CBCentralManager _centralManager;
    private CBPeripheral _targetPeripheral;
    // 目标GATT服务器的服务UUID
    private readonly CBUUID _targetServiceUuid = CBUUID.FromString("YOUR_SERVICE_UUID");

    public BLECentralHandler()
    {
        // 主线程初始化蓝牙管理器
        _centralManager = new CBCentralManager(this, DispatchQueue.MainQueue);
    }

    // 蓝牙状态更新回调
    public override void UpdatedState(CBCentralManager central)
    {
        if (central.State == CBManagerState.PoweredOn)
        {
            // 仅扫描包含目标服务UUID的外设
            central.ScanForPeripherals(new[] { _targetServiceUuid });
        }
        else
        {
            Console.WriteLine($"蓝牙状态异常:{central.State}");
        }
    }
}

3. 扫描并连接目标GATT服务器

实现扫描回调,筛选目标外设并发起连接:

public override void DiscoveredPeripheral(CBCentralManager central, CBPeripheral peripheral, NSDictionary advertisementData, NSNumber RSSI)
{
    // 可通过外设名称或广播数据筛选目标GATT服务器
    if (peripheral.Name == "YOUR_GATT_SERVER_NAME")
    {
        _targetPeripheral = peripheral;
        central.StopScan();
        // 发起连接
        central.ConnectPeripheral(peripheral);
    }
}

// 连接成功回调
public override void ConnectedPeripheral(CBCentralManager central, CBPeripheral peripheral)
{
    Console.WriteLine($"已连接GATT服务器:{peripheral.Name}");
    // 设置外设代理,用于后续服务/特征发现
    peripheral.Delegate = this;
    // 发现外设所有服务
    peripheral.DiscoverServices();
}

// 连接失败回调
public override void FailedToConnectPeripheral(CBCentralManager central, CBPeripheral peripheral, NSError error)
{
    Console.WriteLine($"连接失败:{error.LocalizedDescription}");
    // 可添加重连逻辑
}

4. 发现服务与特征

实现服务、特征发现回调,定位目标操作资源:

// 服务发现回调
public override void DiscoveredService(CBPeripheral peripheral, NSError error)
{
    if (error != null)
    {
        Console.WriteLine($"发现服务失败:{error.LocalizedDescription}");
        return;
    }

    foreach (var service in peripheral.Services)
    {
        if (service.UUID == _targetServiceUuid)
        {
            // 发现目标服务下的所有特征
            peripheral.DiscoverCharacteristics(service);
        }
    }
}

// 特征发现回调
public override void DiscoveredCharacteristic(CBPeripheral peripheral, CBService service, NSError error)
{
    if (error != null)
    {
        Console.WriteLine($"发现特征失败:{error.LocalizedDescription}");
        return;
    }

    foreach (var characteristic in service.Characteristics)
    {
        // 定位目标读写特征
        if (characteristic.UUID == CBUUID.FromString("YOUR_CHARACTERISTIC_UUID"))
        {
            // 读取特征值
            peripheral.ReadValue(characteristic);
            // 订阅特征通知(若特征支持通知属性)
            peripheral.SetNotifyValue(true, characteristic);
        }
    }
}

5. 处理特征数据与通知

实现特征数据更新回调,解析并处理数据:

public override void UpdatedCharacterteristicValue(CBPeripheral peripheral, CBCharacteristic characteristic, NSError error)
{
    if (error != null)
    {
        Console.WriteLine($"获取特征数据失败:{error.LocalizedDescription}");
        return;
    }

    // 将二进制数据转为字符串(根据实际数据格式调整)
    var data = characteristic.Value;
    string value = NSString.FromData(data, NSStringEncoding.UTF8);
    Console.WriteLine($"收到特征数据:{value}");
    
    // 可通过MessagingCenter将数据传递给Xamarin Forms共享代码
}

注意事项

  • Xamarin Forms中需通过DependencyService调用上述iOS平台代码,实现跨平台层的交互
  • iOS 13+必须申请NSBluetoothAlwaysUsageDescription权限,否则后台无法维持BLE连接
  • 需处理断开重连逻辑,在DisconnectedPeripheral回调中触发重连

内容的提问来源于stack exchange,提问作者Charmy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:50:46