分类目录归档:Android

Android手机使用Tasker控制充电

起因

看到网上有人说,备用机长时间插在电源上会导致电池鼓包,虽然不确定真假,但还是“宁可信其有,不可信其无”,安全第一嘛。

工具

  1. tasker
  2. esp8266开发板
  3. 带光耦的继电器
  4. usb公头,母头,线材若干
  5. 电烙铁(非必需,如果直接截断一根usb线接到继电器上的话,4也可以省了)

操作

基本流程

tasker在电量变化时通知单片机当前电量,单片机收到手机发来的http post包后查看当前电量,并决定是否操作继电器。例如,当点量小于35时启动充电,等于100时关闭充电,36~99时不进行任何操作。

tasker

在tasker上新建一个电量变化配置文件。

并在电量变化时将当前电量发送至esp8266(或者发送至自己的物联网服务器,再由该服务器控制继电器以实现更复杂的功能。物联网部分今后有系列文章详细介绍),可参考这篇博客《Android手机使用Tasker转发短信及来电》

esp8266+光耦继电器

大致效果如图。简单来说就是把继电器的vcc,gnd,sig连接至开发板的Vusb,GND,一个gpio口。之后将usb充电线的vcc线截断,连接至继电器的常开端(为了,省电)

备注:关于光耦继电器

esp8266的gpio是3.3v,但常见的arduino继电器模块是5V的,部分模块可能无法正常使用。采用光耦继电器可以避免因为电平不匹配带来的麻烦。

arduino

这里使用arduino来编写esp8266的代码。只贴出处理函数,其它支持代码(如,连接wifi,启动web服务器,gpio初始化)略。

server.on("/auto", [](){
digitalWrite(led, 0);
for (uint8_t i=0; i<server.args(); i++){
if (server.argName(i) == "battery"){

//当电量<35时,继电器对应的引脚写1,启动继电器

if(server.arg(i).toInt() < 35){
digitalWrite(PIN, 1);
}

//当电量=100时,继电器对应的引脚写0,关闭继电器

if(server.arg(i).toInt() == 100){
digitalWrite(PIN, 0);
}
}
}
digitalWrite(led, 1);
server.send(200, "text/plain", "auto");
});

ESP8266 可以使用lua编写,不过我个人对它不熟所以用了相对熟悉的arduino

其它思路

  1. Tasker中可以实现对应电量触发不同任务,给继电器直接下达开/关命令。我并没有采用这种思路,原因见2
  2. Tasker将电池电量送至物联网服务器,由物联网服务器来控制继电器开关。最初设计为该思路,但物联网服务器没写完,故只能将这部分功能转移到单片机上实现

 

 

Android手机使用Tasker转发短信及来电

起因

更换手机号及手机后,原手机及手机号成为备用机。因为各种原因,无法弃用以及不能把原手机卡插到新手机里,故想转发备用机的短信及来电至新手机上

工具

  1. tasker
  2. php
  3. 邮箱

操作

takser设置

以短信为例,在tasker上新建一个配置文件,手都短信,任意

并添加任务,名称随意,以方便自己识别为准。新建一个HTTP POST操作,内容参考

必要说明:

  1. mode=sms表示内容为短信,方便和电话等其它操作共用api
  2. 服务器端采用token鉴权。设计中服务器端支持多用户多手机,采用token来识别不同的手机

服务器(部分/伪)代码

伪代码

if ($post['token'] == '指定的token'){

if (preg('<span style="font-size: 1rem;">/(检验码|验证码|快递|快件|腾讯|支付宝|中国农业银行)/</span><span style="font-size: 1rem;">', $post['content'])){</span>

sendmail('邮箱',$post['content']);

}

DbInsert($post);

}

框架为CI,控制器部分

 

//处理送来的时间。从takser送来的时间为12.30形式,处理成12:30形式方便写数据库,防止整点12.00变成12导致的错误,可能非必需

$time_arr = explode('.',$this-&gt;input-&gt;post('time'));

if (count($time_arr)&gt;=2){
 $time = ($this-&gt;input-&gt;post('date').' '.$time_arr[0]. ':' .$time_arr[1]); 
 }else{
   $time = ($this-&gt;input-&gt;post('date').' '.$time_arr[0]. ':0' ); 
 }

//正则匹配一些特殊的字符串,保护如下字符串的短信,将被转发至邮箱(如移动139邮箱,实现免费的短信转发/来电提醒),其余短信只存入数据库。

$pattern = '/(检验码|验证码|快递|快件|腾讯|支付宝|中国农业银行)/';
 preg_match($pattern, $this-&gt;input-&gt;post('content'), $matches, PREG_OFFSET_CAPTURE);
 if($matches){
   $mail_content = '目标手机:'.$phone."\r\n时间:".$time."\r\n来源:".$this-&gt;input-&gt;post('name').'('.$this-&gt;input-&gt;post('from').')'."\r\n内容:".$this-&gt;input-&gt;post('content');
   $this-&gt;sendMail('Email地址','短信:'.mb_substr($this-&gt;input-&gt;post('content'),0,20),$mail_content);
 }

return $this-&gt;sms_model-&gt;addSms($uid,$phone,$this-&gt;input-&gt;post('from'),$this-&gt;input-&gt;post('name'),$time,$this-&gt;input-&gt;post('content'));

模型部分略,就是写数据库,该函数返回值为字符串,不涉及视图层

 

服务器部分代码还包括了查看短信及来电的UI部分,因为代码目前仅支持单用户,以及必要的UI没有完善,暂不提交github。