鹰眼的地理围栏服务,将根据轨迹判断终端是否进出围栏,并实时推送报警至观察者。
鹰眼ios sdk提供了一系列与地理围栏相关的功能。通过 btkfenceaction 类中相应的接口发起请求,响应通过 btkfencedelegate 协议中对应的方法回调给开发者。
鹰眼ios sdk中的地理围栏分为客户端地理围栏和服务端地理围栏,二者都支持创建、删除、修改、查询操作。使用鹰眼ios sdk,还可以查询指定终端实体与指定地理围栏的位置关系,查询指定终端实体的历史报警信息。当某终端实体的轨迹触发了地理围栏之后,报警信息会通过 btktracedelegate 的 -(void)ongetpushmessage:(btkpushmessage *)message; 方法回调给开发者。
鹰眼服务中,地理围栏主要有以下3种使用场景:
1、物流时效监控:司机app集成鹰眼sdk持续追踪轨迹。车辆管理人员通过服务端为每个司机创建出发地和目的地站点围栏,一旦监控对象进出围栏,鹰眼支持向鹰眼sdk和开发者服务端推送报警信息。
2、路线偏离报警:鹰眼v3.0新增路线围栏,可设定车辆行驶路线和偏离距离,一旦车辆偏离超过设定的距离,鹰眼围栏将推送报警。
3、用车行业运营区域监控:利用鹰眼多边形地理围栏和行政区围栏功能,设置运营区域围栏,一旦判断车辆进/出运营区触发报警。
围栏的种类
鹰眼ios sdk提供了两个端的地理围栏:客户端地理围栏和服务端地理围栏。
• 客户端地理围栏的管理、计算、报警触发均在客户端的鹰眼ios sdk内部完成,无需联网即可完成地理围栏的运算。
• 服务端地理围栏的管理、计算、报警触发都在鹰眼服务端完成,依赖于轨迹点及时上传至服务端才能完成围栏的各种操作。因此要想完整地使用服务端地理围栏的功能,使用sdk的设备必须时刻保持联网状态,否则将无法及时触发服务端地理围栏,报警信息也无法及时推送至客户端。与客户端地理围栏相比,服务端地理围栏支持将报警信息推送。
开发者可根据业务场景选择两类围栏中的一类,或两类同时使用,互为补充。
围栏的形状
目前鹰眼ios sdk的服务端地理围栏支持圆形、多边形、线形、行政区4种围栏形状,客户端地理围栏支持圆形围栏。四种形状的围栏报警行为如下:
• 圆形围栏:支持设置圆形围栏,一旦进出圆形范围则推送报警。
• 多边形围栏:支持设置多边形围栏,一旦进出多边形围栏则推送报警。
• 线形围栏:支持设置折线围栏,一旦偏离或回到设定路线则推送报警。
• 行政区围栏:支持通过传入行政区名称,创建以行政区边界为界的围栏。
围栏报警去噪的说明
无论是gps定位还是网络定位都存在误差(也就是常说的定位漂移问题),噪点会造成围栏误报警。目前鹰眼围栏进行了去噪处理,同时开放了 denoiseaccuracy 去噪精度参数供开发者在创建围栏时设置,围栏运算时,一旦判断轨迹点的定位精度大于此去噪精度,则不参与围栏运算。比如设置 denoiseaccuracy = 30,则定位精度大于30米的轨迹点都不会参与围栏计算。
在此提供各定位模式的平均精度供开发者参考:
• 设备在空旷的室外时定位精度均值为几米。
• 设备在室内打开wi-fi开关的情况下,wi-fi定位的精度均值为十几米到几十米。
• 设备在室内但关闭wi-fi开关的情况下,基站定位的精度均值为几百米到几千米。
使用鹰眼ios sdk可以创建、删除、更新、查询服务端地理围栏。sdk将轨迹上传至服务端时,服务端会进行相应的计算,若有围栏报警被触发,则通过长连接将报警信息推送至sdk;sdk还可以主动发起请求来查询指定监控对象的状态以及报警历史纪录等。需要注意的是:sdk中使用服务端地理围栏的功能时,必须要求网络畅通。若网络不畅,轨迹信息无法及时上传至服务端,围栏计算和推送均无法正常运行。
创建围栏
通过 btkfenceaction 类中的 -(void)createserverfencewith:(btkcreateserverfencerequest *)request delegate:(id
btkservercirclefence 代表服务端圆形地理围栏;
btkserverpolygonfence 代表服务端多边形地理围栏;
btkserverpolylinefence 代表服务端线形地理围栏;
btkserverdistrictfence 代表服务端行政区域地理围栏;
下面的代码片段表示,创建一个名称为"server_circle_fence"的服务端圆形地理围栏,圆心坐标为东经 116.3134°、北纬 40.0478°,围栏半径为50米。它的监控对象为"entitya",且当 entitya 这个终端实体的定位精度大于50米的轨迹点不参与此围栏的计算。
// 圆心cllocationcoordinate2d center =cllocationcoordinate2dmake(40.0478,116.3134);// 构造将要创建的新的围栏对象btkservercirclefence*fence =[[btkservercirclefence alloc] initwithcenter:center radius:50coordtype:btk_coordtype_bd09lldenoiseaccuracy:50fencename:@"server_circle_fence"monitoredobject:@"entitya"];// 构造请求对象btkcreateserverfencerequest*circlerequest =[[btkcreateserverfencerequest alloc] initwithservercirclefence:fence serviceid:100000tag:21];// 发起创建请求[[btkfenceaction sharedinstance] createserverfencewith:circlerequest delegate:self];
删除围栏
通过 btkfenceaction 类中的 -(void)deleteserverfencewith:(btkdeleteserverfencerequest *)request delegate:(id
以下代码片段表示,删除监控对象为终端实体"entitya"的所有服务端地理围栏。
// 构造请求对象btkdeleteserverfencerequest*request =[[btkdeleteserverfencerequest alloc] initwithmonitoredobject:@"entitya"fenceids:nil serviceid:100000tag:22];// 发起删除请求[[btkfenceaction sharedinstance] deleteserverfencewith:request delegate:self];
更新围栏
通过 btkfenceaction 类中的 -(void)updateserverfencewith:(btkupdateserverfencerequest *)request delegate:(id
以下代码片段表示,将 fenceid 为138的服务端圆形地理围栏的圆心修改为东经 116.2134°、北纬 40.1478°,半径修改为60米。且这个围栏的名称改为"server_fence_60",监控对象改为终端实体"entityb",去噪精度改为60米。
// 新的圆心cllocationcoordinate2d center =cllocationcoordinate2dmake(40.1478,116.2134);// 新的圆形围栏btkservercirclefence*fence =[[btkservercirclefence alloc] initwithcenter:center radius:60coordtype:btk_coordtype_bd09lldenoiseaccuracy:60fencename:@"server_fence_60"monitoredobject:@"entityb"];// 构建请求对象btkupdateserverfencerequest*request =[[btkupdateserverfencerequest alloc] initwithservercirclefence:fence fenceid:138serviceid:100000tag:23];// 发起更新请求[[btkfenceaction sharedinstance] updateserverfencewith:request delegate:self];
查询围栏
通过 btkfenceaction 类中的 -(void)queryserverfencewith:(btkqueryserverfencerequest *)request delegate:(id
以下代码片段表示,查询监控对象为终端实体"entitya"的所有服务端地理围栏。
// 构建请求对象btkqueryserverfencerequest*request =[[btkqueryserverfencerequest alloc] initwithmonitoredobject:@"entitya"fenceids:nil outputcoordtype:btk_coordtype_bd09llserviceid:100000tag:24];// 发送查询请求[[btkfenceaction sharedinstance] queryserverfencewith:request delegate:self];
实时状态查询
鹰眼ios sdk支持查询指定监控对象的状态。监控对象即某个终端实体,监控对象的状态是指其相对其上的地理围栏的位置关系:是在圆形或多边形围栏的内部还是外部,是否偏离了线形围栏等。sdk提供了2个方法用于查询监控对象的状态:
1、使用-(void)queryserverfencestatuswith:(btkqueryserverfencestatusrequest *)request delegate:(id
以下代码片段表示,查询终端实体"entitya"和所有监控该终端实体的服务端地理围栏的位置关系。
// 构建请求对象btkqueryserverfencestatusrequest*request =[[btkqueryserverfencestatusrequest alloc] initwithmonitoredobject:@"entitya"fenceids:nil serviceid:100000tag:25];// 发起查询请求[[btkfenceaction sharedinstance] queryserverfencestatuswith:request delegate:self];
2、使用 -(void)queryserverfencestatusbycustomlocationwith:(btkqueryserverfencestatusbycustomlocationrequest *)request delegate:(id
以下代码片段表示,假设"entitya"这个终端实体在东经 120.44°,北纬 40.11° 的话,该终端实体和其上的 fenceid 为17、23、29的这几个服务端地理围栏的位置关系,只有这几个地理围栏的监控对象是"entitya"这个终端实体时才有意义,如果不知道有哪些地理围栏在监控"entitya"这个终端实体,则 fenceids 属性传入 nil 即可。
// 被监控对象的模拟位置cllocationcoordinate2d customlocation =cllocationcoordinate2dmake(40.11,120.44);// 地理围栏id列表nsarray*fenceids = @[@17, @23, @29];// 构建请求对象btkqueryserverfencestatusbycustomlocationrequest*request =[[btkqueryserverfencestatusbycustomlocationrequest alloc] initwithmonitoredobject:@"entitya"customlocation:customlocation coordtype:btk_coordtype_bd09llfenceids:fenceids serviceid:100000tag:28];// 发起查询请求[[btkfenceaction sharedinstance] queryserverfencestatusbycustomlocationwith:request delegate:self];
历史报警查询
鹰眼ios sdk支持查询指定时间段内,服务端地理围栏的历史报警记录。sdk提供了以下2个方法:
1、使用 -(void)queryserverfencehistoryalarmwith:(btkqueryserverfencehistoryalarmrequest *)request delegate:(id
以下代码片段表示,查询"entitya"这个终端实体上的所有服务端地理围栏,在过去12小时内的所有报警纪录。
nsuinteger endtime =[[nsdate date] timeintervalsince1970];// 构建请求对象btkqueryserverfencehistoryalarmrequest*request =[[btkqueryserverfencehistoryalarmrequest alloc] initwithmonitoredobject:@"entitya"fenceids:nil starttime:(endtime -12*60*60) endtime:endtime outputcoordtype:btk_coordtype_bd09llserviceid:100000tag:26];// 发起查询请求[[btkfenceaction sharedinstance] queryserverfencehistoryalarmwith:request delegate:self];2. 使用 -(void)batchqueryserverfencehistoryalarmwith:(btkbatchqueryserverfencehistoryalarmrequest*)request delegate:(id<btkfencedelegate>)delegate; 方法,批量查询某个service下,所有的历史报警信息。
以下代码片段表示,查询"100000"这个 service 下,所有的终端实体上的所有服务端地理围栏,在过去12小时内的报警历史纪录。
nsuinteger endtime =[[nsdate date] timeintervalsince1970];// 构建请求对象btkbatchqueryserverfencehistoryalarmrequest*request =[[btkbatchqueryserverfencehistoryalarmrequest alloc] initwithstarttime:endtime -12*60*60endtime:endtime outputcoordtype:btk_coordtype_bd09llpageindex:1pagesize:10serviceid:100000tag:27];// 发起查询请求[[btkfenceaction sharedinstance] batchqueryserverfencehistoryalarmwith:request delegate:self];
报警推送
当服务端围栏被触发之后,会通过长连接将报警信息推送给sdk,sdk会通过 btkactiondelegate 协议的 -(void)ongetpushmessage:(btkpushmessage *)message; 方法将报警信息推送给开发者。因此服务端围栏的报警推送要求网络畅通。当接收报警的手机断网或网络状态不好时,会导致报警推送失败,鹰眼服务端将在后续的10分钟之内每隔15s推送一次,直至收到成功响应。若10分钟之后仍未成功,将不再推送,但报警记录将存储在鹰眼服务端。为避免因此造成报警漏接收,开发者可定期使用历史报警查询接口同步报警信息。
以下的代码片段展示了报警信息的解析方法:
-(void)ongetpushmessage:(btkpushmessage*)message {nslog(@"收到推送消息,消息类型: %@", @(message.type));if(message.type==0x03){btkpushmessagefencealarmcontent*content =(btkpushmessagefencealarmcontent*)message.content;if(content.actiontype==btk_fence_monitored_object_action_type_enter){nslog(@"被监控对象 %@ 进入 服务端地理围栏 %@ ", content.monitoredobject, content.fencename);}elseif(content.actiontype==btk_fence_monitored_object_action_type_exit){nslog(@"被监控对象 %@ 离开 服务端地理围栏 %@ ", content.monitoredobject, content.fencename);}}}
客户端围栏的所有功能,均在sdk内部完成,不依赖网络。只要开启服务且开始采集之后,每个轨迹点参与客户端围栏的计算,若触发报警,会直接通过 btkactiondelegate 协议的 -(void)ongetpushmessage:(btkpushmessage *)message; 方法将报警信息推送给开发者。客户端围栏的历史报警信息也将存储在sdk中,开发者可以通过相应的方法查询客户端围栏的历史报警纪录。客户端历史报警纪录最多保存7天。
客户端地理围栏的管理,主要是指客户端围栏的新建、删除、修改、查询操作。
创建围栏
通过 btkfenceaction 类中的 -(void)createlocalfencewith:(btkcreatelocalfencerequest *)request delegate:(id
以下代码片段表示,创建一个名称为"local_fence_a"的客户端圆形地理围栏,圆心位于东经 116.3134°、北纬 40.0478°,半径为100米。它监控"entitya"这个终端实体,且没有设置去噪精度,也就是所有以“entitya”身份开启轨迹服务并开始采集后,采集到的轨迹点都会参与此地理围栏的计算。
// 围栏圆心cllocationcoordinate2d center =cllocationcoordinate2dmake(40.0478,116.3134);// 新的客户端地理围栏对象btklocalcirclefence*localfence =[[btklocalcirclefence alloc] initwithcenter:center radius:100coordtype:btk_coordtype_bd09lldenoiseaccuracy:0fencename:@"local_fence_a"monitoredobject:@"entitya"];// 构建请求对象btkcreatelocalfencerequest*request =[[btkcreatelocalfencerequest alloc] initwithlocalcirclefence:localfence tag:21];// 创建客户端地理围栏[[btkfenceaction sharedinstance] createlocalfencewith:request delegate:self];
删除围栏
通过 btkfenceaction 类中的 -(void)deletelocalfencewith:(btkdeletelocalfencerequest *)request delegate:(id
以下代码片段表示,删除所有以"entitya"这个终端实体为监控对象的客户端地理围栏。
// 构建请求对象btkdeletelocalfencerequest*request =[[btkdeletelocalfencerequest alloc] initwithmonitoredobject:@"entitya"fenceids:nil tag:22];// 删除客户端地理围栏[[btkfenceaction sharedinstance] deletelocalfencewith:request delegate:self];
更新围栏
通过 btkfenceaction 类中的 -(void)updatelocalfencewith:(btkupdatelocalfencerequest *)request delegate:(id
以下代码片段表示,将 fenceid 为15的客户端地理围栏的名称修改为"local_fence_a",监控对象改为"entityb",围栏的圆心坐标改为东经 116.5167°,北纬 40.1486°,围栏半径改为158米。同时将该客户端地理围栏的去噪精度改为10米,即定位精度超过10米的轨迹点将不再参与围栏计算。
// 新的围栏圆心cllocationcoordinate2d center =cllocationcoordinate2dmake(40.1486,116.5167);// 新的客户端圆形地理围栏对象btklocalcirclefence*localfence =[[btklocalcirclefence alloc] initwithcenter:center radius:158coordtype:btk_coordtype_bd09lldenoiseaccuracy:10fencename:@"local_fence_a"monitoredobject:@"entityb"];// 构建请求对象btkupdatelocalfencerequest*request =[[btkupdatelocalfencerequest alloc] initwithlocalfenceid:15localcirclefence:localfence tag:23];// 更新客户端地理围栏[[btkfenceaction sharedinstance] updatelocalfencewith:request delegate:self];
查询围栏
通过 btkfenceaction 类中的 -(void)querylocalfencewith:(btkquerylocalfencerequest *)request delegate:(id
以下代码片段表示,查询所有监控对象为"entitya"的客户端地理围栏。
// 构建请求对象btkquerylocalfencerequest*request =[[btkquerylocalfencerequest alloc] initwithmonitoredobject:@"entitya"fenceids:nil tag:24];// 查询客户端地理围栏[[btkfenceaction sharedinstance] querylocalfencewith:request delegate:self];
实时状态查询
鹰眼ios sdk支持查询指定监控对象和客户端围栏的位置关系。开发者可以借此查询当前终端是在客户端地理围栏的内部还是外部。
使用 -(void)querylocalfencestatuswith:(btkquerylocalfencestatusrequest *)request delegate:(id
以下代码片段表示,查询终端实体"entitya"和所有以"entitya"为监控对象的客户端地理围栏的位置关系。
// 构建请求对象btkquerylocalfencestatusrequest*request =[[btkquerylocalfencestatusrequest alloc] initwithmonitoredobject:@"entitya"fenceids:nil tag:111];// 发起查询请求[[btkfenceaction sharedinstance] querylocalfencestatuswith:request delegate:self];
使用 -(void)querylocalfencestatusbycustomlocationwith:(btkquerylocalfencestatusbycustomlocationrequest *)request delegate:(id
以下代码片段表示,假设"entitya"这个终端实体在东经 116.5167°,北纬 40.1486° 的话,该终端实体和其上所有客户端地理围栏的位置关系。
// 被监控对象的模拟位置cllocationcoordinate2d customlocation =cllocationcoordinate2dmake(40.1486,116.5167);// 构建请求对象btkquerylocalfencestatusbycustomlocationrequest*request =[[btkquerylocalfencestatusbycustomlocationrequest alloc] initwithmonitoredobject:@"entitya"customlocation:customlocation coordtype:btk_coordtype_bd09llfenceids:nil tag:42];// 发起查询请求[[btkfenceaction sharedinstance] querylocalfencestatusbycustomlocationwith:request delegate:self];
历史报警查询
鹰眼ios sdk支持查询指定监控对象,在指定时间段内,客户端地理围栏的历史报警记录。使用 -(void)querylocalfencehistoryalarmwith:(btkquerylocalfencehistoryalarmrequest *)request delegate:(id
以下代码片段表示,查询名称为"entitya"的终端实体,在过去1小时内的历史报警纪录。
nsuinteger endtime =[[nsdate date] timeintervalsince1970]-3600;// 构建请求对象btkquerylocalfencehistoryalarmrequest*request =[[btkquerylocalfencehistoryalarmrequest alloc] initwithmonitoredobject:@"entitya"fenceids:nil starttime:endtime -60*60endtime:endtime tag:333];// 发起查询请求[[btkfenceaction sharedinstance] querylocalfencehistoryalarmwith:request delegate:self];
报警推送
客户端地理围栏不依赖网络,因此每个采集到的轨迹点,都会在第一时间参与客户端围栏的计算,若触发报警,则和服务端报警一样,通过 btkactiondelegate 协议的 -(void)ongetpushmessage:(btkpushmessage *)message; 方法将报警信息推送给开发者。不同的是,btkpushmessage 中表示推送消息类型的 type 字段的值不同。
以下代码片段展示了,如何解析推送信息中的客户端地理围栏报警推送。
-(void)ongetpushmessage:(btkpushmessage*)message {nslog(@"收到推送消息,消息类型: %@", @(message.type));if(message.type==0x04){btkpushmessagefencealarmcontent*content =(btkpushmessagefencealarmcontent*)message.content;if(content.actiontype==btk_fence_monitored_object_action_type_enter){nslog(@"被监控对象 %@ 进入 客户端地理围栏 %@ ", content.monitoredobject, content.fencename);}elseif(content.actiontype==btk_fence_monitored_object_action_type_exit){nslog(@"被监控对象 %@ 离开 客户端地理围栏 %@ ", content.monitoredobject, content.fencename);}}}
上一篇
下一篇
本篇文章对您是否有帮助?