Paho MQTT 客户端在设备锁定后断开连接

2023-12-10

我目前正在开发一个小型“紧急按钮”应用程序,该应用程序应该在医疗机构中运行。由于该项目的假设之一是独立于 Internet,因此我决定采用 MQTT,并在本地 WLAN 中设置服务器。

我已经实现了 Paho Android 服务,效果非常好。到了一定程度。一旦我锁定设备并关闭屏幕,一分钟后客户端就会断开连接。由于我已将 MQTT 选项设置为 30 秒的 KeepAlive 间隔,这一定是由 Android 本身引起的,可能会进入其锁定睡眠状态。我在几部不同的智能手机上获得了相同的结果,因此它可能也与用户设置无关。

我宁愿避免设置自动重新连接过程

 public class ServerCallback implements MqttCallback
{
    public void connectionLost(Throwable cause) { 
    ...
    }
}

因为我想在由于不可预测的原因导致连接丢失时使用此方法提示错误对话框。

如果是这样,我有什么选择可以防止这种断开连接?

EDIT:

我的额外观察是,只要设备插入并充电,就不会发生断开连接。


经过谷歌搜索后,我想我找到了原因:

Paho MQTT 客户端使用定时任务安排 keepalive ping。 A定时任务当手机进入睡眠状态时将会停止,因此这里是一个糟糕的选择... keepalive ping 的实现可以在课程中找到定时器Ping发送器这是从MqttPing发送器 class.

为了在手机休眠时获取定时事件,必须由报警管理器。我发现的问题的最佳解决方案是创建一个从MqttPing发送器班级。在我自己开始编写这样的课程之前,我在 google 上搜索并发现有人已经在 GitHub 上完成了该课程。

在这里能找到它:https://github.com/Suxsem/Domo-Android/blob/master/app/src/main/java/com/suxsem/domo/MqttPingSender.java

我还必须向 MqttClient 添加一个替代构造函数:

public MqttClient(String serverURI, String clientId, MqttClientPersistence persistence, MqttPingSender pingSender) throws MqttException {
    aClient = new MqttAsyncClient(serverURI, clientId, persistence, pingSender);
}

在我实例化 MqttClient (在我的服务中)的地方,我执行以下操作:

MqttPingSender pingSender = new MqttPingSenderAlarm(this);
mqClient = new MqttClient("tcp://<IP>:<PORT>", "MyTestServiceID", new MemoryPersistence(), pingSender);

