【问题标题】:Android bluetooth wake up device安卓蓝牙唤醒设备
【发布时间】:2016-03-13 00:52:31
【问题描述】:

我给自己买了一块运行 Android KitKat 的智能手表。 我已使用蓝牙将它连接到我的 HTC m9 智能手机。 我创建了一个在智能手表(客户端模式)和智能手机(服务器模式)上运行的应用程序。 应用程序通过蓝牙 Socket 连接相互通信。

当我在手机上接到电话时,我会通过蓝牙插座向手表发送蓝牙通知并使其振动。

只要手表的 CPU 正常运行,一切都会好起来的。 当手表进入睡眠状态并且我在智能手机上接到电话时,手表不会处理通知,因为手表的 CPU 正在睡眠。

在手表上使用部分锁定可以做到这一点,但它会消耗电池电量。 我不需要对手机进行部分锁定,因为当手机接到电话时,手机会“神奇”地唤醒,所以我的应用程序的服务能够发送通知。

我也不能在手表上使用 AlarmManager,因为我需要在收到蓝牙套接字通知时唤醒手表,而不是定期唤醒。

WakefullRecevier 也没有解决问题,因为我的手表需要先唤醒,以便 WakefullReceiver 设置电源锁(或者我弄错了吗?!)并运行其代码。

所以问题是:电话如何在来电时唤醒?还是收到短信?这是硬件问题..中断? 有没有什么方法可以在收到蓝牙消息时唤醒手表?

谢谢

【问题讨论】:

    标签: android bluetooth


    【解决方案1】:

    在过去的几天里,我一直在玩手表进行不同的测试。 我没有回答最初的问题,但由于没有其他人回答这个问题,我只会写下我自己的结论,这些结论对我的应用程序来说已经足够好了,也许可以帮助其他有类似问题的人。

    1.当配对的手表在手机的蓝牙范围内时,手表不需要电源锁。 手机发送的任何消息都会被手表接收。 如果手表闲置一段时间,手机发送的第一条蓝牙消息会延迟约 1 秒收到。可能 Android 手表进入某种低功耗模式,但能够在收到蓝牙消息时运行我的代码。当然,当手表不空闲时,手表几乎会立即收到蓝牙消息。

    2。找出蓝牙套接字是否仍然连接的最佳方法是写入它。 套接字读取是一个阻塞调用,但当手表超出蓝牙范围时,它不会抛出IOException。我找不到可以更改的读取超时属性。 所以我只是每 60 秒向套接字写入一个字节,以检测套接字是否不再连接。电池影响最小,而插座故障检测时间是可以接受的。

    3.当配对的手表不在手机蓝牙范围内时,需要蓝牙socket重连策略。 在这种情况下使用部分锁定似乎不是一个好方法,因为它使 CPU 保持清醒。还经常尝试重新连接到手机会耗尽电池。

    重新连接策略基于应用程序需求。 我最终使用WakefulBroadcastReceiverAlarmManager 在给定的时间段内进行套接字连接尝试。

    4.时不时地,当手表离开蓝牙范围,然后又回到范围内时,蓝牙插座似乎一次又一次地进入某种“僵尸”状态。有时socket.connect 调用只是阻塞而没有成功或抛出错误,有时socket.connectcall 不会抛出错误,因为给人的印象是连接已经建立,但随后的写入总是抛出IOException。 每当我遇到这种情况时,我都会停止/启动蓝牙适配器,这似乎可以解决问题。

    5.注意停止/启动蓝牙适配器。 在尝试蓝牙重启期间,Android 可以让 CPU 进入睡眠状态。我没有预料到这种行为,但它确实发生了。因此,如果您想尽快完成此操作而没有任何延迟,请确保应用程序在重新启动尝试期间获取PARTIAL_WAKE_LOCK。当然不要忘记尽快释放锁。

    【讨论】:

      猜你喜欢
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多