Пример Ble Api для Xamarin.Andorid

Я пытаюсь подключить Polar H10 к моему приложению xamarin для Android с помощью Ble. Клиент https://developers.google.com/fit/android/ble-sensors Я искал в Интернете любые образцы для xamarin android, но тщетно. У кого-нибудь есть идеи?

Я инициализирую API-клиент нажатием кнопки во фрагменте; Поэтому, когда ScanButton нажат, я вызываю функцию ScanButton_Click и инициализирую клиент Google Api, который успешно подключается.

Я не уверен, как получить результаты, когда я начинаю сканировать устройства ble. На данный момент я считаю, что просто печатаю список, который не выглядит как список в консоли, но выглядит как «com.google.android.gms.internal.zzbsz@8bb6de0», когда выполняется строка Console.WriteLine(list);.

Мой клиентский код GoogleAPI:

    private void ScanButton_Click(object sender, EventArgs e)
    {
        InitializeGoogleAPIClient();
        mClient.Connect();
    }

    private void InitializeGoogleAPIClient()
    {
        var clientConnectionCallback = new ClientConnectionCallback();                       

        mClient = new GoogleApiClient.Builder(mActivity)
            .AddApi(FitnessClass.BLE_API)
            .AddApi(FitnessClass.SENSORS_API)    
            .AddApi(FitnessClass.RECORDING_API)            
            .AddScope(new Scope(Scopes.FitnessActivityRead))
            .AddScope(new Scope(Scopes.FitnessBodyReadWrite))
            .AddScope(new Scope(Scopes.FitnessLocationReadWrite))
            .AddConnectionCallbacks(clientConnectionCallback)
            .AddOnConnectionFailedListener((ConnectionResult result) => {
                Console.WriteLine("Connection failed. Cause: " + result);
                if (!result.HasResolution)
                {
                    // Show the localized error dialog
                    GooglePlayServicesUtil.GetErrorDialog(result.ErrorCode, mActivity, 0).Show();
                    return;
                }
                if (!authInProgress)
                {
                    try
                    {
                        Console.WriteLine("Attempting to resolve failed connection");
                        authInProgress = true;
                        result.StartResolutionForResult(mActivity, REQUEST_OAUTH);
                    }
                    catch (IntentSender.SendIntentException e)
                    {
                        Console.WriteLine("Exception while starting resolution activity", e);
                    }
                }
            }).Build();

        //OnConnected? start calling Fit APIs
        clientConnectionCallback.OnConnectedImpl = () => InvokeBLEApi();
    }

    private async void InvokeBLEApi()
    {
        var bleScanCallback = new BleConnectionCallBack(mClient);
        bleScanCallback.OnDevice = (device) => ClaimBle(device);            
        StartBleScanRequest request = new StartBleScanRequest.Builder()
            .SetDataTypes(Android.Gms.Fitness.Data.DataType.TypeHeartRateBpm)
            .SetBleScanCallback(bleScanCallback)
            .Build();

        PendingResult pendingResult = FitnessClass.BleApi.StartBleScan(mClient, request);                      
    }

    private void ClaimBle(BleDevice device)
    {           
        PendingResult pending_result = FitnessClass.BleApi.ClaimBleDevice(mClient, device);
        PendingResult list = FitnessClass.BleApi.ListClaimedBleDevices(mClient);

        Console.WriteLine(list);
    }

Классы, которые я использовал выше:

class BleConnectionCallBack : BleScanCallback
{
    private GoogleApiClient mClient;
    private BleDevice mdevice;
    public Action<BleDevice> OnDevice { get; set; }
    public BleConnectionCallBack(GoogleApiClient Client)
    {
        mClient = Client;
    }
    public override void OnDeviceFound(BleDevice device)
    {
        var hr_sensor = device.Name;
        OnDevice(device);
        //PendingResult pendingResult = FitnessClass.BleApi.ClaimBleDevice(mClient, device);
    }

    public override void OnScanStopped()
    {

    }
}

class ClientConnectionCallback : Java.Lang.Object, GoogleApiClient.IConnectionCallbacks
{
    public Action OnConnectedImpl { get; set; }

    public void OnConnected(Bundle connectionHint)
    {
        //once we get the callback we can start calling the Fit APIs
        Console.WriteLine("Connected!!!");

        OnConnectedImpl();
    }

    public void OnConnectionSuspended(int cause)
    {
        if (cause == GoogleApiClient.ConnectionCallbacksConsts.CauseNetworkLost)
        {
            Console.WriteLine("Connection lost.  Cause: Network Lost.");
        }
        else if (cause == GoogleApiClient.ConnectionCallbacksConsts.CauseServiceDisconnected)
        {
            Console.WriteLine("Connection lost.  Reason: Service Disconnected");
        }
    }
}

person Sar    schedule 18.07.2018    source источник


Ответы (1)


Я использовал эту библиотеку до RxAndroidBle, в ней есть примеры кода и все такое. Он использует RxJava2, так что это немного кривая обучения, но очень приятно использовать.

Вот пример кода, который они используют:

Disposable scanSubscription = rxBleClient.scanBleDevices(
    new ScanSettings.Builder()
        // .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) // change if needed
        // .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES) // change if needed
        .build()
    // add filters if needed
)
.subscribe(
    scanResult -> {
        // Process scan result here.
    },
    throwable -> {
        // Handle an error here.
    }
);

// When done, just dispose.
scanSubscription.dispose();
person PmanAce    schedule 18.07.2018