到目前为止,这似乎工作完美,但我只测试了 20-30 分钟。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Paho MQTT 客户端在设备锁定后断开连接 的相关文章

  • 在工具栏下显示内容

    您好 我试图简单地将我的内容放在工具栏下方 但是当我运行我的应用程序时 某些内容本应位于工具栏下方 却隐藏在工具栏后面 我已经阅读了有关使用框架布局来尝试将其分离的内容 但我有点卡住了 我目前正在使用该软件提供的基本 android stu
  • Android ToggleButton 始终检查

    如果切换按钮处于选中或取消选中状态 我想存储在 SharedPreferences 中 toggle setOnCheckedChangeListener new OnCheckedChangeListener public void on
  • 音频流的最佳实践

    我正在编写一个应用程序来播放远程服务器的音频 我尝试了多种方法来实现流音频 但它们对我来说都不够好 这就是我尝试过的 幼稚地使用 MediaPlayer 就像是 MediaPlayer player new MediaPlayer play
  • Cordova - 启动后出现白屏,控制台中没有例外

    我已经离开我的 Cordova 应用程序一段时间了 但昨天刚刚进行了一次新的克隆 发现它出现了 死机白屏 症状 启动画面显示 程序加载 然后我就得到一个空白屏幕 更多细节 CLI 科尔多瓦 6 1 1 安卓 5 1 1 ios 4 1 1
  • 我无法再在后台应用程序中接收任何 FCM 消息

    当应用程序处于后台时 我无法再在应用程序中接收任何数据消息 请注意 直到最近它在我的应用程序中都运行良好 也许在我的开发环境最近更新后它停止工作了 我不能说 所以我尝试用快速入门 android 项目 https github com fi
  • 无法在 Android Studio 中导出签名的 APK

    当我使用keytool list keystore path to keyfile jks并提供我的密码 我可以看到那里的条目 但是当我在尝试使用相同的密码生成签名的 APK 时使用相同的密码时 我收到错误 无法加载密钥库 密钥库被篡改 或
  • VOIP通话录音

    我正在开发一个在 android 中录制 VOIP 通话的项目 我没有找到任何解决方案 有很多应用程序支持手机上的 VOIP 录音 我找不到任何教程和帮助 立方体通话记录器 https play google com store apps
  • CoordinatorLayout 和 ImageView 在滚动时调整宽度的问题

    我正在尝试放置一个ImageView in a CollapsingToolbarLayout它在加载时占据整个屏幕 并且当您滚动内容时 16x9 分辨率图像宽度会调整大小 直到图像占据屏幕的整个宽度 那时 我希望图像具有视差app lay
  • 如何使用 RecyclerView 创建此布局?

    我正在尝试使用这种类型的布局创建回收器视图 这些项目是字符串 可以以不同的大小出现 我不知道每行中有多少项目 我可以使用 StaggeredGridLayoutManager 来做到这一点吗 该图像只是一个假示例 每行可以有更多项目 您可能
  • 如何使用 Google 的 GithubBrowserSample 方法在片段之间共享视图模型?

    我对 Android 架构组件的使用非常陌生 因此我决定使用 GithubBrowserSample 来构建我的应用程序来实现我的许多用例 但我有一个问题 我不知道使用这种方法在片段之间共享视图模型的正确方法是什么 我想共享视图模型 因为我
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • 如何清除Android剪贴板?

    我发现的方法都不起作用 这是我尝试过的 1 使用clearPrimaryClip 的方法ClipboardManager class ClipboardManager clipboard ClipboardManager getSystem
  • 在 Android 中加密/解密字符串的简单方法

    我的问题是如何加密String String AndroidId Override public void onCreate Bundle savedInstanceState super onCreate savedInstanceSta
  • Android 认为我没有关闭数据库!为什么?

    我有一个 SQLiteDatabase 数据成员 我在 onCreate 中初始化它 并在 onPause onStop 和 onDestroy 中调用 close 它在 onResume 中重新初始化 它似乎运行得很好 但当我查看调试器时
  • Android - 状态栏阻止全屏

    我的应用程序启动时可以全屏正确运行 然而 在最小化然后返回应用程序后 状态栏会弹出 并将我的视图向下推一点 如何防止状态栏移动我的视图 这是我的布局
  • Android 的 Intent 和 Parcelable 对象

    为什么我需要打包我的对象 即使我只需将其发送到同一任务的另一个线程 实际上 我需要打开一个甚至可以在同一线程 主线程 上运行的活动 换句话说 为什么 Google 不提供一个 startActivity 版本 它采用通用对象广告参数而不是捆
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • Android 从通知刷新 Activity

    我有一个程序 我在其中调用通知 如果您将其下拉 该通知将启动一个新活动 mNotificationManager NotificationManager getSystemService ns int icon R drawable sta
  • 我想测量 ListView 的高度 (getHight() = 0)

    我无法自己决定任务将是问 我想测量 ListView 的高度 无法捕捉渲染 ListView 的时刻 rssListView getHight 0 public class RSSactivity extends Activity publ

