前期莫名报错
官方至今未给出正确答案
官方最终答复
您好~
- 流程可以参考文档中的8.5.1章节,先通过GET /ISAPI/System/Video/inputs/channels/1/counting/search/capabilities获取输入参数的能力集。
之后调用POST /ISAPI/System/Video/inputs/channels/1/counting/search查询。
接口返回参数,能力集参考文档里19.4.1.33章节,
POST查询接口,文档中没有搜索到,我附件形式提供给你。
- POSTMAN工具测试,报错deviceError设备错误,这个信息无法判断错误原因。
建议: - 通过上述能力集先获取下输入参数的能力集范围,结合你实际设备测试下。
- 设备WEB页面,应用展示,里面点进去之后找下有没有客流量报表相关的查询,可以WEB页面查询的时候,F12看下底层请求,WEB页面也是用的ISAPI协议,可以参考WEB页面查询的报文。
请求地址
POST /ISAPI/System/Video/inputs/channels/1/counting/search
输入报文:
<?xml version="1.0" encoding="UTF-8"?>
<CountingStatisticsDescription xmlns="http://www.isapi.org/ver20/XMLSchema" version="2.0">
<!--opt, object, 查询客流量数据报表统计, attr:version{opt, string, 版本}-->
<statisticType>
<!--req, enum, 统计类型, subType:string, [enternum#进入人数,exitnum#离开人数,peoplePassing#经过人数,all#全部(全部是指进入人数和离开人数),enterExitDuplicate#进入离开重复人数,faceAttribute#人脸属性,humanBodyAttribute#人体属性,enterRate#进入率,enterExitPeoplePassingNum#进入/离开/经过人数,enterDuplicate#进入重复人数,exitDuplicate#离开重复人数,passDuplicate#经过重复人数], desc:进入率=(进入人数-重复人数)/(进入人数-重复人数+通过人数)-->enternum
</statisticType>
<reportType>
<!--req, enum, 报表类型, subType:string, [daily#日报表,weekly#周报表,monthly#月报表,yearly#年报表]-->daily
</reportType>
<timeSpanList>
<!--opt, array, 时间跨度列表, subType:object-->
<timeSpan>
<!--opt, object, 时间跨度-->
<startTime>
<!--req, datetime, 开始时间-->1970-01-01T00:00:00+08:00
</startTime>
<endTime>
<!--req, datetime, 结束时间-->1970-01-01T00:00:00+08:00
</endTime>
</timeSpan>
</timeSpanList>
<triggerPeopleCountingData>
<!--opt, bool, 触发客流统计数据-->true
</triggerPeopleCountingData>
<PagingSearchCond>
<!--opt, object, 分页查询条件-->
<searchID>
<!--req, string, 搜索记录唯一标识, desc:用来确认上层客户端是否为同一个(倘若是同一个,则设备记录内存,下次搜索加快速度)-->test
</searchID>
<searchResultPosition>
<!--req, int, 搜索结果位置-->1
</searchResultPosition>
<maxResults>
<!--req, int, 最大结果-->1
</maxResults>
</PagingSearchCond>
<MinTimeInterval>
<!--opt, enum, 最小时间间隔, subType:string, [oneMinute#1分钟,quarter#15分钟,half#30分钟,hour#一小时,day#天,week#周,month#月]-->quarter
</MinTimeInterval>
<child>
<!--opt, bool, 是否只检测儿童, desc:该节点为false时表示统计成人和小孩-->true
</child>
<FaceAttribute>
<!--opt, object, 人脸属性, desc:搜索人脸属性时,statisticType=faceAttribute;后续若有进入+人脸属性搜索,statisticType=enternum;若搜索人体属性statisticType=humanBodyAttribute时,可输入人脸属性查询条件-->
<faceExpression>
<!--opt, enum, 人脸表情, subType:string, [unknown#未知,poker-faced#中性,happy#高兴,surprised#惊讶,disgusted#厌恶,sad#难过,angry#愤怒,contemptuous#轻蔑,panic#害怕,all#全部]-->unknown
</faceExpression>
<gender>
<!--opt, enum, 性别, subType:string, [unknown#未知,female#女人,male#男人,all#全部]-->unknown
</gender>
<mask>
<!--opt, enum, 口罩, subType:string, [unknown#未知,yes#戴口罩,no#不戴口罩,all#全部]-->unknown
</mask>
<ageGroup>
<!--opt, enum, 年龄段, subType:string, [unknown#未知,child#少年,young#青年,middle#中年,old#老年,infant#婴幼儿,kid#儿童,teenager#青少年,prime#壮年,middleAged#中老年,all#全部]-->unknown
</ageGroup>
<glass>
<!--opt, enum, 眼镜, subType:string, [unknown#未知,yes#戴眼镜,no#不戴眼镜,sunglasses#戴墨镜,all#全部]-->yes
</glass>
</FaceAttribute>
<regionID>
<!--opt, string, 区域ID, desc:区域ID,复选时,逗号隔开,支持多区域,/ISAPI/System/Video/inputs/channels/<ID>/counting/search/capabilities的regionsID一致-->1
</regionID>
<HumanBodyAttribute>
<!--opt, object, 人体属性, desc:搜索人体属性时,statisticType=humanBodyAttribute-->
<things>
<!--opt, enum, 拎东西, subType:string, [unknown#未知,yes#是,no#否,all#全部]-->unknown
</things>
</HumanBodyAttribute>
</CountingStatisticsDescription>
输出报文:
<?xml version="1.0" encoding="UTF-8"?>
<CountingStatisticsResult xmlns="http://www.isapi.org/ver20/XMLSchema" version="2.0">
<!--ro, opt, object, 查询客流量数据报表统计, attr:version{opt, string, 版本}-->
<responseStatus>
<!--ro, req, bool, 应答状态-->true
</responseStatus>
<responseStatusStrg>
<!--ro, req, string, 应答状态字-->test
</responseStatusStrg>
<numOfMatches>
<!--ro, req, int, 匹配数目-->1
</numOfMatches>
<matchList>
<!--ro, opt, array, 匹配列表, subType:object-->
<matchElement>
<!--ro, opt, object, 匹配元素-->
<timeSpan>
<!--ro, opt, object, 时间段-->
<startTime>
<!--ro, req, datetime, 起始时间-->1970-01-01T00:00:00+08:00
</startTime>
<endTime>
<!--ro, req, datetime, 结束时间-->1970-01-01T00:00:00+08:00
</endTime>
</timeSpan>
<enterCount>
<!--ro, opt, int, 进入人数总数-->1
</enterCount>
<exitCount>
<!--ro, opt, int, 离开人数总数-->1
</exitCount>
<peoplePassingCount>
<!--ro, opt, int, 经过人数总数-->1
</peoplePassingCount>
<duplicatePeopleCount>
<!--ro, opt, int, 重复人数总数-->1
</duplicatePeopleCount>
<duplicateEnter>
<!--ro, opt, int, 进入重复人数-->1
</duplicateEnter>
<duplicateExit>
<!--ro, opt, int, 离开重复人数-->1
</duplicateExit>
<duplicatePass>
<!--ro, opt, int, 经过重复人数-->1
</duplicatePass>
<FaceExpressionList>
<!--ro, opt, array, 人脸表情统计总数, subType:object-->
<FaceExpression>
<!--ro, opt, object, 人脸表情-->
<value>
<!--ro, req, enum, 具体人脸属性对应的可选项, subType:string, [unknown#未知,poker-faced#中性,happy#高兴,surprised#惊讶,disgusted#厌恶,sad#难过,angry#愤怒,contemptuous#轻蔑,panic#害怕,all#全部]-->unknown
</value>
<count>
<!--ro, req, int, 人脸表情对应的人数-->1
</count>
</FaceExpression>
</FaceExpressionList>
<GenderList>
<!--ro, opt, array, 性别统计, subType:object-->
<Gender>
<!--ro, opt, object, 性别-->
<value>
<!--ro, req, enum, 具体性别属性对应的可选项, subType:string, [unknown#未知,female#女人,male#男人,all#全部]-->unknown
</value>
<count>
<!--ro, req, int, 性别对应的人数-->1
</count>
</Gender>
</GenderList>
<MaskList>
<!--ro, opt, array, 口罩统计, subType:object-->
<Mask>
<!--ro, opt, object, 口罩-->
<value>
<!--ro, req, enum, 具体口罩属性对应的可选项, subType:string, [unknown#未知,yes#戴口罩,no#不戴口罩,all#全部]-->unknown
</value>
<count>
<!--ro, req, int, 口罩对应的人数-->1
</count>
</Mask>
</MaskList>
<AgeGroupList>
<!--ro, opt, array, 年龄段统计, subType:object-->
<AgeGroup>
<!--ro, opt, object, 年龄段-->
<value>
<!--ro, req, enum, 具体年龄段属性对应的可选项, subType:string, [unknown#未知,child#少年,young#青年,middle#中年,old#老年,infant#婴幼儿,kid#儿童,teenager#青少年,prime#壮年,middleAged#中老年,all#全部]-->unknown
</value>
<count>
<!--ro, req, int, 年龄段对应的人数-->1
</count>
</AgeGroup>
</AgeGroupList>
<GlassList>
<!--ro, opt, array, 眼镜统计, subType:object-->
<Glass>
<!--ro, opt, object, 眼镜-->
<value>
<!--ro, req, enum, 具体眼镜属性对应的可选项, subType:string, [unknown#未知,yes#戴眼镜,no#不戴眼镜,sunglasses#戴墨镜,all#全部]-->unknown
</value>
<count>
<!--ro, req, int, 眼镜对应的人数-->1
</count>
</Glass>
</GlassList>
<RegionList>
<!--ro, opt, array, 区域统计信息, subType:object-->
<Region>
<!--ro, opt, object, 区域-->
<id>
<!--ro, req, int, 检测区域id-->1
</id>
<enterCount>
<!--ro, opt, int, 进入人数-->1
</enterCount>
<exitCount>
<!--ro, opt, int, 离开人数-->1
</exitCount>
<passingCount>
<!--ro, opt, int, 经过人数-->1
</passingCount>
<duplicateEnter>
<!--ro, opt, int, 进入重复人数-->1
</duplicateEnter>
<duplicateExit>
<!--ro, opt, int, 离开重复人数-->1
</duplicateExit>
</Region>
</RegionList>
<ThingsList>
<!--ro, opt, array, 拎东西统计, subType:object-->
<Things>
<!--ro, opt, object, 拎东西-->
<value>
<!--ro, req, enum, 具体拎东西属性对应的可选项, subType:string, [unknown#未知,yes#是,no#否]-->unknown
</value>
<count>
<!--ro, req, int, 拎东西对应的人数-->1
</count>
</Things>
</ThingsList>
<enterRate>
<!--ro, opt, float, 进入率, range:[0.00,100.00], step:0.01, desc:进入率=(进入人数-重复人数)/(进入人数-重复人数+通过人数)-->1
</enterRate>
</matchElement>
</matchList>
</CountingStatisticsResult>
成果 (取得正确数据)
最终总结
官方给的管理页面也是isapi请求页面,F12看下底层请求,获得正确的请求方法。这样快速又高效,事半功倍。折腾了几天,搜索百度这方面信息很少。估计是开发的人不多。海康的确是很不错的设备,统计很全面,如男女、年龄,戴眼镜、拎东西等。