Android蓝牙唤醒设备
我给自己买了一台运行Android KitKat的smartwatch。 我已将它连接到使用蓝牙的HTC m9智能手机。 我已经创建了一个在smartwatch(客户端模式)和智能手机(服务器模式)上运行的应用程序。 应用程序通过蓝牙套接字连接互相通话。Android蓝牙唤醒设备
当我在手机上接听电话时,我正在通过蓝牙插孔向手表发送蓝牙通知并使其振动。
只要手表的CPU处于运行状态,所有的功能都很好。 当手表进入休眠状态,并且我在智能手机上接到电话时,手表不处理通知,因为手表的CPU处于休眠状态。
在手表上使用部分锁定可以做到这一点,但它会消耗电池以加快速度。 我不需要部分锁定电话,因为当电话接到电话时,电话会“神奇地”唤醒,所以我的应用程序的服务能够发送通知。
我也不能在手表上使用AlarmManager,因为我需要手表在唤醒时收到蓝牙套接字通知,而不是定期进行。
一个WakefullRecevier也没有解决问题,因为我的手表需要先唤醒,以便WakefullReceiver将电源锁(或者我弄错了这个?)并运行它的代码。
所以问题是:电话如何在来电时醒来?或收到短信?这是一个硬件的事情..中断? 当收到蓝牙讯息时有没有什么办法唤醒手表?
谢谢
在过去的几天,我一直在玩弄腕表制作不同的测试。 我没有回答原来的问题,但由于没有人回答这个问题,我只会写下我自己的结论,这对我的申请来说已经足够了,也许可以帮助其他类似问题的人。
1.当配对手表在手机的蓝牙范围内时,手表上不需要电源锁。 手表发送的任何信息均由手表接收。 如果手表保持闲置一段时间,手机发送的第一条蓝牙消息将以约1秒的延迟时间收到。可能Android手表会进入某种低功耗模式,但可以在收到蓝牙消息时运行我的代码。当手表闲置时,蓝牙信息几乎立即由手表接收。
2.找出蓝牙套接字是否仍然连接的最佳方法是写入它。 套接字读取是阻止呼叫,但当手表离开蓝牙范围时,它不会丢弃IOException
。我无法找到可以更改的读取超时属性。 因此,我只是每60秒向套接字中写入一个字节以检测套接字是否不再连接。插座下降检测时间可以接受时,电池影响最小。
3.当配对手表不在蓝牙范围内时,蓝牙插座重新连接策略是必需的。 在这种情况下使用部分锁似乎不是一个好办法,因为它可以让CPU保持清醒状态。还试图重新连接到手机通常会导致电池死亡。
重新连接策略基于应用程序需求。 我结束了使用WakefulBroadcastReceiver
和AlarmManager
进行套接字连接尝试与给定的时间。
4.当手表退出蓝牙范围后,再回到范围内,然后蓝牙插座似乎会以某种'僵尸'状态进入。有时socket.connect
调用没有成功或抛出错误只是阻止,其他时间socket.connect
调用不会抛出错误,给出的连接已建立的印象,但随后的写入总是抛出IOException
。 每当我遇到这种情况时,我只是停止/启动似乎解决问题的蓝牙适配器。
5.请注意停止/启动蓝牙适配器。在蓝牙重新启动尝试期间,Android可以让CPU进入睡眠状态。我并不期待这种行为,但确实发生了。因此,如果您希望尽可能快地完成此操作,请确保应用程序在重新尝试期间获取PARTIAL_WAKE_LOCK
。当然,不要忘记尽快释放锁。