家里从开始使用物品管理软件到现在已有一年的时间。

在整理物品的过程中,我发现有时会很难从物品名称中联想到物品的模样。往往物品就在眼前,且物品管理中也记录了物品的相关信息,却还是不知道眼前这个物品叫什么,有什么用。

这时候如果物品管理中每个物品在记录存放位置的同时附带了相应图片的话,就能方便我们将记录中的物品与现实中的物品联系起来。

服务器

要存放图片的话,就需要在数据库里新建一个表,将图片与物品对应起来。还需要有能力将图片从客户端上传至服务器,搜索了一下,轮子都有,那就直接用,很快,就搭建好了。

不过我的服务器带宽只有 1Mbit/s,如果将图片直接存放在服务器中,就会严重拖慢图片访问速度。因为现在手机拍摄的图片大多是 5MB,所以每次加载图片,需要至少 40 秒的时间,这个体验并不是很好。

一般遇到这种情况,会将图片存放在云存储里,在访问的时候直接访问对应的云存储位置。可以用腾讯云对象存储 COS,或者阿里云对象存储 OSS。不过之前的文章 外网通过 IPv6 直连 NAS 中提到,我家的 NAS 已经可以通过 IPv6 直连。并且我现在的服务器也支持 IPv6,可以直接与 NAS 通讯。所以我准备直接在 NAS 上部署一个 MinIO,一个开源的对象存储软件。这样也方便我备份和管理物品图片。

腾讯云的弹性公网 IPv6 按流量计费是 0.8 元/GB(只计算出流量),因为我只有上传图片的时候才会有出流量,所以每个月应该不会花多少钱。不过具体多少,等下个月我看一看再来更新。

2021/3/23 18:20 更新
家里宽带开通了公网 IP,不再需要服务器通过 IPv6 与 NAS 通讯。我将腾讯云的 IPv6 关闭了,到今天一共花了 0.03 元,一共上传了 4 张图片到 NAS。

客户端

手机上,通过 intent 库我可以直接调用系统相机拍摄图片,并将图片保存在缓存中,然后上传到图片。通过这样处理,我的安卓应用甚至不需要拍照权限。

不过由于我对 MinIO 还不够了解,网页版客户端出现了 CORS 报错,导致无法显示图片。

2021/3/13 20:32 更新
原来是我之前测试时设置了其他密码,后面又更改的时候没有按照文档来做。因为这个应用的配置是加密的,所以需要在更换密码时提供旧密码来让它迁移配置。结果我没有提供,导致它无法访问配置,也就导致了 CORS 设置出问题。

IPv6

服务器和客户端都搞定之后,结果在部署时我又遇到了问题。每次上传图片都提醒我,我无法访问 NAS,但我在服务器中 ping NAS 却发现一切正常。纠结半天终于反应过来,是 Docker 容器不支持 IPv6。

同样是利用万能的搜索引擎,我找到这篇文章 Docker IPV6 and Docker compose。参考文章,我们需要创建启用了 IPv6 的网络。

# 创建 Docker 网络
sudo docker network create --ipv6 --subnet "fd00::/80" website
# 设置转发
# -t 指定要操纵的表
# -A 向规则链中添加条目
# -s 指定要匹配的数据包源 IP 地址
# -o <网络接口>:指定数据包要离开本机所使用的网络接口
# -j <目标>:指定要跳转的目标
sudo ip6tables -t nat -A POSTROUTING -s fd00::/80 ! -o docker0 -j MASQUERADE

经过这样设置之后,利用命令 sudo docker run --rm --network website -t busybox ping6 -c 4 nas.hehome.xyz 测试,一切运行就正常了。图片也能够正常的上传。

未来计划

虽然到现在为止,上传物品图片的功能已经能够正常使用,但也就是实现了我设想中最基本的功能。

未来我还可以做如下的改进:

  • 既然物品有着对应的图片,那是否可以通过物品图片训练一个神经网络,反过来识别一个图片中有什么物品。
  • 客户端需要标注物品在图片位置的功能(训练所需参数)。
  • 完善对网页版的支持(显示图片网址,支持从网页上传物品图片)。
  • 优化客户端的图片显示功能,支持放大缩小。
  • 支持编辑图片信息与更换图片。

标签: 智慧家庭, NAS, 图片