从BluetoothLE设备获取本机设备信息

时间:2018-05-03 09:34:21

标签: xamarin xamarin.forms

我在我的Xamarin项目中使用Plugin.BLE nuget包来查询我拥有的BLE设备。它似乎工作正常,但是当触发找到的设备事件时,有一个对象作为整个设备对象的一部分返回。该对象称为NativeDevice。

Intellisense表明这是一个可以在平台上操作的对象,这正是我想要做的,所以我可以在我的mvvm框架中存储和处理。

问题在于,如果我将对象作为设备投射到平台上并将其存储在var中,则var始终为null。

我应该如何从平台上的对象获取值,以便将它们传递回我的视图模型?

我的代码看起来像这样

(在表单项目中)

adapter.DeviceDiscovered += (s, a) =>
        {
            var adList = new List<AdvertisingRecords>();
            foreach (var r in a.Device.AdvertisementRecords)
            {
                adList.Add(new AdvertisingRecords { Data = r.Data, Type = (AdvertisingRecordType)r.Type });
            }

            var newbtd = new BluetoothDevice
            {
                AdvertisementRecords = adList,
                NativeDevice = DependencyService.Get<INativeDevice>().ConvertToNative(a.Device.NativeDevice),
                Name = a.Device.Name,
                Rssi = a.Device.Rssi,
                Id = a.Device.Id,
                State = (BluetoothStates)a.Device.State
            };
            btd.Add(newbtd);
        };

在平台上

[assembly: Xamarin.Forms.Dependency(typeof(NativeDeviceConverter))]
namespace MyApp.Droid.Injected
{
    public class NativeDeviceConverter : INativeDevice
    {
        public NativeDevice ConvertToNative(object device)
        {
            var dev = device as Device;
            if (dev != null)
                return new NativeDevice { Name = !string.IsNullOrEmpty(dev.BluetoothDevice.Name) ? dev.BluetoothDevice.Name : string.Empty, Address = dev.BluetoothDevice.Address, Type = dev.BluetoothDevice.Type.ToString() };
            else
                return new NativeDevice();
        }
    }
}

NativeDevice是我在VM中使用的抽象类

1 个答案:

答案 0 :(得分:0)

设备值null的原因是a.Device.NativeDevice的类型不是设备类型。它是NativeObject所以对于android它是BluetoothDevice类型,对于ios,它是CBPeripheral。

据我所知,您希望传递一个类型为Device的设备。所以你只需要将它替换为

NativeDevice = DependencyService.Get<INativeDevice>().ConvertToNative(a.Device.NativeDevice)

NativeDevice = DependencyService.Get<INativeDevice>().ConvertToNative(a.Device)

现在你可以在android中使用Device.BluethoothDevice。