买了几个15元一个的网络摄像头,必须联网才能用.买了乡下用的,没有网络.于是花了点时间,弄了一个本地服务器,使得摄像头在无网络也能用.

 

摄像头来源

某宝9新二手.15元一个.清晰度差了点,只有720P

APP是在的.

但是这个摄像头必须联网才能用,因为在乡下用.乡下是没有宽带的.于是就开始试试能不能弄成离线服务器.

 

 

 

抓包

 

手机抓包

 

首先是有网络环境.手机抓包.得到rtsp链接.

360P

rtsp://192.168.1.25:51503/6034E17AC9C0ECF82F8F0E3C4F890698_1

720P

rtsp://192.168.1.25:51503/6034E17AC9C0ECF82F8F0E3C4F890698_0

 

6034E17AC9C0ECF82F8F0E3C4F890698

可能是一种基于摄像头IP或MAC拼接后MD5生成的字符.

这个字符对摄像头是固定的.也就是抓包一次即可.至于算法不必纠结.

 

将RTSP链接放入网络播放器中是可以播放的.大概有2~3秒延迟.

 

路由器抓包

 

摄像头开机的时候post到官方服务器.

 

服务器返回一个JSON

 

{
	"ipc_datetime": "2024-12-21 19:29:47",
	"msg_name": "IpcRegister",
	"timezone": 8,
	"cloud_url": "",
	"cloud_package_index": 0,
	"cloud_stream_type": 1,
	"bcd_cloud": 0,
	"cloud_md_always_record": true,
	"bind_flag": true,
	"user_key": "**************",
	"pic_url": "http:\/\/mpic-cn14.*.com\/motionPic\/upload?u=151733430789814069",
	"ipc_uuid": "0",
	"ret": 0,
	"ret_desc": "success",
	"pull_url": "120.77.*.*:9515",
	"verify": "*******************",
	"server_reserve": "6",
	"alarm_uri": "http:\/\/devicecall.*.com\/api\/DeviceAlarm\/alarmEventReport"
}

 

然后建立一个TCP通信

指向上面json中

"pull_url": "120.77.*.*:9515"

TCP服务器返回

{"msg_name":"IpcRegister","msg_index":3,"ret":0,"ret_desc":"success connected","ipc_id":"66310197036","ipc_datetime":"2024-12-21 18:29:48","timezone":8}

 

搭建测试环境

 

路由器设置劫持域名.劫持到我电脑.临时测试下.

 

 

电脑上我用caddy弄了一个简单的web服务器.

返回上面数据.

<?php

$json = '{
    "ipc_datetime": "2024-12-21 19:29:47",
    "msg_name": "IpcRegister",
    "timezone": 8,
    "cloud_url": "",
    "cloud_package_index": 0,
    "cloud_stream_type": 1,
    "bcd_cloud": 0,
    "cloud_md_always_record": true,
    "bind_flag": true,
    "user_key": "**************",,
    "pic_url": "http:\\/\\/mpic-cn14.*.com\\/motionPic\\/upload?u=151733430789814069",
    "ipc_uuid": "0",
    "ret": 0,
    "ret_desc": "success",
    "pull_url": "120.77.*.*:9515",
    "verify": "**************",,
    "server_reserve": "6",
    "alarm_uri": "http:\\/\\/devicecall.*.com\\/api\\/DeviceAlarm\\/alarmEventReport"
}';

echo $json ;

摄像头重新通电.

摄像头提示联网失败.

 

然后伪造一个TCP服务器

"pull_url": "120.77.*.*:9515"

指向我电脑IP10.0.0.228

"pull_url": "10.0.0.228:9515"

 

发现TCP服务器不需要模拟返回,只需要摄像头能建立TCP链接,摄像头就会提示联网成功.

摄像头重新通电.链接成功.

 

 

通过RTSP链接,可以连接.但是每次连接摄像头时间显示的都是2024-12-21 19:29:47开始

通过CADDY服务器日志,发现摄像头一直在注册设备,然后caddy返回上面json,时间就是2024-12-21 19:29:47

修改下上面PHP代码,调整输出为当前时间.成功显示正确时间.

 

 

离线测试

 

关闭路由器互联网.家里彻底断网.

打开官方APP,可以看到我WIFI图标是无网络的.APP也提示无网络.

但是APP显示设备在线.有且只有一个在线.(如果联网我这里有好几个设备)

 

 

 

进去查看,确实可以查看,甚至双向语音功能也正常.

 

路由器部署

 

环境

直接路由器用C语言写一个tcp服务器.

web服务器直接用php即可.因为路由器装了kod,有PHP.

 

路由器录像存储

 

摄像头都这么便宜了,我不可能买个录像机吧,于是看看有没有openwrt录像的方案.

找到几个都是docker的,但是我不喜欢用docker.

 

 

然后找到这个openwrt开源项目:

https://github.com/onchina/luci-app-nvr

原理是ffmapg转录RTSP监控视频流到文件.

我使用有些问题,我改了下.

https://github.com/onchina/luci-app-nvr/pull/2/files

 

 

 

预览视频

 

然后通过kod网页可以查看已经录制的视频.(手机也可以.)

 

摄像头TF卡和路由器双存储.现在可以完全脱离APP实现录制了.过两天部署到乡下.