Android MQTT:实现设备信息上报与远程控制

news2024/12/26 21:49:02

Android MQTT:实现设备信息上报与远程控制

1. 介绍

1.1 MQTT是什么?

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,最初由IBM开发,用于连接远程设备与服务器之间的通信。它在物联网(IoT)应用中变得越来越流行,因为它具有以下特点:

  • 轻量级协议:MQTT是一种精简的协议,有效地减少了通信开销,适合于带宽有限的网络。

  • 发布/订阅模型:MQTT采用发布者-订阅者模型,允许设备发布消息到特定主题,其他设备可以订阅这些主题以接收消息。

  • 可靠性:MQTT支持消息质量服务(QoS),可确保消息的可靠传递。

  • 即时通信:它允许设备之间进行实时通信,适用于需要低延迟的应用。

1.2 MQTT在IoT和Android应用中的重要性

在物联网中,数百万台设备需要与云端或其他设备进行通信,而MQTT正是为这种场景而设计的。Android作为智能设备的重要平台之一,通过MQTT可以轻松实现以下功能:

  • 设备信息上报:Android设备可以将其状态、数据或传感器信息发布到MQTT服务器,供其他设备或应用程序订阅。

  • 远程控制:通过MQTT,您可以从远程位置控制Android设备的操作,如远程开关灯、调整温度或播放媒体。

  • 实时通知:Android设备可以实时接收来自其他设备或服务器的通知和命令。

  • 物联网集成:将Android设备集成到物联网生态系统中,实现智能家居、智能城市和智能工业等应用。

在接下来的文章中,我们将介绍如何在Android应用中使用MQTT库实现设备信息上报和远程控制功能。首先,我们将学习如何设置项目并导入所需的MQTT库。

2. 准备工作

在开始使用MQTT协议实现设备信息上报和远程控制功能之前,我们需要进行一些准备工作。这些工作包括导入MQTT库、创建MQTT客户端以及配置连接参数。

2.1 导入MQTT库和设置依赖

为了在Android项目中使用MQTT,我们需要导入相应的MQTT库。这里我们将使用Eclipse Paho Android库,它是一个常用的MQTT库,提供了稳定的功能和良好的支持。您可以通过以下方式将它添加到项目的Gradle依赖中:

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'

这将使您能够在Android应用中使用MQTT协议的客户端。

2.2 创建一个MQTT客户端

在Android应用中,您需要创建一个MQTT客户端来处理与MQTT服务器的通信。以下是创建MQTT客户端的示例代码:

import org.eclipse.paho.android.service.MqttAndroidClient
import org.eclipse.paho.client.mqttv3.MqttConnectOptions

// MQTT服务器地址
val serverUri = "tcp://mqtt.eclipse.org:1883"

// 客户端ID
val clientId = "AndroidDevice"

// 创建MQTT客户端
val mqttClient = MqttAndroidClient(context, serverUri, clientId)

