概念定义

  • 快递柜,快递柜有两种绑定状态,未绑定与已绑定。首次扫描快递柜二维码的用户成为快递柜的管理员。

  • 快递柜状态,因为快递柜使用蓝牙,蓝牙只能近距离通信,无法跟服务器直接通信,所以需要小程序作中间数据交流媒介。快递柜的状态主要是包括电量信息。电量无法直接上报,只能在每次用户使用小程序,主动链接后,通过小程序上报至服务器。所以服务器查看的电量不一定准确。

  • 快递柜角色,快递柜角色分为3种,管理员、普通用户、陌生用户。3种角色的权限如下表所示:

  • 快递柜密钥,每个快递柜出厂时都有一个对称密钥,蓝牙模块保留一个,服务器同时也会保留一个。每次开箱的数据交换的机器随机码,都会用此对称密钥加密。

  • 开箱动态密码,对于陌生用户,每次开箱操作都必须提供开箱密码,开箱动态密码有一个有效期,管理员/普通用户可以在创建的时候,指定该动态密码的有效期。

  • 机器随机码,为了防止恶意攻击,每次开箱开始的时候,蓝牙模块都会生成一个机器随机码,该随机码会用出厂时的密钥加密,然后再返回给客户端。服务端接收到这个机器随机码的密文后会使用该设备的对称密钥解密,然后作进一步的运算并通过小程序返回给蓝牙设备,蓝牙设备验证机器随机码的合法性,判断是否需要开箱。

快递柜绑定流程

  • 快递柜出厂时默认没有绑定任何用户,系统采用谁先扫描,谁成为快递柜管理员的原则,实现快递柜的绑定。绑定流程如图所示:

  • 管理员通过微信扫描柜子上的二维码

  • 打开微信小程序注册成功后,请求服务器查询快递柜的信息

  • 服务器判断快递柜是否未绑定管理员,若是则执行步骤4;若快递柜已有管理员,且请求用户不是该柜子的管理员,则判断用户是否为快递柜的普通操作员。

  • 服务器把快递柜与发起请求的用户建立绑定关系,并设置该用户未管理员

  • 返回绑定结果给用户

快递柜开箱流程

  • 快递员开箱流程如下:
    • 管理员或普通用户通过小程序请求一个开箱随机密码,并设置开箱密码的有效期
    • 服务器生成一个开箱随机码,并设置该码的有效期
    • 服务器返回开箱密码给用户,并在小程序上展示
    • 管理员或普通用户把开箱动态密码告诉快递员
    • 快递员扫描箱子二维码,识别出箱子的唯一编号
    • 快递员小程序连接蓝牙
    • 箱子生成一个机器随机码,并返回给快递员小程序
    • 小程序把机器编号、机器随机码、步骤4的开箱动态密码发送至后台。
    • 后台首先检查开箱随机码是否已过期,然后根据机器码查询该快递柜的密钥,对机器随机码进行解码,并做加1操作,然后用密钥进行再次加密
    • 服务器把密码返回给小程序
    • 小程序把开箱密码通过蓝牙发送至快递柜
    • 快递柜解密开箱密码,并对比之前的机器随机码,判断解密后的原文是否为最后一次生成的机器随机码做了加1操作。
    • 若密码正确,则打开快递柜,并通知小程序,开箱成功
    • 小程序把此次的开箱结果上报至服务器。

系统设计

  • 系统分为3大部分的开发: