当前位置: 首页 > news >正文

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

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: Intwhile (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: Intwhile (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。

相关文章:

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

Android MQTT&#xff1a;实现设备信息上报与远程控制 1. 介绍 1.1 MQTT是什么&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息传输协议&#xff0c;最初由IBM开发&#xff0c;用于连接远程设备与服务器之间的通信。它在物…...

Python爬虫——新手使用代理ip详细教程

Python代理IP爬虫是一种可以让爬虫拥有更多网络访问权限的技术。代理IP的作用是可以为爬虫提供多个IP地址&#xff0c;从而加快其爬取数据的速度&#xff0c;同时也可以避免因为访问频率过高而被网站封禁的问题。本文将介绍如何使用Python实现代理IP的爬取和使用。 一、代理IP的…...

idea VCS配置多个远程仓库

Idea VCS配置多个远程仓库 首先要有连个远程仓库地址 idea 添加数据源 查看推送记录 添加数据源 ok之后填写账号密码 推送本地项目 选择不同远程地址 push 查看不同远程地址的 不同分支的 推送记录 不期而遇的温柔&#xff1a; 应用开源架构进行项目开发&#xff0c;特别是那…...

LKPNR: LLM and KG for Personalized News Recommendation Framework

本文是LLM系列文章&#xff0c;针对《LKPNR: LLM and KG for Personalized News Recommendation Framework》的翻译。 LKPNR:LLM和KG的个性化新闻推荐框架 摘要1 引言2 相关工作3 问题定义4 框架5 实验6 案例7 结论 摘要 准确地向用户推荐候选新闻文章是个性化新闻推荐系统面…...

Xshell只能打开一个会话、左边栏消失不见、高级设置在哪儿、快捷键设置解决

Xshell只能打开一个会话、左边会话栏消失不见、高级设置在哪儿解决 1.问题&#xff1a; xshell会话&#xff08;窗口&#xff09;上方切换栏不见了的处理办法 解决方法&#xff1a;ctrl shift t 2.问题&#xff1a; 左边会话管理器不见了 解决方法&#xff1a; 3.问题…...

Android Retrofit 高级使用与原理

简介 在 Android 开发中&#xff0c;网络请求是一个极为关键的部分。Retrofit 作为一个强大的网络请求库&#xff0c;能够简化开发流程&#xff0c;提供高效的网络请求能力。本文将深入介绍 Retrofit 的高级使用与原理&#xff0c;帮助读者更全面地理解和应用这一库。 什么是…...

Unity3D开发流程及注意事项

使用Unity3D开发游戏需要遵循一定的流程和注意事项&#xff0c;以确保项目的顺利进行并获得良好的结果。以下是一般的游戏开发流程以及一些注意事项&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 游…...

表单引擎的自定义控件的概念与设计

基本概念 概述 控件的定义&#xff1a;用于展示或者采集数据的表单元素&#xff0c;称为控件,比如&#xff1a;文本框、下拉框、单选按钮、从表等.自定义控件&#xff1a;表单引擎提供的基础控件之外的控件称为自定义控件, 这些控件由开发人员自己定义&#xff0c;比如&#…...

leetcode刷题--栈与递归

文章目录 1. 682 棒球比赛2. 71 简化路径3. 388 文件的最长绝对路径4. 150 逆波兰表达式求值5. 227. 基本计算器II6. 224. 基本计算器7. 20. 有效的括号8. 636. 函数的独占时间9. 591. 标签验证器10. 32.最长有效括号12. 341. 扁平化嵌套列表迭代器13. 394.字符串解码 1. 682 棒…...

自然语言处理——数据清洗

一、什么是数据清洗 数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序&#xff0c;包括检查数据一致性&#xff0c;处理无效值和缺失值等。与问卷审核不同&#xff0c;录入后的数据清理一般是由计算机而不是人工完成。 ——百度百科 二、为什么要数据清洗 现实生…...

MySql学习笔记07——存储引擎介绍

存储引擎 Mysql中特有的术语&#xff0c;Oracle中没有。 存储引擎就是一个表存储/组织数据的方式。不同的存储引擎&#xff0c;表存储数据的方式不同。 指定存储引擎 在建表的时候可以在最后小括号的")"的右边使用&#xff1a; ENGINE来指定存储引擎。 CHARSET来…...

Java基础学习笔记-1

前言 Java 是一门强大而广泛应用的编程语言&#xff0c;它的灵活性和跨平台特性使其成为许多开发者的首选。无论您是刚刚入门编程&#xff0c;还是已经有一些编程经验&#xff0c;掌握 Java 的基础知识都是构建更复杂程序的关键。 本学习笔记旨在帮助您深入了解 Java 编程语言…...

以太坊虚拟机

1.概述 以太坊虚拟机 EVM 是智能合约的运行环境。它不仅是沙盒封装的&#xff0c;而且是完全隔离的&#xff0c;也就是说在 EVM 中运行代码是无法访问网络、文件系统和其他进程的。甚至智能合约之间的访问也是受限的。 2.账户 以太坊中有两类账户&#xff08;它们共用同一个…...

说说BTree和B+Tree

分析&回答 B树索引是B树在数据库中的一种实现&#xff0c;是最常见也是数据库中使用最为频繁的一种索引。B树中的B代表平衡&#xff08;balance&#xff09;&#xff0c;而不是二叉&#xff08;binary&#xff09;&#xff0c;因为B树是从最早的平衡二叉树演化而来的。 接…...

8.1.3 Bit representation and coding - 解读

这段描述定义了一些序列&#xff0c;并规定了它们在编码信息时的使用方式。下面是对每个序列的解析&#xff1a; 1. 序列X&#xff1a;在位持续时间的一半之后&#xff0c;将发生一个“暂停”。这个序列用于表示逻辑“1”。 2. 序列Y&#xff1a;在整个位持续时间内&#xff0c…...

spring 理解

spring容器 程序启动时&#xff0c;会给spring容器一个清单&#xff0c;清单中列出了需要创建的对象以及对象依赖关系&#xff0c;spring容器会创建和组装好清单中的对象&#xff0c;然后将这些对象存放在spring容器中&#xff0c;当程序中需要使用的时候&#xff0c;可以到容…...

实战SpringMVC之CRUD

目录 一、前期准备 1.1 编写页面跳转控制类 二、实现CRUD 2.1 相关依赖 2.2 配置文件 2.3 逆向生成 2.4 后台代码完善 2.4.1 编写切面类 2.4.2 编写工具类 2.4.3 编写biz层 2.4.4 配置mapper.xml 2.4.5 编写相应接口类&#xff08;MusicMapper&#xff09; 2.4.6 处…...

TCP机制之连接管理(三次握手和四次挥手详解)

TCP的连接管理机制描述了连接如何创建以及如何断开! 建立连接(三次握手) 三次握手的过程 所谓建立连接就是通信双方各自要记录对方的信息,彼此之间要相互认同;这里以A B双方确立男女朋友关系为例: 从图中可以看出,通信双方各自向对方发起一个"建立连接"的请求,同时…...

NLP(3)--GAN

目录 一、概述 二、算法过程 三、WGAN 1、GAN的不足 2、JS散度、KL散度、Wasserstein距离 3、WGAN设计 四、Mode Collapse and Mode Dropping 1、Mode Collapse 2、Mode Dropping 3、FID 四、Conditional GAN 一、概述 GAN&#xff08;Generative Adversial Networ…...

无涯教程-JavaScript - IMLOG2函数

描述 IMLOG2函数以x yi或x yj文本格式返回复数的以2为底的对数。可以从自然对数计算复数的以2为底的对数,如下所示- $$\log_2(x yi)(log_2e)\ln(x yi)$$ 语法 IMLOG2 (inumber)争论 Argument描述Required/OptionalInumberA complex number for which you want the bas…...

SpringBoot复习:(61)拦截器(HandlerInterceptor)的用法

一、自定义拦截器&#xff1a; package cn.edu.tju.interceptor;import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRespo…...

【PyQT5教程】-01入门PyQT5

PyQT介绍 1.Qt 1.1 介绍 Qt&#xff08;读作“cute”&#xff09;是一个跨平台的C应用程序开发框架&#xff0c;最初由挪威公司Trolltech&#xff08;现在是Qt公司的一部分&#xff09;开发。Qt提供了一系列工具和类库&#xff0c;用于开发图形界面应用程序、命令行工具和服务…...

判断字符串s是否为字符串t的子序列

题目&#xff1a;给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一…...

数据结构之队列的实现(附源码)

目录 一、队列的概念及结构 二、队列的实现 拓展&#xff1a;循环队列 三、初学的队列以及栈和队列结合的练习题 一、队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(Fi…...

[A题]2023 年全国大学生数学建模比赛思路、代码更新中.....

&#x1f4a5;1 概述 构建以新能源为主体的新型电力系统&#xff0c;是我国实现“碳达峰”“碳中和”目标的一项重要措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。定日镜是塔式太阳能光热发电站&#xff08;以下简称塔式电站&#xff09;收集太阳能的基本组…...

Tailwind 练手项目

Tailwind 练手项目 用到的技巧 Tailwind CSS 速成 应该都提过了&#xff0c;我不记得这里有什么特别新的知识 整体完成图大概这样&#xff1a; 一个纯静态页面&#xff0c;没有做 JS 之类的特效&#xff0c;不过做了移动端适配&#xff0c;说实话我写到一半的时候改了不少………...

SpringMVC_SSM整合

一、回顾SpringMVC访问接口流程 1.容器加载分析 容器分析 手动注册WebApplicationContext public class ServletConfig extends AbstractDispatcherServletInitializer {Overrideprotected WebApplicationContext createServletApplicationContext() {//获取SpringMVC容器An…...

【操作系统】电脑上没有IIS怎么办

文章目录 前言一、查看二、解决 前言 有的新机刚开始在计算机-管理-服务下没有IIS网络服务怎么办。 一、查看 桌面计算机/此电脑 鼠标右键&#xff1a;管理 服务和应用 发现没有IIS 二、解决 控制面板 程序和功能 启动或关闭Windows功能 IIS相关的所有功能选中&#xff…...

【vue】vue项目中批量下载文件并打压缩包

前言 一开始用的是循环单个文件下载&#xff0c;即从后台获取到文件url列表&#xff0c;循环对每个url单独进行下载&#xff0c;这样的问题是每调用一次下载&#xff0c;浏览器都会进行“另存为”的弹框&#xff0c;很麻烦&#xff01;&#xff01;&#xff01; 关闭“下载前…...

Linux中的软件管家——yum

目录 ​编辑 一&#xff0c;软件安装的方式 二&#xff0c;对yum的介绍 1.yum的作用 2&#xff0c;yum的库 三&#xff0c;yum下载软件的操作 1.yumlist 2.yuminstall 3.yumremove 四&#xff0c;yum源的转换 一&#xff0c;软件安装的方式 软件安装的方式大概分为三种…...