# Command及说明

版本记录

更新日期 版本号 更新内容 作者
2021/3/1 V2.0.0 初稿 Lux
2021/4/9 V2.0.1 修改2.38 IOTYPE_USER_IPCAM _DEVICE_SUPPORT_CLOUD _RESP = 0x800D Lux
2021/6/29 V2.0.2 增加2.42 获取设备人形侦测开关;2.43 设置设备人形侦测开关;2.44 获取设备夜视开关;2.45 设置设备夜视开关;2.46 获取设备夏令时开关;2.47 设置设备夏令时开关;修改2.7 获取设备事件列表 Lux
2021/11/16 V2.0.3 增加2.27 呼叫Client端开始传送Video Frame;2.28 呼叫Client端停止传送Video Frame;2.35 结束通话;2.36 呼叫方发出通话请求;2.37 被呼叫方响应呼叫请求;调整部分编号 Lux

一、IO Command定义

注:设备需要依据TUTK提供的IO Command文档进行功能对接。为规范公版Kalay APP IO Command的设定和使用,禁止随意更改公版IO Command已制定的参数和结构体,如因随意更改造成设备无法成功对接公版APP,TUTK无需承担任何责任。同时,为满足客制化项目的需求,将预留部分参数区段以供客制化Command的设定。

1.1 公版和客制化使用的参数区段

1.2 结构体定义规范及限制

  • 结构体的数据所占字节数应为4的倍数
  • 结构体的数据所占字节数应不超过1024字节

二、结构体及说明

2.1 呼叫设备开始传送Video Frame

IOTYPE_USER_IPCAM_START = 0x01FF;

  • 由APP发往Device;
  • APP告知Device开始发送视频数据。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;               // Camera Index
  unsigned char reserved[4];
  } SMsgAVIoctrlAVStream;

2.2 呼叫设备停止传送Video Frame

IOTYPE_USER_IPCAM_STOP = 0x02FF;

  • 由APP发往Device;
  • APP告知Device停止发送视频数据。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;            // Camera Index
  unsigned char reserved[4];
  } SMsgAVIoctrlAVStream;

2.3 呼叫设备开始传送Audio Frame

IOTYPE_USER_IPCAM_AUDIOSTART = 0x0300;

  • 由APP发往Device;
  • APP告知Device开始发送音频数据。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;          // Camera Index
  unsigned char reserved[4];
  } SMsgAVIoctrlAVStream;

2.4 呼叫设备停止传送Audio Frame

IOTYPE_USER_IPCAM_AUDIOSTOP = 0x0301;

  • 由APP发往Device;
  • APP告知Device停止发送音频数据。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;         // Camera Index
  unsigned char reserved[4];
  } SMsgAVIoctrlAVStream;

2.5 设定设备SD卡录像模式

IOTYPE_USER_IPCAM_SETRECORD_REQ = 0x0310;

  • 由APP发往Device;
  • APP告知Device要设置设备SD卡录像模式。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;               // Camera Index
  unsigned int recordType;          // 参考ENUM_RECORD_TYPE
  unsigned char reserved[4];
  }SMsgAVIoctrlSetRecordReq, SMsgAVIoctrlGetRecordResq;

  typedef enum
  {
  AVIOTC_RECORDTYPE_OFF = 0x00;
  AVIOTC_RECORDTYPE_FULLTIME = 0x01;
  AVIOTC_RECORDTYPE_ALARM = 0x02;
  AVIOTC_RECORDTYPE_MANUAL = 0x03;
  }ENUM_RECORD_TYPE;

IOTYPE_USER_IPCAM_SETRECORD_RESP = 0x0311;

  • 由Device发往APP;
  • Device告知App设置结果。
  • IOCtrl数据:
  typedef struct
  {
  int result;                            // 0 成功, otherwise: 失败。
  unsigned char reserved[4];
  }SMsgAVIoctrlSetRecordResp;

2.6 获取设备目前SD卡录像模式

IOTYPE_USER_IPCAM_GETRECORD_REQ = 0x0312;

  • 由APP发往Device;
  • APP告知Device要获取设备SD卡录像模式。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;            // Camera Index
  unsigned char reserved[4];
  }SMsgAVIoctrlGetRecordReq;

IOTYPE_USER_IPCAM_GETRECORD_RESP = 0x0313;

  • 由Device发往APP;
  • Device将录像类型配置放到IOCtrl资料并回传给App。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;                 // Camera Index
  unsigned int recordType;            // 参考ENUM_RECORD_TYPE
  unsigned char reserved[4];
  }SMsgAVIoctrlSetRecordReq, SMsgAVIoctrlGetRecordResq;

  typedef enum
  {
  AVIOTC_RECORDTYPE_OFF = 0x00;
  AVIOTC_RECORDTYPE_FULLTIME = 0x01;
  AVIOTC_RECORDTYPE_ALARM = 0x02;
  AVIOTC_RECORDTYPE_MANUAL = 0x03;
  }ENUM_RECORD_TYPE;

2.7 获取设备事件列表

IOTYPE_USER_IPCAM_LISTEVENT_REQ = 0x0318;

  • 由APP发往Device;
  • APP告知Device要获取设备事件列表。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;               // Camera Index
  STimeDay stStartTime;             // 搜寻事件的起始时间 ...
  STimeDay stEndTime;               // ... 搜寻事件的结束时间
  unsigned char event;               // 事件类型,参考ENUM_EVENTTYPE
  unsigned char status;              // 0x00: 录像文件存在,事件未读取
                                                  // 0x01: 录像文件存在,事件已读取
                                                  // 0x02: 无录像文件记录
  unsigned char reserved[2];
  }SMsgAVIoctrlListEventReq;

  typedef struct
  {
  unsigned short year;      // 年份数
  unsigned char month;    // 自一月以来的月数,范围为1到12。
  unsigned char day;        // 每月的日期,范围为1到31。
  unsigned char wday;     // 自星期日以来的天数,范围为0到6。(星期日= 0,星期一= 1,...)    
  unsigned char hour;       // 午夜之后的小时数,范围为0到23。
  unsigned char minute;  // 小时后的分钟数,范围为0到59。
  unsigned char second;  // 分钟后的秒数,范围为0到59。
  }STimeDay;

