出入口車牌識別攝像機
HTTP POST功能模式說明
2018年5月
目 錄
一、 Http架構方案處理流程... 2
二、 相機端參數配置頁面... 3
三、 模式說明... 4
(一) 模式1.. 4
1. WebService地址... 4
2. 接口... 4
3. message的創建方式及事例代碼... 4
(二) 模式2.. 8
1. 數據內容... 8
2. 方案說明:... 9
3. http post 斷網續傳功能... 9
4. 上傳車牌全景圖片和特寫圖片數據內容... 12
5. 服務器端圖片數據解析... 13
6. 服務端應答... 14
1) 入口應答數據... 14
2) 出口應答數據... 14
3) 主服務響應心跳應答數據... 15
四、 注意事項... 16
一、 Http架構方案處理流程
二、 相機端參數配置頁面
圖1 相機配置頁面
三、 模式說明
(一) 模式1
攝像頭對進出場車輛數量更新,使用WebService方式調用
- WebService地址
WebService地址是可以在攝像頭端配置的,配置的地址樣例格式為:
http://182.92.112.149:8089/WebService.asmx
- 接口
bool UpdateParkingCountByCamera(string message)
string是消息字符串,內容見下一節
bool是返回值true成功,false失敗
- message的創建方式及事例代碼
private string CreateCameraMessage()
{
// 創建byte的數組
// 1字節的在場車輛數量增加還是減少,4字節的車型字符串長度,N字節的車型字符串,
// 4字節的車牌顏色字符串長度,N字節的車牌顏色字符串,4字節的車牌號字符串長度,N字節的車牌號字符串
// 8字節的date毫秒,4字節的攝像頭IP字符串長度,N字節的攝像頭IP字符串,4字節的停車場ID
bool isAdd = true; // true表示有車進場,在場車輛數量增加,false表示有車出場,在場車輛數量減少
string carType = "小型車";
string plateColor = "藍色";
string plate = "京A99999";
long ms = DateTime.Now.Millisecond;
string ip = "192.168.0.1";
int parkingId = 1;
byte[] ret = new byte[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];
int offset = 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);
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);
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);
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);
offset += 4;
return Convert.ToBase64String(ret);
其中該攝像頭是進場攝像頭還是出場攝像頭,可在攝像頭管理頁面配置
該攝像頭隸屬於哪個停車場,也可在攝像頭管理頁面配置,一個int可以滿足。
(二) 模式2
- 數據內容
1)車牌數據包
POST /htc/app/v1/c/camera_parking HTTP ----- 上傳路徑
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_parking HTTP ----- 上傳路徑同上
Host: 119.254.103.73 ----- 服務器地址/ 端口同上
Content-Type: application/x-www-form-urlencoded ----- 數據類型
Content-Length: 25 ----- 數據長度 (取決於真實數據長度決定)
type=HeartBeat&interval=%d ------心跳周期(可配置)
- 方案說明:
路徑:實際發送路徑就是界面配置的路徑。
發送內容:
1) 車牌數據內容: 數據類型&車牌號&車牌顏色&時間&停車場ID&相機ID,以及抓拍圖片
2) 心跳數據包內容: HeartBeat&心跳周期(心跳周期可設置為5~30秒,超過邊界5或30時取其邊界值,心跳周期默認值為10秒)。
注意: 數據類型type可取值為online/offline/HeartBeat(心跳數據包部分), online: 表示此次發送的數據包為實時車牌信息數據包。
offline: 表示此次發送的數據包是從SD卡中存儲的原來心跳檢測http post 的服務器離線或post上傳服務器時失敗時所存儲的車牌信息數據包。
HeartBeat:表示此次發送的數據包為心跳數據包。
算法識別到結果后,入口相機根據http服務端反饋信息判斷是否打開道閘,以及在LED屏顯示相關內容
出口相機則根據http服務器返回的消息進行打開道閘和LED屏金額顯示。
- http post 斷網續傳功能
網頁控件(相機參數-http post參數)界面中有一個斷網續傳功能開關和一個心跳周期設置選項見第3頁圖1 相機配置頁面。httppost斷網續傳功能默認不開啟。心跳默認是10秒。
相機通過添加對接收http post上傳數據的主服務器(以下簡稱主服務器,為了和備用服務器區分)心跳檢測來判斷主服務器是否在線。例如心跳周期設定為5秒,相機就會每隔5秒向主服務器發一次心跳,主服務器接收到心跳數據后,通過判斷心跳發來的數據給相機發送不同的響應,相機接收主服務器發來響應,進行判斷主服務器是否在線。如果相機超時時間內沒有接收到服務器發送的響應或接收到錯誤的響應,相機就會判定主服務器離線,然后繼續判定其它條件(是否啟用正確的備用服務器,詳見如下表1、表2)決定是否存車牌等儲信息片到SD中。當心跳檢測主服務器正常時,SD卡中有帶有httpost的NC圖片相機就會以post形式續傳到主服務器上。
1)http post斷網存儲部分:
心跳檢測主服務器正常時: 車牌識別成功后,會先post 上傳到主服務器再上傳備用服務器(開啟備用服務器),如果向主服務器和備用服務器(開啟備用服務器)都post最大上傳次后數仍沒有接收正確的響應或未接收到響應,就會存儲實時車牌圖片信息到SD卡中,圖片名如下(圖2)中帶httppost字段和NC字段的全景圖和車牌特寫圖(帶有closeup字段);如果向主服務器或備用服務器(開啟備用服務器)上傳中有一次post成功就停止post繼續執行並且不會存儲圖片。(post上傳到主服務器和備用服務器之間沒有前后影響,上傳數據到主服務器成功后,如果開啟備用服務器,仍會繼續向備用服務器上傳數據)
如果心跳檢測到主服務離線,post上傳會跳過向主服務器的上傳,如果未開啟比用服務器就會直接存儲圖片到SD卡中;如果開啟了備用服務器,會向備用服務器上傳(最大次數3次),如果成功,不會存儲圖片,失敗就存儲圖片到SD卡中。
圖2 httppost 斷網續傳存儲的文件名
圖注:圖中帶有httppost 字段的文件名表示是由httppost所存儲到SD卡中的文件,同時帶有httppost字段的和NC字段的文件名是post失敗或主服務器離線時存儲到SD卡中的圖片的文件名。
例如:設置最大上次次數3次,開啟斷網續傳功能,設置心跳周期5秒
(1) 開啟備用服務器,相機存儲車牌等信息到SD卡中的條件如下(表1)
表1:
| 心跳檢測主服務器是否在線 |
上傳主服務器是否有一次post成功(最多post3次) |
上傳備用服務器是否有一次post成功(最多post3次) |
是否存儲圖片到SD卡中 |
| 在線 |
有 |
有 |
不存儲 |
| 在線 |
有 |
沒有 |
不存儲 |
| 在線 |
沒有 |
有 |
不存儲 |
| 在線 |
沒有 |
沒有 |
存儲 |
| 離線 |
|
有 |
不存儲 |
| 離線 |
|
沒有 |
存儲 |
(2)如果未開啟備用服務器,相機存儲車牌等信息到SD卡中的條件如下(表2)
表2:
| 心跳檢測主服務器是否在線 |
上傳主服務器是否有一次post成功(最多post3次) |
是否存儲圖片到SD卡中 |
| 在線 |
有 |
不存儲 |
| 在線 |
沒有 |
存儲 |
| 離線 |
|
存儲 |
2)http post續傳部分:
心跳檢查post 的主服務器是否在線,在線的話,會把SD中的帶有_httppost_字段並且帶有NC字段的圖片以post形式續傳到主服務器(只續傳主服務器,備用服務器不續傳,此次續傳服務器不用給相機發送相應的響應數據),續傳成功,會將圖片名字的NC字段去掉以剩下字段重新命名如下圖3。如果post續傳到主服務器失敗會保留圖片的文件名等待下次續傳直至續傳成功。
圖3 http post斷網續傳續傳后文件名
相機對對SD卡中的http post斷網存儲圖片的處理如下(表3)
表3:
| 心跳檢測主服務器是否在線 |
續傳主服務器是否有一次post成功(最多post3次) |
對SD卡中的http post斷網存儲圖片的處理 |
| 在線 |
有 |
文件名中去掉NC字段並且重新命名 |
| 在線 |
沒有 |
保留文件直至續傳成功 |
| 離線 |
|
保留文件等待續傳 |
- 上傳車牌全景圖片和特寫圖片數據內容
發送請求:
1)實時http post上傳
POST /htc/app/v1/c/camera_parking HTTP/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卡存儲的圖片續傳
POST /htc/app/v1/c/camera_parking HTTP/1.1
Host: 115.28.209.249:4088
Content-Type: application/x-www-form-urlencoded
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}
status:200 http通信狀態,200代表應答返回正常
speed:1 顯示屏播放速度為1 (不同品牌LED屏速度存在差異)
postfix:歡迎光臨 LED屏播放內容
verified:true/false 是否抬桿,true:抬桿 false: 不抬桿
入口開閘模式:
- 識別成功開閘:只有識別為有牌車輛才會控制閘機開啟,車輛放行
- 全部開閘: 識別有牌車和無牌車均開啟欄桿放行
- 反饋開閘: 根據http服務端返回狀態來判斷是否抬桿 (true:抬桿 false: 不抬桿)
2) 出口應答數據
識別車牌數據上傳服務器,服務端返回應答數據,相機通過服務端所返回的消息判斷是否打開道閘,並在LED屏顯示金額 (只針對實時post數據到主服務器;相機對於備用服務器發過來的響應數據只用來判定通信成功與否不會進行其它的動作處理)
{"status":200, "totol_fee":0.000000,"is_paid":true, "display":"hello,123456"}
status:200 http通信狀態,200代表應答返回正常
totol_fee:0.000000 收費金額 (費率由服務端進行計算)
display:"hello,123456"} LED屏顯示內容 (內容可自定義)
is_paid: true/false 是否抬桿,true:抬桿 false: 不抬桿
3) 主服務響應心跳應答數據
主服務器接收到相機發送的心跳包,進行判定響應相機請求,給出應答數據,應答數據在wireshark里的抓包應該是標准的http消息,如下圖
內容如下:
{"status": 200,"PostServer":"OK"}
status:200 http通信狀態,200代表應答返回正常
PostSetver:OK 用於相機判定主服務器正常
4) 車牌數據與心跳數據通用應答數據
當服務器工作在公網,設備工作在私網時,因為存在私網穿透的問題,服務器很難直接向設備發起通信。如果服務器需要主動向設備下發黑白名單、透傳串口數據、執行開閘等動作時,可以利用定時上報的心跳包網絡連接,將這些主動下發的命令通過心跳包應答來發送給設備。
這種方案的好處是可以簡單的解決私網穿透的問題,壞處是主動下發的命令需要被動的定時發送,會有一定的延時,延時最長可達到心跳包的周期間隔。
此外對於正常的車牌推送消息,服務器也可以通過推送消息的應答來下發上述的各種命令。在車牌推送消息應答中增加命令下發,可以減小被動下發命令的延時。
a) 黑白名單下發
- i. 添加黑白名單
添加黑白名單的應答消息為json格式,例如:
{"PostServer":"OK", "whitelist_opt_data" : [{"Action" : "add",
"PlateNumber" : "粵B12345", "Type" : "W",
"Start" : "2000/01/01 00:00:00", "End" : "2020/12/31 23:59:59"}]}
其中PostServer字段為必填字段,其值必須為OK;
whitelist_opt_data字段為必填字段,其值為一個數組,數組中的每一項為一條待添加的黑白名單,黑白名單信息包括:
Action為必填字段,其值為黑白名單操作類型,對於添加黑白名單,必須為add;
PlateNumber為必填字段,其值為車牌號碼;
Type為黑白名單類型,當值為W時表示白名單,當值為B時表示黑名單;
Start為黑白名單生效的開始時間;
End為黑白名單生效的結束時間。
- ii. 編輯黑白名單
編輯黑白名單的應答消息為json格式,例如:
{"PostServer":"OK", "whitelist_opt_data" : [{"Action" : "update",
"PlateNumber" : "粵B12345", "Type" : "W",
"Start" : "2000/01/01 00:00:00", "End" : "2020/12/31 23:59:59"}]}
其中PostServer字段為必填字段,其值必須為OK;
whitelist_opt_data字段為必填字段,其值為一個數組,數組中的每一項為一條待編輯的黑白名單,黑白名單信息包括:
Action為必填字段,其值為黑白名單操作類型,對於編輯黑白名單,必須為update;
PlateNumber為必填字段,其值為車牌號碼;
Type為黑白名單類型,當值為W時表示白名單,當值為B時表示黑名單;
Start為黑白名單生效的開始時間;
End為黑白名單生效的結束時間。
- iii. 刪除黑白名單
刪除黑白名單的應答消息為json格式,例如:
{"PostServer":"OK", "whitelist_opt_data" : [{"Action" : "delete",
"PlateNumber" : "粵B12345"
}]}
其中PostServer字段為必填字段,其值必須為OK;
whitelist_opt_data字段為必填字段,其值為一個數組,數組中的每一項為一條待刪除的黑白名單,黑白名單信息包括:
Action為必填字段,其值為黑白名單操作類型,對於刪除黑白名單,必須為delete;
PlateNumber為必填字段,其值為車牌號碼。
- iv. 刪除所有黑白名單
刪除所有黑白名單的應答消息為json格式,例如:
{"PostServer":"OK", "whitelist_opt_data" : [{"Action" : "deleteAll",
"PlateNumber" : ""
}]}
其中PostServer字段為必填字段,其值必須為OK;
whitelist_opt_data字段為必填字段,其值為一個數組,對於刪除所有黑白名單的操作,只需要向數組中添加一條空白車牌號的黑白名單信息即可;
Action為必填字段,其值為黑白名單操作類型,對於刪除所有黑白名單,必須為deleteAll;
PlateNumber為必填字段,對於刪除所有黑白名單的操作,車牌號碼可以隨意填寫。
- v. 查詢黑白名單信息
查詢黑白名單的應答消息為json格式,例如:
{"PostServer":"OK", "whitelist_opt_data" : [{"Action" : "query",
"PlateNumber" : "粵B12345"
}]}
其中PostServer字段為必填字段,其值必須為OK;
whitelist_opt_data字段為必填字段,其值為一個數組,數組中的每一項為一條待查詢的黑白名單,黑白名單信息包括:
Action為必填字段,其值為黑白名單操作類型,對於查詢黑白名單,必須為query;
PlateNumber為必填字段,其值為車牌號碼。
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"}}
其中name字段目前沒有使用,可以隨意填寫;
type字段必須為0;
device字段目前只支持IO1,即第一路開關量輸出;
data字段為ON時,表示開關量閉合。
四、 注意事項
1、 在對接時,如果網頁上勾選了斷網續傳,則服務器必須在收到相機的心跳包后,響應心跳應答數據才行,否則相機會認為服務器掉線,不再推送車牌圖片數據。