在上面的示例中,我们使用了MqttAndroidClient类来创建一个Android端的MQTT客户端。您需要提供MQTT服务器的地址(例如:tcp://mqtt.eclipse.org:1883)以及一个唯一的客户端ID(例如:AndroidDevice)。

2.3 配置连接参数

成功创建MQTT客户端后,接下来需要配置连接参数,这些参数包括用户名、密码以及连接回调等。以下是配置连接参数的示例代码:

// 创建连接选项
val options = MqttConnectOptions()

// 设置用户名和密码
options.userName = "yourUsername"
options.password = "yourPassword".toCharArray()

// 连接到MQTT服务器
mqttClient.connect(options)

在上面的代码中,我们创建了一个MqttConnectOptions对象,并设置了用户名和密码以进行身份验证。最后,我们使用mqttClient.connect(options)方法连接到MQTT服务器。

这些准备工作将帮助您在Android应用中成功实现MQTT协议的功能。接下来,我们将讨论如何发布设备信息以及远程控制设备。

3. 设备信息上报

在IoT和Android应用中,将设备信息上报到MQTT服务器是一个常见的应用场景。通过MQTT协议,设备可以定期或根据需要将信息发布到服务器,其他设备或应用程序可以订阅并接收这些信息。下面我们将详细介绍如何在Android应用中实现设备信息上报功能。

3.1 将设备信息发布到MQTT服务器

要将设备信息发布到MQTT服务器,首先需要创建一个MQTT消息并将其发布到指定的主题(Topic)。以下是一个示例代码,演示了如何发布设备信息:

import org.eclipse.paho.client.mqttv3.MqttMessage

// 主题名称
val topic = "device/info"

// 你要发布的信息
val messageText = "Device status: online"
val mqttMessage = MqttMessage(messageText.toByteArray())

// 将消息发布到主题
mqttClient.publish(topic, mqttMessage)

在上面的示例中,我们首先指定了一个主题名称(例如:“device/info”),然后创建了一个MqttMessage对象,将设备信息作为字节数组添加到消息中。最后,我们使用mqttClient.publish()方法将消息发布到指定的主题。

3.2 选择合适的主题和消息格式

选择合适的主题和消息格式对于设备信息上报至关重要。主题应该清晰明了,以便其他设备或应用程序能够轻松订阅所需的信息。消息格式也应根据需求进行设计,可以使用JSON、XML或其他格式来表示设备信息。

例如,如果您的应用需要上报温度数据,可以选择一个主题"device/temperature",然后使用JSON格式发布数据,如下所示:

val topic = "device/temperature"
val temperatureData = mapOf("temperature" to 25.5, "unit" to "Celsius")
val message = Gson().toJson(temperatureData)
val mqttMessage = MqttMessage(message.toByteArray())
mqttClient.publish(topic, mqttMessage)

3.3 处理连接中断和失败

在实际应用中,网络连接可能会中断或连接到MQTT服务器失败。为了确保信息上报的可靠性,您需要处理这些情况并采取适当的措施。以下是处理连接中断和失败的示例代码:

mqttClient.setCallback(object : MqttCallbackExtended {
    override fun connectionLost(cause: Throwable?) {
        // 处理连接中断,例如尝试重新连接
        // ...
    }

    override fun messageArrived(topic: String?, message: MqttMessage?) {
        // 处理接收到的消息
        // ...
    }

    override fun deliveryComplete(token: IMqttDeliveryToken?) {
        // 消息发送完成后的回调
        // ...
    }

    override fun connectComplete(reconnect: Boolean, serverURI: String?) {
        if (reconnect) {
            // 重新连接成功
            // ...
        } else {
            // 首次连接成功
            // ...
        }
    }
})

在上面的代码中,我们设置了一个MqttCallbackExtended回调来处理连接中断、接收到的消息以及连接成功等事件。这可以帮助您在设备信息上报过程中更好地处理各种情况。

通过以上步骤,您可以在Android应用中实现设备信息上报功能,并确保信息的可靠传输。在下一部分,我们将讨论如何实现远程控制设备,以便通过MQTT协议进行设备控制。

4. 远程控制

在IoT和Android应用中,除了将设备信息上报到MQTT服务器外,还经常需要实现远程控制设备的功能。通过MQTT协议,您可以轻松地实现Android设备的远程控制,允许其他设备或应用程序向您的设备发送控制命令。下面我们将详细介绍如何在Android应用中实现远程控制功能。

4.1 通过MQTT实现Android设备的远程控制

要通过MQTT实现Android设备的远程控制,首先需要订阅一个或多个特定的主题(Topic),以便接收控制命令。然后,您需要在Android应用中编写代码来监听这些主题,执行相应的控制操作,并发送响应。以下是一个示例流程:

  1. 订阅控制命令主题。

  2. 监听接收到的MQTT消息。

  3. 解析消息内容,识别控制命令。

  4. 执行相应的控制操作(例如,打开/关闭设备、调整设备参数等)。

  5. 发送响应消息以确认执行。

下面是一个使用Kotlin编写的示例代码,演示如何订阅控制命令主题并执行控制操作:

import org.eclipse.paho.client.mqttv3.IMqttMessageListener
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended
import org.eclipse.paho.client.mqttv3.MqttMessage

// 订阅控制命令主题
val controlTopic = "device/control"
mqttClient.subscribe(controlTopic)

// 设置MQTT回调监听器
mqttClient.setCallback(object : MqttCallbackExtended {
    override fun connectionLost(cause: Throwable?) {
        // 处理连接中断
    }

    override fun messageArrived(topic: String?, message: MqttMessage?) {
        // 监听接收到的消息
        if (topic == controlTopic) {
            // 解析消息内容,识别控制命令
            val controlCommand = message?.toString()
            when (controlCommand) {
                "turn_on" -> {
                    // 执行打开设备的操作
                    // ...
                    // 发送响应消息
                    val responseTopic = "device/response"
                    val responseMessage = MqttMessage("Device is turned on.".toByteArray())
                    mqttClient.publish(responseTopic, responseMessage)
                }
                "turn_off" -> {
                    // 执行关闭设备的操作
                    // ...
                    // 发送响应消息
                    val responseTopic = "device/response"
                    val responseMessage = MqttMessage("Device is turned off.".toByteArray())
                    mqttClient.publish(responseTopic, responseMessage)
                }
                else -> {
                    // 未知的控制命令
                }
            }
        }
    }

    override fun deliveryComplete(token: IMqttDeliveryToken?) {
        // 消息发送完成后的回调
    }

    override fun connectComplete(reconnect: Boolean, serverURI: String?) {
        if (reconnect) {
            // 重新连接成功
        } else {
            // 首次连接成功
        }
    }
})

在上面的示例中,我们首先订阅了一个名为"device/control"的主题,以接收控制命令。然后,我们设置了MQTT回调监听器,用于处理接收到的消息。当接收到消息时,我们解析消息内容,根据控制命令执行相应的操作,并发送响应消息以确认执行。

通过以上步骤,您可以在Android应用中实现远程控制设备的功能,实现设备的双向通信。在下一部分,我们将总结本文并提供一些额外的资源,以帮助您进一步探索Android MQTT应用的可能性。

5. 安全性

在将Android设备与MQTT服务器连接以进行信息上报和远程控制时,确保通信的安全性至关重要。在本节中,我们将讨论一些保护MQTT通信的关键安全性措施,以及如何实施访问控制来确保设备信息的隐私和安全。

5.1 使用加密和身份验证保护MQTT通信

加密通信

MQTT通信的安全性可以通过加密来增强。您可以使用TLS/SSL(Transport Layer Security/Secure Sockets Layer)来加密MQTT连接,以确保消息在传输过程中得到加密保护。这可以防止未经授权的访问者拦截和查看消息内容。

要在Android应用中启用加密的MQTT连接,您需要进行以下配置:

import org.eclipse.paho.client.mqttv3.MqttConnectOptions
import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManagerFactory
import java.security.KeyStore
import java.io.InputStream
import java.security.cert.CertificateFactory

// 加载您的服务器证书
val serverCertificateInputStream: InputStream = ... // 加载服务器证书的输入流
val cf = CertificateFactory.getInstance("X.509")
val ca = cf.generateCertificate(serverCertificateInputStream)

// 创建一个包含您的服务器证书的信任库
val keyStore = KeyStore.getInstance(KeyStore.getDefaultType())
keyStore.load(null, null)
keyStore.setCertificateEntry("ca", ca)

// 创建信任管理器
val tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
tmf.init(keyStore)

// 创建SSL上下文
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, tmf.trustManagers, null)

// 创建MQTT连接选项
val mqttConnectOptions = MqttConnectOptions()
mqttConnectOptions.socketFactory = sslContext.socketFactory

身份验证

身份验证是另一个重要的安全性方面。在MQTT通信中,您可以使用用户名和密码进行身份验证,以确保只有授权的用户可以连接到MQTT服务器并执行操作。

要在Android应用中进行身份验证,您可以配置连接选项,如下所示:

val mqttConnectOptions = MqttConnectOptions()
mqttConnectOptions.userName = "yourUsername"
mqttConnectOptions.password = "yourPassword".toCharArray()

5.2 实施访问控制以确保设备信息的隐私和安全

在MQTT通信中,实施访问控制是确保设备信息的隐私和安全的关键。通过控制哪些设备可以访问特定主题,您可以限制信息的可见性。例如,您可以配置MQTT服务器,只允许特定设备发布信息到某些主题或只允许特定设备订阅某些主题。

以下是一个示例,演示如何使用Kotlin设置MQTT发布和订阅的主题:

// 发布信息到"device/info"主题
val publishTopic = "device/info"
val message = "Device status: online"
mqttClient.publish(publishTopic, message.toByteArray(), 0, false)

// 订阅"device/control"主题以接收控制命令
val subscribeTopic = "device/control"
mqttClient.subscribe(subscribeTopic)

