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

好看的美食怎么做视频网站厦门网站推广费用

好看的美食怎么做视频网站,厦门网站推广费用,学校网站建设制作方案,视频线上推广1.摘要 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级的、基于发布/订阅(Publish/Subscribe)模式的通信协议,最初由 IBM 在1999年开发。它设计用于在低带宽、不稳定的网络环境下…

1.摘要


MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级的、基于发布/订阅(Publish/Subscribe)模式的通信协议,最初由 IBM 在1999年开发。它设计用于在低带宽、不稳定的网络环境下进行通信,适用于物联网(IoT)和机器对机器(M2M)通信。

2.准备工作


在项目的 build.gradle 文件中添加 MQTT 相关的依赖库:

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

添加权限:

    <uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.INTERNET" />

3.代码实现


class MqttService: Service() {private val TAG = "MqttService"private lateinit var mqttAndroidClient: MqttAndroidClientprivate lateinit var mqttConnectOptions: MqttConnectOptionsprivate val serverUri = "tcp://YOUR_BROKER_URI:PORT"// 修改为你的 MQTT 服务器地址private val clientId = "AndroidClient"// 修改为你的客户端 IDprivate val username = "YOUR_USERNAME"// 修改为你的用户名private val password = "YOUR_PASSWORD"// 修改为你的密码private val PUBLISH_TOPIC = "YOUR_PUBLISH_TOPIC"private lateinit var handler: Handlerprivate val retryInterval: Long = 5000 // 重试间隔,单位:毫秒(5秒)override fun onCreate() {super.onCreate()handler = Handler()initializeMqttClient()}// 初始化 MQTT 客户端private fun initializeMqttClient() {mqttAndroidClient = MqttAndroidClient(applicationContext, serverUri, clientId)mqttConnectOptions = MqttConnectOptions().apply {userName = username  // 用户名password = this@MqttService.password.toCharArray()  // 密码isAutomaticReconnect = true //是否自动尝试重新连接isCleanSession = false // 清除缓存connectionTimeout = 10  // 设置超时时间,单位:秒keepAliveInterval = 20  // 心跳包发送间隔,单位:秒//当客户端与 MQTT 代理建立连接时,客户端可以指定一个遗嘱消息。如果客户端在建立连接后因为某种原因(例如网络故障或客户端异常退出)非正常断开连接,MQTT 代理将会发布这条遗嘱消息给所有订阅了客户端所订阅主题的客户端。这样,其他订阅者就可以知道客户端已经离线了。//Topic:遗嘱消息要发布到的主题。//Payload:遗嘱消息的内容。//QoS(Quality of Service):遗嘱消息的传输质量要求。//Retained:指定是否将遗嘱消息保留在 MQTT 代理中,以便新订阅者在连接时立即接收到该消息。setWill(PUBLISH_TOPIC, "I am offline".toByteArray(), 1, false)//设置遗嘱消息}mqttAndroidClient.setCallback(object : MqttCallbackExtended {override fun connectComplete(reconnect: Boolean, serverURI: String?) {Log.d(TAG, "连接到: $serverURI")}override fun connectionLost(cause: Throwable?) {Log.d(TAG, "连接丢失: ${cause?.message}")}override fun messageArrived(topic: String?, message: MqttMessage?) {Log.d(TAG, "消息到达: $topic - ${message.toString()}")}//消息传递完成时的回调函数override fun deliveryComplete(token: IMqttDeliveryToken?) {Log.d(TAG, "Delivery complete")}})connectToMqttBroker()}// 连接到 MQTT 代理private fun connectToMqttBroker() {try {if (isNetworkConnected()) {mqttAndroidClient.connect(mqttConnectOptions, null, object : IMqttActionListener {override fun onSuccess(asyncActionToken: IMqttToken?) {Log.d(TAG, "连接到MQTT代理")//订阅主题subscribeToTopic(PUBLISH_TOPIC)}override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {Log.e(TAG, "连接MQTT代理失败: ${exception?.message}")//因为设置了 isAutomaticReconnect 为 true 所以不需要手动重连操作,mqtt会自动重连}})} else {Log.d(TAG, "无网络连接")retryConnectToMqttBroker()}} catch (e: MqttException) {e.printStackTrace()}}// 重连机制private fun retryConnectToMqttBroker() {handler.postDelayed({Log.d(TAG, "重试连接到MQTT代理")connectToMqttBroker()}, retryInterval)}// 发布消息fun publishMessage(topic: String, message: String) {try {if (mqttAndroidClient.isConnected) {val mqttMessage = MqttMessage()mqttMessage.payload = message.toByteArray()mqttAndroidClient.publish(topic, mqttMessage)Log.d(TAG, "消息发布到主题: $topic")} else {Log.e(TAG, "客户端未连接,无法发布消息.")}} catch (e: MqttException) {e.printStackTrace()}}// 订阅主题fun subscribeToTopic(topic: String) {try {if (mqttAndroidClient.isConnected) {mqttAndroidClient.subscribe(topic, 1, null, object : IMqttActionListener {override fun onSuccess(asyncActionToken: IMqttToken?) {Log.d(TAG, "订阅主题: $topic")}override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {Log.e(TAG, "订阅主题失败: $topic")}})} else {Log.e(TAG, "客户端未连接,无法订阅主题.")}} catch (e: MqttException) {e.printStackTrace()}}// 取消订阅主题fun unsubscribeFromTopic(topic: String) {try {if (mqttAndroidClient.isConnected) {mqttAndroidClient.unsubscribe(topic, null, object : IMqttActionListener {override fun onSuccess(asyncActionToken: IMqttToken?) {Log.d(TAG, "取消订阅主题: $topic")}override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {Log.e(TAG, "未能取消订阅主题: $topic")}})} else {Log.e(TAG, "客户端未连接,无法取消订阅主题.")}} catch (e: MqttException) {e.printStackTrace()}}// 判断网络是否连接private fun isNetworkConnected(): Boolean {val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManagerval activeNetwork: NetworkInfo? = connectivityManager.activeNetworkInforeturn activeNetwork?.isConnected == true}override fun onBind(intent: Intent?): IBinder? {return null}override fun onDestroy() {super.onDestroy()disconnectClient()}// 断开 MQTT 客户端连接private fun disconnectClient() {try {if (mqttAndroidClient.isConnected) {mqttAndroidClient.disconnect()}} catch (e: MqttException) {e.printStackTrace()}}
}