IOTYPE_USER_IPCAM_LISTEVENT_RESP = 0x0319;

  • 由Device发往APP;
  • Device将录像列表放到IOCtrl资料并回传给App。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;          // Camera Index
  unsigned int total;               // 搜索的总事件数
  unsigned char index;            // 数据包索引, 0,1,2...
                                             // avSendIOCtrl 一次最多可发送1024 个字节;
                                            //总事件可以分为x个包; x是0,1,2 ...
  unsigned char endflag;        // end flag = 1表示此数据包是最后一个数据包,否则有更多的数据包要接收。
  unsigned char count;           //此封包中有多少个事件。
  unsigned char reserved[1];
  SAvEvent stEvent[0];           //此封包中所有事件的第一个地址
  }SMsgAVIoctrlListEventResp;

  typedef struct
  {
  STimeDay stTime;
  unsigned char event;              // 参考ENUM_EVENTTYPE
  unsigned char status;             // 0x00: 录像文件存在,事件未读取
                                              // 0x01: 录像文件存在,事件已读取
                                              // 0x02: 无录像文件记录
  unsigned short duration;       // 事件持续时间(以秒为单位)
  }SAvEvent;

  typedef enum
  {
  AVIOCTRL_EVENT_ALL = 0x00// 所有事件类型
  AVIOCTRL_EVENT_MOTIONDECT = 0x01// 移动侦测启动
  AVIOCTRL_EVENT_VIDEOLOST = 0x02// 视频报警丢失
  AVIOCTRL_EVENT_IOALARM = 0x03// IO报警启动
  AVIOCTRL_EVENT_MOTIONPASS = 0x04// 移动侦测结束
  AVIOCTRL_EVENT_VIDEORESUME = 0x05// 视频检索
  AVIOCTRL_EVENT_IOALARMPASS = 0x06// IO报警结束
  AVIOCTRL_EVENT_MOVIE = 0x07;
  AVIOCTRL_EVENT_TIME_LAPSE = 0x08;
  AVIOCTRL_EVENT_EMERGENCY = 0x09;
  AVIOCTRL_EVENT_EXPT_REBOOT = 0x10// 系统异常重启
  AVIOCTRL_EVENT_SDFAULT = 0x11// SD Card记录异常
  AVIOCTRL_EVENT_FULLTIME_RECORDING = 0x12;    // 全时录像
  AVIOCTRL_EVENT_PIR = 0x13;                                           // PIR侦测
  AVIOCTRL_EVENT_RINGBELL = 0x14;                             // 门铃呼叫
  AVIOCTRL_EVENT_SOUND = 0x15;
  AVIOCTRL_EVENT_HUMANOID_DETECTION = 0x16;  // 人形侦测
  }ENUM_EVENTTYPE;

2.8 事件回播控制播放

IOTYPE_USER_IPCAM_RECORD_PLAYCONTROL_REQ = 0x031A;

  • 由APP发往Device;
  • APP告知Device要进行录像事件回放。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;                 // Camera Index
  unsigned int command;             // 播放记录指, 参考ENUM_PLAYCONTROL.
  unsigned int Param;                  // 指令参数,由用户自定义
  STimeDay stTimeDay;             // 事件列表起始时间
  unsigned char endflag;              // 0 app, 事件播放完毕; 1 web, 当此事件播放完毕时继续播下一个事件
  unsigned char downloadFlag;    // 0 回放模式, 1 下载模式
  unsigned char reserved[2];
  } SMsgAVIoctrlPlayRecordReq;

  typedef enum
  {
  AVIOCTRL_RECORD_PLAY_PAUSE = 0x00;
  AVIOCTRL_RECORD_PLAY_STOP = 0x01;
  AVIOCTRL_RECORD_PLAY_STEPFORWARD = 0x02;
  AVIOCTRL_RECORD_PLAY_STEPBACKWARD = 0x03;
  AVIOCTRL_RECORD_PLAY_FORWARD = 0x04;
  AVIOCTRL_RECORD_PLAY_BACKWARD = 0x05;
  AVIOCTRL_RECORD_PLAY_SEEKTIME = 0x06;
  AVIOCTRL_RECORD_PLAY_END = 0x07;
  AVIOCTRL_RECORD_PLAY_START = 0x10;
  AVIOCTRL_RECORD_PLAY_NEXT = 0xf0;
  AVIOCTRL_RECORD_PLAY_IFRAME = 0xf1
  }ENUM_PLAYCONTROL;

IOTYPE_USER_IPCAM_RECORD_PLAYCONTROL_RESP = 0x031B;

  • 由Device发往APP;
  • Device将录像回放结果放到IOCtrl资料并回传给App.(APP收固定字节长度)
  • IOCtrl数据:
  typedef struct
  {
  unsigned int command;          // 播放记录指令,参考ENUM_PLAYCONTROL
  unsigned int result;                //取决于指令定义
                                               // 当使用AVIOCTRL_RECORD_PLAY_START:
                                               // result>=0  设备未使用实际通道进行播放
                                               // result <0  异常错误
                                               // result= -1 回放异常
                                               // result= -2 超出最大可连接的Client数
  unsigned int size;                  //  事件回放文件大小
  unsigned char respond; 
  unsigned char reserved[3];
  } SMsgAVIoctrlPlayRecordResp;

2.9 设置设备解析度

IOTYPE_USER_IPCAM_SETSTREAMCTRL_REQ = 0x0320;

  • 由APP发往Device;
  • APP告知Device要设置设备的解析度。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;          // Camera Index
  unsigned char quality;         // 参考ENUM_QUALITY_LEVEL
  unsigned char reserved[3];
  } SMsgAVIoctrlSetStreamCtrlReq;

  typedef enum
  {
  AVIOCTRL_QUALITY_UNKNOWN = 0x00,
  AVIOCTRL_QUALITY_MAX = 0x01;
  AVIOCTRL_QUALITY_HIGH = 0x02;
  AVIOCTRL_QUALITY_MIDDLE = 0x03;
  AVIOCTRL_QUALITY_LOW = 0x04;
  AVIOCTRL_QUALITY_MIN = 0x05;
  }ENUM_QUALITY_LEVEL;

IOTYPE_USER_IPCAM_SETSTREAMCTRL_RESP = 0x0321;

  • 由Device发往APP;
  • Device告知APP解析度设置结果。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int result;         // 0: 成功; otherwise: 失败
  unsigned char reserved[4];
  } SMsgAVIoctrlGetStreamCtrlResq;

2.10 获取设备目前解析度

IOTYPE_USER_IPCAM_GETSTREAMCTRL_REQ = 0x0322;

  • 由APP发往Device;
  • APP告知Device要获取设备目前的解析度。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;         // Camera Index
  unsigned char reserved[4];
  }SMsgAVIoctrlGetStreamCtrlReq;

IOTYPE_USER_IPCAM_GETSTREAMCTRL_RESP = 0x0323;

  • 由Device发往APP;
  • Device将设备解析度配置放到IOCtrl资料并回传给App。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int  channel;        // Camera Index
  unsigned char quality;        //参考ENUM_QUALITY_LEVEL
  unsigned char reserved[3];
  } SMsgAVIoctrlSetStreamCtrlReq, SMsgAVIoctrlGetStreamCtrlResp;

2.11 设置设备位移侦测之灵敏度

IOTYPE_USER_IPCAM_SETMOTIONDETECT_REQ = 0x0324;

  • 由APP发往Device;
  • APP告知Device要设置设备位移侦测的灵敏度。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;                   // Camera Index
  unsigned int sensitivity;               // 0 (禁用) ~ 100(最大):
                                                    // Index in App. Sensitivity value
                                                    // 0              0(关闭)
                                                    // 1              25(低)
                                                    // 2              50(中)
                                                   // 3              75(高)
                                                   // 4              100(最高)
  }SMsgAVIoctrlSetMotionDetectReq, SMsgAVIoctrlGetMotionDetectResp;