在实际应用中,您可以根据设备的身份、角色和权限来配置访问控制策略,以确保信息的隐私和安全。

通过加密通信、身份验证和访问控制,您可以提高Android MQTT应用的安全性,确保设备信息的机密性和完整性。这些安全性措施对于IoT应用和设备之间的可信通信至关重要。

在下一部分,我们将对本文进行总结,并提供一些额外的资源,以帮助您深入了解Android MQTT应用的开发和安全性。

6. 性能优化

在开发Android MQTT应用时,性能是一个关键因素,特别是在IoT和大规模设备通信的场景下。在本节中,我们将探讨一些性能优化策略,以确保您的应用在高负载情况下表现出色。

6.1 消息压缩

在MQTT通信中,消息的大小会直接影响通信的性能和效率。在设备信息上报和远程控制中,您可以考虑使用消息压缩来减小消息的大小,从而降低带宽消耗并提高通信速度。

Android应用可以使用第三方库来实现消息压缩,例如Zlib或Snappy。以下是一个使用Zlib进行消息压缩的示例:

import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.util.zip.DeflaterOutputStream
import java.util.zip.InflaterInputStream

// 压缩消息
fun compressMessage(inputMessage: String): ByteArray {
    val byteArrayOutputStream = ByteArrayOutputStream()
    val deflaterOutputStream = DeflaterOutputStream(byteArrayOutputStream)
    val messageBytes = inputMessage.toByteArray(Charsets.UTF_8)
    deflaterOutputStream.write(messageBytes)
    deflaterOutputStream.close()
    return byteArrayOutputStream.toByteArray()
}

// 解压消息
fun decompressMessage(compressedMessage: ByteArray): String {
    val byteArrayInputStream = ByteArrayInputStream(compressedMessage)
    val inflaterInputStream = InflaterInputStream(byteArrayInputStream)
    val byteArrayOutputStream = ByteArrayOutputStream()
    val buffer = ByteArray(1024)
    var len: Int
    while (inflaterInputStream.read(buffer).also { len = it } > 0) {
        byteArrayOutputStream.write(buffer, 0, len)
    }
    return byteArrayOutputStream.toString(Charsets.UTF_8)
}

通过压缩和解压消息,您可以减小消息的大小,从而降低了消息传输的网络带宽需求。

6.2 QoS级别

MQTT协议定义了三种不同的消息质量服务级别(QoS级别):0、1和2。在性能优化方面,您需要考虑选择合适的QoS级别,以平衡消息传输的可靠性和性能。

  • QoS 0:消息以最低开销发送,但不进行确认,可能会导致消息丢失。
  • QoS 1:消息发送后会等待收到确认,确保消息至少被传输一次,但可能会重复。
  • QoS 2:消息发送后会等待收到确认,并确保消息只被传输一次,但开销最大。

