场景说明
进入现场后,实施现场控制:佩戴的手机安装APP,下发RFID卡片,APP通过蓝牙读取卡片信息,并把卡片和手机信息在读取数据完毕后实时上报服务端,服务端通过预留的手机信息和卡片信息判断设备是否授权且未经篡改。
分析:
(1) 手机全球唯一标识imei号;
(2) 卡片信息唯一标识num;
(3) APP安装序号唯一标识SN;
这里暂时不考虑安装序号唯一标识。
由于需要不定时的上报上述信息,当上报信息中的IMEI和num同服务端预留的不同时,则视为设备非法信息造篡改。
通信问题:采用什么方式?
A .TCP
B.WebSocket
C.HTTP
考虑到长连接方式比较合适,所以优先考虑A和B,而C需要APP定时调用。
当手机端申请TCP链接时,需要提交用户账户和密码初次验证,验证通过后准许连接,之后保持tcp长连接,每隔固定的时间(时间不能长于5min)发送手机端采集到的手机唯一识别码和卡片信息
这里考虑下列问题:
1.第一次发送报文需要传输身份信息并作验证,然后保存当前的管道ID并绑定身份信息,
之后就直接发送数据信息;需要构建全局变量(共享内存)或者借助内存缓存、文件存放身份管道数据。PHP是直接操作内存的;内存缓存需要使用redis,文件存储需要IO操作。
2.每次发送报文都携带身份认证信息,根据报文的身份信息处理发送数据;
这个比较合适目前场景:项目前期尽量简化处理逻辑和简化系统框架。
由此定义数据格式:
身份验证报文
cli-->server request:verify@@acc@@pwd@@timestamp
server-->cli response:verify@@status@@timestampstatus:200--ok;403--error
数据传输报文
cli-->server request:data@@num@@pwd@@phoneid@@timestamp
server-->cli response:data@@status@@timestamp status:200--ok;403--error
由于是TCP报文,这里需要加上数据校验和数据加密的部分。
暂时先不处理(AES、RSA加密等均可),直接使用数据传输报文。
那么,这样的服务就PHP而来需要什么来做?
(1) 使用workerman构建服务
Win/linux系统均可用,但是linux下操作更加方便,且功能齐全,纯PHP实现。
(2) 使用swoole构建服务
仅linux 系统可用,且系统版本不得低于3.0。
两者相比,swoole的性能更加优越,且提供操作内存的表,比三方缓存效率更高,同时提供http方式访问websocket操作,功能强悍。而win下workerman仅支持cli方式。
贴上demo 供后期优化处理吧,这里提供基于workerman 的 tcp、webSocket、http(get、post)方法。
TCP方式 webSocket & http
网友评论