关于安卓机实现远程视频监控

我们先来定义一下需求,最基本的视频监控啥也不干,只是希望能在想看的时候看到视频。

前提是,外网能够访问,否则的话,这个业务基本意义不大(只能用来看豪宅)

那么基于这个需求,我们有如下几种方案:

1、成熟的远程监控软件,如向日葵,其提供一整套服务,需要注册或者付费;

2、国外类似向日葵的产品,但是由于其服务器在国外无法稳定。

3、类似IPCAMERA这样的安卓APP;

方案3,这类的APP,如果是商业化的,通常它也需要注册或者付费,这样它才可以提供外网支持。

如果扩展一下,仅使用免费的功能,外网支持自己去实现。

还有如下几种方案:

1、通过向日葵的花生壳实现域名向家庭网络外网IP的映射,然后再将外网IP向安卓手机的IP进行映射。但这个事情基本前提是你家有独立的外网IP,实际上宽带商一般不提供独立的外网IP,他们用的NAT,所以根本就访问不到你家来。

2、建设一个家庭的VPN网络,手机直接连进VPN,再访问安卓手机提供的摄像头监控页面链接。

3、让安卓手机上的摄像头APP向远程的推流视频服务器比如RTMP进行推流,但需要自建RTMP服务器。

抛开成本不谈,这个方案有一个大问题,RTMP目前在手机端的页面上不能支持!(网上有个所谓的vedio.js,只有电脑端使用,有人说百度魔改的版本可以,实际上并不能)

如果实现一个苹果的HLS推流(M3U8模式),它的问题是延迟比较严重。而且实现起来相对麻烦一点。