在选择QoS级别时,您需要根据应用场景的需求来权衡性能和消息可靠性。如果应用需要高度可靠的消息传输,可以选择QoS 1或QoS 2,但需要注意它们会增加网络开销。如果性能更为重要,可以选择QoS 0。

6.3 批量操作

在设备信息上报和远程控制中,通常会涉及大量消息的传输和处理。为了提高性能,您可以考虑批量操作,将多个消息打包成一个批处理消息进行传输,从而减少消息传输的开销和频率。

以下是一个示例,演示如何将多个消息打包成一个批处理消息:

// 创建一个批处理消息
fun createBatchMessage(messages: List<String>): ByteArray {
    val byteArrayOutputStream = ByteArrayOutputStream()
    val messageSeparator = "\n".toByteArray(Charsets.UTF_8)

    for (message in messages) {
        val messageBytes = message.toByteArray(Charsets.UTF_8)
        byteArrayOutputStream.write(messageBytes)
        byteArrayOutputStream.write(messageSeparator)
    }

    return byteArrayOutputStream.toByteArray()
}

// 解析批处理消息
fun parseBatchMessage(batchMessage: ByteArray): List<String> {
    val messages = mutableListOf<String>()
    val messageSeparator = "\n".toByteArray(Charsets.UTF_8)
    val byteArrayInputStream = ByteArrayInputStream(batchMessage)
    val buffer = ByteArray(1024)
    var len: Int

    while (byteArrayInputStream.read(buffer).also { len = it } > 0) {
        val messageBytes = buffer.copyOfRange(0, len)
        val message = String(messageBytes, Charsets.UTF_8)
        messages.add(message)
    }

    return messages
}

通过批量操作,您可以减少每个消息的传输和处理次数,提高性能和效率。

在性能优化方面,您可以根据应用需求选择适当的

策略,如消息压缩、QoS级别、批量操作等,以确保Android MQTT应用在各种情况下都能表现出色。这些策略可以根据您的具体应用场景来灵活调整,以实现最佳性能。

在下一部分,我们将对本文进行总结,并提供一些额外的资源,以帮助您深入了解Android MQTT应用的开发和性能优化。

7 Android MQTT:实际应用案例

在本节中,我们将展示一个实际的Android MQTT应用案例,以帮助您更好地理解如何在实际项目中应用MQTT来实现设备信息上报和远程控制。我们将以一个智能家居控制系统为例来演示。

7.1 案例背景

假设您正在开发一个智能家居控制应用,用户可以通过该应用控制家中的灯光和温度。此外,用户还可以查看家庭设备的状态和实时数据。

7.2 实现设备信息上报

7.2.1 导入MQTT库

首先,我们需要导入MQTT库并设置Gradle依赖,以便在Android项目中使用MQTT。我们可以使用Eclipse Paho Android库来实现MQTT通信。

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'

7.2.2 创建MQTT客户端

在我们的Android应用中,创建一个MQTT客户端,该客户端将用于连接到MQTT服务器并发送设备信息。在创建客户端时,需要指定MQTT服务器的地址、客户端ID等信息。

import org.eclipse.paho.client.mqttv3.MqttClient
import org.eclipse.paho.client.mqttv3.MqttConnectOptions
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence

// MQTT服务器地址
val serverUri = "tcp://mqtt.eclipse.org:1883"

// 客户端ID
val clientId = "SmartHomeApp"

// 创建MQTT客户端
val mqttClient = MqttClient(serverUri, clientId, MemoryPersistence())

7.2.3 连接到MQTT服务器

配置连接参数,如用户名和密码,并连接到MQTT服务器。

val options = MqttConnectOptions()
options.userName = "yourUsername"
options.password = "yourPassword".toCharArray()

mqttClient.connect(options)

7.2.4 发布设备信息

使用mqttClient.publish()方法将设备信息发布到MQTT服务器。选择合适的主题和消息格式,然后将信息发送出去。