IOTYPE_USER_IPCAM_SETMOTIONDETECT_RESP = 0x0325;

  • 由Device发往APP;
  • Device告知APP位移侦测之灵敏度设置结果。
  • IOCtrl数据:
  typedef struct
  {
  int result;                     // 0: 成功; otherwise: 失败
  unsigned char reserved[4];
  }SMsgAVIoctrlSetMotionDetectResp;

2.12 获取设备目前位移侦测之灵敏度

IOTYPE_USER_IPCAM_GETMOTIONDETECT_REQ = 0x0326;

  • 由APP发往Device;
  • APP告知Device要获取设备位移侦测的灵敏度。
  • IOCtrl数据:
  typedef struct
  {
  unsigned  int  channel;             // Camera Index
  unsigned char reserved[4];
  } SMsgAVIoctrlGetMotionDetectReq;

IOTYPE_USER_IPCAM_GETMOTIONDETECT_RESP = 0x0327;

  • 由Device发往APP;
  • Device将设备移动侦测灵敏度配置放到IOCtrl资料并回传给App。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;                // Camera Index
  unsigned int sensitivity;            // 0(禁用) ~ 100(最大):
                                                  // index sensitivity value
                                                  // 0              0(关闭)
                                                  // 1              25(低)
                                                  // 2              50(中)
                                                  // 3              75(高)
                                                  // 4              100(最高)
  }SMsgAVIoctrlSetMotionDetectReq, SMsgAVIoctrlGetMotionDetectResp;

2.13 获取目前设备通道数

IOTYPE_USER_IPCAM_GETSUPPORTSTREAM_REQ = 0x0328;

  • 由APP发往Device;
  • APP告知Device要获取目前设备频道数。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char reserved[4];
  }SMsgAVIoctrlGetSupportStreamReq;

IOTYPE_USER_IPCAM_GETSUPPORTSTREAM_RESP = 0x0329;

  • 由Device发往APP;
  • Device将设备频道数配置放到IOCtrl资料并回传给App。
  • IOCtrl数据:
  typedef struct
  {
  unsigned short index;           // 设备使用的stream index
  unsigned short channel;       // AVAPIs使用的channel index
  char reserved[4];
  }SStreamDef;

  typedef struct
  {
  unsigned int number;          // 可支持的 stream数量
  SStreamDef streams[0];
  }SMsgAVIoctrlGetSupportStreamResp;

2.14 获取设备音讯格式

App传送声音用。

IOTYPE_USER_IPCAM_GETAUDIOOUTFORMAT_REQ = 0x032A;

  • 由APP发往Device;
  • APP告知Device要获取设备音频格式。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;       // camera index
  char reserved[4];
  }SMsgAVIoctrlGetAudioOutFormatReq;

IOTYPE_USER_IPCAM_GETAUDIOOUTFORMAT_RESP = 0x032B;

  • 由Device发往APP;
  • Device将设备音频格式放到IOCtrl资料并回传给App。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;          // camera index
  int format;                          // 参考ENUM_CODECID in AVFRAMEINFO.h
  char sample_rate;
  char bitdata;
  char channels;                    // 可支持的通道数量
  char avservchannel;           // 0  子通道;1 主通道;otherwise 子通道(默认0)
  }SMsgAVIoctrlGetAudioOutFormatResp;

  Sample_Rate:
  AUDIO_SAMPLE_8K = 0;
  AUDIO_SAMPLE_11K = 1;
  AUDIO_SAMPLE_12K = 2;
  AUDIO_SAMPLE_16K = 3;
  AUDIO_SAMPLE_22K = 4;
  AUDIO_SAMPLE_24K = 5;
  AUDIO_SAMPLE_32K = 6;
  AUDIO_SAMPLE_44K = 7;
  AUDIO_SAMPLE_48K = 8;

  CodecId:
  MEDIA_CODEC_UNKNOWN = 0x00;
  MEDIA_CODEC_VIDEO_MPEG4 = 0x4C;
  MEDIA_CODEC_VIDEO_H263 = 0x4D;
  MEDIA_CODEC_VIDEO_H264 = 0x4E;
  MEDIA_CODEC_VIDEO_MJPEG = 0x4F;
  MEDIA_CODEC_VIDEO_HEVC = 0x50;
  MEDIA_CODEC_AUDIO_AAC_RAW = 0x86;
  MEDIA_CODEC_AUDIO_AAC_ADTS = 0x87;
  MEDIA_CODEC_AUDIO_AAC_LATM = 0x88;
  MEDIA_CODEC_AUDIO_G711U = 0x89;        //g711 u-law
  MEDIA_CODEC_AUDIO_G711A = 0x8A;       //g711 a-law
  MEDIA_CODEC_AUDIO_ADPCM = 0x8B;
  MEDIA_CODEC_AUDIO_PCM = 0x8C;
  MEDIA_CODEC_AUDIO_SPEEX = 0x8D;
  MEDIA_CODEC_AUDIO_MP3 = 0x8E;
  MEDIA_CODEC_AUDIO_G726 = 0x8F;

  Bitdata (0x0 ~ 0xF):
  AUDIO_DATABITS_8 = 0;
  AUDIO_DATABITS_16 = 1

2.15 获取设备信息

建议改为使用0x8015/0x8016

IOTYPE_USER_IPCAM_DEVINFO_REQ = 0x0330;

  • 由APP发往Device;
  • APP告知Device要获取设备资讯。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char reserved[4];
  }SMsgAVIoctrlDeviceInfoReq;

IOTYPE_USER_IPCAM_DEVINFO_RESP = 0x0331;

  • 由Device发往APP;
  • Device将设备资讯放到IOCtrl资料并回传给App。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char model[16];
  unsigned char vendor[16];
  unsigned int version;
  unsigned int channel;                //保留
  unsigned int total;                     // MBytes, sdcard的全部空间
  unsigned int free;                      // MBytes , sdcard的可用空间
  unsigned int company;              //参考OTA 上的公司名
  unsigned char reserved[4];
  }SMsgAVIoctrlDeviceInfoResp;

2.16 变更设备密码

IOTYPE_USER_IPCAM_SETPASSWORD_REQ = 0x0332;

  • 由APP发往Device;
  • APP告知Device要变更设备密码。
  • IOCtrl数据:
  typedef struct
  {
  char oldpasswd[32];        // 旧密码
  char newpasswd[32];       // 新密码
  }SMsgAVIoctrlSetPasswdReq;

IOTYPE_USER_IPCAM_SETPASSWORD_RESP = 0x0333;

  • 由Device发往APP;
  • Device告知APP变更设备密码的结果。
  • IOCtrl数据:
  typedef struct
  {
  int result;              //0x00 密码设置成功, 否则失败
  unsigned char reserved[4];
  }SMsgAVIoctrlSetPasswdResp;

2.17 事件回放进度控制

IOTYPE_USER_IPCAM_GET_PLAYBACK_REQ = 0x033A;

  • 由App发往Device。
  • App告知Device获取事件时长信息。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;                 // Camera Index
  STimeDay stTimeDay;           //  事件的时间长度
  unsigned char reserved[4];
  }SMsgAVIoctrlGetPlaybackReq;

