React Native App获取安卓手机电池电量,执行后台任务,并使用MQTT和Home Assistant通信

NO.1
React Native

官方文档

https://reactnative.dev/docs/environment-setup

本文使用的版本是0.71版本

使用的是win10开发(目前只适配安卓手机,不考虑iphone)

此图片的alt属性为空;文件名为image-469-1024x561.png

NO.2
获取手机电脑

github地址:

https://github.com/react-native-device-info/react-native-device-info

React Native 获取 iOS 和 Android 的设备信息

最新更新时间是本文发布的3周以前,可以放心使用

使用方法

下载依赖

yarn add react-native-device-info

引入依赖

import DeviceInfo from 'react-native-device-info'

获取当前手机电量信息

DeviceInfo.getBatteryLevel().then((batteryLevel) => {
    console.log(`当前电池电量`,batteryLevel)
});

这个开源库,不仅支持电量获取,还有其他几十个API,可自行参开官方文档

此图片的alt属性为空;文件名为image-470.png

NO.3
后台定时任务

第一次使用js的setintervalde的定时函数,执行HTTP请求

发现当APP切回到后台是,定时器立马停止执行,所以这个方案不行

官方后台任务-Headless JS

文档地址

https://reactnative.cn/docs/headless-js-android

官方描述

Headless JS 是一种使用 js 在后台执行任务的方法。它可以用来在后台同步数据、处理推送通知或是播放音乐等等

也就是即便APP从前台界面切换到后台,任务依旧会执行,只要进程不被Kill

不仅仅是切换到后台,锁屏场景下也会继续执行,这正是我们需要的效果

建议使用第三方库:react-native-background-timer

github地址

https://github.com/ocetnik/react-native-background-timer

这个开源库的Tag最新一期在2020年,本文的React Native 2023年,本文测试,这个库在安卓手机上目前使用正常,能构建和使用

使用方式

下载依赖

yarn add react-native-background-timer

引入依赖

import BackgroundTimer from 'react-native-background-timer'

使用方法

// 后台任务
BackgroundTimer.runBackgroundTimer(() => { 
    console.log(`每3秒执行一次`)
}, 
3000);

测试后台任务时,使用的是HTTP服务,经过12小时的锁屏待机测试,APP每隔几秒都在正常的请求HTTP通信,没有被进程杀掉

关于手机设置APP保活的操作,会拆分为另一篇文章来记录

此图片的alt属性为空;文件名为image-471.png

参考以下文章

安卓手机-小米设置React Native APP锁屏后常驻后台保活,避免被杀掉进程

NO.4
MQTT

除了使用HTTP的通信方式,还可以使用MQTT的方式

因为它足够轻量,可以保持长连接,避免手机过多消耗电量和带宽,同时支持订阅发布模式,Home Assistant只在手机发布通知时,才会有对应的交互操作

不要两个设备频繁请求响应

npm地址

https://www.npmjs.com/package/@openrc/react-native-mqtt

github地址:

https://github.com/mqttjs/MQTT.js

官方描述

一个极简的MQTT库,支持react-native,保持MQTT同步,支持emq和mosquitto

下载依赖

yarn add @openrc/react-native-mqtt

引入依赖

import MQTT from '@openrc/react-native-mqtt'

使用方式

const client = MQTT.connect('ws://car.openrc.top/mqtt', {
  port: 8083,
  protocol: 'ws',
  username: 'your username',
  password: 'your password',
  reconnectPeriod: 30 * 1000,
  qos: 2,
});

client.on('closed', function () {
  console.log('mqtt event closed');
});

client.on('error', function (msg) {
  console.log('mqtt event error', msg);
});

client.on('connect', function () {
  console.log('connected mqtt');
});

其他React Native 开源库

可以看到本文使用的是最新的支持React Native的库,3年前更新

此图片的alt属性为空;文件名为image-472-1024x276.png

经过测试,这个库能够正常运行,连接MQTT

本文使用的MQTT服务,使用开源的EMQX

参考文章

Docker Compose部署开源免费EMQX MQTT服务 用于Home Assistant MQTT通信

NO.5
Tips

至此,一个支持后台锁屏定时任务,可以获取手机电量并且MQTT通信的APP完成

主要用于设置闲置手机设置电量阈值,通过Home Assistant设置智能插座开关,避免电池鼓包,过度充电,造成的安全隐患,也能保持手机一直开机,正常接收短信,电话,以及自动化任务等

Home Assistant设置手机自动充电

参考文章

《Home Assistant智能家具设置MQTT通信 联通智能插座自动化开关》

END