<commit_before>IVR RPC 协议
==================

名词解释
^^^^^^^^^^^^^

- IVR：internet video recorder，一种基于物联网云计算技术的网络视频录象机；
  与传统NVR，DVR类似，IVR可以接入和管理各种摄像头，支持录像，支持直播点播视频等功能，
  但是与传统NVR，DVR的不同在于用户可以在互联网上观看直播点播，
  并且因为应用了云计算技术，IVR拥有近于无限的接入能力以及海量的并发直播点播请求；IVR主要由IVC与IVT两部分组成。

- IVC：internet video cloud，运行于云端的视频云平台；
  提供API接口以及管理网页，用户可以随时通过互联网，以网页，APP公众号等方式接入IVC，对其名下的摄像头进行管理，并进行直播点播。

- IVT：安装与客户现场的，具有与IVC通信能力的视频设备，如摄像头，NVR等，IVT通过IVR RPC协议接入IVC，并接受IVC的管理。

- Channel：IVT上的视频通道；
  一般一路摄像头为一条channel。如果IVT为摄像头，则只有一条通道，且通道号必须为0；
  如果IVT为NVR，则会有多条通道，每条通道代表一个NVR管理下的摄像头。

- IVR RPC：IVT与IVR之间采用的通信协议

协议特性
^^^^^^^^^^^^

IVR RPC底层基于TCP/IP的websocket，应用层为基于JSON的自定义协议。

应用层协议的基本通信模式包括RPC与event（事件通知）两种：

1. RPC为一应一答模式；通信中的两个端点均可以发起RPC请求；在单一方向上，请求接收/回应方，必须根据请求到达的顺序来处理并回应请求；
两个方向上RPC请求有个各自的序列号，且独立计数；任一方向上的RPC请求与响应，不受另一方向上是否有RPC请求正在进行的影响。

2. 事件通知是没有应答的；通信中的两个端点均可以给对方发送事件通知。

应用层协议数据包格式
^^^^^^^^^^^^^^^^^^^^^^^^^^

此处数据包指的是应用层协议的数据包，即websocket的payload/message。数据包使用JSON标准进行串行化。

RPC request
++++++++++++

RPC请求包的格式 ::

  {
    "req": <字符串，必填，请求的RPC方法>,
    "params": <JSON对象，可选，RPC方法的参数；当方法没有参数时，此域不存在>,
    "seq": <整数，必填，RPC的序列号；每发送一次请求，+1>
  }

RPC调用成功的response
+++++++++++++++++++++++++++++++

当RPC调用成功，应答包的格式 ::

  {
    "seq": <整数，必填，RPC的序列号；与对应的RPC请求的序列号一致>,
    "resp": <JSON对象，必选，应答内容>
  }

RPC调用失败的response
++++++++++++++++++++++++++++++++

当RPC调用失败，应答包的格式 ::

  {
    "seq": <整数，必填，RPC的序列号；与对应的RPC请求的序列号一致>,
    "err": {
      "code": <整数，必填，错误码>,
      "msg": <字符串，必填，错误信息>
    }
  }

通用的error code

==========     ============
code            备注
==========     ============
1               内部系统错误
==========     ============

事件通知
+++++++++++

事件通知包的格式 ::

  {
    "event": <字符串，必填，事件名称>,
    "params": <JSON对象，可选，参数；当没有参数时，该域不存在>
  }

异常处理
^^^^^^^^^^^^

当通讯的一端发现如下异常时，需主动断开websocket连接：

1. RPC的request与response的seq（序列号不一致）

2. 在没有响应上一个RPC request的情况下收到其他RPC request

3. RPC相应超时，当RPC发起方发现对端在20秒后仍然没有响应请求

4. 调用的RPC方法不存在

5. 数据包格式不正确

协议流程
^^^^^^^^^^^

1. IVT向IVC发起websocket连接，并携带上login_code，login_password等信息。

2. IVC测在接收到请求后，验证IVT身份，若通过，则与IVT建立websocket连接。