IOTYPE_USER_IPCAM_GET_PLAYBACK_RESP = 0x033B;

注:视频流的时间戳必须在回传的时间段内, 时间戳为UTC格式。

  • 由Device发往App;
  • Device时长信息回传给App。
  • IOCtrl数据:
  typedef struct
  {
  unsigned  int videoTime;             // 事件视频时间(以秒为单位)
  unsigned  long size;                     // 事件大小(以字节为单位)
  unsigned char reserved[4];
  }SMsgAVIoctrlGetPlaybackResp;

IOTYPE_USER_IPCAM_SET_RECORD_PROGRESS_REQ = 0x033C;

注: App不会停掉视频流(不会发送0x2ff)。

  • 由App 发往Device。
  • App告知Device从指定时间播放。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;                    // Camera Index
  STimeDay stTimeDay;                   // 事件的时间长度
  unsigned  int progressTime;          // 事件进度时间(以秒为单位)
  unsigned char reserved[4];
  }SMsgAVIoctrlSetRecordProgessReq;

IOTYPE_USER_IPCAM_SET_RECORD_PROGRESS_RESP = 0x033D;

  • 由Device发往App。
  • Device将设备进度结果回传给App。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char result;              //0 表示成功
  unsigned char reserved[3];
  }SMsgAVIoctrlSeRecordProgressResp;

2.18 获取设备周围Wifi列表

IOTYPE_USER_IPCAM_LISTWIFIAP_REQ = 0x0340;

  • 由APP发往Device;
  • APP告知Device要获取设备周围的wifi列表。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char reserved[4];
  }SMsgAVIoctrlListWifiApReq;

IOTYPE_USER_IPCAM_LISTWIFIAP_RESP = 0x0341;

  • 由Device发往APP;
  • Device将设备周围的wifi列表放到IOCtrl资料并回传给App。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int number;                      // 最大: 1024/36=28
  SWifiAp stWifiAp[0];                       //  存储所有WiFi信息的起始地
                                                       // 使用(SWifiAp)字节的大小来获取WiFi数据。
  }SMsgAVIoctrlListWifiApResp;

  typedef struct
  {
  char ssid[32];         // WiFi SSID 
  char mode;            // 参考 ENUM_AP_MODE
  char enctype;        // 加密为WiFi,请参考ENUM_AP_ENCTYPE。
  char signal;          // 信号强度,范围为0%至100%。
  char status;          // 0 : 无效的ssid或已断开连接
                             // 1 : 连接默认网关
                             // 2 : 密码不匹配
                             // 3 : 弱信号且已连接
                             // 4 : 所选密码匹配且已断开连接或已连接,但不是默认网关
  }SWifiAp;

  typedef enum
  {
  AVIOTC_WIFIAPMODE_NULL = 0x00;
  AVIOTC_WIFIAPMODE_MANAGED = 0x01;
  AVIOTC_WIFIAPMODE_ADHOC = 0x02;
  }ENUM_AP_MODE;

  typedef enum
  {
  AVIOTC_WIFIAPENC_INVALID = 0x00;
  AVIOTC_WIFIAPENC_NONE = 0x01;
  AVIOTC_WIFIAPENC_WEP = 0x02// WEP,无密码
  AVIOTC_WIFIAPENC_WPA_TKIP = 0x03;
  AVIOTC_WIFIAPENC_WPA_AES = 0x04;
  AVIOTC_WIFIAPENC_WPA2_TKIP = 0x05;
  AVIOTC_WIFIAPENC_WPA2_AES = 0x06;
  AVIOTC_WIFIAPENC_WPA_PSK_TKIP = 0x07;
  AVIOTC_WIFIAPENC_WPA_PSK_AES = 0x08;
  AVIOTC_WIFIAPENC_WPA2_PSK_TKIP = 0x09;
  AVIOTC_WIFIAPENC_WPA2_PSK_AES = 0x0A;
  }ENUM_AP_ENCTYPE;

2.19 设定设备的Wifi网络

IOTYPE_USER_IPCAM_SETWIFI_REQ = 0x0342;

  • 由APP发往Device;
  • APP告知Device要设置设备的wifi。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char ssid[32];                  // 连接的WiFi SSID
  unsigned char password[32];         // WiFi SSID 密码
  unsigned char mode;                    // 参考ENUM_AP_MODE
  unsigned char enctype;                 // 参考ENUM_AP_ENCTYPE
  unsigned char reserved[10];
  }SMsgAVIoctrlSetWifiReq;

IOTYPE_USER_IPCAM_SETWIFI_RESP = 0x0343;

  • 由Device发往APP;
  • Device告知APP设置设备wifi的结果。
  • IOCtrl数据:
  typedef struct
  {
  int result;                      //如果已连接WiFi,则返回0,否则返回1。
  unsigned char reserved[4];
  }SMsgAVIoctrlSetWifiResp;

2.20 获取设备目前所设置的WiFi

IOTYPE_USER_IPCAM_GETWIFI_REQ = 0x0344;

  • 由APP发往Device;
  • APP告知Device要获取设备目前所设置的wifi。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char reserved[4];
  }SMsgAVIoctrlGetWifiReq;

IOTYPE_USER_IPCAM_GETWIFI_RESP = 0x0345;

  • 由Device发往APP;
  • Device将设备当前wifi配置放到IOCtrl资料并回传给App。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char ssid[32];                 // WiFi ssid
  unsigned char password[32];        // WiFi密码(如果不为空)
  unsigned char mode;                     // 参考 ENUM_AP_MODE
  unsigned char enctype;                 // 参考ENUM_AP_ENCTYPE
  unsigned char signal;                    // 信号强度 0--100%
  unsigned char status;                    // 参考SWifiAp的 "status"
  }SMsgAVIoctrlGetWifiResp;

2.21 设定设备目前所设置的WiFi

该command支持64bit密码,同IOTYPE_USER_IPCAM_SETWIFI_REQ = 0x0342一起发送。

IOTYPE_USER_IPCAM_SETWIFI_REQ2 = 0x0346;

  • 由APP发往Device;
  • APP告知Device要设定设备目前所设置的wifi。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char ssid[32];                  // 连接的WiFi SSID
  unsigned char password[64];         // WiFi SSID密码
  unsigned char mode;                     // 参考ENUM_AP_MODE
  unsigned char enctype;                 // 参考ENUM_AP_ENCTYPE
  unsigned char reserved[10];
  }SMsgAVIoctrlSetWifiReq2;

IOTYPE_USER_IPCAM_GETWIFI_RESP2 = 0x0347;

  • 由Device发往APP;
  • Device将设备当前wifi配置放到IOCtrl资料并回传给App。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char ssid[32];                   // WiFi ssid
  unsigned char password[64];          // WiFi密码(如果不为空)
  unsigned char mode;                      // 参考 ENUM_AP_MODE
  unsigned char enctype;                  // 参考ENUM_AP_ENCTYPE
  unsigned char signal;                     // 信号强度 0--100%
  unsigned char status;                     // 参考SWifiAp的 "status"
  }SMsgAVIoctrlGetWifiResp2;

2.22 呼叫设备开始接收Audio Frame

