Android平台.NET/C#连接远程蓝牙设备时如何指定服务名?
在Android .NET/C#中连接蓝牙设备时指定服务名的方法
蓝牙RFCOMM连接的核心标识是UUID,服务名只是注册服务时绑定的友好展示名称,客户端无法直接通过服务名创建连接,必须先找到对应服务名关联的UUID,再用该UUID建立连接。以下是具体实现步骤:
1. 枚举远程设备的所有服务UUID
通过BluetoothDevice.GetUuids()获取设备广播的所有服务UUID,遍历这些UUID并解析对应的服务名。若设备未主动广播UUID,可调用FetchUuidsWithSdp()触发SDP查询,通过监听BluetoothDevice.ActionUuid广播获取结果。
2. 解析服务记录中的服务名
每个UUID对应一条服务记录,其中属性ID为0x0100的字段就是服务名称(UTF-8编码),解析该字段即可匹配目标服务名。
完整代码示例
using Android.Bluetooth; using System.Text; // 目标服务名 const string TargetServiceName = "MyServiceName"; // 假设remoteDevice是已获取的远程蓝牙设备实例 var uuids = remoteDevice.GetUuids(); if (uuids == null) { // 触发主动SDP查询 remoteDevice.FetchUuidsWithSdp(); // 需注册广播接收器监听BluetoothDevice.ActionUuid获取查询结果 return; } foreach (var uuidParcel in uuids) { var serviceUuid = uuidParcel.Uuid; var serviceRecord = remoteDevice.GetServiceRecord(serviceUuid); if (serviceRecord == null) continue; var serviceName = GetServiceNameFromRecord(serviceRecord); if (serviceName == TargetServiceName) { // 找到目标服务,创建RFCOMM套接字 var socket = remoteDevice.CreateRfcommSocketToServiceRecord(serviceUuid); // 执行连接操作 // socket.Connect(); break; } } // 解析服务记录中的服务名 private string GetServiceNameFromRecord(BluetoothDevice.ServiceRecord serviceRecord) { try { // 获取属性ID为0x0100的服务名称字段 var attribute = serviceRecord.GetAttribute(0x0100); if (attribute != null && attribute.Value != null) { return Encoding.UTF8.GetString(attribute.Value); } } catch (Exception) { // 处理解析异常 } return null; }
关键说明
- 权限要求:Android 12及以下需申请
BLUETOOTH、BLUETOOTH_ADMIN权限;Android 13+需申请BLUETOOTH_CONNECT、BLUETOOTH_SCAN权限,部分场景还需定位权限。 - 服务名仅用于外部展示,连接的核心依赖是UUID,需确保目标服务的UUID在远程设备上已正确注册并关联到指定服务名。
内容的提问来源于stack exchange,提问作者user20138168
相关产品推荐
相关产品推荐