3. IVT定期向IVC发送keepalive，在keepalive中携带IVT的状态，以及其下摄像头的状态信息。

4. 根据业务安排，IVT与IVC可以进行各种RPC与event的交换。

IVC的websocket URL格式如下: ::

  ws://<IVC host:port>/ivc?login_code=<IVT登录名>&login_passwd=<IVT<PASSWORD>>&hardware_model=<IVT的硬件型号>&firmware_model=<IVT的固件版本号>

IVC支持的RPC方法
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

此处描述所有IVT可以调用的IVC的RPC方法。其中“参数”指的是RPC request数据包中的params域；
“成功应答”指的是RPC调用成功的response中的resp域；“失败应答”值得是RPC调用失败的response中的err域。

Keepalive
+++++++++++++

IVT利用该方法定期向IVC报告工作状态，IVC以此作为IVT仍然在线的依据，同时IVT通过等待IVC的应答来判断与IVC的连接状态。

参数： ::

  {
    "state": <必填，整数；IVT的状态，1：在线，2：升级中，3：异常>
    "channels": [
      {
        "channel": <必填，整数>,
        "state": <必填，整数；该channel的状态，0：离线，1：在线，2：直播中>,
        "record_session": <可选，字符串；当前channel正在进行的录像session的ID，录像session ID为StartCloudRecord请求中的session_id域；空字符串或该域不存在表示没有正在进行的录像session>
        "alarm": <可选，整数；当前报警状态flag，每一位（从0开始计数）对应一种报警类型，当相应位为1时，标示该类型的报警被触发；第2位，外部报警；第3位，移动侦测；当该域不存在时表示当前没有报警>
      }
    ]
  }

成功应答： ::

  空

preview_server
++++++++++++++++

IVT可通过该方法获取用于上传摄像头预览图的URL。

参数： ::

  无

成功应答： ::

  {
    "url": <必填，字符串；上传图片所用的URL>
  }

.. note::

  获取URL后，可使用POST方法上传图片；图片的二进制数据放在body中。


GetFirmware
++++++++++++++++

IVT可通过该方法获取最新的固件的版本，及其下载URL。

参数： ::

  无

成功应答： ::

  {
    "firmware_model": <必填，字符串；最新固件的版本号>,
    "url": <必填，字符串；最新固件的下载地址>
  }

AlarmNotify
++++++++++++

IVT可通过该方法向IVC上报报警事件的开始/结束

参数： ::

  {
    "channel": <必填，整数；通道号>,
    "type": <必填，整数；报警类型：2，外部报警；3，移动侦测>,
    "state": <必填，字符串枚举，start/end；报警状态：start，开始；end，结束>,
    "desc": <必填，字符串；描述信息>
  }

成功应答： ::

  {
    "pic_upload_url": <必填，字符串；报警相关图片的上传URL>
  }


IVT支持的RPC方法
^^^^^^^^^^^^^^^^^^^

此处描述所有可以被调用的IVT的RPC方法。

RTMPPublish
++++++++++++

IVC可以通过该方法请求IVT publish一条RTMP流到指定URL。

参数： ::

  {
    "channel": <必填，整数>,
    "quality": <必填，字符串；可选值为：ld、sd、hd、fhd，分别代表低清，标清，高清，全高清>,
    "url": <必填，字符串；publish RTMP流的目标URL>,
    "stream_id": <必填，字符串；用来标识这条流的ID>,
    "max_bitrate": <必填，整数，单位bit/s；用来表示最大允许的码率，0表示没有限制，若相应流码率大于该值，需返回失败>
  }

成功应答（即publish成功，或该RTPM stream已经存在）： ::

  空

RTMPStopPublish
+++++++++++++++++

IVC可以通过该方法请求IVT结束正在publish的RTMP流。

参数： ::

  {
    "stream_id": <必填，字符串；RTMPPublish时给的stream_id>,
    "channel": <必填，整数>
  }

成功应答（成功结束，或该流不存在）： ::

  空

StartCloudRecord
++++++++++++++++++

