首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于Xamarin.Andorid的Ble Api示例

用于Xamarin.Andorid的Ble Api示例
EN

Stack Overflow用户
提问于 2018-07-19 01:42:35
回答 1查看 258关注 0票数 2

我正在尝试使用Ble客户端https://developers.google.com/fit/android/ble-sensorsPolar H10连接到我的xamarin android应用程序,我已经在网上搜索过任何xamarin android的示例,但都是徒劳的。有谁知道吗?

我通过在片段中单击按钮来初始化API客户端;因此,当单击ScanButton时,我调用ScanButton_Click函数并初始化Google Api客户端,该客户端正在成功连接。

当我开始扫描ble设备时,我不确定如何获得结果。现在,我相信我只是打印了一个列表,它在控制台中看起来不像一个列表,但在执行Console.WriteLine(list);行时看起来像"com.google.android.gms.internal.zzbsz@8bb6de0“。

我的GoogleAPI客户端代码:

代码语言:javascript
复制
    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);
    }

我在上面使用的类:

代码语言:javascript
复制
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");
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-07-19 01:45:57

我在RxAndroidBle之前用过这个库,它有代码样例和所有的东西。它使用RxJava2,所以它有一点学习曲线,但使用起来非常好用。

下面是他们使用的代码示例:

代码语言:javascript
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51408067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档