Spring boot создайте тему и опубликуйте ее, чтобы приложение могло ее получить - PullRequest
0 голосов
/ 07 января 2019

Я создаю приложение, в котором есть кнопка с надписью «Присоединиться к комнате», и когда вы нажимаете на нее, вы присоединяетесь к воображаемой комнате, где вы можете видеть, как в нее входит больше пользователей. Моя идея состоит в том, чтобы создать тему для экземпляра nameRoom, и каждый раз, когда пользователь присоединяется к комнате, он автоматически подписывается на него, поэтому, если есть другое обновление, он / она получит обновление, например, одно присоединенное или одно оставленное. То, где я застрял, это: «Администратор» может создать «Комнату», поэтому каждый раз, когда Администратор создает Комнату, это должна быть новая тема, верно? Итак, мой вопрос, как только я нахожусь в комнате, я хотел бы создать как обратный отсчет, скажем, 30 секунд, и когда эти 30 секунд сделаны, он начинает задавать мне вопросы, и каждый может ответить на вопрос, и мне нужно чтобы увидеть, сколько пользователей ответили, а сколько нет, это другая тема?

Поток:

  1. Администратор создает комнату -> Комната1
  2. Пользователь1 присоединяется к Комнате1 и видит, что только вы находитесь в этой комнате
  3. Пользователь2 входит в комнату и видит, что в этой комнате 2 парня (и так до пользователя 5)
  4. Затем таймер понижается с 30 до 0
  5. Тогда как пользователь1 я вижу «Сколько лет Майклу Джордану» и 4 чекбокс, и каждый может ответить
  6. Также есть поле, в котором указано, сколько ответов уже опубликовано, поэтому, если время вопроса составляет 30 секунд, и они 5 пользователей, и они отвечают менее чем за 30 секунд, вопрос должен быть перемещен на следующий экран, который
  7. Топ 3, кто ответил быстрее и набрал

Чтобы быть ясным:

Я хотел бы знать, как создать тему, а затем опубликовать в ней с помощью Spring. Например, для создания комнаты не требуется MQTT, но чтобы проверить, кто присоединяется и что это такое, поэтому я спрашиваю, как я могу создать это с MQTT?

Кроме того, MQTT будет отвечать за всю информацию? Я имею в виду, что в каждой комнате есть несколько вопросов, поэтому через MQTT необходимо знать рейтинг и т. Д.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

В моем старом проекте я создал нечто похожее на то, что вам нужно. Я все еще уверен, что системы уведомлений Google (и Apple) лучше. В любом случае вот что вам нужно.

Вы можете использовать Eclipse Paho для создания и потребления сообщений MQTT. В мой файл build.gradle приложения для Android я добавил:

 compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.0.2'

Теперь есть более новая версия библиотеки

Эта библиотека предлагает вам все необходимые API для того, чтобы получать и генерировать MQTT-сообщения на устройстве Android и с него.

В разделе документации вы можете найти пример приложения. Вы можете начать оттуда

На стороне сервера я использовал Apache ActiveMQ в качестве брокера. Он предлагает встроенную реализацию обработчика MQTT, и вы можете создавать темы и очереди для обработки сообщений MQTT.

Надеюсь, это полезно

Angelo

РАЗДЕЛ РЕДАКТИРОВАНИЯ

Предположим, вы хотите использовать ActiveMQ на стороне сервера.

Вы должны загрузить и установить activemq. В файле activemq.xml внутри каталога ${activemq_home}/conf вы найдете конфигурацию mqtt. Вот эта строка:

<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

Это означает, что activemq обрабатывает сообщения протокола mqtt на порту 1883 (порт TCP / IP mqtt по умолчанию).

На консоли администратора ActiveMQ вы можете создать тему или очередь, которую вы хотите использовать для своих сообщений. В приложении необходимо подключить сервис paho к созданной теме или очереди.

Обратите внимание, что по умолчанию activemq использует в памяти БД. Я предлагаю вам настроить его, чтобы использовать обычную СУБД или даже NoSQL DB. Самое главное, чтобы вы сконфигурировали его так, чтобы все сообщения не были в памяти, иначе вы рискуете потерять сообщения.