IVC可以通过该方法请求IVT启动录像并上传录像至云存储。

参数： ::

  {
    "session_id": <必填，字符串，22字节；录像session ID>,
    "channel": <必填，整数>,
    "quality": <必填，字符串；可选值为：ld、sd、hd、fhd，分别代表低清，标清，高清，全高清>,
    "max_bitrate": <必填，整数，单位bit/s；用来表示最大允许的码率，0表示没有限制，若相应流码率大于该值，需返回失败>，
    "seg_duration": <必填，整数；ts文件长度，单位秒>,
    "seg_max_size": <必填，整数；每个ts文件的最大尺寸，单位byte>,
    "seg_max_count": <必填，整数；最多在内存中缓存的ts文件数量>,
    "prerecord_seconds": <必填，整数；预录秒数，单位妙>,
    "start_ts": <必填，整数；第一个TS文件的时间戳，若给定0或者负数，则IVT使用设备自身的时间>,
    "cbk_url": <必填，回调URL，最长256字节；录像模块通过请求该URL，获取录像上传地址>
  }

成功应答： ::

  空

StopCloudRecord
+++++++++++++++++

IVC可以通过该方法请求IVT结束录像。

参数： ::

  {
    "session_id": <必填，字符串；录像session ID>,
    "channel": <必填，整数>
  }

成功应答（成功结束，或该录像session不存在）： ::

  空

RebootChannel
+++++++++++++

IVC可以通过该方法请求IVT重启摄像头。

参数： ::

  {
    "channel": <必填，整数>
  }

成功应答： ::

  空

GetPTZPresetList
++++++++++++++++++++

IVC可以通过该命令获取摄像头的预置点列表

参数： ::

  {
    "channel": <必填，整数>
  }

成功应答： ::

  [
    {
      "name": <必填，字符串；预置点名称>,
      "token": <必填，字符串；预置点token>
    }
    ...
  ]

GetPTZPresetTourList
++++++++++++++++++++++++++++

IVC可以通过该命令获取摄像头的预置点巡航计划列表

参数： ::

  {
    "channel": <必填，整数>
  }

成功应答： ::

  [
    {
      "name": <必填，字符串；预置点巡航计划名称>,
      "token": <必填，字符串；预置点巡航计划token>
    }
    ...
  ]

AlarmMoveDetectConfig
++++++++++++++

IVC可以通过该方法修改摄像头的移动侦测相关的参数

参数： ::

  {
    "channel": <必填，整数>,
    "enable": <必填，bool；报警功能开关，当为false时，不应上报任何报警信息>,
    "start": <可选，整数；每天自动布防时间，从00:00开始算起的秒数，如早上3点20为12000；当不存在时为0，0点0分；start可以大与end，当start大于end时，则表示跨天布防，start是当天的时间，而end是第二天的时间>,
    "end": <可选，整数；每天自动撤防时间，从00：00开始算起的秒数；当不存在时为86400，即第二天的0点0分>,
    "sensitivity": <必填，整数；灵敏度，0-100，0为最不灵敏，100为最灵敏>,
    "delay": <必填，整数；抖动时间，单位秒，侦测到移动后，在指定的delay时间内没有再次侦测到移动，则上报报警结束>
  }

成功应答（配置成功）： ::

  空
  
AlarmRectIntrusionDetectConfig
++++++++++++++

IVC可以通过该方法修改摄像头的拌网检测相关的参数。参数中的rect描述了拌网所用长方形的四个顶点的位置，每个顶点的位置使用X和Y坐标表示；坐标的原点为画面的左上角，坐标的取值范围为0-100，因此坐标（0，0）为原点即画面的左上角，（0，100）为画面左下角，（100，100）为画面右下角。rect为可选参数，没有给定时，表示不修改长方形的位置。

