1.首先從運渣車識別對接QQ羣下載並閱讀成都市智慧工地建築垃圾運渣車輛在線視頻監控系統接口及功能要求說明書
文檔裏面只有兩個接口,一個獲取授權設備列表。另一個是上傳識別數據。下面是對接過程中遇到的問題以及解決方案。
對接完成後,還需要從現場設備獲取數據上傳至建委,並且識別錯誤率不超過10%,就算拿到資質了。
2.從羣裏負責人獲取測試賬號(appKey,appSecret),並把自己的設備序列號發給負責人將其加入測試庫。接下來就可以開始寫代碼對接了。
3.第一個接口通過 GetAuth 獲取設備與 Key 值(會在第二個接口中用到),下面是通過 RestRequest 方式發起的 POST 請求代碼:
/// <summary>獲取設備密鑰</summary>
public async Task<object> GetVehicleIdentificationDeviceList(VehicleIdentificationGetAccessTokenInput input)
{
input.SetPrivateKeyAndSign("9708B6AE9100DDE83B2EB8F6487C7317");//appKey
var request = new RestRequest($"/Service/DistinguishWebSvr.assx/GetAuth", Method.POST, DataFormat.None);
request.AddParameter("appKey", input.Key);
request.AddParameter("deviceNumber", input.SerialNumber);
request.AddParameter("sign", input.Sign);
var client = new RestClient("Url");
var response = client.Execute(request);
return response.Content;
}
上面代碼中一般會遇到第一個問題“如何生成HMACMD5”,下面是這個問題在C#裏面的答案。
/// <summary>
/// 對傳遞參數進行加簽使用 HMACMD5 方式
/// </summary>
/// <param name="input">加簽值</param>
/// <param name="privateKey">私鑰 密鑰</param>
/// <returns></returns>
public void ToMd5(string input, string privateKey)
{
var hmacmdb = new HMACMD5(Encoding.UTF8.GetBytes(privateKey));
var bytes = hmacmdb.ComputeHash(Encoding.UTF8.GetBytes(input));
var md5 = BitConverter.ToString(bytes).Replace("-", "");
Sign = md5;
}
第一個接口還可以通過1024程序員開發工具箱網站直接獲取 sign 然後通過 Postman 或其他方式驗證。到這裏第一個接口就對通了,並能成功拿到如文檔中描述的返回數據。
4.第二個接口通過 UploadCarData 方法上傳識別數據。
/// <summary>上傳車輛識別數據</summary>
public async Task<object> UploadCarDataVehicleIdentification(VehicleIdentificationUploadCarDataInput input)
{
var bytes = File.ReadAllBytes(@"圖片路徑");
input.Image = bytes;
input.SetPrivateKeyAndSign("27112411");//這是第一個接口種的 Key
var request = new RestRequest($"/Service/DistinguishWebSvr.assx/UploadCarData", Method.POST, DataFormat.None);
request.AddParameter("carInfo", input.carInfo);
request.AddFileBytes("image", bytes, "20191114173358.jpg");//文件名幷包含後綴
request.AddParameter("sign", input.Sign);
var client = new RestClient("Url");
var response = client.Execute(request);
return response.Content;
}
這個接口可能會遇到下面的問題:
- 如何獲取文件 byte[] 值;(本地使用 File.ReadAllBytes 方法,也可以通過獲取 base64 然後再通過 Convert.FromBase64String("base64字符串"))
- 如何在 RestClient 中傳遞 byte[] 值;(使用 AddFileBytes 方法,注意第三個參數文件名需要包含後綴)
- 如何合併兩個 byte[] 值;(使用 CopyTo 方法)
- 加簽時是用 appKey 還是 appSecret;(都不是,使用 GetAuth 接口返回的設備對應的 Key)
- 各種驗籤不通過;(可能是 carInfo 的數據類型導致服務端驗籤失敗,將 carInfo 屬性改爲 string 類型)
5.最後是兩個方法的輸入參數以及加簽的方法合併到下面類中
using Newtonsoft.Json;
using System;
using System.Security.Cryptography;
using System.Text;
namespace ThirdParty.Device.InputModels
{
/// <summary>
/// 建築垃圾運渣車輛獲取 設備與密鑰
/// </summary>
public class VehicleIdentificationGetAccessTokenInput : VehicleIdentificationAccessTokenInput
{
/// <summary>公鑰</summary>
[JsonProperty("appKey")] public string Key { get; set; }
/// <summary>設備序列號</summary>
[JsonProperty("deviceNumber")] public string SerialNumber { get; set; }
/// <summary>
/// 設置私鑰並加簽
/// </summary>
/// <param name="privateKey"></param>
public void SetPrivateKeyAndSign(string privateKey)
{
ToMd5(Key + SerialNumber, privateKey);
}
}
/// <summary>
/// 上傳車輛識別數據
/// </summary>
public class VehicleIdentificationUploadCarDataInput : VehicleIdentificationAccessTokenInput
{
/// <summary>車輛識別信息</summary>
[JsonProperty("carInfo")]
public string carInfo { get; set; }
/// <summary>車輛識別圖片(包含車牌,見圖 1)</summary>
[JsonProperty("image")]
public byte[] Image { get; set; }
/// <summary>車輛沖洗圖片</summary>
[JsonProperty("cleanImage")]
public byte[] CleanImage { get; set; }
/// <summary>車輛識別圖片 1(預留)</summary>
[JsonProperty("image1")]
public byte[] Image1 { get; set; }
/// <summary>車輛識別圖片 2(預留)</summary>
[JsonProperty("image2")]
public byte[] Image2 { get; set; }
/// <summary>車輛識別圖片 3(預留)</summary>
[JsonProperty("image3")]
public byte[] Image3 { get; set; }
/// <summary>
/// 設置私鑰並加簽
/// </summary>
/// <param name="key"></param>
public void SetPrivateKeyAndSign(string key)
{
var jsonBytes = Encoding.UTF8.GetBytes(carInfo);
var len = jsonBytes.Length + Image.Length;
len += CleanImage?.Length ?? 0;
len += Image1?.Length ?? 0;
len += Image2?.Length ?? 0;
len += Image3?.Length ?? 0;
var totalBytes = new byte[len];
jsonBytes.CopyTo(totalBytes, 0);
Image.CopyTo(totalBytes, jsonBytes.Length);
Image1?.CopyTo(totalBytes, jsonBytes.Length + Image1.Length);
var hmacmdb = new HMACMD5(Encoding.UTF8.GetBytes(key));
var bytes = hmacmdb.ComputeHash(totalBytes);
Sign = BitConverter.ToString(bytes).Replace("-", "");
}
public byte[] GetBytes(string input)
{
return Convert.FromBase64String(input);
}
}
public class CarEntryExitInfo
{
/// <summary>設備序列號</summary>
public string DeviceNumber { get; set; }
/// <summary>抓拍時間</summary>
public string SnapDate { get; set; }
/// <summary>車輛類型:(0:轎車,1:運渣車,2:罐車)</summary>
public string CarModel { get; set; }
/// <summary>車牌號</summary>
public string CarNumber { get; set; }
/// <summary>出入類型(1:進場;2:出場)</summary>
public string Type { get; set; }
}
/// <summary>
/// 加簽
/// </summary>
public class VehicleIdentificationAccessTokenInput
{
/// <summary>數字簽名</summary>
[JsonProperty("sign")] public string Sign { get; set; }
/// <summary>
/// 對傳遞參數進行加簽使用 HMACMD5 方式
/// </summary>
/// <param name="input"></param>
/// <param name="privateKey">私鑰 密鑰</param>
/// <returns></returns>
public void ToMd5(string input, string privateKey)
{
var hmacmdb = new HMACMD5(Encoding.UTF8.GetBytes(privateKey));
var bytes = hmacmdb.ComputeHash(Encoding.UTF8.GetBytes(input));
var md5 = BitConverter.ToString(bytes).Replace("-", "");
Sign = md5;
}
}
}
後面對接的朋友,如果發現有新的對接情況,請反饋我們會及時更新。