该项目包括服务器端和网络应用程序,旨在与配备不同型号和不同品牌的 GPS 跟踪器的儿童智能手表设备进行通信。例如,它可以与Q50、Q60、Q80、Q90、Q100、Q360、Q523、Q730、Q750、Q8、GW100、GW100S、GW200、GW200S、GW300、GW300S、GW400S、GW400X、GW500S、 GW600S、GW700、GW800、GW900、GW900S、GW1000、GW1000S、EW100、EW100S、EW200、K911、W8、W9、W10、Y3、G36 安全守护者、DS18、T58、T100、I8、G10、G100、 D99、D100、D100S 等。粗略地说,它的功能与 SeTracker、FindMyKids 等应用程序相同。主要区别在于,所有个人数据(如联系人、位置、通信历史记录等)都变得真正私密,因为它们存储在用户控制的硬件上。
解决的另一个问题是儿童智能手表通信和跟踪应用程序的安全模型。默认情况下,只要知道设备标识符,任何人都可以控制该设备,而无需进一步确认是否是设备所有者。如果设备的手机号码已知,则可以通过向设备发送文本消息来轻松获取标识符。当然,有一个密码,但所有设备都具有完全相同的出厂密码,并且没有烦人的通知要求更改密码,因此没有人这样做。
在此应用程序中,已实现以下安全场景:
最后但并非最不重要的一点是,它是免费的,没有广告:)。
构建项目非常简单
docker compose -f docker-builder.yml run --rm builder
构建时,将创建https
连接所需的 SSL 证书。可以使用环境变量DOMAIN
和IP
指定域和/或 IP 地址
docker compose -f docker-builder.yml run --rm -e DOMAIN=example.com -e IP=123.45.67.89 builder
该应用程序可以由不同的数据库支持,具体取决于您的选择。最轻量级的场景是使用嵌入式H2数据库。在这种情况下,可以使用命令启动应用程序
docker compose --profile h2 up -d
还可以使用容器化或独立的 PostreSQL。在前一种情况下,您可以使用命令启动应用程序
docker compose --profile pg up -d
在后一种情况下,您必须使用数据库 URL 和凭据完成文件db.env
,然后运行命令
docker compose --profile pg_ext up -d
如果您的 compose 版本不支持配置文件,您可以为每个场景使用专用的 compose 文件
docker compose -f h2.yml up -d
docker compose -f pg.yml up -d
docker compose -f pg_ext.yml up -d
在最后一种情况下,您仍然需要使用数据库 URL 和凭据来完成db.env
文件。
也可以跳过无聊的构建阶段并运行发布附加的二进制文件(应该安装 java 8 或更高版本)
java -jar kidtracker.jar
该二进制文件配置为使用嵌入式 H2 数据库。首次启动时会在工作目录中创建三个文件夹:
data
包含设备位置、电话号码等数据库记录,该日期是机密的,因此请确保安全!logs
具有足够的自描述性,包含应用程序本身的日志以及设备调试处于活动状态时的设备日志,media
该文件夹用于将 amr 格式的传入音频转换为 mp3Web UI 可在https://<hostname>:8003
上找到。要登录,请使用默认凭据admin
/ password
。
要将设备分配给注册到应用程序的用户,应用程序应该可从公共网络访问,也就是说,它应该具有公共 IP 地址,并且可能还具有关联的域名。默认情况下,应用程序侦听端口8001
上的设备,假设同一端口映射到公共网络。然后发送到设备的以下文本消息使其开始连接到应用程序:
pw,123456,ip,<public IP address or domain>,8001#
这里123456
是默认密码,很可能是在设备上设置的。其他已知的默认密码有523681
54321
654321
。但是,如果密码已更改,则应使用新密码而不是默认密码。
强烈建议更改默认密码!
然后单击导航栏右侧的 按钮,然后单击页脚上的 按钮。要分配的设备需要设备标识符。一旦设备连接到应用程序,四位数的确认令牌就会发送到设备。要确认用户拥有该设备,应在令牌过期后的接下来 5 分钟内将该令牌输入到弹出表单中。
注册到该应用程序的任何用户都可以是普通用户或管理员。管理员可以注册其他用户,而普通用户则不能,这是唯一的区别。管理员可以创建普通用户和其他管理员。对于现有用户,管理员权限既不能被授予,也不能被撤销,唯一的修改方法是删除用户帐户,然后重新创建。
出于安全考虑,用户手机号码也不能修改。同样,要更改它,需要删除并重新创建用户帐户。要删除用户帐户,必须取消分配所有设备。
第一次运行时,有一个具有管理员权限的默认用户帐户,登录名admin
,密码password
。建议在创建其他用户帐户时删除此帐户,或更改默认密码。如果只有一个具有管理员权限的帐户,则无法删除。默认管理员帐户没有有效的手机号码,也不能为其分配设备。
设备通过消息与应用程序进行通信。有多种类型的消息,有些可以提供有关设备位置和警报的信息,其他则包含实际电池电量和计步器值。
应用程序还可以将某些消息发送到设备,以使其执行多项操作或修改其设置。为了确保设备已收到消息,它会向应用程序发送回一条确认消息。在等待确认消息时,UI 保持阻塞状态。如果10秒内没有收到确认(可配置),则认为初始消息未确认。
所有指定设备的位置标记与用户位置标记共享相同的地图。设备标记包含有关上次已知位置的时间、电池电量、计步器值以及最终设备起飞警报、低电量警报、连接丢失警报和过时位置警报的信息。如果从设备收到的最后一条消息超过 15 分钟前,则认为设备丢失。
当直接 GPS 数据可用时,设备可以根据直接 GPS 数据提供其实际位置,以及当直接 GPS 观测不可用时(主要是在建筑物内或存在电磁噪声的情况下)最后检测到的位置,在这种情况下 GPS 数据
被认为是过时的。当接收到的位置数据已过时时,会显示过时数据警报。
请注意,低电量警报和实际电量值以不同类型的消息形式出现。带有实际费用的消息比带有位置和警报的消息更频繁(每 5 分钟发送一次),后者可能会在数小时内不发送。因此,标记显示 100% 的电池电量以及低电量警报的情况并不罕见。在这种情况下,优先考虑的是电池电量的数值,并且可以忽略低电量警报。
当按下 SOS 按钮时,设备会发送警报消息。在这种情况下,设备标记会变为红色,并且会播放警报声,直到单击该标记。标记单击结果将其移动到顶部并切换儿童选择。切换儿童选择时,所选设备标记将显示在顶部。
设备可以向应用程序发送音频消息和(如果配备摄像头)快照。当此类新消息到达时,设备标记变为蓝色,并播放老式电话铃声,直到单击该标记。与警报情况一样,单击标记会导致将其移动到顶部并切换儿童选择。
UI 中的任何位置的时间戳都是可点击的,并且通过点击可以在绝对日期和时间值以及从现在开始的时间间隔之间切换。
有两个图标有两种状态:填充和连线。当地图视图跟随选定的设备标记时,第一个将被填充。可以通过单击它来切换其状态。当地图视图跟随用户位置标记时,另一个会被填充。也可以通过单击来切换其状态。当一个图标被填充时,另一个图标被填充,反之亦然。拖动地图时,两个图标都会变为连线。
通过单击命令来唤醒 GPS 并将当前位置发送到设备。地图视图开始跟随设备标记,跟随设备图标被填充。
与设备的聊天是不对称的。文本聊天消息可以通过按钮发送到设备,而设备可以发送短音频消息,如果设备配备摄像头,还可以发送快照。设备还可以通过按钮强制拍摄快照或通过按钮进行 15 秒的录音。
历史记录对话框允许以两种模式选择时间间隔:日期(从一个午夜到下一个午夜)和常规(用户可以选择间隔的开始和结束)。要在模式之间切换,请单击日期和时间选择器标签。
当选择时间间隔时,可以显示聊天记录,或计步器和电池电量图表。所选时间间隔的设备轨迹也可以放在地图上。右上角会出现一个滑块,用于沿轨道移动设备标记。当检查历史轨迹时,历史对话框图标变为 。要删除曲目并返回到在线标记位置,请单击它。
联系人对话框允许编辑主要和辅助设备管理员、SOS 号码、设备联系人、允许拨打设备的号码以及分配给设备按钮的快速呼叫号码。对于所有联系人类别,都有固定数量的可填充空位。默认情况下,空槽是隐藏的,但可以通过单击对话框页脚处的按钮来显示。
儿童对话框允许用户分配和取消分配儿童设备、更改拇指以及获取有关设备及其实际状态的一些常规信息。在左侧栏中放置了一个可点击的拇指,点击它会出现孩子编辑对话框。中间一列是设备标识符。如果设备在线,其标识符为绿色,否则为红色。设备标识符下方是从设备接收到最后一条消息的时间。所有有权访问该设备的用户及其手机都列在最右列。