参数： ::

  {
    "channel": <必填，整数>,
    "enable": <必填，bool；报警功能开关，当为false时，不应上报任何报警信息>,
    "start": <可选，整数；每天自动布防时间，从00:00开始算起的秒数，如早上3点20为12000；当不存在时为0，0点0分；start可以大与end，当start大于end时，则表示跨天布防，start是当天的时间，而end是第二天的时间>,
    "end": <可选，整数；每天自动撤防时间，从00：00开始算起的秒数；当不存在时为86400，即第二天的0点0分>,
    "sensitivity": <必填，整数；灵敏度，0-100，0为最不灵敏，100为最灵敏>,
    "delay": <必填，整数；抖动时间，单位秒，侦测到拌网后，在指定的delay时间内没有再次侦测到，则上报报警结束>
    "rect": {
      "ulx": <必填，整数；长方形左上角的x轴位置，0-100>
      "uly": <必填，整数；长方形左上角的y轴位置，0-100>
      "urx": <必填，整数；长方形右上角的x轴位置，0-100>
      "ury": <必填，整数；长方形右上角的y轴位置，0-100>
      "dlx": <必填，整数；长方形左下角的x轴位置，0-100>
      "dly": <必填，整数；长方形左下角的y轴位置，0-100>
      "drx": <必填，整数；长方形右下角的x轴位置，0-100>
      "dry": <必填，整数；长方形右下角的y轴位置，0-100>
    } <可选；拌网长方形四个顶点的位置。当该域不存在时，表示对摄像机上已有的长方形设置不做修改>
  }

成功应答（配置成功）： ::

  空  

IVT支持的event
^^^^^^^^^^^^^^^^^^^

此处描述IVT接受的event事件通知。“参数”指的是件通知数据包中的params域。

UpgradeFirmware
++++++++++++++++

IVC可以通过该方法通知IVT升级固件（推荐IVT强制升级），收到该事件后IVT可以通过GetFirmware方法来获取具体的固件信息。

参数： ::

  无

SyncTime
++++++++++++++++

IVC可以通过该方法通知IVT要求摄像头同步给定的时间。

参数： ::

  {
    "datetime": <必填，字符串；格式YY-MM-DDTHH:MM:SS，例子：2016-12-05T02:15:32>,
    "offset": <必填，整数；可接受的偏差，单位秒，若摄像机时间与上面给定的时间的偏差在offset秒之内，则摄像机无需同步时间>,
  }

CtrlPTZ
++++++++++++

IVC可以通过该方法操作摄像头的云台。

参数： ::

  {
    "channel": <必填，整数>,
    "op": <必填，字符串；云台的操作码，具体参见下表>,
    "value": <可选，整数；意义见下表>
  }

==================   =============   ===============================================
op                    操作             value
==================   =============   ===============================================
up                    上                可选，整数，速度，0-100，0最慢，100最快，默认100
down                  下                同上
left                  左                同上
right                 右                同上
upleft                左上              同上
upright               右上              同上
downleft              左下              同上
downright             右下              同上
zoomin                拉近              同上
zoomout               拉远              同上
stop                  停止              可选，整数，但数值没有意义
==================   =============   ===============================================

GotoPTZPreset
++++++++++++++++++++++

IVC可通过该方法通知摄像头移到预置点

参数： ::

  {
    "channel": <必填，整数>,
    "token": <必填，字符串；预置点token>
  }


CtrlPTZPresetTour
++++++++++++++++++++++

IVC可通过该方法通知摄像头启动或停止预置点巡航计划

参数： ::

  {
    "channel": <必填，整数>,
    "token": <必填，字符串；预置点巡航计划token，当op为stop时，该域没有意义，可以为空>,
    "op": <必填，字符串；start或者stop>
  }

CtrlPTZPatrol
++++++++++++++++++++++

IVC可通过该方法通知摄像头启动或停止巡迹

参数： ::

  {
    "channel": <必填，整数>,
    "op": <必填，字符串；start或者stop>
  }



<commit_msg>IVR RPC: fix missing alarm type for rectangle intrusion in AlarmNotify and Keepalive method<commit_after>IVR RPC 协议
==================

名词解释
^^^^^^^^^^^^^

