1.首先从运渣车识别对接QQ群下载并阅读成都市智慧工地建筑垃圾运渣车辆在线视频监控系统接口及功能要求说明书
文档里面只有两个接口,一个获取授权设备列表。另一个是上传识别数据。下面是对接过程中遇到的问题以及解决方案。
对接完成后,还需要从现场设备获取数据上传至建委,并且识别错误率不超过10%,就算拿到资质了。
2.从群里负责人获取测试账号(appKey,appSecret),并把自己的设备序列号发给负责人将其加入测试库。接下来就可以开始写代码对接了。
3.第一个接口通过 GetAuth 获取设备与 Key 值(会在第二个接口中用到),下面是通过 RestRequest 方式发起的 POST 请求代码:
/// 获取设备密钥
public async Task
上面代码中一般会遇到第一个问题“如何生成HMACMD5”,下面是这个问题在C#里面的答案。
///
/// 对传递参数进行加签使用 HMACMD5 方式
///
/// 加签值
/// 私钥 密钥
///
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 方法上传识别数据。
/// 上传车辆识别数据
public async Task
这个接口可能会遇到下面的问题:
5.最后是两个方法的输入参数以及加签的方法合并到下面类中
using Newtonsoft.Json;
using System;
using System.Security.Cryptography;
using System.Text;
namespace ThirdParty.Device.InputModels
{
///
/// 建筑垃圾运渣车辆获取 设备与密钥
///
public class VehicleIdentificationGetAccessTokenInput : VehicleIdentificationAccessTokenInput
{
/// 公钥
[JsonProperty("appKey")] public string Key { get; set; }
/// 设备序列号
[JsonProperty("deviceNumber")] public string SerialNumber { get; set; }
///
/// 设置私钥并加签
///
///
public void SetPrivateKeyAndSign(string privateKey)
{
ToMd5(Key + SerialNumber, privateKey);
}
}
///
/// 上传车辆识别数据
///
public class VehicleIdentificationUploadCarDataInput : VehicleIdentificationAccessTokenInput
{
/// 车辆识别信息
[JsonProperty("carInfo")]
public string carInfo { get; set; }
/// 车辆识别图片(包含车牌,见图 1)
[JsonProperty("image")]
public byte[] Image { get; set; }
/// 车辆冲洗图片
[JsonProperty("cleanImage")]
public byte[] CleanImage { get; set; }
/// 车辆识别图片 1(预留)
[JsonProperty("image1")]
public byte[] Image1 { get; set; }
/// 车辆识别图片 2(预留)
[JsonProperty("image2")]
public byte[] Image2 { get; set; }
/// 车辆识别图片 3(预留)
[JsonProperty("image3")]
public byte[] Image3 { get; set; }
///
/// 设置私钥并加签
///
///
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
{
/// 设备序列号
public string DeviceNumber { get; set; }
/// 抓拍时间
public string SnapDate { get; set; }
/// 车辆类型:(0:轿车,1:运渣车,2:罐车)
public string CarModel { get; set; }
/// 车牌号
public string CarNumber { get; set; }
/// 出入类型(1:进场;2:出场)
public string Type { get; set; }
}
///
/// 加签
///
public class VehicleIdentificationAccessTokenInput
{
/// 数字签名
[JsonProperty("sign")] public string Sign { get; set; }
///
/// 对传递参数进行加签使用 HMACMD5 方式
///
///
/// 私钥 密钥
///
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;
}
}
}
后面对接的朋友,如果发现有新的对接情况,请反馈我们会及时更新。