IOTYPE_USER_IPCAM_SPEAKERSTART = 0x0350;

  • 由APP发往Device;
  • APP告知Device开始接收音频数据。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;             // Camera Index
  unsigned char reserved[4];
  } SMsgAVIoctrlAVStream;

2.23 呼叫设备停止接收Audio Frame

IOTYPE_USER_IPCAM_SPEAKERSTOP = 0x0351;

  • 由APP发往Device;
  • APP告知Device停止接收音频数据。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;          // Camera Index
  unsigned char reserved[4];
  } SMsgAVIoctrlAVStream;

2.24 设置画面镜像/翻转状态

IOTYPE_USER_IPCAM_SET_VIDEOMODE_REQ = 0x0370;

  • 由APP发往Device;
  • APP告知Device进行镜像/翻转设置。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;            // Camera Index
  unsigned char mode;             // 参考 ENUM_VIDEO_MODE
  unsigned char reserved[3];
  }SMsgAVIoctrlSetVideoModeReq;

  typedef enum
  {
  AVIOCTRL_VIDEOMODE_NORMAL = 0x00;
  AVIOCTRL_VIDEOMODE_FLIP = 0x01// 垂直翻转
  AVIOCTRL_VIDEOMODE_MIRROR = 0x02// 水平翻转
  AVIOCTRL_VIDEOMODE_FLIP_MIRROR = 0x03// 垂直和水平翻转
  }ENUM_VIDEO_MODE;

IOTYPE_USER_IPCAM_SET_VIDEOMODE_RESP = 0x0371;

  • 由Device发往APP;
  • Device告知APP设置结果。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;             // Camera Index
  unsigned char result;             // 0: 成功; otherwise:失败
  unsigned char reserved[3];
  }SMsgAVIoctrlSetVideoModeResp;

2.25 获取画面镜像/翻转设置状态

IOTYPE_USER_IPCAM_GET_VIDEOMODE_REQ = 0x0372;

  • 由APP发往Device;
  • APP告知Device获取镜像/翻转设置状态。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;            // Camera Index
  unsigned char reserved[4];
  }SMsgAVIoctrlGetVideoModeReq;

IOTYPE_USER_IPCAM_GET_VIDEOMODE_RESP = 0x0373;

  • 由Device发往APP;
  • Device告知APP目前画面镜像/翻转的设置状态。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int  channel;          // Camera Index
  unsigned char mode;             // 参考 ENUM_VIDEO_MODE
  unsigned char reserved[3];
  }SMsgAVIoctrlGetVideoModeResp;

  typedef enum
  {
  AVIOCTRL_VIDEOMODE_NORMAL = 0x00,
  AVIOCTRL_VIDEOMODE_FLIP = 0x01,                     // 垂直翻转
  AVIOCTRL_VIDEOMODE_MIRROR = 0x02,               // 水平翻转
  AVIOCTRL_VIDEOMODE_FLIP_MIRROR = 0x03,       // 垂直和水平翻转
  }ENUM_VIDEO_MODE;

2.26 格式化SD卡

IOTYPE_USER_IPCAM_FORMATEXTSTORAGE_REQ = 0x0380;

  • 由APP发往Device;
  • APP告知Device执行格式化SD卡操作。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int storage;           // Storage index(例如sdcard插槽= 0,内部闪存= 1,...)
  unsigned char reserved[4];
  }SMsgAVIoctrlFormatExtStorageReq;

IOTYPE_USER_IPCAM_FORMATEXTSTORAGE_RESP = 0x0381;

  • 由Device发往APP;
  • Device告知APP已格式化SD卡结果。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int  storage;                // Storage index
  char result;                               // 0: 成功;
                                                  // -1:不支持格式化指令
                                                  // otherwise: 失败
  unsigned char reserved[3];
  }SMsgAVIoctrlFormatExtStorageResp;

2.27 呼叫Client端开始传送Video Frame

主要应用于双向视频通话场景。

IOTYPE_USER_IPCAM_START_CLIENT = 0x03FF;

  • 由APP发往Client;
  • APP告知Client开始发送视频数据。
  • IOCtrl数据:
typedef struct
{
unsigned int channel;         // Camera Index
unsigned char reserved[4];
} SMsgAVIoctrlAVStream;

2.28 呼叫Client端停止传送Video Frame

主要应用于双向视频通话场景。

IOTYPE_USER_IPCAM_STOP_CLIENT = 0x04FF;

  • 由APP发往Client;
  • APP告知Client停止发送视频数据。
  • IOCtrl数据:
typedef struct
{
unsigned int channel;          // Camera Index
unsigned char reserved[4];
} SMsgAVIoctrlAVStream;

2.29 获取NVR设备Channel接口数量

IOTYPE_USER_IPCAM_GET_NVR_CHANNEL_NUMBER_REQ = 0x5A4;

  • 由APP发往Device;
  • APP告知Device获取设备Channel的接口数量。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char reserved[4];
  }SMsgAVIoctrlGetNVRChannelNumberReq;

IOTYPE_USER_IPCAM_GET_NVR_CHANNEL_NUMBER_RESP = 0x5A5;

  • 由Device发往APP;
  • Device告知APP目前设备Channel的接口数量。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int number;           // 设备的通道数量
  unsigned char reserved[4];
  }SMsgAVIoctrlGetNVRChannelNumberResp;

2.30 获取通道名称

IOTYPE_USER_IPCAM_GET_CHANNEL_NAME_REQ = 0x5B0;

  • 由APP发往Device;
  • APP告知Device获取设备的通道名称。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char reserved[4];
  }SMsgAVIoctrlGetChannelNameReq;

IOTYPE_USER_IPCAM_GET_CHANNEL_NAME_RESP = 0x5B1;

  • 由Device发往APP;
  • Device告知APP设备的通道名称。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char count;                        // 通道数量
  unsigned char reserved[3];
  SChannelInfo sChannelInfo[0];         //  第一个channelInfo和channelInfo的总数
  }SMsgAVIoctrlGetChannelNameResp;

  typedef struct
  {
  unsigned int channel;         //camera index
  unsigned char name[24];    //通道名称
  } SChannelInfo;

2.31 设置通道名称

IOTYPE_USER_IPCAM_SET_CHANNEL_NAME_REQ = 0x5B2;

  • 由APP发往Device;
  • APP告知Device要设置设备的通道名称。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char count;                        //  SChannelInfos的数量
  unsigned char reserved[3];
  SChannelInfo sChannelInfo[0];          //  第一个channelInfo和channelInfo的总数
  }SMsgAVIoctrlSetChannelNameReq;

IOTYPE_USER_IPCAM_SET_CHANNEL_NAME_RESP = 0x5B3;

  • 由Device发往APP;
  • Device告知APP设置设备通道名称的结果。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char result;            // 0 成功, 其他失败
  unsigned char reserved[3];
  }SMsgAVIoctrlSetResetResp;

2.32 门铃呼叫

主要应用于可视门铃通话场景。

IOTYPE_XM_CALL_REQ = 0x700;

  • 由Device发往APP;
  • Device告知APP有用户呼叫。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char index;           //门索引号,0:门1; 1:门2
  STimeDay stTime;              //事件时间
  unsigned char reserved[3];
  } SMsgAVIoctrlCallReq