(Windows下实现ffmpeg+nginx+rtmp+hls实现直播推流拉流(低延时)_u011925282的专栏-CSDN博客_ffmpeg hls推流
https://blog.csdn.net/u011925282/article/details/102580420)

当然,有自己的服务器,也可以直接建一个基于webrtc的聊天室。有一个php的workman项目,它有一个这样的demo,就是弄两个进程,监听两个端口,一个发,一个收。

不过很严重的是,现在chrome已经不支持http的webrtc了。你必须用HTTPS,可是https的端口是443,你得修改那个项目,实现外部443向内部其他端口的映射或说反向代理,如果你的服务器上已经有https的项目了,apache怎么解决两个项目的冲突,我现在还没搞清楚。

要是弄的是nginx,就会好一点。

而且这个项目的本质是推jepg文件,所以想想也不会太快。

至于flash,人家也不玩了。

 

如果不考虑手机端直接走web使用的话,实现了rtmp推流服务器之后,在手机端安装一个可以播放rtmp推流的播放器,这样基本上可以解决需求。

至于怎么鉴权。可能要在推流地址上下功夫吧。

用DOCKER建一个rtmp推流服务器还是挺容易的。

最近折腾NFC帖片的问题

关于卡

有些印刷了卡号的厚卡是ID卡,用手机和PN532都不能识别,不能识别的根本原因倒不是什么IC还是ID,而是因为频率问题,125K的频率,读卡器无反应。

关于帖片

买了NFC213的贴片,小米钱包是读不了它的。但是NFC WRITER有反应,但不能写。

恩智浦的NFC帖片软件可以读可以写。

不但可以写,而且可以把系统中的APP引用起来。但是如何实现的,目前存疑,如果是恩智浦的APP本身实现的,那么可以考虑把已经写入的卡放到其他安卓手机,看是否能呼起相关APP,目前没有做这个试验。或者把恩智浦的APP给卸载或者关闭了,看看有没有用。

最可气的是,即使是把网址写入到帖片里,又呼起了浏览器APP,却不能使浏览器APP打开网址。

目前还没有尝试写shell。

试用大厂智能音箱,感到非常失望

虽然现在玩这个已经不新鲜了,但是还是感到很失望。

阿里的方糖2无屏,小度S1有屏。

这两个产品都很渣。

虽然这两个都是老款,但我相信它们的软件是会升级的。

目前这个渣设计,感觉像骗钱的一样。

嗯,你想赚钱可以,但是可不可以把产品做得像样一点。

你音箱本身功能行不行便罢,为什么手机APP也搞那么渣呢?

阿里的天猫精灵APP,连接了设备之后,居然找不到设备。

莫名其妙就被删除掉了。

而且已经连接过的,你再次连接,它还会提示给对方设置WIFI。

相信很多人用这个东西,是希望能和家庭做比较快捷的联系,至少有个对讲机的功能。

结果呢,你只能找到所谓打电话功能。

打电话为什么需要这个智能音箱呢?

我们需要远程和家庭里的智能音箱通话,这样家里的老人、孩子能够快速地和上班在外的人联系上,做饭时候也不用再去接手机。

但是天猫精灵搞得乱七八糟,复杂得要命,留言都不知道留到哪里去了。

小度S1,带摄像头带屏幕,所以它把视频通话放在了首页。不过还是表现很弱。

然后一堆APP堆在屏幕上。各种推荐推销。

洽饭可以理解,但为什么不能把首页做简单点,把麻烦的花哨功能缩回去呢?

还好,百度那个有看家功能,只是它不能默认把看家视频放到百度网盘,却需要单独买会员买云存储。

还有百度网盘上的相册,它不能默认在小度S1上播放,要你自己打开百度网盘。

小度S1的屏保,你也不知道它在什么时候会启动。

它的家庭相册不能直接接到百度网盘里,而是自己在本机上存着,还提供了所谓同步的功能。

也就是说,你想让它显示点东西,得把照片拖到家庭相册的同步文件夹里,老年人哪会这个?

而且小度自己的摄像头再好,有人会拿它拍照吗?

把它上面的照片同步到百度网盘有什么鸟意义呢?

关于IC卡与ID卡的区别

关于ID卡

ID卡属于大家常说的低频卡,一般大部分情况下作为门禁卡或者大部分大学里使用的饭卡,一般为厚一些的卡,是只读的,卡里面只保存有一串唯一的数字序号ID,可以把这串数字理解为你的身份证号,刷卡的时候,读卡器只能读到ID号,然后通过跟后台数据库进行匹配,如果是门禁卡,那么数据库里面就是存在这样的ID号,如果匹配上门就开了,匹配不上门就开不了。

如果是学校的饭卡,刷卡的时候,实际上操作的是你对应ID号相关的数据库中的数据。ID卡本身不存在任何其他数据,所以,学校使用的ID卡饭卡,只能复制卡,刷别人的钱(数据库中的钱),但并没有办法改变账户里的数据。

ID卡的特点

  1. ID卡就是大家常常说的低频卡
  2. 其一般厚度较为厚,并且只是只读,只保存一串唯一身份识别序列号(厚度仅作为参考,也有比较薄的ID卡,如 EM4X、TK4100)
  3. ID卡不存在任何其他的数据

关于高频以及IC卡

高频( 英语:High frequency)是指频带由3MHz到30MHz的无线电波,然而常用的RFID使用的高频频段为13.56MHz

IC卡全称集成电路卡(Integrated Circuit Card),又称智能卡(Smart Card)。可读写,容量大,有加密功能,数据记录可靠,使用更方便,如一卡通系统

消费系统、考勤系统等,目前主要有PHILIPS的Mifare系列卡。

其实ID卡本身的设计就存在所谓的芯片,和IC卡并无本质区别。从前我们会讲公用电话或一些银行卡的接触式卡叫“IC卡”,是因为那块裸露的芯片及其金手指。高频卡类似MIFARE CLASSIC存在着其唯一身份识别UID,在很多门禁使用案例当中,也都有很多基于高频频率中的MIFARE CLASSIC作为ID卡来使用,因为也衍生出了很多只有0区(UID部分)的MIFARE CLASSIC。

如何区分

3个能准确分辨ID卡、IC卡的小技巧。

1、卡面的数字

针对白卡或者钥匙扣卡可以观察卡面上的数字来分辨,ID钥匙扣上一般有00开头的10位或8位数字,如00123647或0098764736。白卡是和银行卡大小薄厚差不多,表面没有印刷图案文字的一种卡。ID白卡卡上有00开头的18位数字,如0012345678 123,45678。而IC钥匙扣卡和IC白卡一般没有印刷卡号。

2、内部线圈

分辨印刷卡是ID卡还是IC卡,上述的的办法可能就不管用了。这时候可以通过观察卡内部线圈的形状来进行分辨。在比较黑暗的地方用手电筒照向卡,观察卡片里面的线圈,一般ID卡线圈是圆形的,并且线圈匝数比较多。IC卡线圈是长方形的,匝数比较少。观察线圈的方式有一定的局限性,首先在印刷色彩较深的卡上,很难观察地到线圈。其次圆形线圈是ID卡、方形线圈是IC卡指的都是一般情况,不排除有特殊的定制的线圈。

3、手机NFC功能检测

如果你手机有NFC功能也可以轻易检测出IC卡、ID卡。ID卡和IC卡重要的区别是工作频率的不同,ID卡的工作频率是125KHz,IC卡的工作频率是13.56MHz。手机NFC的工作频率也是13.56MHz,所以手机的NFC功能能感应到IC卡,不能感应到ID卡。

 

关于所谓的UID和CUID卡什么的

UID卡是一种IC卡,其实一堆”id”卡都是IC卡

UID卡可以修改任意扇区,作为M1复制的子卡,主要应用在IC卡复制上。该卡片完全兼容mifare 1k卡片。卡片的block0(UID所在的block)可以任意修改,重复修改。

UID卡适用于:一卡通、门禁、停车场、自动贩卖机、电子钱包、电子商务、身份验证等多个领域,在住宅小区、写字楼、工厂、学校、医院等各行业中的非接触式IC卡应用。

 

普通IC卡,0扇区不可以修改,其他扇区可反复擦写,我们使用的电梯卡、门禁卡等智能卡发卡商所使用的都是 M1 卡,可以理解为物业发的原卡。

UID 卡
普通复制卡,可以重复擦写所有扇区,主要应用在IC卡复制上,遇到带有防火墙的读卡器就会失效。

CUID 卡
可擦写防屏蔽卡,可以重复擦写所有扇区,UID卡复制无效的情况下使用,可以绕过防火墙。

FUID 卡
不可擦写防屏蔽卡,此卡的特点0扇区只能写入一次,写入一次变成 M1 卡,CUID 复制没用的情况下使用,可以绕过防火墙。

UFUID 卡
高级复制卡,我们就理解为是 UID 和 FUID 的合成卡,需要封卡操作,不封卡就是 UID 卡,封卡后就变为 M1 卡。

ID卡的常用技术参数

1、工作频率:125KHz

2、内部序列号:5个字节

 二、ID卡的分类:

ID卡可按厚度再区分

1、厚卡:厚度1.8mm,厚卡可以喷上各种格式的ID卡号,可以进行丝网印刷,可以另外印刷不干胶贴纸或彩印透明薄膜后贴上去。成本极低,是世界上最经济的射频ID卡。

2、标准厚薄卡:厚度1.05mm,可以双面彩色胶印、打印照片,可以激光或喷印各种格式的ID卡内码或自编流水号。

3、标准薄卡:厚度0.8mm,可以双面彩色胶印、打印照片,可以激光或喷印各种格式的ID卡内码或自编流水号。

如今ID卡常用芯片型号有EM4100、EM4102、SMC4001、NT8803、NT8805等。国内实际用量最大的是台湾出产的SMC4001,其次才是瑞士EM公司生产的EM4100。目前ID卡最典型应用:门禁、考勤、消费、停车等各种安全要求不高的场合。

 

又是忙乱的一天

昨晚几乎没睡觉,还是失眠问题。

早上到公司,上来就继续安装mediawiki,但是安装好之后发现实在不好用。

特殊页面有一整页,整体概念和dokuwiki差不多,但是复杂度比dokuwiki要高,而功能其实更加简陋,唯一优势是默认界面看起来比较漂亮。

最后终于决定还是弄dokuwiki,但没想到复制原来安装好的版本其实并不可行。

虽然这个东东没用数据库,可它还是需要安装的。

各种插件走起来。

其他的都一样,就是在Nginx下权限控制有问题。

然后中间几次开会听人讲公司业务。

细节都不记得,观其大概吧。

当初和某人从0开始搞一个公司,也算百分百的元老,但是真的忍不了他们在工具上搞七搞八,不知道多少时间都浪费上在这些工具上,所以有些事情不愿意参与。后来果然是项目管理工具都换了几茬,文档工具换了几茬,各种任务管理、流程管理也换了几茬,代码却是稀烂,产品更是更新慢,当然表面上功夫到位,花几个月时间搞个新版,就是弄个新界面,功能没加几个,而且学卡慢死,客户最大的需求没人理……

为什么我又要吐槽呢。

 

现在想用禅道,几年没用禅道了,现在居然已经不记得怎么用了。关于禅道中产品与项目的关系,这个解释得比较清楚。

https://www.jianshu.com/p/24e240373b6d

这一天过得真是充实且枯燥

早上有个事,要通过手机上传几个资料的照片。

结果这页面里每个输入项的标题都显示不全(全是省略号)。

折腾了半天,最后弄到一个表格,方知这省略号后是什么东东。

下午为了搞wiki,买了一台新的vps。

买完安装lnmp好一阵折腾。

目的是为了安装那个啥mediawiki,结果设置好vhost之后死也无法访问,以为是阿里云的安全组策略错了,搞到下班之后,在地铁里突然想到,也许是域名没备案导致的。

果然,那些域名既没有备案也没有认证。

好吧,我先不理这个事,先用ip再说。

谁知配置好ip访问之后,又提示说php版本不够高,悔不当初啊,为了兼容一些老程序,故意选择缺省设置。

好吧,那就升级php,结果升级完就502了。

办法是什么呢,它有一个oldphpxxx的文件夹,这是备份啊。

把这个文件夹名称改成php,然后再次升级,居然就升级成功了。

这回不再说php版本不够了,但是又说缺少依赖,具体缺少哪些依赖它也不提,就说建议用composer之类的东西去安装。

好吧,这composer咱这里也没有啊,又要研究安装composer。

 

用tasker玩转手机ftp服务

这篇文章玩tasker玩出了花,作者不可考,收藏如下:

最近想实现一个功能:在笔记本上贴一个NFC标签,当把手机放上去的时候,手机内置的EStrong File Explorer ftp服务自动启动,这样通过笔记本电脑就可以访问手机的文件,当把手机拿开,自动关闭手机ftp服务。

研究了一下 Tasker 的Send Intent功能,以及EStrong File Explorer 反编译后的代码,发现了一些规律,于是决定试试,成功。
[size=13.63636302947998px]
Use task “Send Intent[size=13.63636302947998px]” to start/stop ES File Explorer ftp:

[size=13.63636302947998px]1、StartESFtp
[size=13.63636302947998px]Tasks->New Task(“StartESFtp”)->Add Action->Misc->Send Intent->
[size=13.63636302947998px]Action: android.intent.action.MAIN
[size=13.63636302947998px]Package: com.estrongs.android.pop
[size=13.63636302947998px]Class: com.estrongs.android.pop.ftp.ESFtpShortcut
[size=13.63636302947998px]Target: Activity
[size=13.63636302947998px]2、StopESFtp
[size=13.63636302947998px]Tasks->New Task(“StopESFtp”)->Add Action->Misc->Send Intent->
[size=13.63636302947998px]Action: android.intent.action.MAIN
[size=13.63636302947998px]Extra1: mode:2
[size=13.63636302947998px]Package: com.estrongs.android.pop
[size=13.63636302947998px]Class: com.estrongs.android.pop.ftp.ESFtpShortcut
[size=13.63636302947998px]Target: Activity

研究过程如下:
1、apktool 反编译 ESFileExplorer.apk
得到AndroidManifest.xml如下:
<?xml version=”1.0″ encoding=”utf-8″?>
<manifest android:versionCode=”103″ android:versionName=”1.6.2.5″ android:installLocation=”auto” package=”com.estrongs.android.pop”


<service android:name=”.ftp.ESFtpService” android:exported=”false” />
<activity android:theme=”@style/Transparent” android:label=”@string/app_name” android:name=”.ftp.ESFtpShortcut” android:launchMode=”singleTop” android:configChanges=”keyboardHidden|orientation”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
</intent-filter>
</activity>

从以上内容可以分析得到几个参数:
Action:  android.intent.action.MAIN
Package: com.estrongs.android.pop
Class: com.estrongs.android.pop.ftp.ESFtpShortcut
于是尝试使用以上内容作为参数,调用Tasker的Send Intent,结果发现可以成功启动 ES ftp!!

2、如何停止ftp呢?
研究com.estrongs.android.pop.ftp.ESFtpShortcut反编译得到的java代码和smali代码。
java代码:
public class ESFtpShortcut extends ESActivity
{
protected void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);
int i = 1;
Bundle localBundle = getIntent().getExtras();
if (localBundle != null)
i = localBundle.getInt(“mode”);
try
{
l locall = l.a();
locall.a(this, new k(this, i, locall));
finish();
return;
}
catch (Exception localException)
{
while (true)
localException.printStackTrace();
}
}
}

