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.rhkb.cn/news/124122.html

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

相关文章

day2_C++

day2_C 代码题思维导图 代码题 #include using namespace std;#define MAX 50struct StuData {private:int scoreArr[MAX];int num;public:void setNum(int num);void input();void sort();void show();int getnum();};void StuData::setNum(int num){this->num num; }vo…

第3章 【MySQL】字符集和比较规则

3.1 字符集和比较规则简介 3.1.1 字符集简介 如何存储字符串&#xff1f;需要建立字符与二进制数据的映射关系。建立这个关系需要&#xff1a; 1.把哪些字符映射成二进制数据&#xff1f; 2.怎么映射&#xff1f; 将一个字符映射成一个二进制数据的过程也叫做 编码 &#…

[杂谈]-快速了解直接内存访问 (DMA)

快速了解直接内存访问 (DMA) 文章目录 快速了解直接内存访问 (DMA)1、使用 DMA 需要什么&#xff1f;2、DMA介绍3、DMA 中的数据传输如何进行&#xff1f;4、DMA接口5、DMAC 控制器寄存器6、DMA 控制器编程模式6.1 突发模式&#xff08;Burst Mode&#xff09;6.2 循环窃取模式…

MATLAB 动态图GIF

MATLAB 动态图GIF 前言一、创建动态图&#xff08;动态曲线、动态曲面&#xff09;1. 创建动画曲线&#xff08;MATLAB animatedline函数&#xff09;2. 创建动画曲面 二. 保存动态图三、完整示例1. 动态曲线&#xff08; y s i n ( x ) ysin(x) ysin(x)&#xff09;2. 动态曲…

Linux之权限

目录 一、shell运行原理 二、权限 1、对人操作 2、对角色和文件操作 修改权限&#xff08;改属性&#xff09;&#xff1a; ①ugo- ②二进制数的表示 修改权限&#xff08;改人&#xff09;&#xff1a; 三、权限的相关问题 1、目录的权限 2、umask 3、粘滞位 一、s…

LeetCode 202 快乐数

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 法一&#xff1a;哈希 使用哈希表循环判断每次经过平方和的数&#xff0c;如果为1则直接返回true&#xff0c;若之前存在过但不为1则直接返回false 代码 class Solution { public:// 计算…

基于文本提示的图像目标检测与分割实践

近年来&#xff0c;计算机视觉取得了显着的进步&#xff0c;特别是在图像分割和目标检测任务方面。 最近值得注意的突破之一是分段任意模型&#xff08;SAM&#xff09;&#xff0c;这是一种多功能深度学习模型&#xff0c;旨在有效地从图像和输入提示中预测对象掩模。 通过利用…

【业务功能篇92】微服务-springcloud-多线程-异步处理-异步编排-CompletableFutrue

三、CompletableFutrue 一个商品详情页 展示SKU的基本信息 0.5s展示SKU的图片信息 0.6s展示SKU的销售信息 1sspu的销售属性 1s展示规格参数 1.5sspu详情信息 1s 1.ComplatableFuture介绍 Future是Java 5添加的类&#xff0c;用来描述一个异步计算的结果。你可以使用 isDone方…

Ansible自动化运维之playbooks剧本

文章目录 一.playbooks介绍1.playbooks简述2.playbooks剧本格式3.playbooks组成部分4.运行playbooks及检测文件配置 二.模块实战实例1.playbooks模块实战实例2.vars模块实战实例3.指定远程主机sudo切换用户4.when模块实战实例5.with_items迭代模块实战实例6.Templates 模块实战…

Delft3D模型教程

详情点击公众号链接&#xff1a;基于Delft3D模型水体流动、污染物对流扩散、质点运移、溢油漂移及地表水环境报告编制教程 Delft3D计算网格构建 Delft3D水动力数值模拟 Delft3D污染物对流扩散数值模拟 一&#xff0c;Delft3D软件及建模原理和步骤 1.1地表水数值模拟常用软件、…

认识SQL sever