IOTYPE_XM_CALL_RESP = 0x701;

  • 由APP发往Device;
  • APP告知Device是否进行接听。
  • IOCtrl数据:
  typedef struct
  {
  unsigned  char  index;            //门索引号,0:门1;1: 门2
  int nAnswered;                       //0:挂断;1:接听
  unsigned char reserved[3];
  }SMsgAVIoctrlCallResp;

IOTYPE_XM_CALL_IND = 0x702;

  • 由Device发往APP;
  • Device告知APP是否有其他用户接听。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char index;             //门索引号,0:门1;1:门2
  unsigned char type;              //类型,0:有用户呼叫;1:有其他用户应答
  STimeDay stTime;                //事件时间
  unsigned char reserved[3];
  }SMsgAVIoctrlCallInd;

2.33 发送设备名称给设备

IOTYPE_USER_IPCAM_PUSH_DEVICENAME_REQ= 0x0736;

  • 由APP发往Device;
  • APP告知Device要当前设备名称。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel ;            //camera index
  char devicename[150];          //当前设备名称
  }SMsgAVIoctrlPushDeviceNameReq;

IOTYPE_USER_IPCAM_PUSH_DEVICENAME_RESP= 0x0737;

  • 由Device发往APP;
  • Device告知APP要当前设备名称更新结果。
  • IOCtrl数据:
  typedef struct
  {
  int res ;              //0:成功,其他失败
  char reserved[4];
  }SMsgAVIoctrlPushDeviceNameResp;

2.34 同步手机时间给设备

IOTYPE_USER_IPCAM_SET_TIME_SYNC_REQ = 0x0816;

  • 由APP发往Device;
  • APP告知Device进行同步手机时间。
  • IOCtrl数据:
  typedef struct
  {
  unsigned short year;
  unsigned char month;
  unsigned char day;
  unsigned char hour;
  unsigned char minute;
  unsigned char second;
  unsigned char nIsSupportSync;            // 1 支持; 0 不支持
  int nGMTOffset;                                 //  GMT之间的偏移量(以秒为单位)
  } SMsgAVIoctrlTimeSyncReq;

IOTYPE_USER_IPCAM_SET_TIME_SYNC_RESP = 0x0817;

  • 由Device发往APP;
  • Device告知APP同步时间的结果。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int result;                  //如果成功则返回0,否则失败
  unsigned char reserved[4];
  } SMsgAVIoctrlTimeSyncResp;

2.35 结束通话

主要应用于双向视频通话场景。

IOTYPE_USER_IPCAM_CALL_END = 0x0900;

  • 由APP发往另一端;
  • APP告知对方结束此通话。
  • IOCtrl数据:
typedef struct
{
unsigned char myID[6];        // 我的 ID
unsigned char reserved[2];
}SMsgAVIoctrlCallEnd;

2.36 呼叫方发出通话请求

主要应用于双向视频通话场景。

IOTYPE_USER_IPCAM_CALL_REQ = 0x0901;

  • 由呼叫方发往被呼叫方;
  • 呼叫方向被呼叫方发起通话请求。
  • IOCtrl数据:
typedef struct
{
unsigned char myID[6];         // 我的 ID
unsigned char myUID[20];     // 我的 UID
unsigned char callType;        // 0,单向视频; 1, 双向视频
unsigned char beInvited;      // 0 表示邀请;1 表示被邀请
 unsigned char infoCount;    // 其他参与者的数量
unsigned char reserved[3];
unsigned AccountInfo info    // 其他参与者的信息
}SMsgAVIoctrlCallReq;

typedef struct{
unsigned char UID[20];            // UID
unsigned char myID[6];           // ID
unsigned char reserved[2];
}AccountInfo

2.37 被呼叫方响应呼叫请求

主要应用于双向视频通话场景。

IOTYPE_USER_IPCAM_CALL_RESP = 0x0902;

  • 由被呼叫方发往呼叫方;
  • 被呼叫方响应呼叫方发起的通话请求。
  • IOCtrl数据:
typedef struct
{
unsigned char answer;       // 0, 拒绝; 1 接听
unsigned char myID[6];     //myID
unsigned char reserved[1];
}SMsgAVIoctrlCallResp;

2.38 云台控制

IOTYPE_USER_IPCAM_PTZ_COMMAND = 0x1001;

  • 由APP发往Device;
  • APP告知Device进行云台控制。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char control;          // 云台控制指令,参考 ENUM_PTZCMD.
  unsigned char speed;            // 云台转动的速度
  unsigned char point;            // app未使用
  unsigned char limit;            // app未使用
  unsigned char aux;              // app未使用
  unsigned char channel;       // camera index
  unsigned char reserve[2];
  } SMsgAVIoctrlPtzCmd;

  /* AVIOCTRL PTZ Command 值 */

  typedef enum
  {
  AVIOCTRL_PTZ_STOP = 0;
  AVIOCTRL_PTZ_UP = 1;
  AVIOCTRL_PTZ_DOWN = 2;
  AVIOCTRL_PTZ_LEFT = 3;
  AVIOCTRL_PTZ_LEFT_UP = 4;
  AVIOCTRL_PTZ_LEFT_DOWN = 5;
  AVIOCTRL_PTZ_RIGHT = 6;
  AVIOCTRL_PTZ_RIGHT_UP = 7;
  AVIOCTRL_PTZ_RIGHT_DOWN = 8;
  AVIOCTRL_PTZ_AUTO = 9;
  AVIOCTRL_PTZ_SET_POINT = 10;
  AVIOCTRL_PTZ_CLEAR_POINT = 11;
  AVIOCTRL_PTZ_GOTO_POINT  = 12;
  AVIOCTRL_PTZ_SET_MODE_START = 13;
  AVIOCTRL_PTZ_SET_MODE_STOP = 14;
  AVIOCTRL_PTZ_MODE_RUN = 15;
  AVIOCTRL_PTZ_MENU_OPEN = 16;
  AVIOCTRL_PTZ_MENU_EXIT = 17;
  AVIOCTRL_PTZ_MENU_ENTER = 18;
  AVIOCTRL_PTZ_FLIP = 19;
  AVIOCTRL_PTZ_START = 20;
  AVIOCTRL_LENS_APERTURE_OPEN = 21;
  AVIOCTRL_LENS_APERTURE_CLOSE = 22;
  AVIOCTRL_LENS_ZOOM_IN = 23;
  AVIOCTRL_LENS_ZOOM_OUT = 24;
  AVIOCTRL_LENS_FOCAL_NEAR = 25;
  AVIOCTRL_LENS_FOCAL_FAR = 26;
  AVIOCTRL_AUTO_PAN_SPEED = 27;
  AVIOCTRL_AUTO_PAN_LIMIT = 28;
  AVIOCTRL_AUTO_PAN_START = 29;
  AVIOCTRL_PATTERN_START = 30;
  AVIOCTRL_PATTERN_STOP = 31;
  AVIOCTRL_PATTERN_RUN  = 32;
  AVIOCTRL_SET_AUX = 33;
  AVIOCTRL_CLEAR_AUX = 34;
  AVIOCTRL_MOTOR_RESET_POSITION = 35;
  }ENUM_PTZCMD;