发现Extra属性里有一个参数”mode”:
int i = 1;
Bundle localBundle = getIntent().getExtras();
if (localBundle != null)
i = localBundle.getInt(“mode”);
并且缺省值是1
int i = 1
推测mode=1表示启动ftp服务,如果mode=0呢?尝试了一下,没能够停止ftp服务。于是继续看用到这个参数i的地方:
locall.a(this, new k(this, i, locall));
看看k这个类是什么内容:
class k
implements n
{
k(ESFtpShortcut paramESFtpShortcut, int paramInt, l paraml)
{
}

public void a()
{
while (true)
{
try
{
if (this.b == 1)
{

Intent localIntent = new Intent(this.a, ESFtpService.class);
this.a.startService(localIntent);

}
}
}
catch (Exception localException)
{
localException.printStackTrace();
}
if (this.b == 2)
this.c.c();
else if (this.b == 3)
this.c.e();
else if (this.b == 4)
this.c.f();
}
}
}

this.b是什么玩意?这个反编译出来的java代码质量很差,没有反映出b变量是哪里来的,但是可以初步推断应该是和Extra的mode参数有关。因为b==1的时候startService,进一步查看smali代码:

# instance fields
.field final synthetic a:Lcom/estrongs/android/pop/ftp/ESFtpShortcut;