val topic = "smart-home/lights"
val message = "Light status: ON"
val qos = 1 // 选择适当的QoS级别

mqttClient.publish(topic, message.toByteArray(), qos, false)

7.2.5 处理连接中断和失败

在实际应用中,需要处理MQTT连接中断和失败的情况,以确保设备信息能够成功上报。可以设置连接回调来处理这些事件。

mqttClient.setCallback(object : MqttCallback {
    override fun connectionLost(cause: Throwable?) {
        // 处理连接中断事件
    }

    override fun messageArrived(topic: String?, message: MqttMessage?) {
        // 处理收到的消息
    }

    override fun deliveryComplete(token: IMqttDeliveryToken?) {
        // 消息传递完成时的回调
    }
})

7.3 实现远程控制

7.3.1 订阅控制主题

为了实现远程控制,我们需要订阅一个用于接收控制命令的主题。当控制命令到达时,我们将执行相应的操作。

val controlTopic = "smart-home/control/lights"

mqttClient.subscribe(controlTopic, qos)

7.3.2 接收和执行控制命令

当从MQTT服务器接收到控制命令时,我们可以通过订阅回调来执行相应的操作。

override fun messageArrived(topic: String?, message: MqttMessage?) {
    if (topic == controlTopic) {
        val controlCommand = message.toString()
        // 执行控制操作,例如打开或关闭灯光
        if (controlCommand == "turn_on") {
            // 打开灯光
        } else if (controlCommand == "turn_off") {
            // 关闭灯光
        }
    }
}

7.4 总结

上面演示了如何在Android应用中使用MQTT实现设备信息上报和远程控制,以一个智能家居控制系统为例。通过导入MQTT库、创建MQTT客户端、发布设备信息、订阅控制主题等步骤,我们可以构建强大的物联网应用。

除了上述示例外,您还可以进一步扩展应用,包括实现更多传感器数据的上报和控制、加强安全性、考虑性能优化等。MQTT在IoT领域有着广泛的应用,希望本文能够帮助您入门并掌握其基本用法。

在您的实际项目中,务必考虑设备信息的安全性和隐私保护,采取适当的安全措施以确保通信的保密性。同时,根据您的应用需求,优化MQTT通信以提高性能也是非常重要的。

8. 未来展望

MQTT(Message Queuing Telemetry Transport)在Android应用中有着广泛的应用,随着物联网(IoT)领域的不断发展,MQTT在未来将继续发挥重要作用。以下是MQTT在Android应用的未来展望和发展趋势:

8.1 更广泛的IoT应用

随着越来越多的设备连接到互联网,MQTT将在更多的IoT应用中得到应用。未来,我们可以期待在家庭自动化、智能城市、智能交通等领域看到更多基于MQTT的Android应用,以实现设备之间的无缝通信和协作。

8.2 更多的开源库和工具

随着MQTT的普及,我们可以期待更多开源库和工具的出现,以简化Android应用对MQTT的集成和使用。这些工具将有助于开发人员更轻松地构建可靠的MQTT通信系统,加快应用的开发速度。

8.3 安全性和隐私的重要性

随着IoT设备数量的增加,安全性和隐私保护将变得尤为重要。未来的Android MQTT应用将更注重数据的安全传输和存储,采取更多的加密和身份验证措施,以确保设备信息不被未经授权的访问。

9 结论

本文介绍了如何在Android应用中使用MQTT来实现设备信息上报和远程控制。关键点包括导入MQTT库、创建MQTT客户端、发布设备信息、订阅控制主题、处理连接中断和失败、以及考虑安全性和性能优化。
鼓励读者积极尝试并探索MQTT在他们的Android项目中的应用。MQTT是一个强大的通信协议,可以满足各种IoT应用的通信需求,帮助您构建智能化的Android应用。
希望本文对您在Android MQTT应用开发中有所帮助,祝愿您的物联网应用取得成功!

