PKR停车管理系统和远程服务器定义V2.2
PKR停车管理系统和远程服务器定义V2.2
最后更新时间:2017-06-23
本文档简单定义本地停车管理系统(简称“本地”)跟远程服务器(简称“远程”)交互数据的接口规范。
本地跟远程交互数据分2种应用:
1.(WSMode=0)本地将车辆进出记录发送给远程,远程只接收数据,合法性判断全
部在本地进行;
2.(WSMode=1)本地识别到车牌或者读到卡号,将卡号或车牌等信息发送给远程,
远程验证卡号或车牌的合法性,返回验证结果;本地根据收到的验证结果进行下一步操作(直接开闸放行、收费放行或者非法提示);
注:通过一个服务端程序,可以实现本地跟远程双向通信交互数据,如微信支付、获取剩余车位等。服务端程序必须运行在安装数据库的电脑上!
配置文件设置说明(Config.ini):
[WS]
WSConfig=0 ; 0-关闭接口,1-开启接口
WSUseMDW=0 ; 0-不通过服务端程序(不支持双向通信),1-通过服务端程序(支持双向通信)
WSMode=0 ; 0-第一种应用,1-第2种应用
WSUseWSDL=0 ; 0-标准接口,1-非标接口
WSLog=1 ; 0-关闭日志,1-开启日志
WSUrl=http://127.0.0.1 ; 远程服务器地址或者本地服务端程序地址
WSPort=1213 ; 远程服务器端口或者本地服务端程序端口
WSUserName= ; 用户名
WSPassword= ; 密码(MD5-32编码)
WSPicture=0 ; 0-不上传图片,1-上传图片Base64编码数据
数据传输用HTTP协议POST方式,JSON格式UTF8编码,如
(第1种应用,配置文件WSMode=0):
本地发送(进出场):
如:
Msg= '{"outtime":"2017-04-19 23:21:45","workstationid":1,VLP":"粤B12345"," username ":"test","method":"","Ctypename":"临时车","channeltype":0,"operator":"管理员
","inpicture1":"","direction":0,"password":"d41d8cd98f00b204e9800998ecf8427e","parkid": 1,"inVLP":"","remainspace":100,"outchannel":1,"Vtypename":"小型车
","cardsn":"116021386901","inchannelname":"停车场入口","outchannelname":"停车场入口
","Vtype":1,"receivablefee":"5.00","command":1,"outpicture":"","inchannel":1,"totalspace":1 00,"intime":"2017-04-19
23:21:45","mode":0,"code":1,"recordid":70,"Ctype":3,"inpicture":"","actualfee":"5.00"} '
远程应答:
{"parkid":1,"workstationid":1,"recordid":70,"code":1,"command":1,"result":0,"message":"ok "}
接口说明:
method - 预留
mode - 预留
parkid - 车场编号
workstationid - 当前岗亭ID
recorded - 当前记录ID
code - 当前设备号
command - 指令( 0-岗亭/服务端心跳,
1-主动上传进出记录,
2-主动上传收费记录
3-主动上传充值记录
4-远程服务器发起临时车停车计费请求
5-远程服务器发起月租车充值计费请求
6-远程服务器发起获取车辆信息请求
7-远程服务器发回临时车停车支付结果
8-远程服务器发回月租车充值支付结果
9-远程服务器发起获取剩余车位请求
10-远程服务器发起锁车请求
11-远程服务器发起注册车辆信息请求
12-远程服务器发起车辆进场请求
13-主动上传车辆信息
)
username - 用户名
password - 密码(MD5-32编码)
cardsn - 卡号
VLP - 车牌号码
Ctype - 卡类型(1-工作卡,2-月卡,3-临时卡,4-储值卡,5-贵宾卡,)
Ctypename - 卡类型名称
Vtype - 车辆类型(预留,1-小型车,2-摩托车,3-大型车,4-超大型车)Vtypename - 车辆类型名称
direction - 进出方向(0-进场,1-出场)
channeltype - 车场类型(0-大车场,1-小车场)
inchannel - 进场通道号(1-255)
inchannelname - 进场通道名称
inpicture - 进场全景图片名
inpicture1 - 进场车牌特写图片名
inpicturedata - 进场全景图片数据(Base64)
inpicturedata1 - 进场车牌特写图片数据(Base64)
intime - 进场时间
outchannel - 出场通道号(1-255)
outchannelname - 出场通道名称
outpicture - 出场全景图片名
outpicture1 - 出场车牌特写图片名
outpicturedata - 出场全景图片数据(Base64)
outpicturedata1 - 出场车牌特写图片数据(Base64)
outtime - 出场时间
inVLP - 进场识别错误的车牌,出场人工查找到进场记录后,把进场识别错误的车牌发送过来,方便云端匹配并清除该记录
operator - 出场操作员
receivablefee - 应收
actualfee - 实收
totalspace - 总车位
remainspace - 剩余车位
result - 返回结果( 0-成功,
1-参数错误
2-没有查询到数据
3-保存数据错误
4-非临时车
5-非月租车
6-已支付未超时
7-其他错误)
message - 错误信息
(第2种应用,配置文件WSMode=1):
本地发送(进出场):
Msg= '{"workstationid":1,"VLP":"粤B12345","method":"","picture1":"","Ctypename":"临时车","channeltype":0,"channelname":"停车场出口","operator":"管理员"," username ":"test"," password
":"d41d8cd98f00b204e9800998ecf8427e","direction":1,"parkid":1,"inVLP":"","picturepath": "","cardsn":"116021386901","Vtype":"小型车
","channel":2,"command":1,"picturepath1":"","mode":0,"code":2,"localtime":"2017-04-19 23:57:12","recordid":0,"Ctype":3,"picture":""}'
远程应答:
{ 'result':'1' , 'channel':'1' , 'Ctype':'3' , 'Vtype':'' , 'message':'交易成功' , 'pay':'0' }
接口说明:
本地发送:
method - 预留
mode - 预留
parkid - 车场编号
workstationid - 当前岗亭ID
recorded - 当前记录ID
code - 当前设备号
command - 指令(0-心跳,1-上传进出数据,2-上传收费数据)
username - 用户名
password - 密码(MD5-32编码)
cardsn - 卡号
VLP - 车牌号码
Ctype - 本地定义车辆类别(2-月租车,3-临时车,4-储值车,5-贵宾车)Ctypename - 本地定义车辆类别名
Vtype - 本地定义车辆类型(1-小型车,2-摩托车,3-大型车,4-超大型车)Vtypename - 本地定义车辆类型名
direction - 进出方向(0-进场,1-出场)
channel - 进出通道号(1-255)
channelname - 通道名称
channeltype - 车场类型(0-大车场,1-小车场)
localtime - 时间(进出场时间)
picture - 全景图片
picture1 - 车牌特写图片
picturepath - 全景图片路径
picturepath1 - 车牌特写图片路径
picturedata - 全景图片Base64编码数据
picturedata1 - 车牌特写图片Base64编码数据
inVLP - 进场识别错误的车牌,出场人工查找到进场记录后,把进场识别错误的车牌发送过来,方便云端匹配并清除该记录
operator - 收费员
totalspace - 总车位
remainspace - 剩余车位
远程接收本地POST数据接口:
1、上传进出、收费、充值记录(command=1、
2、3):RemotePostHost?a=inout
2、上传计费结果(command=4):RemotePostHost?a=upmoney
3、上传充值计费结果(command=5):RemotePostHost?a=uprecharge
4、上传车辆信息(command=6):RemotePostHost?a=upinfo
5、上传剩余车位(command=9):RemotePostHost?a=upspace
6、返回远程注册车辆信息结果(command=11):RemotePostHost?a=upregister
注:RemotePostHost是服务端程序配置文件中设置的POST主机地址
远程应答:
result - 返回结果
channel - 通道号(把通道号回传过来)
Ctype - 远程定义车辆类别(2-月租车,3-临时车,4-储值车,5-贵宾车,)Vtype - 远程定义车辆类型(车类型,1-小型车,2-摩托车,3-大型车,4-
超大型车)
message - 提示信息
pay - 交费
result:
-2 - 交易拒绝
-1 - 通信失败
0 - 参数错误
1 - 入口开闸
2 - 出口开闸
3 - 收费放行
4 - 已进场
5 - 已出场
6 - 已挂失
7 - 已注销
8 - 已过期
9 - 余额不足
10 - 其他错误
上传其他数据:
车辆信息注册(command=13)
本地发送: Msg='{"workstationid":1,"message":"","VLP":"粤
B66666","position":"0","method":"","username":"test","Ctypename":"月租车
","model":"MAGOTAN","balance":"0.05","registertime":"2017-05-25","status":1,"vehiclena me":"张三","parkid":1,
"vehiclenumber":"1234567890123456789012","certificate":"12345678901234567","Vtypen ame":"小型车","result":0,"cardsn":"12","telephone":"138********","Vtype":1,"address":"
深圳市龙华区民治街道
","receivablefee":"0.00","password":"d41d8cd98f00b204e9800998ecf8427e","endtime":"201 7-06-24","command":13,"deposit":"0","mode":0,"color":"黑色
","code":0,"recordid":0,"Ctype":2,"starttime":"2017-05-25","actualfee":"0.00"}'
远程应答:
{"parkid":1,"workstationid":1,"recordid":0,"code":1,"command":13,"result":0,"message":"o k"}
车辆充值记录(command=3)
本地发送:'{"workstationid":1,"message":"","VLP":"粤
B66666","position":"0","method":"","username":"test","Ctypename":"月租车","model":"MAGOTAN","balance":"0.05","registertime":"2017-05-25","status":1,"vehiclename": "张三","parkid":1, "vehiclenumber":"1234567890123456789012","certificate":"12345678901234567","Vtypename": "小型车","result":0,"cardsn":"12","operate":0,"telephone":"138********","Vtype":1,"address":"深圳市龙华区民治街道
","receivablefee":"0","password":"d41d8cd98f00b204e9800998ecf8427e","endtime":"2017-07-24
","command":3,"deposit":"0","mode":0,"color":"黑色
","code":0,"recordid":0,"Ctype":2,"starttime":"2017-06-25","actualfee":"0"}'
远程应答:
{"parkid":1,"workstationid":1,"recordid":0,"code":1,"command":3,"result":0,"message":"ok "}
接口说明:
method - 预留
mode - 预留
parkid - 车场编号
workstationid - 当前岗亭ID
recorded - 当前记录ID(保留0)
code - 当前设备号(保留0)
command - 指令( 0-岗亭/服务端心跳,
1-主动上传进出记录,
2-主动上传收费记录
3-主动上传充值记录
4-远程服务器发起临时车停车计费请求
5-远程服务器发起月租车充值计费请求
6-远程服务器发起获取车辆信息请求
7-远程服务器发回临时车停车支付结果
8-远程服务器发回月租车充值支付结果
9-远程服务器发起获取剩余车位请求
11-远程服务器发起注册车辆信息请求
13-主动上传车辆信息
)
username - 用户名
password - 密码(MD5-32编码)
cardsn - 卡号
VLP - 车牌号码
Ctype - 卡类型(1-工作卡,2-月卡,3-临时卡,4-储值卡,5-贵宾卡,)
Ctypename - 卡类型名称
Vtype - 车辆类型(预留,1-小型车,2-摩托车,3-大型车,4-超大型车)
Vtypename - 车辆类型名称
Vehiclenumber- 车辆识别号
Status - 状态,预留
model - 车辆型号(字符串)
color - 车辆颜色(字符串)
certificate - 证件号码(字符串)
vehiclename - 车主姓名
telephone - 电话号码
address - 住址
position - 固定车位
deposit - 押金
balance - 余额
registertime - 注册时间
starttime - 车辆有效期起始时间(预留)
endtime - 车辆有效期截止时间
receivablefee - 充值应收
actualfee - 充值实收
receivablefee - 应收
actualfee - 实收
result - 返回结果( 0-成功,
1-参数错误
2-没有查询到数据
3-保存数据错误
4-非临时车
5-非月租车
6-已支付未超时
7-其他错误)
message - 错误信息
关于WebSocket:
由于普通的HTTP协议向远程POST数据只能有本地发起(本地一般没有固定IP),远程立即返回结果,有些操作需要由远程发起,本地响应,如远程主动获取剩余车位,微信支付远程发起计费请求,远程发送支付结果等,这里采用WebSocket技术,建立本地与远程的实时连接,保证本地远程实时通信。
使用WebSocket双向实时通信,必须在安装数据库的电脑上运行服务端程序;
服务端配置文件说明(Config.ini)
[DB]
DBHost=. ; 数据库服务器地址,用一个“.”,不需要修改
DBname=PKH_Database ; 数据库名称
DBUser=sa ; 数据库用户名
DBPass= ; 数据库密码
[Params]
FreeTime=0 ; 用于非标收费标准,一般保持默认值
FirstFeeLimit=0 ; 用于非标收费标准,一般保持默认值
[Config]
User=test ; 远程服务器通信用户名
Password=test ; 远程服务器通信密码
RemoteWebSocketHost=https://www.360docs.net/doc/9716132013.html, ; WebSocket主机地址RemoteWebSocketPort=1234 ; WebSocket端口
RemotePostHost=https://www.360docs.net/doc/9716132013.html,/index.php ; POST主机地址
RemotePostPort=0 ; POST主机端口(0-默认端口)
一、WebSocket握手指令格式:
{"type":"login","shop_id":1,"username":"test","password":"d41d8cd98f00b204e9800998ecf842 7e","parkname":"测试","freetime":0,"chargetimeout":10}
shop_id - parkid
username - 用户名
password - 密码(MD5-32编码)
parkname - 本地设置停车场名称
freetime - 收费标准的非标设置
chargetimeout - 微信支付临时车支付成功后超时时间,从数据库获取
二、微信支付相关接口
1、获取临时车收费金额
远程服务器通过WebSocket发送:
{"type":"money","command":4,"shop_id":9,"VLP":"粤
B11111","intime":"","outtime":"2017-06-09
10:19:11","recordid":"","cardsn":"","channelcode":"","Ctype":"","Vtype":"","parkid":9,"recei vablefee":0,"actualfee":0,"workstationid":0}
本地POST(RemotePostHost?a=upmoney):
{"outtime":"2017-06-09 10:19:06","freetime":"0","workstationid":0,"message":"成功计算费用","sig":"","VLP":"粤B11111","username":"test","method":"","Ctypename":"临时车","channeltype":0,"operator":"","direction":1,"password":"d41d8cd98f00b204e9800998ecf84 27e","parkid":1,"inVLP":"","outchannel":0,"Vtypename":"小型车
","result":0,"cardsn":"","Vtype":1,"receivablefee":"0.05","command":4,"outpicture":"","inch annel":0,"intime":"2017-06-09
10:17:53","mode":0,"code":0,"recordid":1,"Ctype":3,"inpicture":"","actualfee":"0.05"}
2、通知临时车支付结果
远程服务器通过WebSocket发送:
{"type":"info","command":7,"shop_id":9,"cardsn":"","VLP":"粤
B11111","chargetime":"2017-06-12
11:05:46","receivablefee":"0.000","actualfee":"0.0500","parkid":"1","recordid":6,"workstatio nid":1,"result":0}
3、获取月租车充值金额
远程服务器通过WebSocket发送:
{"type":"info","command":5,"shop_id":9,"cardsn":"","VLP":"粤
B12345","starttime":"2017-06-09 11:12:52","endtime":"2017-06-09
11:12:52","count":1,"parkid":9,"recordid":0,"workstationid":0}
本地POST(RemotePostHost?a=uprecharge):
{"workstationid":0,"message":"成功计算费用" ,"VLP":"粤
BN13T6","username":"test","method":"","Ctypename":"月租车","password":"
d41d8cd98f00b204e9800998ecf8427e ","parkid":1,"Vtypename":"小型车
","result":0,"cardsn":"","operate":0,"Vtype":1,"receivablefee":"0.05","endtime":"2017-08-08 ","command":5,"mode":0,"count":1,"recordid":0,"Ctype":2,"starttime":"2017-07-09","actualf ee":"0.05"}
4、通知月租车充值支付结果
远程服务器通过WebSocket发送:
{"type":"info","command":8,"shop_id":9,"cardsn":"","VLP":"粤
B12345","chargetime":"2017-06-12
11:07:51","starttime":"2017-07-09","endtime":"2017-08-08","receivablefee":0.05,"actualfee":0.05 ,"count":1,"parkid":"9","recordid":0,"workstationid":0,"result":0}
三、微信支付流程
1、临时车交费:远程服务器通过WebSocket向本地发送计费请求→本地服务端计算出费用Post到远程服务器指定接口→远程服务器收到费用进入支付流程,支付完成通过WebSocket告诉本地支付结果→流程完成,本地不需要再应答给远程;
2、月租车充值延期:进入充值延期界面,自动通过WebSocket向本地请求当前车辆有效截止时间及1个月的充值费→本地服务端返回当前车辆充值延期1个月的费用和充值延期后的新有效截止时间→充值延期界面选择充值月数后再次通过WebSocket向本地请求新的有效截止时间及费用→本地计算出新的充值延期费用和新有效截止时间,POST到远程服务器指定接口→远程服务器进入支付流程,支付完成通过WebSocket告诉本地支付结果→流程完成,本地不需要再应答给远程。
注:接口往远程服务器发送数据均通过POST方式,远程主动往本地发送请求用WebSocket 方式,比如远程向本地发送计费请求,通过WebSocket发送command=4的JSon字符串数据,本地收到数据进行计费,计费结果通过POST方式发送给远程服务器。
以上接口定义可能会有细微调整!