目录 一、数据库的概念 1.1数据库的基本概念 1.2对数据库的了解 二、数据库的分类 2.1关系型数据库&#xff08;RDBMS&#xff09;&#xff1a; 2.2非关系型数据库&#xff08;NoSQL&#xff09;&#xff1a; 2.3混合数据库&#xff1a; 2.4数据仓库&#xff1a; 2.5嵌…

报错:为什么数组明明有内容但打印的length是0

文章目录 一、问题二、分析三、解决1.将异步改为同步2.设置延迟 一、问题 在日常开发中&#xff0c;for 循环遍历调用接口&#xff0c;并将接口返回的值进行拼接&#xff0c;即push到一个新的数组中&#xff0c;但是在for循环内部是可以拿到这个新的数组&#xff0c;而for循环…

docker笔记9:Docker-compose容器编排

目录 1.是什么&#xff1f; 2. 能干嘛&#xff1f; 3.去哪下&#xff1f; 4.安装步骤 ​编辑 5.卸载步骤 6.Compose核心概念 6.1概念 6.2 Compose常用命令 7.Compose编排微服务 7.1改造升级微服务工程docker_boot 7.2不用Compose 7.2.1 单独的mysql容器实例 7.3 …

自动化测试基础知识详解

前言 有颜色的标注主要是方便记忆&#xff0c;勾选出个人感觉的重点 块引用&#xff1a;大部分是便于理解的话&#xff0c;稍微看看就行&#xff0c;主要是和正常的文字进行区分的 1、什么是自动化测试 自动化测试是软件测试活动中一个重要分支和组成部分&#xff0c;随着软…

C#事件event

事件模型的5个组成部分 事件拥有者&#xff08;event source&#xff09;&#xff08;类对象&#xff09;&#xff08;有些书将其称为事件发布者&#xff09; 事件成员&#xff08;event&#xff09;&#xff08;事件拥有者的成员&#xff09;&#xff08;事件成员就是事件本身…

拿下嵌入式软件工程师面试题(day1)

前言 &#xff08;1&#xff09;如果你在读大学&#xff0c;不管你本科毕业是读研还是就业&#xff0c;你都可以早点准备嵌入式面试题&#xff0c;本系列教程的面试题均基于C语言。 &#xff08;2&#xff09;像嵌入式学得好&#xff0c;且学历不错的本科生和研究生&#xff0c…

mysql8 Found option without preceding group错误

这个错误说起来是真的坑&#xff0c;今晚帮同学在window操作系统上安装mysql8当自定义my.ini文件的时候 就出现一下错误&#xff0c;死活启动不起来 一直报错。当删掉这个my.ini文件的时候却能启动&#xff0c;刚开始以为是my.ini里的配置选项不对&#xff0c;一个一个筛查后依…

抖音小店爆款制造指南:打造抖音爆款商品的八大技巧

抖音小店作为一种电商模式&#xff0c;通过短视频形式展示商品&#xff0c;吸引用户购买。在抖音平台上&#xff0c;打造爆款商品是每个抖音小店主的梦想。以下是四川不若与众整理的一些抖音小店如何打造爆款商品的技巧。 1. 产品选择&#xff1a;选择适合抖音平台的产品非常重…

鲁棒优化入门(6)—Matlab+Yalmip两阶段鲁棒优化通用编程指南(上)

0.引言 上一篇博客介绍了使用Yalmip工具箱求解单阶段鲁棒优化的方法。这篇文章将和大家一起继续研究如何使用Yalmip工具箱求解两阶段鲁棒优化(默认看到这篇博客时已经有一定的基础了&#xff0c;如果没有可以看看我专栏里的其他文章)。关于两阶段鲁棒优化与列与约束生成算法的原…

Window安装虚拟机+给虚拟机安装Linux

一、虚拟机下载 这里使用Virtualbox虚拟机。可以直接从官网下载&#xff1a;Downloads – Oracle VM VirtualBox 点击进行下载&#xff0c;选择window版本的。直接双击&#xff0c;一直下一步 进行安装 PS&#xff1a;安装需要开启CPU虚拟化&#xff0c;一般电脑都已经开启了…