10 参考文献

  • Eclipse Paho: Eclipse Paho项目是一个提供MQTT实现的开源项目,包括Java、C、Python等多种语言的客户端库。
  • MQTT 3.1.1 协议规范: MQTT官方协议规范,详细介绍了MQTT协议的各个方面。
  • Android MQTT客户端库: Eclipse Paho提供的Android MQTT客户端库的GitHub仓库,包含示例代码和文档。
  • HiveMQ MQTT Academy: 提供有关MQTT的教程、课程和文章,帮助您更深入地了解MQTT。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/982333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5大LOGO免费在线生成器,从此设计不求人!

hi&#xff0c;大家好我是技术苟&#xff0c;每天晚上22点准时上线为你带来实用黑科技&#xff01;由于公众号改版&#xff0c;现在的公众号消息已经不再按照时间顺序排送了。因此小伙伴们就很容易错过精彩内容。喜欢黑科技的小伙伴&#xff0c;可以将黑科技百科公众号设为标星…

19-springcloud(中)

一 服务注册发现 1 什么是服务治理 为什么需要服务治理 在没有进行服务治理前,服务之间的通信是通过服务间直接相互调用来实现的。 过程&#xff1a; 武当派直接调用峨眉派和华山派&#xff0c;同样&#xff0c;华山派直接调用武当派和峨眉派。如果系统不复杂&#xff0c;这样…

vue3+vite项目运行报错[plugin vite:dep-pre-bundle]

报错截图 原因&#xff1a;vue-i18n 插件于9.5更新&#xff0c;打包和引入方式有改变&#xff0c;所以新启动和新部署的项目都会有这个问题。 解决方式&#xff1a; 1.项目全局搜索&#xff1a;vue-i18n/dist/v ue-i18n.cjs.js 然后将搜索到的代码替换为 &#xff1a;vue-i18…

代码泄漏无感知?代码安全审计构筑企业核心资产安全防线

目录 一个不眠之夜 源代码托管&#xff1a;最容易被从内部攻破的堡垒 审计事件&#xff0c;构建源代码安全防护的“最后一道防线” 源代码托管审计事件三要素 源代码托管审计事件的价值 极狐GitLab 审计事件功能 极狐GitLab 审计事件功能特点 极狐GitLab 审计事件功能使…

什么牌子的led台灯质量好?热门的Led护眼台灯推荐

led台灯有环保无污染、耗能低、长寿命等优点&#xff0c;适合用在阅读、书写、批阅等办公或学习的场所。而挑选LED台灯时&#xff0c;分散光挡板做的比较好的优先选择&#xff0c;能分散大量蓝光&#xff0c;对眼睛危害较小。下面&#xff0c;小编为大家推荐五款质量好的led护眼…

几个步骤轻松把PDF转成Excel,你学会了吗

在工作和学习中&#xff0c;我们经常需要将PDF文档中的表格转换为Excel表格&#xff0c;以便进行进一步的编辑和分析。本文将介绍几个简单的步骤&#xff0c;帮助您快速将PDF转换为Excel&#xff0c;并提供一些需要注意的实现方法。 步骤一&#xff1a;选择合适的PDF转Excel工具…

基于SSM的教务管理

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 我们的系统是一个现代…

创新领航 | 竹云产品入选“年度优秀创新软件产品推广目录”

8月31日&#xff0c;由中国电子信息行业联合会主办的第二十五届中国国际软件博览会在天津拉开帷幕&#xff0c;本次大会以“塑造软件新生态 赋能发展新变革”为主题&#xff0c;为全国乃至全球软件行业高质量发展聚智聚“力”。 大会发布“2022-2023年度优秀创新软件产品推广目…

Alpha 测试与 Beta 测试

Alpha测试 Alpha测试 是由用户在 开发环境下 进行的测试&#xff0c;也可以是开发机构内部的用户在模拟实际操作环境下进行的测试。开发者坐在用户旁边&#xff0c;这是在开发者受控的环境下进行的测试。由开发者随时记录下错误情况和使用中的问题。 Beta测试 Beta测试 是由…

