在自组 NAS 上备份安卓相册的办法
在自组 NAS 上备份安卓相册的办法
按照 自组NAS教程 成功搭建家用 NAS 存储以后,备份手机相册和媒体库的需求非常普遍。虽然各种商业 NAS 往往会提供各种网页端 gui 或手机 app 作为完善其生态的重要组成部分,但仅就「备份」这个需求来说,简单的一个 termux
就完全足够了。
按照 自组NAS教程 成功搭建家用 NAS 存储以后,备份手机相册和媒体库的需求非常普遍。虽然各种商业 NAS 往往会提供各种网页端 gui 或手机 app 作为完善其生态的重要组成部分,但仅就「备份」这个需求来说,简单的一个 termux
就完全足够了。
Devices are designed to be accesed via socket.io. By default a device gets itself registered at the official socket.io server once it is connected to the internet, either via wirelss LANs(aka Wifi) or 4G/5G cellular networks. Clients who are willing to request the realtime video streaming should connect themselves to the socket.io server and join the same room with the target devices, which is followed by the steps below:
1 | import { io } from "socket.io-client"; |
偶尔发现的简便小技巧随手分享。
使用场景:家庭PC,Windows系统,希望搭网络服务(ssh/transmission/nginx等),或者远程开发平台(go/python/nodejs等)
硬件要求:家用宽带最好有公网ip(包含ddns)且路由器可以转发端口。如果没有的话可以用云服务商那儿买的vps搭frp或ssh tunnel。
如果有需要可以自行设置wake-on-lan方便远程开机(我自己是24小时开机所以没用上这个)。
一、装VMware Player。对,免费的Player就够;
二、新建一个Linux的guest,网络连接选桥接(bridged)。装好server版系统(不需要gui),发行版随意。
三、在guest机上装你需要的服务,设置好systemctl enable。在路由或vps上设好端口转发。
以上三步是常规操作不多赘述详细操作,有疑问查阅之前的文章
根据 Nvidia官网 教程说明,先下载用于 Ubuntu (或者其他当前使用的Linux发行版)的安装包。其中 Ubuntu版的下载地址如下:
https://developer.nvidia.com/sdkmanager_deb
注意:使用该地址下载可能需要先注册Nvidia用户,注册步骤请按照官网提示一步步进行,此处不多赘述。
下载完成后打开终端 Terminal,键入以下命令安装sdkmanager(此处假设下载好的.deb安装包位于 ~/Downloads/
目录,该目录是大多数浏览器的默认下载目录,如果你手动修改过下载保存目录,请自行替换):
$ cd ~/Downloads
$ sudo apt install ./sdkmanager*.deb -y
等待安装完毕后键入以下命令打开刚安装好的sdkmanager:
$ sdkmanager
进入SDK Manager 的GUI图形界面后取消勾选 HARDWARE CONFIGURATION
栏中的 Host Machine
选勾,再点击 Target Hardware
方框右下角的三个点 ...
,选择Jetson TX2 models
。
监测平台(下文简称平台)采用 NextJS 作为开发技术栈。基于 NextJS 的前后端一体化和服务器端预渲染(Server Side Rendering) 特性,可以方便地进行设备端传感器数据上传和客户端页面实时刷新。
NextJS 依赖 Node.js 环境和 ReactJS 前端框架,因此开发环境上需要安装好 Node.js 和 npm 包管理工具。在 Ubuntu 20.04 LTS 版本下安装nodejs 方法如下
1 | $ curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - |
监测仪会在有网络连接的前提下定时向预设的网络接口以 HTTP 协议的格式发送 POST 请求,用以向网站传递设备信息以及实时气体浓度数据。
目前设备外发数据的接口有以下五种:
token 请求接口:
http://[hostname:port]/[apipath]/getToken
用以发送用户名密码验证信息并获取返回的验证 token 。该 token 将被用于以下另四种 api 接口的身份验证。
设备信息上传接口:
http://[hostname:port]/[apipath]/deviceInfo
用于上传监测仪的设备名称、序列号、经纬度位置信息以及所属用户。
摄像机信息上传接口:
http://[hostname:port]/[apipath]/cameraSource
用于上传摄像机的 camera id、摄像机画面的远程获取 url 和所属设备。
传感器信息上传接口:
http://[hostname:port]/[apipath]/sensorInfoUpdate
用于传递设备上气体浓度传感器的名称、代号、类别、上下限阈值和所属设备。
实时气体浓度数据上传接口:
http://[hostname:port]/[apipath]/realtimeDataUpload
用于上传设备中所有气体传感器的实时浓度数据。该接口一般会同时上传所有气体浓度数据,因此发送的数据结构是数组形式。
Qt 的位置信息库 QtPositioning 中获取位置信息的输入源设置方法为:
QGeoPositionInfoSource::createDefaultSource()
该方法默认选择当前系统的位置信息提供服务获取经纬度坐标等。
我的系统是树莓派 Raspbian,因此安装了 geoclue2 作为位置服务,用上述方法创建位置信息源后开始获取树莓派的经纬度,再用 GeocodeModel 从 OpenStreetMap 处查询经纬度对应的实际地址。
以上是自研发软件的一些背景。
在开发环境中调通了地址显示的功能后,编译部署到树莓派上,发现数据源一直是 Null 。但是 geoclue2 很确定是正常工作的,不管是示例程序还是开发环境都明确显示位置源没有问题,但就是在实际程序内不显示位置。
开 qDebug() 打印,supportedPositioningMethods 是正确的。终端给出的是这么一行提示:
libEGL warning: DRI2: failed to authenticate
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
qt.positioning.geoclue2: Unable to start the client: "org.freedesktop.DBus.Error.AccessDenied" "An authorization request is already pending"
qml: Source error: 0
qt.positioning.geoclue2: Unable to start the client: "org.freedesktop.DBus.Error.AccessDenied" "'[myapp]' disallowed, no agent for UID 0"
很显然,qt.positioning.geoclue2 报错那两行跟获取不到位置信息的错误高度相关,于是理所当然的从这里下手了。