2.39 APP获取第一张I帧图片

IOTYPE_USER_IPCAM_RECEIVE_FIRST_IFRAME = 0x1002;

  • 由APP发往Device;
  • APP告知Device接收到第一张I帧图片。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int channel;        // camera index
  char reserved[4];
  }SMsgAVIoctrlReceiveFirstIFrame;

2.40 设备进行OTA升级

IOTYPE_USER_IPCAM_OTA_REQ = 0x8001;

  • 由APP发往Device;
  • APP告知Device开始进行OTA升级。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char file_checksum[32];      // MD5校验码
  unsigned char url[256];                      // 下载固件url链接
  unsigned int file_size;                        // 固件包大小
  unsigned char reserved[4];
  }SMsgAVIoctrlOTAReq;

IOTYPE_USER_IPCAM_OTA_RESP = 0x8002;

  • 由Device发往App
  • Device告知App升级OTA结果。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int progress;          //  下载固件进度
  unsigned int endflag;         //1:下载完成;0:下载中
  unsigned char reserved[8];
  }SMsgAVIoctrlOTAResp;

2.41 获取设备信息

注:新设备需对接OTA功能时建议使用,与旧cmd IOTYPE_USER_IPCAM_DEVINFO_REQ = 0x0330同作用。

IOTYPE_USER_IPCAM_DEVICE_INFO_REQ = 0x8015;

  • 由App发往Device
  • App告知Device要获取设备资讯。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char reserved[8];
  } SMsgAVIoctrlDeviceInfoReq;

IOTYPE_USER_IPCAM_DEVICE_INFO_RESP = 0x8016;

  • 由Device发往App
  • Device告知App设备资讯。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char model[32];           // 产品型号
  unsigned char product[32];        // 产品名
  unsigned char vender[32];         // 制造商(需与KOTA服务器上的厂商一致)
  unsigned int version;                 // 当前版本号
  unsigned int free;                      // SD卡剩余空间
  unsigned int total;                     // SD卡总空间
  unsigned char region;                //获取设备所在位置,0:中国大陆区;1:非中国大陆区
  unsigned char reserved[3];
  } SMsgAVIoctrlDeviceInfoResp;

注:以上参数用于拼接向KOTA服务器获取升级文件的下载地址请求,故需与在KOTA服务器上创建的vender,product,model等信息保持一致,且注意区分设备所在区域。

2.42 获取设备是否支持OTA升级

IOTYPE_USER_IPCAM _DEVICE_SUPPORT_OTA_REQ = 0x800A;

  • 由App发往Device
  • App告知Device要获取设备是否支持OTA。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char reserved[8];
  }SMsgAVIoctrlDeviceSupportOTAReq;

IOTYPE_USER_IPCAM _DEVICE_SUPPORT_OTA _RESP = 0x800B;

  • 由Device发往App
  • Device告知App设备是否支持OTA。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char isSupport;        //  0 不支持;1 支持
  unsigned char reserved[4];
  } SMsgAVIoctrlDeviceSupportOTAResp;

2.43 获取设备是否支持云存储

IOTYPE_USER_IPCAM _DEVICE_SUPPORT_CLOUD_REQ = 0x800C;

  • 由App发往Device
  • App告知Device查询是否支持云存储。
  • IOCtrl数据:
  typedef struct
  {
  unsigned char reserved[8];
  }SMsgAVIoctrlDeviceSupportCloudReq;

IOTYPE_USER_IPCAM _DEVICE_SUPPORT_CLOUD _RESP = 0x800D;

  • 由Device发往App
  • Device告知App设备是否支持云存储结果。
  • IOCtrl数据:
  typedef struct
  {
  unsigned int result;           // 0 不支持;1 支持
  unsigned char reserved[4];
  } SMsgAVIoctrlDeviceSupportCloudResp;

2.44 设置设备云存储录像状态

IOTYPE_USER_IPCAM_DEVICE_SET_CLOUD_REQ = 0x8010;

  • 由App发往Device
  • App告知Device开启或关闭云存储录像功能。
  • IOCtrl数据:
typedef struct
{
unsigned int channel;       // camera index
unsigned int isOn;           // 1 开启, 0 关闭
}SMsgAVIoctrlSetCloudReq;

IOTYPE_USER_IPCAM_DEVICE_SET_CLOUD_RESP = 0x8011;

  • 由Device发往App
  • Device告知App开启或关闭云存储录像结果。
  • IOCtrl数据:
typedef struct
{
unsigned int channel;       // camera index
unsigned int result;          // 0 成功, 1 失败
}SMsgAVIoctrlSetCloudResp;

2.45 获取设备云存储录像状态

IOTYPE_USER_IPCAM_DEVICE_GET_CLOUD_REQ = 0x8012;

  • 由App发往Device
  • App获取Device云存储录像状态。
  • IOCtrl数据:
typedef struct
{
unsigned int channel;         // camera index
unsigned char reserved[4];
}SMsgAVIoctrlGetCloudReq;

IOTYPE_USER_IPCAM_DEVICE_GET_CLOUD_RESP = 0x8013;

  • 由Device发往App
  • Device告知App云存储录像状态。
  • IOCtrl数据:
typedef struct
{
unsigned int channel;       // camera index
unsigned int isOn;            // 1 开启, 0 关闭
}SMsgAVIoctrlGetCloudResp;

2.46 获取有SD卡事件的日期

IOTYPE_USER_IPCAM_GET_EVENT_DATE_REQ = 0x9000;

  • 由App发往Device
  • App告知Device获取有SD卡事件的日期。
  • IOCtrl数据:
typedef struct
{
unsigned int channel;          //Camera Index
unsigned int eventType;      //查询的事件类型,0:全部,1:移动侦测;2:全时录像,默认是0
STimeDay stStartTime;       //开始时间
STimeDay stEndTime;        //结束时间
unsigned char reserved[8];
} SMsgAVIoctrlGetEventDateReq;

IOTYPE_USER_IPCAM_GET_EVENT_DATE_RESP = 0x9001;

  • 由Device发往App
  • Device告知App有SD卡事件的日期结果。
  • IOCtrl数据:
typedef struct
{
unsigned int count;                  //事件的日期数量
unsigned char reserved[4];
EventDate eventDate[1];         //事件的日期
} SMsgAVIoctrlGetEventDateResp;

typedef struct
{
char date[8];                 //事件的日期,例如:20200210,后面依次还有count-1个date[8]
} EventDate;

2.47 获取设备人形侦测开关

IOTYPE_USER_IPCAM_GET_HUMANDETECTION_REQ = 0x9002;

  • 由App发往Device
  • App告知Device查询人形侦测开关
  • IOCtrl数据:
typedef struct
{
unsigned char reserved[4];
} SMsgAVIoctrlGetHumanDetectionReq;

IOTYPE_USER_IPCAM_GET_HUMANDETECTION_RESP = 0x9003;

  • 由Device发往App
  • Device告知App人形侦测开关查询结果
  • IOCtrl数据:
typedef struct
{
unsigned int result;             //  1:开启; 其他:关闭
unsigned char reserved[4];
} SMsgAVIoctrlGetHumanDetectionResp;

2.48 设置设备人形侦测开关

IOTYPE_USER_IPCAM_SET_HUMANDETECTION_REQ = 0x9004;

  • 由App发往Device
  • App告知Device设置人形侦测开关
  • IOCtrl数据:
typedef struct
{
unsigned int isOn;        // 1:开启;0 :关闭
unsigned char reserved[4];
} SMsgAVIoctrlSetHumanDetectionReq;

IOTYPE_USER_IPCAM_SET_HUMANDETECTION_RESP = 0x9005;

  • 由Device发往App
  • Device告知App人形侦测开关设置结果
  • IOCtrl数据:
typedef struct
{
unsigned int result;             // 0:成功;其他:失败
unsigned char reserved[4];
} SMsgAVIoctrlSetHumanDetectionResp;

2.49 获取设备夜视开关

IOTYPE_USER_IPCAM_GET_NIGHTVISION_REQ = 0x9006;

  • 由App发往Device
  • App告知Device查询夜视开关
  • IOCtrl数据:
typedef struct
{
unsigned char reserved[4];
} SMsgAVIoctrlGetNightVisionReq;

IOTYPE_USER_IPCAM_GET_NIGHTVISION_RESP = 0x9007;

  • 由Device发往App
  • Device告知App夜视开关查询结果
  • IOCtrl数据:
typedef struct
{
unsigned int result;             // 1:开启;其他:关闭
unsigned char reserved[4];
} SMsgAVIoctrlGetNightVisionResp;

2.50 设置设备夜视开关

IOTYPE_USER_IPCAM_SET_NIGHTVISION_REQ = 0x9008;

  • 由App发往Device
  • App告知Device设置夜视开关
  • IOCtrl数据:
typedef struct
{
unsigned int isOn;        // 1:开启;0:关闭
unsigned char reserved[4];
} SMsgAVIoctrlSetNightVisionReq;

IOTYPE_USER_IPCAM_SET_NIGHTVISION_RESP = 0x9009;

  • 由Device发往App
  • Device告知App夜视开关设置结果
  • IOCtrl数据:
typedef struct
{
unsigned int result;             // 0:成功;其他:失败
unsigned char reserved[4];
} SMsgAVIoctrlSetNightVisionResp;

2.51 获取设备夏令时开关

IOTYPE_USER_IPCAM_GET_SUMMERTIME_REQ = 0x9010;

  • 由App发往Device
  • App告知Device查询夏令时开关
  • IOCtrl数据:
typedef struct
{
unsigned char reserved[4];
} SMsgAVIoctrlGetSummerTimeReq;

IOTYPE_USER_IPCAM_GET_SUMMERTIME_RESP = 0x9011;

  • 由Device发往App
  • Device告知App夏令时开关查询结果
  • IOCtrl数据:
typedef struct
{
unsigned int result;             // 1:开启;其他:关闭
unsigned char reserved[4];
} SMsgAVIoctrlGetSummerTimeResp;

2.52 设置设备夏令时开关

IOTYPE_USER_IPCAM_SET_SUMMERTIME_REQ = 0x9012;

  • 由App发往Device
  • App告知Device设置夏令时开关
  • IOCtrl数据:
typedef struct
{
unsigned int isOn;        // 1:开启; 0:关闭
unsigned char reserved[4];
} SMsgAVIoctrlSetSummerTimeReq;

IOTYPE_USER_IPCAM_SET_SUMMERTIME_RESP = 0x9013;

  • 由Device发往App
  • Device告知App夏令时开关设置结果
  • IOCtrl数据:
typedef struct
{
unsigned int result;             // 0:成功;其他:失败
unsigned char reserved[4];
} SMsgAVIoctrlSetSummerTimeResp;

三、示例说明

3.1 APP实作通过Command获取灯光状态实例

  • 定义Command及结构体
  • 获取开关状态Command定义:IOTYPE_GET_LED_REQ = 0x30000001
  • 获取开关状态结构体定义: @struct SMsgAVIoctrlGetLedReq;
  typedef struct
  {
  int channel;       //当前通道号
  unsigned char reserved[4];
  }SMsgAVIoctrlGetLedReq;
  • 设备端回复APP开关状态Command定义:IOTYPE_GET_LED_RESP = 0x30000002
  • 设备端回复APP开关状态结构体定义:@struct SMsgAVIoctrlGetLedResp;
  typedef struct
  {
  int res;        //0:成功,  其他失败
  unsigned char isOnOff;        // 0:开启; 1:关闭
  unsigned char reserved[3];
  }SMsgAVIoctrlGetLedResp;

3.2 IOS端发送及接收Command的方法

  • 发送Command的方法
    SMsgAVIoctrlGetLedReq *s =  malloc(sizeof(SMsgAVIoctrlGetLedReq));
    memset(s, 0, sizeof(SMsgAVIoctrlGetLedReq));
    [self.camera KY_SendIOCtrlToChannel:channel
            Type:IOTYPE_GET_LED_REQ
             Data:(char *)s
    DataSize:sizeof(SMsgAVIoctrlGetLedReq)];
    free(s);
  • 接收Command的回调方法
- (void)KY_DidReceiveIOCtrlWithUid:(NSString *)uid Type:(NSInteger)type Data:(const char*)data DataSize:(NSInteger)size
{
    if (type ==  IOTYPE_GET_LED_RESP)
    {
        SMsgAVIoctrlGetLedResp *s = (SMsgAVIoctrlGetLedResp *)data;
        isLightOn = s->isOnOff;
    }
}

3.3 Android 如何将bytes转成一个java对象

private class People {
    int age = 0;//4 bytes means data[0] ~ data[3]
    long birthday = 1612330883993L;//8 bytes means data[4] ~ data[11]
String name = "";//custom bytes ex: 32 bytes
}
/**
 * byte to people
 *
 * @param data src bytes length > 44
 * @return people
 */
private People byteToPeople(byte[] data) {
       if (data.length < 44) {
              return null;
       }
       People p = new People();
       p.age = byteArrayToInt(data, 0);
       p.birthday = byteArrayToLong(data, 4);
       byte[] name = new byte[32];
       System.arraycopy(data, 12, name, 0, 32);
       p.name = new String(name);
       return p;
}

private short byteArrayToShort(byte[] bytes, int beginPos) {
       return (short) ((0xff & bytes[beginPos]) | ((0xff & bytes[beginPos + 1]) << 8));
}

private int byteArrayToInt(byte[] bytes, int beginPos) {
       return (0xff & bytes[beginPos]) | (0xff & bytes[beginPos + 1]) << 8 | (0xff & bytes[beginPos + 2]) << 16 | (0xff & bytes[beginPos + 3]) << 24;
}

private long byteArrayToLong(byte[] bytes, int beginPos) {
       long l = 0;
       for (int i = 0; i < 4; i++) {
              l = l | ((0xffL & bytes[beginPos + i]) << (8 * i));
       }
       return l;
}