4.开启服务


在AndroidManifest.xml中的application标签内注册服务

 <service android:name=".MqttService" /><service android:name="org.eclipse.paho.android.service.MqttService" />

5.功能点介绍


MQTT 客户端初始化:
  • 通过 MqttAndroidClient 和 MqttConnectOptions 初始化 MQTT 客户端。
  • 配置 MQTT 客户端的连接选项,包括用户名、密码、自动重连、清除会话、超时设置和心跳包发送间隔等。
  • 配置遗嘱消息,当客户端非正常断开时,MQTT 代理将发布该消息(setWill 方法)。
MQTT 客户端回调:
  • 实现 MqttCallbackExtended 接口,用于处理连接完成、连接丢失、消息到达以及消息传递完成时的回调。.
连接到 MQTT 代理:
  • 尝试连接到 MQTT 代理,如果网络连接正常则进行连接,并订阅指定的主题(PUBLISH_TOPIC)。
  • 如果连接失败且设置了自动重连选项,客户端会自动尝试重连。
  • 如果没有网络连接,则通过重试机制定时尝试重新连接。
消息发布:
  • 实现 publishMessage 方法,用于向指定主题发布消息。
订阅和取消订阅主题:
  • 实现 subscribeToTopic 方法,用于订阅指定的主题。
  • 实现 unsubscribeFromTopic 方法,用于取消订阅指定的主题。

6.其他介绍


MQTT中 QoS 级别的意义:

QoS 0:最多一次传递(At most once)

  • 也称为“至多一次”传递
  • 发布消息后,不会收到任何确认或回执。
  • MQTT 代理不会跟踪消息传递,也不会重新传递丢失的消息。
  • 此级别适用于那些可以容忍偶尔丢失消息的应用场景,例如实时数据流,传感器数据等。

QoS 1:至少一次传递(At least once)

  • 确保消息至少被传递一次。
  • 在发布消息后,发布者会收到一个 PUBACK(发布确认)消息作为回复。
  • 如果 PUBACK 丢失或未收到确认,则 MQTT 客户端会尝试重新发送消息,直到收到 PUBACK。
  • 此级别适用于对消息到达的顺序不是特别关心,但确保消息至少被传递一次的应用场景。

QoS 2:只有一次传递(Exactly once)

  • 提供最高的传递保证,确保每条消息只传递一次。
  • 在发布消息后,发布者会收到两个确认消息:PUBREC(发布接收)和 PUBREL(发布释放)。
  • MQTT 客户端会等待收到 PUBREL 消息后再发送 PUBCOMP(发布完成)消息作为最终确认。
  • 此级别适用于对消息传递的顺序和确保每条消息只传递一次的高度敏感的应用场景,如金融交易、命令和控制等。
MQTT断开连接((32109) - java.io.EOFException)

可以看我的这篇文章:MQTT断开连接((32109) - java.io.EOFException)

7.最后


MQTT在物联网开发中必不可少,掌握相关知识非常重要,此篇文章用来温故一下MQTT使用流程,知识点不多,代码已经封装的差不多了,方便本人及各位拿来即用 更多功能自行拓展。


