4.上传车牌全景图片和特写图片数据内容...12
5.服务器端图片数据解析...13
6.服务端应答...14
1)入口应答数据...14
2)出口应答数据...14
3)主服务响应心跳应答数据...15
四、注意事项...16
一、Http架构方案处理流程
二、相机端参数配置页面
图1相机配置页面
三、模式说明
(一)模式1
摄像头对进出场车辆数量更新,使用WebService方式调用
WebService地址是可以在摄像头端配置的,配置的地址样例格式为:
boolUpdateParkingCountByCamera(stringmessage)
string是消息字符串,内容见下一节
bool是返回值true成功,false失败
privatestringCreateCameraMessage()
{
//创建byte的数组
//1字节的在场车辆数量增加还是减少,4字节的车型字符串长度,N字节的车型字符串,
//4字节的车牌颜色字符串长度,N字节的车牌颜色字符串,4字节的车牌号字符串长度,N字节的车牌号字符串
//8字节的date毫秒,4字节的摄像头IP字符串长度,N字节的摄像头IP字符串,4字节的停车场ID
boolisAdd=true;//true表示有车进场,在场车辆数量增加,false表示有车出场,在场车辆数量减少
stringcarType="小型车";
stringplateColor="蓝色";
stringplate="京A99999";
longms=DateTime.Now.Millisecond;
stringip="192.168.0.1";
intparkingId=1;
byte[]ret=newbyte[1+4+Encoding.UTF8.GetBytes(carType).Length+4+Encoding.UTF8.GetBytes(plateColor).Length+
4+Encoding.UTF8.GetBytes(plate).Length+8+4+Encoding.UTF8.GetBytes(ip).Length+4];
intoffset=0;
Array.Copy(BitConverter.GetBytes(isAdd),0,ret,offset,4);
offset+=1;
Array.Copy(BitConverter.GetBytes(Encoding.UTF8.GetBytes(carType).Length),0,ret,offset,4);
offset+=4;
Array.Copy(Encoding.UTF8.GetBytes(carType),0,ret,offset,Encoding.UTF8.GetBytes(carType).Length);
offset+=Encoding.UTF8.GetBytes(carType).Length;
Array.Copy(BitConverter.GetBytes(Encoding.UTF8.GetBytes(plateColor).Length),0,ret,offset,4);
Array.Copy(Encoding.UTF8.GetBytes(plateColor),0,ret,offset,Encoding.UTF8.GetBytes(plateColor).Length);
offset+=Encoding.UTF8.GetBytes(plateColor).Length;
Array.Copy(BitConverter.GetBytes(Encoding.UTF8.GetBytes(plate).Length),0,ret,offset,4);
Array.Copy(Encoding.UTF8.GetBytes(plate),0,ret,offset,Encoding.UTF8.GetBytes(plate).Length);
offset+=Encoding.UTF8.GetBytes(plate).Length;
Array.Copy(BitConverter.GetBytes(ms),0,ret,offset,4);
offset+=8;
Array.Copy(BitConverter.GetBytes(Encoding.UTF8.GetBytes(ip).Length),0,‘。第三方可微分11111asdqweqwrewqfdkpewokfret,offset,4);
Array.Copy(Encoding.UTF8.GetBytes(ip),0,ret,offset,Encoding.UTF8.GetBytes(ip).Length);
offset+=Encoding.UTF8.GetBytes(ip).Length;
Array.Copy(BitConverter.GetBytes(parkingId),0,ret,offset,4);
returnConvert.ToBase64String(ret);
其中该摄像头是进场摄像头还是出场摄像头,可在摄像头管理页面配置
该摄像头隶属于哪个停车场,也可在摄像头管理页面配置,一个int可以满足。
(二)模式2
1)车牌数据包
POST/htc/app/v1/c/camera_parkingHTTP-----上传路径Host:119.254.103.73-----服务器地址/端口
Content-Type:application/x-www-form-urlencoded-----数据类型Content-Length:61-----数据长度(取决于真实数据长度决定)type=%s&car_plate=京ABC123&color=蓝色----数据包类型(车牌数据包和心跳包)
&start_time=1234567890&park_id=5&camera_id=%s----车牌数据(包含数据包类型、日期、车牌颜色、车牌号码、相机ID---MAC地址、停车场ID)
2)心跳数据包
POST/htc/app/v1/c/camera_parkingHTTP-----上传路径同上Host:119.254.103.73-----服务器地址/端口同上
Content-Type:application/x-www-form-urlencoded-----数据类型Content-Length:25-----数据长度(取决于真实数据长度决定)
type=HeartBeat&interval=%d------心跳周期(可配置)
路径:实际发送路径就是界面配置的路径。
发送内容:
2)心跳数据包内容:HeartBeat&心跳周期(心跳周期可设置为5~30秒,超过边界5或30时取其边界值,心跳周期默认值为10秒)。
注意:数据类型type可取值为online/offline/HeartBeat(心跳数据包部分),online:表示此次发送的数据包为实时车牌信息数据包。
HeartBeat:表示此次发送的数据包为心跳数据包。
如果心跳检测到主服务离线,post上传会跳过向主服务器的上传,如果未开启比用服务器就会直接存储图片到SD卡中;如果开启了备用服务器,会向备用服务器上传(最大次数3次),如果成功,不会存储图片,失败就存储图片到SD卡中。
例如:设置最大上次次数3次,开启断网续传功能,设置心跳周期5秒
(1)开启备用服务器,相机存储车牌等信息到SD卡中的条件如下(表1)
表1:
心跳检测主服务器是否在线
上传主服务器是否有一次post成功(最多post3次)
上传备用服务器是否有一次post成功(最多post3次)
是否存储图片到SD卡中
在线
有
不存储
没有
存储
离线
(2)如果未开启备用服务器,相机存储车牌等信息到SD卡中的条件如下(表2)
表2:
表3:
续传主服务器是否有一次post成功(最多post3次)
文件名中去掉NC字段并且重新命名
保留文件直至续传成功
保留文件等待续传
发送请求:
POST/htc/app/v1/c/camera_parkingHTTP/1.1
Host:115.28.209.249:4088
Content-Type:application/x-www-form-urlencoded
Content-Length:55240
type=online&car_plate=京N06GB8&color=蓝色&start_time=1436509947&park_id=5&camera_id=0001aa00000d&picture=全景图数据BASE64编码&closeup_pic=车牌特写图数据BASE64编码
2)SD卡存储的图片续传
Content-Length:55241
type=offline&car_plate=京N06GB8&color=蓝色&start_time=1436509947&park_id=5&camera_id=0001aa00000d&picture=全景图数据BASE64编码&closeup_pic=车牌特写图数据BASE64编码
$data=base64_decode(str_replace("","+",$picture));file_put_contents("./imgs/".iconv('UTF-8','GB2312',$car_plate)."."."jpg",$data);
1)入口应答数据
识别车牌数据上传服务器,服务端返回应答数据在LED屏中显示,并根据返回状态判断是否抬杆(只针对实时post数据到主服务器;相机对于备用服务器发过来的响应数据只用来判定通信成功与否不会进行其它的动作处理)
{"status":200,"speed":1,"postfix":"欢迎光临","verified":true/false}
speed:1显示屏播放速度为1(不同品牌LED屏速度存在差异)
postfix:欢迎光临LED屏播放内容
verified:true/false是否抬杆,true:抬杆false:不抬杆
入口开闸模式:
2)出口应答数据
识别车牌数据上传服务器,服务端返回应答数据,相机通过服务端所返回的消息判断是否打开道闸,并在LED屏显示金额(只针对实时post数据到主服务器;相机对于备用服务器发过来的响应数据只用来判定通信成功与否不会进行其它的动作处理)
{"status":200,"totol_fee":0.000000,"is_paid":true,"display":"hello,123456"}
totol_fee:0.000000收费金额(费率由服务端进行计算)
display:"hello,123456"}LED屏显示内容(内容可自定义)
is_paid:true/false是否抬杆,true:抬杆false:不抬杆
3)主服务响应心跳应答数据
内容如下:
{"status":200,"PostServer":"OK"}
PostSetver:OK用于相机判定主服务器正常
4)车牌数据与心跳数据通用应答数据
当服务器工作在公网,设备工作在私网时,因为存在私网穿透的问题,服务器很难直接向设备发起通信。如果服务器需要主动向设备下发黑白名单、透传串口数据、执行开闸等动作时,可以利用定时上报的心跳包网络连接,将这些主动下发的命令通过心跳包应答来发送给设备。
这种方案的好处是可以简单的解决私网穿透的问题,坏处是主动下发的命令需要被动的定时发送,会有一定的延时,延时最长可达到心跳包的周期间隔。
此外对于正常的车牌推送消息,服务器也可以通过推送消息的应答来下发上述的各种命令。在车牌推送消息应答中增加命令下发,可以减小被动下发命令的延时。
a)黑白名单下发
添加黑白名单的应答消息为json格式,例如:
{"PostServer":"OK","whitelist_opt_data":[{"Action":"add",
"PlateNumber":"粤B12345","Type":"W",
"Start":"2000/01/0100:00:00","End":"2020/12/3123:59:59"}]}
其中PostServer字段为必填字段,其值必须为OK;
whitelist_opt_data字段为必填字段,其值为一个数组,数组中的每一项为一条待添加的黑白名单,黑白名单信息包括:
Action为必填字段,其值为黑白名单操作类型,对于添加黑白名单,必须为add;
PlateNumber为必填字段,其值为车牌号码;
Type为黑白名单类型,当值为W时表示白名单,当值为B时表示黑名单;
编辑黑白名单的应答消息为json格式,例如:
{"PostServer":"OK","whitelist_opt_data":[{"Action":"update",
whitelist_opt_data字段为必填字段,其值为一个数组,数组中的每一项为一条待编辑的黑白名单,黑白名单信息包括:
Action为必填字段,其值为黑白名单操作类型,对于编辑黑白名单,必须为update;
删除黑白名单的应答消息为json格式,例如:
{"PostServer":"OK","whitelist_opt_data":[{"Action":"delete",
"PlateNumber":"粤B12345"
}]}
whitelist_opt_data字段为必填字段,其值为一个数组,数组中的每一项为一条待删除的黑白名单,黑白名单信息包括:
Action为必填字段,其值为黑白名单操作类型,对于删除黑白名单,必须为delete;
PlateNumber为必填字段,其值为车牌号码。
删除所有黑白名单的应答消息为json格式,例如:
{"PostServer":"OK","whitelist_opt_data":[{"Action":"deleteAll",
"PlateNumber":""
whitelist_opt_data字段为必填字段,其值为一个数组,对于删除所有黑白名单的操作,只需要向数组中添加一条空白车牌号的黑白名单信息即可;
Action为必填字段,其值为黑白名单操作类型,对于删除所有黑白名单,必须为deleteAll;
PlateNumber为必填字段,对于删除所有黑白名单的操作,车牌号码可以随意填写。
查询黑白名单的应答消息为json格式,例如:
{"PostServer":"OK","whitelist_opt_data":[{"Action":"query",
whitelist_opt_data字段为必填字段,其值为一个数组,数组中的每一项为一条待查询的黑白名单,黑白名单信息包括:
Action为必填字段,其值为黑白名单操作类型,对于查询黑白名单,必须为query;
b)485/232串口数据透传
485/232串口数据透传的应答消息为json格式,例如:
{"ext":{"name":"test","type":0,"device":"RS485","data":"MDAwMTAyMDMwNDA1MDYwNzA4MDkwYTBiMGMwZDBlMGY="}}
其中name字段目前没有使用,可以随意填写;
type字段必须为0;
device字段支持RS485和RS232,分别表示485和232串口设备;
data字段为要透传的数据,base64编码格式。
c)开闸(第一路开关量输出闭合)
开闸(开关量输出闭合)的应答消息为json格式,例如:
{"ext":{"name":"test","type":0,"device":"IO1","data":"ON"}}
device字段目前只支持IO1,即第一路开关量输出;
data字段为ON时,表示开关量闭合。
四、注意事项
1、在对接时,如果网页上勾选了断网续传,则服务器必须在收到相机的心跳包后,响应心跳应答数据才行,否则相机会认为服务器掉线,不再推送车牌图片数据。