.field private final synthetic b:I

.field private final synthetic c:Lcom/estrongs/android/pop/ftp/l;

# direct methods
.method constructor <init>(Lcom/estrongs/android/pop/ftp/ESFtpShortcut;ILcom/estrongs/android/pop/ftp/l;)V
.locals 0

iput-object p1, p0, Lcom/estrongs/android/pop/ftp/k;->a:Lcom/estrongs/android/pop/ftp/ESFtpShortcut;

iput p2, p0, Lcom/estrongs/android/pop/ftp/k;->b:I

iput-object p3, p0, Lcom/estrongs/android/pop/ftp/k;->c:Lcom/estrongs/android/pop/ftp/l;

invoke-direct {p0}, Ljava/lang/Object;-><init>()V

return-void
.end method

可以看到,b就是k的构造函数的第二个参数(p0==对象本身即this, p1为第一个参数,p2为第二个参数,p3为第三个参数) 。参照前面对k构造函数的调用:locall.a(this, new k(this, i, locall));
因此可以确定 b–>i–>Extra(“mode”)
于是决定将2、3、4分别代入mode中进行尝试,幸运的是,刚尝试了mode=2就成功停止了ES ftp!!

当然,还有个更牛逼的哥们,写了篇英文文章,用bing搜索,发现应该还真是他原创,帖链接在此

