作者归档:zjqzxc

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。

 

 

 

 

Windows使用Rsync备份Linux文件夹

最近有需求把vps上某个备份文件夹自动同步到别的地方。虽然另一台linux服务器也做了同步,但终究文件本地没有备份心里不踏实,于是考虑自己的电脑在每天的第一次开机时执行一次同步。

rsync:

方案一:cwRsync

方案二:cygwin+源码编译

以上两种方法均可通过搜索引擎找到详细步骤,不详述

每天自动执行

最简单的方式是计划任务,不过我这里并没有用这种方法,而是将备份脚本加入到开机自启动中。这种方法存在一个问题,即如果一天多次开机,备份脚本会多次运行。虽然rsync并不会对服务器产生太大压力,但是服务器端备份间隔没有小于一天的,一天多次检查还是有些多余。

解决方案:

创建一个状态文件,内容为今天的日期。脚本运行后先检查该文件中的内容与今天的日期是否相同。若相同则不执行备份,若不同则执行备份,并在备份完成后将今日日期更新到脚本中。

@echo off
echo VPS自动同步到本地....
set /p a=<D:\tools\vpsRsyncDate.conf
if "%a%"== "%date%" (
  echo 今日已同步,无需再次同步
  pause
) else (
  D:
  chdir D:\cygwin64\bin
  echo 开始同步xxx
  bash --login -i -c "(RSYNC 备份命令)"
  echo 完成同步xxxx
  echo %date%> D:\tools\vpsRsyncDate.conf
  pause
)

使用Nginx反向代理,Cloudflare反向代理后,Apache获取客户端真实IP问题

起因:

服务器端部署apache+php应用,使用$_server[‘remote_addr’]获取的ip为127.0.0.1。虽然说可以通过其他方案来获取正确的ip,但强迫症发作,觉得这是不可接受的。

解决方案:

作为反代服务器的NGINX配置:

确保server中包含以下内容:

server{
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

作为后端服务器的Apache配置:

1、启用mod_remoteip模块

a2enmod remoteip

或(debian系统有效):

sudo ln -s /etc/apache2/mods-available/remoteip.load /etc/apache2/mods-enabled/remoteip.load

2、修改配置文件(以debian为例)

方案一:在使用Cloudflare后,客户端的真实ip会被放在HTTP_CF_CONNECTING_IP中,直接使用即可

在apache2.conf中或虚拟主机的配置文件中添加以下内容

<IfModule remoteip_module>
RemoteIPHeader CF-Connecting-IP
RemoteIPInternalProxy 127.0.0.1/24
</IfModule>

修改apache access log格式(在/etc/apache2/site-enable/*.conf中添加或修改)

LogFormat "%{CF-Connecting-IP}i %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"" proxied
CustomLog ${APACHE_LOG_DIR}/access-example.com.log proxied

方案二:手动剔除Cloudflare所有的ip

Cloudflare使用的ip可以在https://www.cloudflare.com/ips/查询

<IfModule remoteip_module>
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1/24
#CloudFlare IP Ranges
RemoteIPInternalProxy 103.21.244.0/22
RemoteIPInternalProxy 103.22.200.0/22
RemoteIPInternalProxy 103.31.4.0/22
RemoteIPInternalProxy 104.16.0.0/12
RemoteIPInternalProxy 108.162.192.0/18
RemoteIPInternalProxy 131.0.72.0/22
RemoteIPInternalProxy 141.101.64.0/18
RemoteIPInternalProxy 162.158.0.0/15
RemoteIPInternalProxy 172.64.0.0/13
RemoteIPInternalProxy 173.245.48.0/20
RemoteIPInternalProxy 188.114.96.0/20
RemoteIPInternalProxy 190.93.240.0/20
RemoteIPInternalProxy 197.234.240.0/22
RemoteIPInternalProxy 198.41.128.0/17
</IfModule>

其他:若未使用cdn:

<IfModule remoteip_module>
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1/24
</IfModule>

3、补充:若后端服务器为NGINX

在配置文件中添加:

set_real_ip_from 127.0.0.1/24;
real_ip_header X-Forwarded-For;

 

个人邮件服务器——一、概述

前言:

大概5年以前,一个偶然的机会,看到了腾讯提供了免费的企业邮箱,只要有域名就可以申请使用。上某宝,兴冲冲买了一个.info域名,回去注册,腾讯说这个域名后缀垃圾邮件太多,不让用了,心中顿时[哔]🐶。再后来,买了至今仍在使用的flagplus.net域名,总算是用上了一个可以自己随意指定用户名的邮件系统。

时间到了2016年,开始在net.cn上大量购买看起来好玩的低价域名后缀的域名后,想着要把其中某一个准备常用的域名开通一个域名邮箱,于是注销了当时申请的一个腾讯企业邮箱(提示只能注销域名3次,心中不爽),绑定新域名,提示不支持,心中[哔]🐶。

半年后的2016年底,随着希拉里邮件门事件的爆出,便萌生了搭建自己的邮件服务器的想法。于是乎开始查资料。本来以为只需要几条apt-get就能完成,后来发现原来远远低估了搭建邮件服务器的难度。陆陆续续又拖了半年,到2017年初,才最终付诸实践。

目前邮件系统已比较稳定运行几个月了,现在整理下整个配置过程,以防自己忘记。

继续阅读

使用插件显示博客阅读数量

博客的访问统计已借助第三方工具实现,但是参考了传统的公共博客系统,每篇博客都有阅读数量统计和显示。本着“WP插件无所不能”的信念(主要是懒得自己考虑如何把第三方工具的统计数据引入进来),经过一番搜索后问题解决。

 

用到的插件:

WP-PostViews:用于统计每篇博客的阅读数量(首页访问不计入统计范围)

PHP Code Widget(可选): 用于在小工具栏执行php代码

 

操作方法:

1、安装WP-PostViews并启用

2、(在合适位置)添加阅读数显示代码:

<?php if(function_exists('the_views')) { the_views(); } ?>

显示最受欢迎的日志:

<?php if (function_exists('get_most_viewed')): ?>
   <ul>
      <?php get_most_viewed(); ?>
   </ul>
<?php endif; ?>

2.1(可选):修改主题相关页面,如index.php, archive.php, single.php, post.php , page.php等,并添加以上代码,及适当的布局,此方法适用于对显示效果有严格要求的人

2.2(可选):因为之前的使用经验,修改主题布局后,再升级主题会导致修改的内容消失。所以考虑使用小工具来解决此问题。但是默认情况下,小工具并不支持执行php代码。搜索后使用插件PHP Code Widget解决问题

3、使用小工具显示博客浏览数

搜索安装并启用PHP Code Widget后,在外观——小工具页面,拖动一个PHP Code标签到小工具栏的合适位置,并根据自己的需求设置合适的内容,保存后测试

 

一些问题:

1、与WP Super Cache的兼容问题:

博客使用了WP Super Cache,但WP-PostViews可以采用ajax方式,使得即使启用了缓存,统计依然可以准确进行。

此外,在小工具栏设置的显示访问数量代码,依然会收到cache影响。负面影响使会使阅读数显示不实时,正面影响是即使开启了这个插件,也可以做到全页面缓存

2、关于增加的数据库操作:

每次访问,会导致一次数据库wp-postmeta表中,post_id为对应博客id,meta_key为views的记录的update操作。由于update操作会导致一次随机读,操作代价比较大,当博客负载较重时不宜采用本插件。当博客负载过重时,建议使用可以部署在其他机器上的软件来实现。

[小工具]Windows桌面窗体所属进程查看Process Explorer

在使用Windows操作系统的过程中,经常会遇到,因为“误装”了一些国产的“全家桶”程序,导致了桌面上或者桌面右下角经常(有规律地)弹出一些奇奇怪怪的窗体,之前的方法一般是手动排除:即看看自己最近装了啥,以及目视分析任务管理器里那些不眼熟的进程来瞎猜。今天在论坛中突然看到有人推荐了微软提供的Process Explorer,在Windows10下测试后觉得很好用。

工具下载地址:

https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

备份下载:ProcessExplorer

使用截图:

通过表单提交simditor中的内容

使用中发现,simditor并没有自动将编辑器中的内容同步到textarea中,内容只能通过api获取,这使得无法直接使用表单的submit提交。

解决方法:editor在值改变时实时同步到textarea的中

补充:为了方便在后端语言直接向编辑器写入默认值,在编辑器加载时将textarea中的值默认传递给simditor;在自动保存插件启用时,优先保证自动保存的内容被加载到simditor中

关键代码如下:

<textarea id="editor" placeholder="Balabala" autofocus>123</textarea>

<script type="text/javascript">
var editor = new Simditor({
    textarea: $('#editor'),
});
if(editor.getValue() == ''){//当自动保存插件开启时
    //无自动保存数据,将textarea中的值赋值给editor
    editor.setValue(document.getElementById("editor").innerHTML)
}else{
    document.getElementById("editor").innerHTML = editor.getValue();
}
editor.on("valuechanged",function(){//simditor窗口内容改变实时同步至textarea
    document.getElementById("editor").innerHTML = editor.getValue();
})
</script>

 

折腾NAS之路

NAS毁一生,单反穷三代 ;两者均不沾,也成不了高富帅    —沃·兹基硕德

这篇博客仅仅是回顾事件,并不涉及具体技术细节。

0x00 为什么会有这么蛋疼的一篇博客?

这不最近又组了一台NAS嘛,趁热回顾一下自己瞎折腾的历程。
不过说到为啥会有组NAS的需求,额,好吧,台式机,笔记本,surface,手机要共享文件实在是麻烦,外加备份需求,一个nas还是很必要的。

0x01 折腾NAS,从折腾校网开始。

事情大概是这样的。那是很久很久以前,久到大概是在2012年初。那年我大一还没结束。因为学习无线网络覆盖不到宿舍区,在宿舍手机没wifi外加校园网20元一个月不限流量这么一个神一般的套餐存在,于是考虑把校网变成无线网来给手机(及其他设备)使用。
然而学校使用的深澜计费认证系统并不希望我这么做。在一不小心的一个机缘巧合,认识了某大胖子学长。在大胖子不厌其烦地指导下,终于买了一台tplink tl-wr703n 3g路由器并成功刷机openwrt,装python登陆上了校网并成功发射出无线信号,从此以后,在移动电源的助力下,宿舍实现7*24h无线网覆盖,当然这是后话。跑题了。

刚才好像提到了这么几个关键字:3g路由,openwrt;3g路由意味着这个路由上有一个usb接口,可以接U盘或者移动硬盘(外部供电的那种),可以接存储设备唉,这不就是nas嘛~虽然当时对nas毫无概念,虽然当时也就开了个http服务和ftp服务,不过不管怎么说,可以算作是一个nas了;openwrt嘛,一个linux内核的路由操作系统,成功将我带入了linux的世(大)界(坑)。

第一台(非现代意义上的)NAS长这样:

0N[TQ9]3DQTIP38Q9AIKK~T
额,不对,放错图了;上图为大胖学长在群里发的图,在看了这张图后我厚着脸皮请教了一系列相关问题并最终入坑。此图需永久珍藏。

97Y@[V4$$GAMZI~UM658B[X
这个才是我的设备;左上角为一个3.5英寸硬盘盒,曾经用把它接到路由器上并成功安装了discuz。

啊呀呀,说起折腾校网又是一堆回忆,都可以另开几篇博客说明情况了。

后续:一共买过3台703n(一台阵亡,其余两台从通州搬家后就收起来吃灰了),一台743n(一周内刷机刷错了,阵亡;直到毕业都没修好),一台大亚db120(双usb接口,用来跑打印服务器并顺便给台式机当无线网卡;毕业搬家通州后该路由作为主路由(两台703n当作ap扩展无线信号)高强度服役半年后阵亡;接班设备为一台小米mini)。

0x02 小插曲:镜像站那些年

时间大概是2012年中旬,在开始折腾前文所述的那个小路有后不久。经大胖(博客)牵线,与玉贤大大(博客)开始给学校折腾镜像站。不久后认识了李吉吉明(博客)大大,之后的数年里生活轨迹完全被改变了。

内容是在太多太乱,另开一篇慢慢说。

0x03 一台小主机

一台VIA芯片的x86主机,512M DDR一代笔记本内存条,板载CF卡槽;曾经通过外接U盘的形式跑Debian一年左右,后来因为种种原因一直没有发挥太大作用;毕业时送范神(博客)了。

0x04 一台龙芯2F CPU的主机

起源:大概是大三的某一台能,某日某qq群中突然有人发了一个链接,一台售价300元左右的,使用国产龙芯2F cpu的笔记本有团购活动。作为一个伪技术宅,果断购入,以供折(吹)腾(牛)。

结果:试着装了下debian,感觉有点费劲;用原生操作系统带出去装逼数次后,因为性能太差就垫枕头了,直到毕业。毕业后考虑用它作为监控机,试装debian后感觉版本有点老,遂放弃,并购入ATOM工控机一台完成此工作(下文又述)。后来的后来,就真的没再开过机了。再后来的后来,用来装debian的硬盘被我拆了装回老笔记本里,老笔记本里的1T硬盘被我拆出来当移动硬盘了,当然,这都是后话。

0x05 ATOM N270工控机

当主力NAS服役将近一年。

从监控机到NAS
原本从淘宝上买的时候是为了跑cacti监控vps的状态,回来后把手边剩下一个160G硬盘塞进去,装32位Debian 8 ,把cacti配置完成后就那么跑着实在是无聊;同时因为手里有surface有需求躺在床上看美剧/电源,平时又主力使用台式机下载,两者间共享实在不方便,便考虑把这台监控机加上nas功能。因为已经在跑cacti了,而且CPU是32位的,开虚拟化也不方便,就直接装samba来当一个简单的nas。

从NAS到下载机
后来的后来,感觉开着台式机下载太费电且噪音过大影响睡眠,于是考虑把这台小主机改装成一台下载机;下载默认目录就是samba的根目录,下载都东西也不用费劲从台式机再经过这台小主机可怜的百兆网卡上传进去了。
各种百度+谷歌,安装transmission,amule,aria2分别下载bt,ed2k和百度网盘/qq旋风离线文件。24H不间断bt下载,那段时间下载了不少“好东西”。啊,跑题了,说好的nas呢。

0x06 联想Q77+I5 3470s Micro-ATX主机

断断续续折腾了小半年,最终决定把NAS部署到ESXi上,一台机器同时当服务器/NAS/软路由(入手华硕路由后放弃该软路由)。

核心配置:
主板:联想Q77
CPU:Intel I5 3740s
内存:ADATA 8G DDR3
硬盘:东芝 饥饿鲨TR150 240G SSD
电源:长城HOPE-5500ZK智控0分贝(配高了,有点浪费)
网卡:Intel 82546GB 双千兆网卡

机器上运行ESXi 6.0系统,开若干虚拟机支持各类服务。主板板载网卡做软路由WAN口,独立网卡连接交换机并作为软路由LAN口,双口预留作为端口聚合使用。主板板载网卡接交换机,独立网卡闲置已暂时拆除。