- IVR：internet video recorder，一种基于物联网云计算技术的网络视频录象机；
  与传统NVR，DVR类似，IVR可以接入和管理各种摄像头，支持录像，支持直播点播视频等功能，
  但是与传统NVR，DVR的不同在于用户可以在互联网上观看直播点播，
  并且因为应用了云计算技术，IVR拥有近于无限的接入能力以及海量的并发直播点播请求；IVR主要由IVC与IVT两部分组成。

- IVC：internet video cloud，运行于云端的视频云平台；
  提供API接口以及管理网页，用户可以随时通过互联网，以网页，APP公众号等方式接入IVC，对其名下的摄像头进行管理，并进行直播点播。

- IVT：安装与客户现场的，具有与IVC通信能力的视频设备，如摄像头，NVR等，IVT通过IVR RPC协议接入IVC，并接受IVC的管理。

- Channel：IVT上的视频通道；
  一般一路摄像头为一条channel。如果IVT为摄像头，则只有一条通道，且通道号必须为0；
  如果IVT为NVR，则会有多条通道，每条通道代表一个NVR管理下的摄像头。

- IVR RPC：IVT与IVR之间采用的通信协议

协议特性
^^^^^^^^^^^^

IVR RPC底层基于TCP/IP的websocket，应用层为基于JSON的自定义协议。

应用层协议的基本通信模式包括RPC与event（事件通知）两种：

1. RPC为一应一答模式；通信中的两个端点均可以发起RPC请求；在单一方向上，请求接收/回应方，必须根据请求到达的顺序来处理并回应请求；
两个方向上RPC请求有个各自的序列号，且独立计数；任一方向上的RPC请求与响应，不受另一方向上是否有RPC请求正在进行的影响。

2. 事件通知是没有应答的；通信中的两个端点均可以给对方发送事件通知。

应用层协议数据包格式
^^^^^^^^^^^^^^^^^^^^^^^^^^

此处数据包指的是应用层协议的数据包，即websocket的payload/message。数据包使用JSON标准进行串行化。

RPC request
++++++++++++

RPC请求包的格式 ::

  {
    "req": <字符串，必填，请求的RPC方法>,
    "params": <JSON对象，可选，RPC方法的参数；当方法没有参数时，此域不存在>,
    "seq": <整数，必填，RPC的序列号；每发送一次请求，+1>
  }

RPC调用成功的response
+++++++++++++++++++++++++++++++

当RPC调用成功，应答包的格式 ::

  {
    "seq": <整数，必填，RPC的序列号；与对应的RPC请求的序列号一致>,
    "resp": <JSON对象，必选，应答内容>
  }

RPC调用失败的response
++++++++++++++++++++++++++++++++

当RPC调用失败，应答包的格式 ::

  {
    "seq": <整数，必填，RPC的序列号；与对应的RPC请求的序列号一致>,
    "err": {
      "code": <整数，必填，错误码>,
      "msg": <字符串，必填，错误信息>
    }
  }

通用的error code

==========     ============
code            备注
==========     ============
1               内部系统错误
==========     ============

事件通知
+++++++++++

事件通知包的格式 ::

  {
    "event": <字符串，必填，事件名称>,
    "params": <JSON对象，可选，参数；当没有参数时，该域不存在>
  }

异常处理
^^^^^^^^^^^^

当通讯的一端发现如下异常时，需主动断开websocket连接：

1. RPC的request与response的seq（序列号不一致）

2. 在没有响应上一个RPC request的情况下收到其他RPC request

3. RPC相应超时，当RPC发起方发现对端在20秒后仍然没有响应请求

4. 调用的RPC方法不存在

5. 数据包格式不正确

协议流程
^^^^^^^^^^^

1. IVT向IVC发起websocket连接，并携带上login_code，login_password等信息。

2. IVC测在接收到请求后，验证IVT身份，若通过，则与IVT建立websocket连接。

3. IVT定期向IVC发送keepalive，在keepalive中携带IVT的状态，以及其下摄像头的状态信息。

4. 根据业务安排，IVT与IVC可以进行各种RPC与event的交换。