Tasker to create toggle widget for ES ftp service — Send Intent

只可惜,据此操作,并不成功,不知道是不是ES现在改了还是怎么的。

搞定了owncloud以及HTTPS的问题

其实还可以选nextcloud\seafile之类,后者还能支持分布式存储。

怕选择困难症,所以很快就定下来用owncloud,其中主要原因是它提供中文界面。

我本不需要,但如果要方便他人,必须有这个。

暂时不靠它存大文件,主要就是文档存储吧。

yum里有安装源,不过就是下载一堆PHP代码回来而已。

我一开始以为它安到哪里我就必须在哪里用,但发现apache的配置太麻烦,于是自作主张把它移到“合法”的位置,结果发现没问题,这就证明确实是一堆PHP页面没有其他的东西。就算有,其位置也不影响吧。

改了apache的配置之后,遇到几次权限问题。

其中有一个.ocdata的隐藏文件,死也搞不定。后来怀疑是owner的组有问题,照网上的脚本去设置,结果遇到脚本本身的问题,复制下来的脚本代码linux居然不认?仔细看报错,到处都是\r,想来应该是windows下的文本自带了不兼容linux的换行吧。

好吧,全部替换,第一次可行,可是配置不对,第二次又不可行了。后来想想不就是脚本吗?我就手动改好了。手动改掉了owner的group,这个group得是apache的拥有者。后来查了一下apache的进程信息,得到了真正有效的group,用命令改过果然就好了(用winscp是改不了的)。

这个owncloud也是讨嫌,官网不留APP下载地址,只留个google市场的地址。

在国内的安卓市场找到的版本过低,居然只能上传不能下载,也看不到远程的文件。后来到bing.com里下载到了新版本的安卓APP,用起来感觉还算好。

然后接下来发现不用https就不能分享文件。

好我继续搞https,之前有几个证书都过期了,更好理一理。

首先第一个问题,去年第一次过期的时候,把其中一个证书(第2个小程序的证书)给直接装到服务器里了,没有再走那个所谓的负载均衡,那么这个证书必须下载下来放到特定文件夹里,然后配合apache的配置文件来使用。更新完了之后果然好了。

第二个问题是最早那个小程序的证书问题,那个证书不需要自己折腾,直接部署到负载均衡上就行,可问题是以前行,现在不行了,折腾了老半天终于明白是监听器里没有绑定证书。也就是说不但证书要绑到负载均衡上,负载均衡的监听器也要绑证书。由此可知,一个负载均衡绑两个证书也是可以的,只要弄两个监听器就好了?不过既然之前已经自己在服务器上完成了https,那就不折腾了。

弄完证书之后,发现派的域名本身是没有https的,只好换一个有https的域名来访问,但这也不是访问的问题,还要修改config,而且是两条语句,修改完了之后就好了。

然而装到最后,突然想到自己的空间有限,搞这个也就是放放文档吧,如果改用seafile,还能玩分布式,凑一下应该挺好的。以后再说吧。