Я пытаюсь реализовать 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 ')