Python实现SSA智能麻雀搜索算法优化LightGBM分类模型(LGBMClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法&#xff0c;在2020年提出&a…

MybatisPlus框架教程:入门、条件构造器、接口操作、代码生成器

MybatisPlus框架 文章目录 MybatisPlus框架快速上手条件构造器接口基本操作新版代码生成器 前面我们体验了JPA带来的快速开发体验&#xff0c;但是我们发现&#xff0c;面对一些复杂查询时&#xff0c;JPA似乎有点力不从心&#xff0c;反观稍微麻烦一点的Mybatis却能够手动编写…

嵌入式Linux驱动开发(LCD屏幕专题)(二)

一、结合APP分析LCD驱动程序 1、open app: open("/dev/fb0", ...) 主设备号: 29, 次设备号: 0 -------------------------------------------------------------- kernel:fb_open // fbmem.cstruct fb_info *info;info get_fb_info(fbidx);if (info->fbop…

保留网络[02/3]:大型语言模型转换器的继任者”

一、说明 在这项工作中&#xff0c;我们提出保留网络&#xff08;RETNET&#xff09;作为基础架构大型语言模型的结构&#xff0c;同时实现训练并行&#xff0c; 推理成本低&#xff0c;性能好。我们从理论上推导出这种联系 复发与关注之间。然后我们提出保留机制 序列建模&…

NeRF项目LLFF 解决新场景pose生成的问题

​​​​​​最近一直在做NeRF相关的项目&#xff0c;其中LLFF前向数据集&#xff0c;是NeRF常用数据集&#xff0c;本文讲下怎么对NeRF数据进行处理 几个重要的链接地址 github-llff : GitHub - Fyusion/LLFF: Code release for Local Light Field Fusion at SIGGRAPH 2019g…

0基础学习VR全景平台篇 第97篇:VR步进式漫游

蛙色VR步进式漫游正式上线&#xff01; 为全行业室内场景提供三维空间重建能力&#xff0c;基于真实场景复刻&#xff0c;多维展示打破线下时空限制&#xff0c;提供高性价比的VR空间应用解决方案。 一、什么是步进式漫游&#xff1f; VR步进式漫游&#xff0c;基于AI特征点提…

QT 第五天 TCP通信与数据库

一、数据库增删改查 QT core gui sqlgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your comp…

第4章 【MySQL】InnoDB记录结构

4.1 准备工作 MySQL 服务器上负责对表中数据的读取和写入工作的部分是 存储引擎 &#xff0c;而服务器又支持不同类型的存储引擎&#xff0c;比如 InnoDB 、 MyISAM 、 Memory 啥的&#xff0c;不同的存储引擎一般是由不同的人为实现不同的特性而开发的&#xff0c;真实数据在…

go-zerogo web集成redis实战

前言 上一篇&#xff1a;go-zero&go web集成JWT和cobra命令行工具实战 从零开始基于go-zero搭建go web项目实战-03集成redis实战 源码仓库地址 源码 https://gitee.com/li_zheng/treasure-box golang redis 客户端 Go-Redis 地址&#xff1a; GitHub: https://github.…

酒店常见十大突发事件应急处置方案

文章目录 1.处理客房门未关的程序2.客房内异常声响的处理程序3.酗酒客人应对程序4.预防打架斗殴、流氓滋事5.停电紧急处理6.客人差欠、拒付酒店费用的处理程序7.客人意外受伤、病危、身亡的处理程序8.防风、防汛等自然灾害应急处理9.发生盗窃案处理程序10.客人报告的“丢失/盗窃…

链表例题小总结:

链表&#xff1a; 第一种题型&#xff1a;双指针 力扣203&#xff1a;移除链表元素 力扣题目链接 题意&#xff1a;删除链表中等于给定值 val 的所有节点。示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1…