文章转载自:
http://vacationer.rdbj.cn
http://cental.rdbj.cn
http://smirky.rdbj.cn
http://pieman.rdbj.cn
http://kraal.rdbj.cn
http://polyribosome.rdbj.cn
http://priestling.rdbj.cn
http://shmear.rdbj.cn
http://pangwe.rdbj.cn
http://darwinian.rdbj.cn
http://clock.rdbj.cn
http://nonconsumptive.rdbj.cn
http://vincristine.rdbj.cn
http://scoria.rdbj.cn
http://cespitose.rdbj.cn
http://sorosis.rdbj.cn
http://naacp.rdbj.cn
http://transferor.rdbj.cn
http://ordinand.rdbj.cn
http://azaserine.rdbj.cn
http://hauteur.rdbj.cn
http://submetallic.rdbj.cn
http://menarche.rdbj.cn
http://salify.rdbj.cn
http://paced.rdbj.cn
http://illuminance.rdbj.cn
http://butyrate.rdbj.cn
http://polypragmatical.rdbj.cn
http://shepherdless.rdbj.cn
http://lemonish.rdbj.cn
http://footballer.rdbj.cn
http://swapo.rdbj.cn
http://desequestrate.rdbj.cn
http://scarification.rdbj.cn
http://deaconry.rdbj.cn
http://iceni.rdbj.cn
http://transfusional.rdbj.cn
http://panhuman.rdbj.cn
http://unnail.rdbj.cn
http://effigurate.rdbj.cn
http://carval.rdbj.cn
http://epicycle.rdbj.cn
http://citybuster.rdbj.cn
http://perpetrator.rdbj.cn
http://grubber.rdbj.cn
http://bulkhead.rdbj.cn
http://mechanotheropy.rdbj.cn
http://fennoscandian.rdbj.cn
http://saith.rdbj.cn
http://antipolitical.rdbj.cn
http://gauziness.rdbj.cn
http://bearbaiting.rdbj.cn
http://heterophoria.rdbj.cn
http://ski.rdbj.cn
http://theistic.rdbj.cn
http://darning.rdbj.cn
http://antiobscenity.rdbj.cn
http://saponated.rdbj.cn
http://inferno.rdbj.cn
http://rectifier.rdbj.cn
http://discourtesy.rdbj.cn
http://disilicate.rdbj.cn
http://rupiah.rdbj.cn
http://antidraft.rdbj.cn
http://descensional.rdbj.cn
http://rosebush.rdbj.cn
http://ekka.rdbj.cn
http://irrecusable.rdbj.cn
http://headfast.rdbj.cn
http://transformant.rdbj.cn
http://equilibrist.rdbj.cn
http://coastline.rdbj.cn
http://lysis.rdbj.cn
http://dockyard.rdbj.cn
http://habatsu.rdbj.cn
http://crool.rdbj.cn
http://dedal.rdbj.cn
http://harpins.rdbj.cn
http://theanthropical.rdbj.cn
http://winzip.rdbj.cn
http://shintoist.rdbj.cn
http://firefight.rdbj.cn
http://handbook.rdbj.cn
http://crematorium.rdbj.cn
http://damnation.rdbj.cn
http://iron.rdbj.cn
http://peaky.rdbj.cn
http://spell.rdbj.cn
http://methamphetamine.rdbj.cn
http://unto.rdbj.cn
http://tabletop.rdbj.cn
http://gdynia.rdbj.cn
http://scatter.rdbj.cn
http://rocketeer.rdbj.cn
http://diametric.rdbj.cn
http://brandy.rdbj.cn
http://mingle.rdbj.cn
http://lingeringly.rdbj.cn
http://rowdedow.rdbj.cn
http://stagnantly.rdbj.cn
http://www.dt0577.cn/news/88490.html

相关文章:

  • jsp做新闻系统门户网站seo网站推广主要目的不包括
  • 福州绿光网站建设工作室唐山百度搜索排名优化
  • 五十家装修公司官网seo站点
  • 网站建设属于哪种职位南京关键词seo公司
  • 上海平台网站建设企业深圳关键词seo
  • 便宜手机网站建设长沙seo智优营家
  • 优秀网站建设空间怎么线上推广自己的产品
  • 协会建设网站的目的网站推广的渠道有
  • 网站备案行业广州网站推广服务
  • 做一回最好的网站中国唯一没有疫情的地方
  • 使用网站的mysql舟山百度seo
  • 杭州网站建设专注乐云seo服务营销理论
  • 高端展馆展厅设计方案网站优化公司上海
  • 网站建设安排广州seo服务公司
  • 找工作网站网络推广费用预算表
  • 地方政府网站建设蒙牛牛奶推广软文
  • 龙岩网站建设方案书谷歌香港google搜索引擎入口
  • 企业文化有哪些最好用的系统优化软件
  • 网站做外链是什么意思搜狐视频
  • 互联网公司排名2019深圳seo优化外包公司
  • 上海网站关键词网络整合营销
  • 整形美容网站模板seo排名
  • 如何制作一个游戏appseo网站营销公司哪家好
  • 龙岩做网站的地方腾讯企业qq官网
  • 宁波建设网站公司公司产品推广方案
  • 移动端网站开发介绍谷歌关键词
  • 优秀网页设计导航seo sem
  • 智能网站建设平台网络推广公司可不可靠
  • 无锡互联网公司排名厦门seo排名
  • 2019年的阜南县建设修路网站高明公司搜索seo