【问题标题】:Spring boot create a topic and publish so APPS can receive itSpring Boot 创建一个主题并发布,以便APPS可以接收它
【发布时间】:2019-06-02 10:13:59
【问题描述】:

我正在创建一个应用程序,其中有一个“加入房间”按钮,当您单击它时,您会加入一个虚构的房间,在那里您可以看到更多用户进入。 我的想法是创建一个主题,例如 nameRoom,每次用户加入房间时,它都会自动订阅他们,所以如果有另一个更新,他/她将收到更新,例如一个加入或离开。 我被困的事情是: “管理员”可以创建一个“房间”,所以每次管理员创建一个房间应该是一个新的话题,对吧?所以,我的问题是,一旦我在一个房间里,我想创建一个倒计时,比如说 30 秒,当这 30 秒完成时,它开始问我问题,每个人都可以回答这个问题,我需要看看有多少用户回答了,有多少没有回答,这是另一个话题?

流程是:

  1. 管理员创建房间 --> Room1
  2. User1 加入 Room1 后只能看到您在此房间内
  3. 用户 2 加入房间,发现房间里有 2 个人(依此类推,直到用户 5)
  4. 然后计时器下降 30 到 0
  5. 然后作为用户 1,我看到“迈克尔乔丹多大了”和 4 个复选框,每个人都可以回答
  6. 还有一个字段表示已经发布了多少个答案,因此如果问题的时间是 30 秒并且他们是 5 个用户并且他们在不到 30 秒的时间内回答了问题,则必须将问题移至下一个屏幕,即
  7. 回答更快并得分的前 3 名

要明确:

我想知道如何创建主题,然后使用 Spring 发布给他们。例如创建房间不是必需的 MQTT,而是检查谁加入和这个东西,所以我问这个,我怎么能用 MQTT 创建这个?

另外,MQTT 会负责说出所有信息吗?我的意思是每个房间都有一些问题,所以有必要通过 MQTT 知道排名等?

【问题讨论】:

  • 那么问题是什么?
  • 感谢您的回复@RoddyoftheFrozenPeas,我正在尝试了解如何使用 MQTT 的东西从服务器/数据库端做到这一点
  • 不确定是否有帮助,但您可以查看以下存储库:github.com/ddycai/spring-boot-chatrooms
  • @ArthurGurov 如果有一个例子可以让我也可以使用某些东西与我的应用程序交互,那就太好了
  • 嗯,APP通知不是一件简单的事情。您应该使用 Apple 和 Google 机制;对于 Apple,您应该使用 APN(Apple 推送通知服务),而对于 Android,您应该使用 GCM(Google Cloud Messaging)

标签: java spring postgresql spring-boot mqtt


【解决方案1】:

1) 您需要创建适合您应用程序需求的数据库

数据库名称:聊天室

表格:

  • Topics(存储所有mqtt房间主题名称)
  • 房间(每个房间都与一个主题相关联)
  • 用户(每个用户都与一个房间相关联)

2) 设置一个 mqtt 服务器,允许在 mqtt 和 websockets 上连接(支持 javascript 应用程序)

3) 现在创建一个带有以下 api 和网页的 spring boot 应用程序

网页:

  • chatroom.html

  • chatroom.js

API:

  • 创建聊天室(用于管理员)
  • 列出聊天室
  • 加入聊天室(新用户)

步骤:

  • 管理员使用 chatroom.html 网页创建新的聊天室。创建时调用 create chatroom api 来创建新的聊天室。在 api 中,它将订阅新聊天室的新主题。
  • 当普通用户访问 chatroom.html 时,它会列出可用的聊天室(使用 list chatroom api)。单击聊天室后,它将调用加入聊天室 api 来更新数据库中的详细信息。浏览器中的 javascript 可以连接到特定聊天室的 mqtt 主题。
  • 为了管理问题,您需要在后端和前端都有自己的逻辑。您可以使用 Mqtt 主题来传输消息

参考以下链接

对于 javascript http://www.steves-internet-guide.com/using-javascript-mqtt-client-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;
    }
}