IVC的websocket URL格式如下: ::

  ws://<IVC host:port>/ivc?login_code=<IVT登录名>&login_passwd=<IVT登录密码>&hardware_model=<IVT的硬件型号>&firmware_model=<IVT的固件版本号>

IVC支持的RPC方法
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

此处描述所有IVT可以调用的IVC的RPC方法。其中“参数”指的是RPC request数据包中的params域；
“成功应答”指的是RPC调用成功的response中的resp域；“失败应答”值得是RPC调用失败的response中的err域。

Keepalive
+++++++++++++

IVT利用该方法定期向IVC报告工作状态，IVC以此作为IVT仍然在线的依据，同时IVT通过等待IVC的应答来判断与IVC的连接状态。

参数： ::

  {
    "state": <必填，整数；IVT的状态，1：在线，2：升级中，3：异常>
    "channels": [
      {
        "channel": <必填，整数>,
        "state": <必填，整数；该channel的状态，0：离线，1：在线，2：直播中>,
        "record_session": <可选，字符串；当前channel正在进行的录像session的ID，录像session ID为StartCloudRecord请求中的session_id域；空字符串或该域不存在表示没有正在进行的录像session>
        "alarm": <可选，整数；当前报警状态flag，每一位（从0开始计数）对应一种报警类型，当相应位为1时，标示该类型的报警被触发；第2位，外部报警；第3位，移动侦测；第4位，拌网；当该域不存在时表示当前没有报警>
      }
    ]
  }

成功应答： ::

  空

preview_server
++++++++++++++++

IVT可通过该方法获取用于上传摄像头预览图的URL。

参数： ::

  无

成功应答： ::

  {
    "url": <必填，字符串；上传图片所用的URL>
  }

.. note::

  获取URL后，可使用POST方法上传图片；图片的二进制数据放在body中。


GetFirmware
++++++++++++++++

IVT可通过该方法获取最新的固件的版本，及其下载URL。

参数： ::

  无

成功应答： ::

  {
    "firmware_model": <必填，字符串；最新固件的版本号>,
    "url": <必填，字符串；最新固件的下载地址>
  }

AlarmNotify
++++++++++++

IVT可通过该方法向IVC上报报警事件的开始/结束

参数： ::

  {
    "channel": <必填，整数；通道号>,
    "type": <必填，整数；报警类型：2，外部报警；3，移动侦测；4，拌网>,
    "state": <必填，字符串枚举，start/end；报警状态：start，开始；end，结束>,
    "desc": <必填，字符串；描述信息>
  }

成功应答： ::

  {
    "pic_upload_url": <必填，字符串；报警相关图片的上传URL>
  }


IVT支持的RPC方法
^^^^^^^^^^^^^^^^^^^

此处描述所有可以被调用的IVT的RPC方法。

RTMPPublish
++++++++++++

IVC可以通过该方法请求IVT publish一条RTMP流到指定URL。

参数： ::

  {
    "channel": <必填，整数>,
    "quality": <必填，字符串；可选值为：ld、sd、hd、fhd，分别代表低清，标清，高清，全高清>,
    "url": <必填，字符串；publish RTMP流的目标URL>,
    "stream_id": <必填，字符串；用来标识这条流的ID>,
    "max_bitrate": <必填，整数，单位bit/s；用来表示最大允许的码率，0表示没有限制，若相应流码率大于该值，需返回失败>
  }

成功应答（即publish成功，或该RTPM stream已经存在）： ::

  空

RTMPStopPublish
+++++++++++++++++

IVC可以通过该方法请求IVT结束正在publish的RTMP流。

参数： ::

  {
    "stream_id": <必填，字符串；RTMPPublish时给的stream_id>,
    "channel": <必填，整数>
  }

成功应答（成功结束，或该流不存在）： ::

  空

StartCloudRecord
++++++++++++++++++

IVC可以通过该方法请求IVT启动录像并上传录像至云存储。

