IObservable <MqttApplicationMessage>не содержит определения для «Где» - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь реализовать MQTT в своем приложении Xamarin для Android, используя this .Однако я получаю сообщение об ошибке

'IObservable<MqttApplicationMessage>', не содержащее определения «Где», и недоступный метод расширения «Где», принимающий первый аргумент типа «IObservable<MqttApplicationMessage>», может бытьнайдено (вы пропустили директиву using или ссылку на сборку?).

Попытался удалить Where, просто чтобы посмотреть, сработает ли он, но вместо этого получить

невозможнопреобразовать лямбда-выражение в тип 'IObserver<MqttApplicationMessage>', потому что это не тип делегата.

Пробовал с использованием Ably.IO и PubNub и смог реализовать его функции pub / sub, но из-за скорости передачи сообщенийпредел Я пытаюсь это и надеюсь, что у него нет ограничения скорости сообщений.(например: ограничение Ably 30-35msg / s)

using System.Collections.Generic;
using System.Text;
using Android.App;
using Android.OS;
using Android.Widget;
using OxyPlot;
using OxyPlot.Series;
using OxyPlot.Xamarin.Android;
using OxyPlot.Axes;
using PubnubApi;
using System.Linq;
using Java.Lang;
using IO.Ably;
using IO.Ably.Realtime;
using System.Drawing;
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.ComponentModel;
using System.Net.Mqtt;
using System.Reactive.Linq;
using System.Threading.Tasks;

protected override async void OnCreate(Bundle savedInstanceState)
{ 
    base.OnCreate(savedInstanceState);

    var configuration = new MqttConfiguration
    {
        //  BufferSize = 128 * 1024,
        Port = 1883,
        KeepAliveSecs = 10,
        WaitTimeoutSecs = 2,
        MaximumQualityOfService = MqttQualityOfService.AtMostOnce,
        AllowWildcardsInTopicFilters = true
    };
    var client = await MqttClient.CreateAsync("test.mosquitto.org", configuration);
    var sessionState = await client.ConnectAsync
        (new MqttClientCredentials(clientId: "foo"), cleanSession: true);
    await client.SubscribeAsync("foo/bar/sampletopic", 
        MqttQualityOfService.AtMostOnce); //QoS0

    client.MessageStream.Where(msg => msg.Topic == "foo/bar/sampletopic").
      Subscribe(msg =>RcvdMsgtext.text=Encoding.ASCII.GetString(msg.payload) );

    pubbtn.Click += async delegate
    {

        var message1 = new MqttApplicationMessage(
            "foo/bar/sampletopic",
            Encoding.UTF8.GetBytes("Foo Message 1"));
        await client.PublishAsync(message1, MqttQualityOfService.AtMostOnce);
    }

//note: Removed some parts but basically all i did was placed  it on OnCreate, changed it
//to async. In using Ably or PubNub "async" is not needed in OnCreate

Ожидание отображения сообщения / изменения текста при нажатии кнопки публикации.

Редактировать: удалось обойти эту ошибку, проверивмои ссылки, увидел System.Reactive с желтым значком, дважды щелкнул по нему, и ошибка IObservable исчезла, но вызвала ошибку, которая требует от меня добавления System.Threading.Tasks.Extensions, которые я сделал в версии 4.0.0 (прочитайте кое-что об использовании этоговерсия для сборки).

Редактировать: Добавлено Использование в коде ..

Сейчас Как только код проходит через эту строку:

var client = await MqttClient.CreateAsync("test.mosquitto.org",       configuration);
       var sessionState = await client.ConnectAsync
       (new MqttClientCredentials(clientId: "foo"), cleanSession: true);

Я получаюошибка

System.TypeLoadException: не удалось разрешить тип с токеном 01000023 из typeref (ожидаемый класс 'System.Reactive.Concurrency.IScheduler' в сборке 'System.Core, версия = 2.0.5.0, культура= нейтральный, PublicKeyToken = 7cec85d7bea7798e ')

1 Ответ

0 голосов
/ 20 сентября 2019

Убедитесь, что System.Reactive.Linq находится в разделе Использование части кода, а также в ссылках.Для VS 2017 может быть использована более низкая версия, поскольку для этого также потребуется добавить System.Threading.Tasks.Extensions

Также в качестве альтернативы используется M2MQTT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...