【讨论】:

  • 感谢您的回答@Santosh,是否有可能向我解释如何从服务器端创建所有这些代理和东西?我正在取消 Spring boot,但我不知道该页面是在同一个项目上还是在不同的项目上,我的意思是一个项目中的 Server Spring 另一个项目中的 Angular(前端)和其他项目中的 Android
  • 嗨@StuartDTO我已经用代码修改了答案,显示了如何连接到mqtt服务器、断开连接、订阅和发布到mqtt。 Connect 和 disconnect 方法必须分别在应用程序的启动和停止时调用
  • 但是,关于弹簧靴?我需要创建一个主题,将其发送到应用程序,这样他们就可以订阅它,对吗?我需要先知道如何创建后端的东西。然后我可以创建前端和应用程序端,但首先我应该创建一些关于@Angelo 的答案,对吧?
  • 我分享的代码是一个 mqtt 客户端,用于你的 spring boot 应用程序。对于该主题,您可以通过两种方式进行。为所有聊天室使用一个主题或根据创建的房间动态创建主题。有很多方法可以实现你的目标。我向你推荐了一种方法。首先尝试创建原型,然后尝试完善您的设计。您只会在开发阶段了解更多信息。
  • 您是否使用过这个或创建过类似的东西?您看起来好像以前用过它,如果我有一些疑问,也许您可​​以帮助我...
【解决方案2】:

在我的旧项目中,我创建了类似于您需要的东西。 我仍然确信谷歌(和苹果)通知系统更好。无论如何,这里有你需要的。

您可以使用Eclipse Paho 来生成和使用 MQTT 消息。 在我的 android app build.gradle 文件中,我添加了:

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

现在有更新版本的库

该库为您提供所有需要的 API,以便在 Android 设备中使用和生成 MQTT 消息。

在文档部分,您可以找到一个示例应用程序。你可以从那里开始

在服务器端,我使用Apache ActiveMQ 作为代理。它提供了 MQTT 处理程序的嵌入式实现,您可以创建主题和队列以处理 MQTT 消息。

希望有用

安杰洛

编辑部分

假设您想在服务器端使用 ActiveMQ。

您必须下载并安装activemq。在目录${activemq_home}/conf 内的activemq.xml 文件中,您将找到mqtt 配置。就是这一行:

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

这意味着 activemq 在端口 1883(mqtt 默认 TCP/IP 端口)上处理 mqtt 协议消息。

在 activemq 的管理控制台上,您可以创建要用于消息的主题或队列。在应用程序中,您必须将 paho 服务连接到创建的主题或队列。

请注意,默认情况下,activemq 在内存数据库中使用。我建议你配置它以使用普通的 RDBMS 甚至 NoSQL DB。最重要的是您对其进行配置以便将所有消息存储在内存中,否则您可能会冒消息丢失的风险。

此外,如果您在互联网上公开 activemq,我强烈建议您通过安全凭证或使用 SSL 证书来保护它。

【讨论】:

  • 你能解释一下我应该如何创建代理以及或多或少我必须在服务器端执行的步骤吗?
  • 查看我的更新部分。如果您还需要什么,请告诉我。
  • 这很酷,很有趣我需要更多地研究 ActiveMQ,但我想知道是否对于我想要的小东西,只需创建一个应该是主题或队列的房间,然后当应用程序加入它发布的房间并在有更多人加入时查看状态,然后从服务器端向每个订阅的人发送一条消息并从应用程序显示它,你明白了吗?
  • 好吧,我要做的是:在服务器端(例如 Web 应用程序)有人(可能是管理员?)创建一个房间。这意味着还要在 activemq 上创建一个主题或队列。此时应用程序可以显示活动房间,用户可以选择他/她想要加入的房间。这里都是 MQTT 协议。一旦连接到房间,应用程序将连接到房间主题或队列,我们​​可以从服务器端发布 MQTT 消息。所有侦听器(应用程序和其他客户端)都可以使用此消息。从应用程序到服务器也是如此。同样在服务器上你必须有一个 MQTT 监听器
  • 谢谢,你认为这是一个不复杂的实现吗?
猜你喜欢
  • 2016-06-21
  • 2019-01-18
  • 1970-01-01
  • 2022-11-21
  • 2019-11-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多