参数： ::

  {
    "session_id": <必填，字符串，22字节；录像session ID>,
    "channel": <必填，整数>,
    "quality": <必填，字符串；可选值为：ld、sd、hd、fhd，分别代表低清，标清，高清，全高清>,
    "max_bitrate": <必填，整数，单位bit/s；用来表示最大允许的码率，0表示没有限制，若相应流码率大于该值，需返回失败>，
    "seg_duration": <必填，整数；ts文件长度，单位秒>,
    "seg_max_size": <必填，整数；每个ts文件的最大尺寸，单位byte>,
    "seg_max_count": <必填，整数；最多在内存中缓存的ts文件数量>,
    "prerecord_seconds": <必填，整数；预录秒数，单位妙>,
    "start_ts": <必填，整数；第一个TS文件的时间戳，若给定0或者负数，则IVT使用设备自身的时间>,
    "cbk_url": <必填，回调URL，最长256字节；录像模块通过请求该URL，获取录像上传地址>
  }

成功应答： ::

  空

StopCloudRecord
+++++++++++++++++

IVC可以通过该方法请求IVT结束录像。

参数： ::

  {
    "session_id": <必填，字符串；录像session ID>,
    "channel": <必填，整数>
  }

成功应答（成功结束，或该录像session不存在）： ::

  空

RebootChannel
+++++++++++++

IVC可以通过该方法请求IVT重启摄像头。

参数： ::

  {
    "channel": <必填，整数>
  }

成功应答： ::

  空

GetPTZPresetList
++++++++++++++++++++

IVC可以通过该命令获取摄像头的预置点列表

参数： ::

  {
    "channel": <必填，整数>
  }

成功应答： ::

  [
    {
      "name": <必填，字符串；预置点名称>,
      "token": <必填，字符串；预置点token>
    }
    ...
  ]

GetPTZPresetTourList
++++++++++++++++++++++++++++

IVC可以通过该命令获取摄像头的预置点巡航计划列表

参数： ::

  {
    "channel": <必填，整数>
  }

成功应答： ::

  [
    {
      "name": <必填，字符串；预置点巡航计划名称>,
      "token": <必填，字符串；预置点巡航计划token>
    }
    ...
  ]

AlarmMoveDetectConfig
++++++++++++++

IVC可以通过该方法修改摄像头的移动侦测相关的参数

参数： ::

  {
    "channel": <必填，整数>,
    "enable": <必填，bool；报警功能开关，当为false时，不应上报任何报警信息>,
    "start": <可选，整数；每天自动布防时间，从00:00开始算起的秒数，如早上3点20为12000；当不存在时为0，0点0分；start可以大与end，当start大于end时，则表示跨天布防，start是当天的时间，而end是第二天的时间>,
    "end": <可选，整数；每天自动撤防时间，从00：00开始算起的秒数；当不存在时为86400，即第二天的0点0分>,
    "sensitivity": <必填，整数；灵敏度，0-100，0为最不灵敏，100为最灵敏>,
    "delay": <必填，整数；抖动时间，单位秒，侦测到移动后，在指定的delay时间内没有再次侦测到移动，则上报报警结束>
  }

成功应答（配置成功）： ::

  空
  
AlarmRectIntrusionDetectConfig
++++++++++++++

IVC可以通过该方法修改摄像头的拌网检测相关的参数。参数中的rect描述了拌网所用长方形的四个顶点的位置，每个顶点的位置使用X和Y坐标表示；坐标的原点为画面的左上角，坐标的取值范围为0-100，因此坐标（0，0）为原点即画面的左上角，（0，100）为画面左下角，（100，100）为画面右下角。rect为可选参数，没有给定时，表示不修改长方形的位置。

