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。

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

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

相关文章

尚硅谷SpringMVC (9-13)

九、HttpMessageConverter HttpMessageConverter &#xff0c;报文信息转换器&#xff0c;将请求报文转换为 Java 对象&#xff0c;或将 Java 对象转换为响应报文 HttpMessageConverter提供了两个注解和两个类型&#xff1a; RequestBody &#xff0c; ResponseBody &#xff…

【AI创作助手使用测试】C++使用场景生成、Windows设备驱动开发介绍、调试技巧

C 是一种通用的编程语言&#xff0c;具有高性能、高效率、高可维护性等优点&#xff0c;被广泛应用于以下场景&#xff1a; 操作系统和嵌入式系统开发&#xff1a;C 是编写操作系统和嵌入式系统的主要语言之一&#xff0c;它可以提供底层的控制和资源管理&#xff0c;并且具有高…

手写Mybatis:第20章-Mybatis 框架源码10种设计模式分析

文章目录 一、类型&#xff1a;创建型模式1.1 工厂模式1.2 单例模式1.3 建造者模式 二、类型&#xff1a;结构型模式2.1 适配器模式2.2 代理模式2.3 组合模式2.4 装饰器模式 三、类型&#xff1a;行为型模式3.1 模板模式3.2 策略模式3.3 迭代器模式 一、类型&#xff1a;创建型…

代码随想录算法训练营day56 | LeetCode 583. 两个字符串的删除操作 72. 编辑距离

583. 两个字符串的删除操作&#xff08;题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台&#xff09; 思路&#xff1a;实际上就是求两个字符串的最长公共子序列。或者也可以换成编辑距离的理解思路&#xff08;这种就是直接用动…

Python生成器和迭代器

Python的生成器是一种特殊的函数&#xff0c;它可以在迭代过程中动态生成值&#xff0c;而不是一次性生成所有值。生成器使用yield语句来产生一个值&#xff0c;并且在每次调用时暂停执行&#xff0c;保留当前的状态。当再次调用生成器时&#xff0c;它会从上次暂停的地方继续执…

HashMap源码分析(JDK1.8)

概述 JDK 1.8 对 HashMap 进行了比较大的优化&#xff0c;底层实现由之前的 “数组链表” 改为 “数组链表红黑树”&#xff0c;本文就 HashMap 的几个常用的重要方法和 JDK 1.8 之前的死循环问题展开学习讨论。 JDK 1.8 的 HashMap 的数据结构如下图所示&#xff0c;当链表节…

SQL中CONVERT()函数用法详解

SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft SQL Server™ 表达式。。 data_type 目标系统所提供的数据类型&#xff0c;包括 bigint 和 sql_variant。不能使用用户定义的数据类型。 length nchar、nva…

Elasticsearch Head的使用

目录 概述一、安装 Elasticsearch Head二、解压文件三、安装Elasticsearch Head依赖四、启动 Elasticsearch Head五、修改Elasticsearch Head启动端口号六、使用 Elasticsearch Head注意事项 概述 Elasticsearch Head 是一个用于管理和监控 Elasticsearch 集群的 Web 界面工具…

【Linux】Ubuntu20.04版本配置pytorch环境2023.09.05【教程】

【Linux】Ubuntu20.04版本配置pytorch环境2023.09.05【教程】 文章目录 【Linux】Ubuntu20.04版本配置pytorch环境2023.09.05【教程】一、安装Anaconda虚拟环境管理器二、创建虚拟环境并激活三、安装Pytorch四、测试pytorchReference 一、安装Anaconda虚拟环境管理器 首先进入…

Ubuntu18.04系统下通过ROS控制Kinova真实机械臂-多种实现方式

所用测试工作空间test_ws&#xff1a;包含官网最原始的功能包 一、使用Kinova官方Development center控制真实机械臂 0.在ubuntu系统安装Kinova机械臂的Development center&#xff0c;这一步自行安装&#xff0c;很简单。 1.使用USB连接机械臂和电脑 2.Development center…

防止SQL注入的四种方案

一、什么是SQL注入&#xff1f; SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理员不知情的情况下实现非法操作&#xff0c;以此来实现欺骗数据库服…

typescript删除array中的空值

使用.flat() 可以看到&#xff0c;调用之后空值被清清除了&#xff0c;如果本身就是1维数组就无所谓&#xff0c;但如果本身是多维数组&#xff0c;又不想数组维度被改变的话就需要传入0&#xff0c;才不会导致数据维度改变

手写RPC框架--5.Netty业务逻辑

RPC框架-Gitee代码(麻烦点个Starred, 支持一下吧) RPC框架-GitHub代码(麻烦点个Starred, 支持一下吧) Netty业务逻辑 5.Netty业务逻辑a.加入基础的Netty代码b.对通道channel进行缓存c.对代码进行重构优化d.完成基础通信e.异步获取服务器的返回结果f.调整代码g.处理handler (优化…

Webpack5入门到原理

Webpack5学习 尚硅谷Webpack5新版视频教程 B站直达&#xff1a;https://www.bilibili.com/video/BV14T4y1z7sw 百度网盘&#xff1a;https://pan.baidu.com/s/114lJRGua2uHBdLq_iVLOOQ 提取码&#xff1a;yyds 阿里云盘&#xff1a;https://www.aliyundrive.com/s/UMkmCzdWsGh&…

[数据集][目标检测]裸土识别裸土未覆盖目标检测数据集VOC格式857张2类别

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;857 标注数量(xml文件个数)&#xff1a;857 标注类别数&#xff1a;2 标注类别名称:["luotu","n…

数据结构——哈希

哈希表 是一种使用哈希函数组织数据的数据结构&#xff0c;它支持快速插入和搜索。 哈希表&#xff08;又称散列表&#xff09;的原理为&#xff1a;借助 哈希函数&#xff0c;将键映射到存储桶地址。更确切地说&#xff0c; 1.首先开辟一定长度的&#xff0c;具有连续物理地址…

【小沐学Unity3d】3ds Max 骨骼动画制作(CAT、Character Studio、Biped、骨骼对象)

文章目录 1、简介2、 CAT2.1 加载 CATRig 预设库2.2 从头开始创建 CATRig 3、character studio3.1 基本描述3.2 Biped3.3 Physique 4、骨骼系统4.1 创建方法4.2 简单示例 结语 1、简介 官网地址&#xff1a; https://help.autodesk.com/view/3DSMAX/2018/CHS https://help.aut…

Android app保活(前台服务)

国内厂商定制&#xff0c;除非厂商给app白名单&#xff0c;否则只能用户手动添加白名单(应用自启和后台运行)&#xff0c;才能通过前台服务实现app保活。 这里介绍前台服务相关实现方式。 开启服务&#xff1a; if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {//安…

H265视频硬解

硬解&#xff0c;使用非CPU进行编码&#xff0c;如显卡GPU、专用的DSP、FPGA、ASIC芯片等。目前的主流GPU加速平台&#xff1a;INTEL、AMD、NVIDIA。 一、软编码和硬编码比较 软编码&#xff1a;实现直接、简单&#xff0c;参数调整方便&#xff0c;升级易&#xff0c;但CPU负…

2021年09月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:双端队列 定义一个双端队列,进队操作与普通队列一样,从队尾进入。出队操作既可以从队头,也可以从队尾。编程实现这个数据结构。 时间限制:1000 内存限制:65535 输入 第一行输入一个整数t,代表测试数据的组数。 每组数据的第一…