Более того, если вы выставляете в Интернете activemq, я настоятельно рекомендую вам защитить его с помощью безопасных учетных данных или SSL-сертификатов.

0 голосов
/ 30 января 2019

1) Вам необходимо создать базу данных, которая соответствует потребностям вашего приложения

Имя базы данных: ChatRoom

Таблица:

  • Темы (для хранения всех названий тем комнаты mqtt)
  • Комната (Каждая комната связана с темой)
  • Пользователь (каждый пользователь связан с комнатой)

2) Настройка сервера mqtt, который позволяет подключаться как к mqtt, так и к websockets (для поддержки приложения javascript)

3) Теперь создайте приложение весенней загрузки со следующими API и веб-страницами

Веб-страницы:

  • chatroom.html

  • chatroom.js

Api:

  • создать чат (для администратора)
  • список чатов
  • присоединиться к чату (для новых пользователей)

Шаги:

  • Администратор использует веб-страницу chatroom.html для создания нового чата. При создании он вызывает создание чата api для создания нового чата. В API это будет подписаться на новую тему для нового чата.
  • Когда обычные пользователи посещают chatroom.html, он отобразит список доступных чатов (используйте список chatroom api). После того, как вы нажмете на чат, он позвонит в раздел присоединиться к чату api, чтобы обновить информацию в базе данных. Javascript из браузера может подключаться к теме mqtt для конкретного чата.
  • Для управления вопросами вам нужно иметь собственную логику как в бэкэнде, так и в интерфейсе. Вы можете использовать тему Mqtt для передачи сообщений

См. Следующие ссылки

Для JavaScript http://www.steves -internet-guide.com / с помощью использования JavaScript-MQTT-клиент-WebSockets /

Для Java https://www.eclipse.org/paho/clients/java/

public final class MessageQueueClient implements MqttCallback
{
    private MqttClient mqttClient;

    private MessageQueueClient() 
    {
    }

    public static MessageQueueClient getInstance() 
    {
        return messageQueueClient;
    }

    @Override
    public void connectionLost(Throwable cause) 
    {
    }

    @Override
    public void messageArrived(String topic, MqttMessage message) 
    {
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken token) 
    {
    }

    //Call this method on server startup to connect to mqtt server(spring boot app start)
    public boolean connect(String hostname, String clientuniqueid) 
    {
        try 
        {
            if (mqttCredentialsDTO != null) 
            {
                MqttConnectOptions options = new MqttConnectOptions();
                options.setAutomaticReconnect(true);
                options.setCleanSession(true);
                mqttClient = new MqttClient(hostname, clientuniqueid);
                mqttClient.connect(options);
                return true;
            }
        } 
        catch (Exception e) 
        {
            e.printStacktrace();
        }
        return false;
    }

    //Call this method on server shutdown to disconnect from mqtt server
    public boolean disconnect() 
    {
        try 
        {
            if (mqttClient != null) 
            {
                mqttClient.disconnect();
                mqttClient.close();
                return true;
            }
        } 
        catch (MqttException e) 
        {
            e.printStacktrace();
        }
        return false;
    }

    //call this method after mqtt connection established to subscribe to any topic
    public boolean subscribe(String topicName, int qos) 
    {
        try 
        {
            if (topicName != null) 
            {
                mqttClient.subscribe(topicName, qos);
                return true;
            }
        } 
        catch (MqttException e) 
        {
            e.printStacktrace();
        }
        return false;
    }


    //call this method after mqtt connection established to publish to any topic
    public boolean publish(String topicName, String message, int qos) 
    {
        try 
        {
            if (topicName != null) 
            {
                MqttMessage mqttMessage = new MqttMessage();
                mqttMessage.setPayload(message.getBytes());
                mqttMessage.setQos(qos);
                mqttClient.publish(topicName, mqttMessage);
                return true;
            }
        } 
        catch (MqttException e) 
        {
            e.printStacktrace();
        }
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...