参数： ::

  {
    "channel": <必填，整数>,
    "enable": <必填，bool；报警功能开关，当为false时，不应上报任何报警信息>,
    "start": <可选，整数；每天自动布防时间，从00:00开始算起的秒数，如早上3点20为12000；当不存在时为0，0点0分；start可以大与end，当start大于end时，则表示跨天布防，start是当天的时间，而end是第二天的时间>,
    "end": <可选，整数；每天自动撤防时间，从00：00开始算起的秒数；当不存在时为86400，即第二天的0点0分>,
    "sensitivity": <必填，整数；灵敏度，0-100，0为最不灵敏，100为最灵敏>,
    "delay": <必填，整数；抖动时间，单位秒，侦测到拌网后，在指定的delay时间内没有再次侦测到，则上报报警结束>
    "rect": {
      "ulx": <必填，整数；长方形左上角的x轴位置，0-100>
      "uly": <必填，整数；长方形左上角的y轴位置，0-100>
      "urx": <必填，整数；长方形右上角的x轴位置，0-100>
      "ury": <必填，整数；长方形右上角的y轴位置，0-100>
      "dlx": <必填，整数；长方形左下角的x轴位置，0-100>
      "dly": <必填，整数；长方形左下角的y轴位置，0-100>
      "drx": <必填，整数；长方形右下角的x轴位置，0-100>
      "dry": <必填，整数；长方形右下角的y轴位置，0-100>
    } <可选；拌网长方形四个顶点的位置。当该域不存在时，表示对摄像机上已有的长方形设置不做修改>
  }

成功应答（配置成功）： ::

  空  

IVT支持的event
^^^^^^^^^^^^^^^^^^^

此处描述IVT接受的event事件通知。“参数”指的是件通知数据包中的params域。

UpgradeFirmware
++++++++++++++++

IVC可以通过该方法通知IVT升级固件（推荐IVT强制升级），收到该事件后IVT可以通过GetFirmware方法来获取具体的固件信息。

参数： ::

  无

SyncTime
++++++++++++++++

IVC可以通过该方法通知IVT要求摄像头同步给定的时间。

参数： ::

  {
    "datetime": <必填，字符串；格式YY-MM-DDTHH:MM:SS，例子：2016-12-05T02:15:32>,
    "offset": <必填，整数；可接受的偏差，单位秒，若摄像机时间与上面给定的时间的偏差在offset秒之内，则摄像机无需同步时间>,
  }

CtrlPTZ
++++++++++++

IVC可以通过该方法操作摄像头的云台。

参数： ::

  {
    "channel": <必填，整数>,
    "op": <必填，字符串；云台的操作码，具体参见下表>,
    "value": <可选，整数；意义见下表>
  }

==================   =============   ===============================================
op                    操作             value
==================   =============   ===============================================
up                    上                可选，整数，速度，0-100，0最慢，100最快，默认100
down                  下                同上
left                  左                同上
right                 右                同上
upleft                左上              同上
upright               右上              同上
downleft              左下              同上
downright             右下              同上
zoomin                拉近              同上
zoomout               拉远              同上
stop                  停止              可选，整数，但数值没有意义
==================   =============   ===============================================

GotoPTZPreset
++++++++++++++++++++++

IVC可通过该方法通知摄像头移到预置点

参数： ::

  {
    "channel": <必填，整数>,
    "token": <必填，字符串；预置点token>
  }


CtrlPTZPresetTour
++++++++++++++++++++++

IVC可通过该方法通知摄像头启动或停止预置点巡航计划

参数： ::

  {
    "channel": <必填，整数>,
    "token": <必填，字符串；预置点巡航计划token，当op为stop时，该域没有意义，可以为空>,
    "op": <必填，字符串；start或者stop>
  }

CtrlPTZPatrol
++++++++++++++++++++++

IVC可通过该方法通知摄像头启动或停止巡迹

参数： ::

  {
    "channel": <必填，整数>,
    "op": <必填，字符串；start或者stop>
  }




{'fraction_non_alphanumeric': 0.2256785435049704, 'fraction_numerical': 0.019881603931643024, 'mean_word_length': 4.2298481308411215, 'pattern_counts': {'":': 168, '<': 178, '<?xml version=': 0, '>': 178, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 12, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2181467', 'n_tokens_mistral': 11544, 'n_tokens_neox': 13206, 'n_words': 759}