我正在尝试在我的 MAUI 应用程序中使用手机上的蓝牙。我关注了这篇文章。 我知道这可能不是最好的资源,但我找不到其他资源。 我是否在某个地方犯了错误,或者这不是正确的策略?
对于上下文,我正在尝试通过 HC-05 模块连接到我的 arduino。
但是,当我尝试使用 DependencyService.Get 时,它返回 null。
这是我的界面,位于 App.xaml.cs 中:
namespace RobotControl
{
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new AppShell();
}
}
public interface IBluetoothConnector
{
List<string> GetConnectedDevices();
void Connect(string deviceName);
public void Write(byte[] data);
}
}
这是我的实现,位于 Platforms/Android/BluetoothConnector.cs:
using Android.Bluetooth;
using Java.Util;
using RobotControl.Platforms.Android.Bluetooth;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
[assembly: Dependency(typeof(RobotControl.Platforms.Android.Bluetooth.BluetoothConnector))]
namespace RobotControl.Platforms.Android.Bluetooth
{
class BluetoothConnector : IBluetoothConnector
{
BluetoothAdapter adapter;
private const string SspUuid = "00001101-0000-1000-8000-00805f9b34fb";
private BluetoothSocket? socket;
public void Connect(string deviceName)
{
var device = adapter.BondedDevices.FirstOrDefault(d=> d.Name == deviceName);
socket = device.CreateRfcommSocketToServiceRecord(UUID.FromString(SspUuid));
socket.Connect();
}
public void Write(byte[] data)
{
}
public List<string> GetConnectedDevices()
{
adapter = BluetoothAdapter.DefaultAdapter;
if (adapter == null)
{
throw new Exception("No Bluetooth adapter");
}
if (adapter.IsEnabled)
{
if(adapter.BondedDevices.Count >0)
{
return adapter.BondedDevices.Select(x => x.Name).ToList();
}
}
else
{
Console.WriteLine("BT is not enabled");
}
return new List<string>();
}
}
}
namespace RobotControl
{
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new AppShell();
}
}
public interface IBluetoothConnector
{
List<string> GetConnectedDevices();
void Connect(string deviceName);
public void Write(byte[] data);
}
}
我正在尝试访问该服务。 Lhand.xaml.cs
namespace RobotControl
{
public partial class LHand : ContentPage
{
public int L_PinkyAngle;
public int L_RingAngle;
public int L_MiddleAngle;
public int L_IndexAngle;
public int L_ThumbAngle;
public int L_RotaAngle;
public LHand()
{
InitializeComponent();
}
private async void SPinky_ValueChanged(object sender, ValueChangedEventArgs e)
{
var connector = DependencyService.Get<IBluetoothConnector>();
if(connector == null)
{
await DisplayAlert("er", "connector is null", "huh");
}
else
{
await DisplayAlert("er", "isnt null", "huh");
}
string x = "";
foreach(string s in connector.GetConnectedDevices())
{
x += s + "\n";
}
await DisplayAlert("er", x+ "", "huh");
}
private void SRing_ValueChanged(object sender, ValueChangedEventArgs e)
{
}
private void SMiddle_ValueChanged(object sender, ValueChangedEventArgs e)
{
}
private void SIndex_ValueChanged(object sender, ValueChangedEventArgs e)
{
}
private void SThumb_ValueChanged(object sender, ValueChangedEventArgs e)
{
}
}
}
感谢您的帮助。
你没有抓住重点。
[assembly: Dependency(typeof(RobotControl.Platforms.Android.Bluetooth.BluetoothConnector))]
这里的this,指向它自己,并且应该指向多平台类型。
(编辑:我还会尝试使用 android 类型手动注入它,并使用多平台类型检索它。)
示例:
这是多平台代码。它位于特定于平台的文件夹之外。
public interface IMyInterface
{
string Get();
}
如您所见,它只承诺有一个方法,称为“get”并返回字符串。你只在多平台部分写这个。没有别的了。
这是特定于平台的代码。它的位置是文件夹“Windows”,或者可能是“Android”,甚至是“Tyzen”。它的不同之处在于您可以调用针对特定平台的方法。
class MyPlatformImplementation : IMyInterface
{
public string Get()
{
return "got it!";
}
}
在您的 Program 类中,您注入特定于平台的类型。
DependencyService.Register<MyPlatformImplementation>();
在页面逻辑中,当您想实际运行此代码时,您可以这样做:
DependencyService.Get<IMyInterface>().Get();
(这将返回“明白了!”)
我就是这么做的。我绝对确定它会起作用。
您注册了该服务吗?
// App.xaml.cs
DependencyService.Register<IBluetoothConnector, BluetoothConnector>();
另外,请参阅这个问题MAUI:DependencyService.Get