随机推荐

  • 在 R 中按 colSums 划分列

    我正在尝试缩放矩阵中的值 以便每一列加起来为一 我努力了 m matrix c 1 9 nrow 3 ncol 3 byrow T 1 2 3 1 1 2 3 2 4 5 6 3 7 8 9 colSums m 12 15 18 m m c
  • Redshift UDF逻辑问题

    我正在尝试编写 redshift udf 来验证时间戳 但是 它总是返回 false 有人可以解释一下为什么吗 create or replace function f Is timestamp sql VARCHAR 20000 retu
  • 如何使用 Interop 与 C# 将 *.ppt、*.pptx 文件另存为 *.wmv?

    我尝试用下面的代码来做到这一点 using Microsoft Office Core using PowerPoint Microsoft Office Interop PowerPoint using System IO using M
  • 如何使用 Java SDK 获取 AWS Quicksight 仪表板的嵌入 URL

    我想我了解获取 AWS Quicksight 仪表板的嵌入 URL 所需的所有步骤 并且我已经能够通过 AWS CLI 获取有效的 URL 如AWS docs 但是 我似乎无法通过 AWS Java SDK 特别是 v2 让它工作 似乎任何
  • 如何让Android应用程序在屏幕休眠时在后台运行?

    我正在开发一个跟踪应用程序 它通过每 3 秒获取用户当前位置来跟踪用户 当屏幕打开时 我能够获取经纬度值 但当屏幕休眠时 我无法获取数据 CODE Override public void onLocationChanged Locatio
  • 在VS 2017、MVC中添加服务引用

    如何在 VS 2017 MVC 中添加服务引用 我尝试找到 添加服务引用 按钮 但它不在那里 只有 添加引用 和 添加连接的服务 我之前在 VS 2013 中添加了服务引用 这很容易 但现在我为我的学校项目更改为 VS 2017 我不知道如
  • 使用 Gson 或 Jackson 压平 JSON 字符串,将包含各个级别键值的键制作为 Map

    我有一个关于以下问题的增强问题使用 Gson 或 Jackson 将 JSON 字符串展平为 Map 我的场景包括重复的键 因此上述问题中的解决方案会导致一些重复的键被覆盖 所以我正在考虑通过将每个级别的密钥组合在一起来构造密钥 那么如何实
  • 如果主题更改,请更改 WP7 应用程序的背景

    如果用户更改主题 我需要更改应用程序的背景图像 Light to Dark 或在代码隐藏中反之亦然 我希望这些应该在页面已加载 event TimDams 向您指出了检测现在设置的主题的好方法之一 但我没有注意到有任何信息如何检测a cha
  • MobileFirst Starter - Bluemix 推送通知在生产模式下失败

    我正在构建一个可以通过 Bluemix 接收远程通知的 iOS 应用程序 我在 Xcode 中的应用程序包标识符与 Apple Portal 中的 AppId 相匹配 后者也与 APN 证书相匹配 xxx sandbox p12 和 xxx
  • 如何更改构建定义的 Scala 版本?

    我正在开发一个简单的 SBT 项目 其中包括用于对 Scala 并行集合进行基准测试的 InputTasks 当我遇到问题时 我已经定义了输入键并开始编写任务 由于我的基准要求斯卡拉 2 10 0 M5 我尝试在我的build sbt na
  • 返回匿名类型结果?

    使用下面的简单示例 使用 Linq to SQL 从多个表返回结果的最佳方法是什么 假设我有两张表 Dogs Name Age BreedId Breeds BreedId BreedName 我想把所有的狗都带回来BreedName 我应
  • EL中bean的动态选择

    有没有办法在运行时而不是设计时指定 EL 中使用的托管 bean 例如 actionListener myBean method 这样myBean根据调用代码的 JSF 页面 part 可以有不同的值 条件是使用的任何对象代替 myBean
  • 只在 ISR 中读取的变量是否为 易失性?

    Is volatile需要一个在主循环中读写但在 ISR 中只读的变量吗 编辑 在编写 main 时 ISR 被禁用 因此 该变量被有效地原子地使用 EDIT 非常相关 中断的易失性与内存屏障 volatile是一种不好的同步访问方式 这是
  • jQuery:将复选框的值添加到输入文本字段

    我正在尝试将任何选中的复选框的值添加到输入文本字段 这是我的小提琴 http jsfiddle net Lf6ky document ready function checkbox on click function if checkbox
  • 使用 f String 插入字符或符号@

    我有两个变量总共存储两个数字 我想组合这些数字并用逗号分隔它们 我读到我可以使用 variablename 插入加号或空格或零 但逗号不起作用 x 42 y 73 print f the number is x y 这是我奇怪的解决方案 我
  • Qt 库中控件的默认 HTML 样式

    这是一个关于 Qt 库的问题 而不是关于 Web 设计的问题 对于 QLabel 和其他控件 我可以设置 HTML 文本 例如 Some Text 问题是 默认的HTML样式是在哪里定义的 我如何找出 标签将使用什么字体 下一个问题 我可以
  • 接收有关 Reality Composer 动画结束的 Xcode 通知

    我有以下可以正确加载的 Reality Composer 项目 正如您所看到的 当动画完成时 它应该使用关键字 attackComplete 进行通知 我如何收到此通知 import RealityKit import ARKit clas
  • 从 1:n 表中的单个查询中检索最新注释(按时间戳)

    假设我有两个表 用户和注释 假设架构如下所示 users id name field2 field3 notes id user id subject heading body timestamp 我想要做的是选择每个用户 以及每个用户根据
  • 如何避免在 .NET Windows 窗体中重复创建表单?

    我正在使用 NET Windows 窗体 我的 MDI 父窗体包含菜单 如果单击菜单 将显示表单 到现在为止没有问题 UserForm uf new UserForm uf Show uf MdiParent this 如果我再次单击菜单
  • Paho MQTT 客户端在设备锁定后断开连接

    我目前正在开发一个小型 紧急按钮 应用程序 该应用程序应该在医疗机构中运行 由于该项目的假设之一是独立于 Internet 因此我决定采用 MQTT 并在本地 WLAN 中设置服务器 我已经实现了 Paho Android 服务 效果非常好