Firmware Recovery

1 Introduction

This document is intended to help users manually update the corrupt IPC firmware .

2 Get Firmware

Please consult Sunmi Technology Customer Service for the latest firmware of your devices and do not use any third-party firmware which may cause malfunctions.

  • Release firmware for the Face Sense Camera (or FS & FM020): Download here.
  • Release firmware for the Store Sense Camera (or SS & FM010): Download here.

3 Notes

  1. Firmware is not interchangeable and you should use correct firmware for your device.
  2. Verification will be performed to ensure the firmware is correctly signed before actually updating. Please make sure the firmware comes from Sunmi Technology to prevent malfunctions or bricks after updating.

4 Update Procedure

4.1 Copy the firmware to the SD-card

  1. Plug the SD-card into a computer, format the SD-card with EXFAT file system and set the volume label to “SUNMI-XXXX” where “XXXX” is the last four digits of the MAC address which is on the label of the device.
  2. Copy the firmware file to the SD-card’s root directory and rename it to “up.bin”.

4.2 Update

  1. Insert the SD-card with firmware inside into the IPC.
  2. Power on the IPC.
  3. Wait for around 10 seconds until the red LED is on, indicating it is updating.
  4. Wait for around 1 min, if the red LED is off and green LED is on that means the device is going to reboot. The updating procedure completes when the green LED is flashing or the blue LED is on.

4.3 Setup

  1. After rebooting, hold the Reset button for a few seconds to restore the factory settings.
  2. Follow  the procedures in the User Manual to setup your device and bind it to your account.
  3. Use the Sunmi Assistant App or go to https://store.sunmi.com and update the firmware to the latest version.
  4. Remember to delete the “up.bin” file under the root directory in the SD-card, preventing any accidently update.

升级异常的固件恢复方法

1. 概述

本文指导用户通过线下手动升级的方式,恢复升级异常的固件。

2. 获取升级固件

请务必从商米售前获取对应型号摄像头的升级固件 ,否则出现升级异常概不负责。

目前商米有的IPC摄像头有两款,分别是

  1. AI识客摄像机,英文名Face Sense Camera,简称FS,目前的型号是FM020。
  2. 智能看店摄像机,英文名Store Sense Camera,简称SS,目前的型号是FM010。

3. 升级规则

  1. 不同机型之间系统固件不能互相升级,例如FS和SS之间不能升级,所以请务必根据自己的机型来获取对应的正式环境固件。
  2. 固件本身有自己的签名机制和升级校验方法,所以请务必从商米处获取固件,切勿随便从第三方获取固件。

4. 详细流程

4.1 拷贝固件到TF卡

  1. 将TF卡插入电脑,执行格式化操作,文件系统设置为exfat,卷标设置为SUNMI-XXXX(其中XXXX为摄像头MAC地址最后四位,摄像头MAC地址见机身背面标贴)。 注:卷标SUNMI-XXXX中的-为英文半角符号,非中文全角符号;XXXX中的字母为大写。
  2. 进入TF卡目录,将从商米处 (详见2. 获取升级固件)获取到的升级固件解压后拷贝到根目录下,并把固件重命名为up.bin

4.2 升级固件

  1. 将带有固件的TF卡重新插入摄像头的TF卡槽中。
  2. 重新上电摄像头。
  3. 等待10秒左右,直到设备亮红灯,则说明正在固件升级 。
  4. 升级需要一些时间,再耐心等待1min左右,直到重新亮绿灯说明设备开始重启,当设备再次闪烁绿灯或者亮蓝灯说明设备已经重启完毕。

4.3 进行首配

  1. 重启后,长按设备上的Reset按键5秒以上进行恢复出厂设置。
  2. 恢复出厂重启后,使用正式环境的商米APP,按照《用户指南》手册中的软件配置指引完成摄像头的首次配置。
  3. 首配完成后,使用商米助手APP或登录正式环境的WEB服务网站https://store.sunmi.com 将设备固件更新到最新版本
  4. 记得删除原来SD卡中的up.bin文件,避免不必要的意外升级。

设备端HTTP接口 Postman测试示例

1.准备工作

本文介绍如何使用Postman在局域网内完成商米IPC设备的首配操作,并进行调试。首先请安装说明书接上电源并通过网线连上网络,确保IPC设备亮蓝灯。

进行以下操作前,还需要获取以下信息,其中除了IPC设备IP和设备SN外,其它信息请联系商米售前技术团队获取:

项目本文示例
app_id08BABCDABBB661234567
secret_keyABCDEFG3F2BB03917123
激活码abcd2986jnts8987hntl1234
OpenAPI证书及其密码openapi.p12
Postman测试集Sunmi_IPC_OpenAPI_Postman_Collection_202007001.json
设备IP192.168.103.198
设备SNC201000P00123

2.Postman安装

  1. 通过Postman官网下载最新版本软件:链接,本文使用的版本为v7.27.1。
  2. 按照安装向导进行安装

3.导入OpenAPI测试集合及配置

  1. 启动Postman
  2. 点击File -> Import -> Upload Files, 打开商米提供的Postman测试集文件,即”Sunmi_IPC_OpenAPI_Postman_Collection_202007001.json”,确认后点击”Import”。
  3. 点击File -> Settings -> Certificate,打开证书管理页面,点击”Add Certificate”,在Host项目填入设备IP如192.168.103.198,在下方打开商米提供的证书并填写对应的密码,确认无误后点击”Add”。
  • 4. 打开General页面,将”SSL certificate verificatio”选项置为`OFF`,并关闭页面。
  • 5. 返回Postman主页面,在侧边栏的Sunmi IPC OpenAPI测试集点击右键,选择”Edit”, 打开”Variables”页面,在”CURRENT VALUE”栏更新对应信息。

4.激活示例

  1. 激活步骤请参考商米开发者平台智能摄像机IPC的设备管理部分
  2. 激活操作采用激活码代替secret_key,请参照第3步修改本测试集的”Variables”页面的secret_key参数为商米提供的激活码
  3. 从侧边栏打开Sunmi IPC OpenAPI -> 基本配置 -> 0. 激活设备,在窗口右侧”Body”中,修改参数”sn”的值为测试设备SN,点击”Send”,成功激活返回”code”为”0″,如下图所示

5.OpenAPI示例测试

  1. 本测试集包含数个IPC设备基本功能的示例,方便前期部署的接口验证,更多接口请查阅商米开发者平台智能摄像机IPC相关页面。每个OpenAPI请求需要加上签名,只有正确签名的合法请求才会被IPC设备响应,具体签名规则请参考签名规则
  2. 本测试集已包含HTTPS请求签名,具体实现请见测试集属性的”Pre-request Scripts”部分,签名所需的请求参数在每个请求”Body”部分的”app_id”、”timestamp”、”random”、”sign”,请勿更改这两部分内容
  3. 正常成功请求如下图所示,错误码定义请参考错误码

示例参考

  1. 初次配置IPC
  2. 检查SD卡状态
  3. 直播&人脸识别

1. 初次配置IPC

调用IPC的OpenAPI接口首先需要获取到IPC的IP地址,故第一步是把IPC接入网络,IPC连接网络的方式有有线连接和无线连接两种方式。

由于有线网络相对不容易受到环境干扰,稳定性和可靠性较高,故首选是有线方式接入网络。

有线接入:
有线接入只需要通过网线把IPC设备和集成SDK的Android设备接入到同一局域网即可,不需要其它设置。

无线接入:

无线配网方式相对要复杂点,步骤如下:

  1. 使用手机/PC的无线网卡扫描IPC的AP热点,一般AP热点的名称为SUNMI_XXXX,其中XXXX为MAC地址最后2个字节的16进制数字,MAC地址可以通过设备机身后背的标贴或者包装盒的标贴查到,AP热点本身是无加密的。
  2. 使用手机/PC的无线网卡连接IPC的AP热点,此时手机/PC就会获取到IPC分配的IP地址(按照设备发现描述的方法即可获取到),一般会是192.168.200.XXX,手机/PC的网关地址就是IPC的地址,一般会是192.168.200.1。
  3. 调用无线配置 API(见获取无线扫描AP列表(无需签名校验)的描述)获取IPC扫描到的AP热点。
  4. 调用无线配置 API(见设置无线参数(无需签名校验)的描述)设置IPC要连接的无线网络(例如无线路由器的SSID和密码),使得IPC能够从网关处获取到IP地址。
  5. 如果网络是可以正常上网的话,IPC取到IP地址后很快就会亮蓝灯,此时表明IPC可以正常连接Internet了。

SDK初始化&启动设备发现

private void initSdk() {
    ... ...
    String localAddress = "192.168.1.100";
    HttpsUtils.SSLParams sSlParams = getSSLParams();
    IPCameraManager mIPCameraManager = IPCameraManager.getInstance();
    mIPCameraManager.init(APP_ID, SECRET_KEY, LICENSE, sSlParams);
    // 启动设备发现
    mIPCameraManager.startDeviceTracker(localAddress);
    ... ...
}

private static HttpsUtils.SSLParams getSSLParams() {
    try {
        InputStream key = new FileInputStream(KEYSOTRE);
        InputStream ca = new FileInputStream(TRUSTSTORE);
        return HttpsUtils.getSslSocketFactory(key, KEYSOTRE_PASSWORD, ca);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    return null;
}

注册设备发现回调

mIPCameraManager.registerDeviceTrackListener(new DeviceTrackListener() {
    @Override
    public void onDeviceOnline(IPCameraInfo device) {
        showToast(getApplicationContext(), "[ " + device.getDeviceid() + " ]上线");
    }
    @Override
    public void onDeviceOffline(IPCameraInfo device) {
        showToast(getApplicationContext(), "[ " + device.getDeviceid() + " ]离线");
    }
});

扫描局域网内设备

mIPCameraManager.rescan();

扫描可连接的WIFI&设置连接WIFI

// 获取IPC扫描的AP热点
private void getWifiList() {
    BasicConfig.getInstance().getApListWithoutAuth(sunmiDevice.getDeviceid(),
            new RpcCallback‹RpcResponse‹ScanResultCollection››() {
                @Override
                public void onComplete(RpcResponse‹ScanResultCollection› result) {
                    if (result.code() == RPCErrorCode.SUCCESS) {
                        wifiListGetSuccess(result.data());
                    } else {
                        Log.i(TAG, "getApListWithoutAuth failed, errcode: " + result.code());
                    }
                }
        });

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            if (wifiList.size() == 0) {
                setNoWifiVisible(View.VISIBLE);
            }
        }
    }, TIMEOUT_GET_WIFI);
}

// 设置IPC连接的AP热点
private void setIpcWifi(String ssid, String psw) {
    showLoadingDialog();
    BasicConfig.getInstance().setWifiConfWithoutAuth(sunmiDevice.getDeviceid(),
            ssid, psw, new RpcCallback‹RpcResponse›() {
                @Override
                public void onComplete(RpcResponse result) {
                    if (result.code() == RPCErrorCode.SUCCESS) {
                        hideLoadingDialog();
                        shortTip("配置成功,请等待设备联网,联网后指示灯会变成蓝色");
                        createWaitDialog();
                    } else {
                        hideLoadingDialog();
                        shortTip("配置失败");
                    }
                }

                @Override
                public void onError(Throwable t) {
                    hideLoadingDialog();
                    shortTip("配置失败");
                }
            });
}

激活OpenAPI

// 由于激活需要与商米后台通信,因此在激活时确保IPC连接的网络可以连接外网。
DeviceManage.getInstance().activate(ipcList.get(postion).getDeviceid(),
    new RpcCallback‹RpcResponse›() {
        @Override
        public void onComplete(RpcResponse result) {
            if (result.code() == RPCErrorCode.SUCCESS || result.code() == RPCErrorCode.DEVICE_ACTIVATED) {
                Log.i(TAG, "activate ipc success");
            } else {
                Log.i(TAG, "activate ipc failed");
            }
        }

        @Override
        public void onError(Throwable t) {
            Log.i(TAG, "activate ipc failed");
        }
    });

画面缩放&聚焦

// 缩放画面
public void setZoomFactor(int zoomFactor){
    mBasicConfig.setZoom(mDevice.getDeviceid(), zoomFactor, new RpcCallback‹RpcResponse›() {
        @Override
        public void onComplete(RpcResponse result) {
            if (result.code() == RpcErrorCode.SUCCESS) {
                mLensConfig.zoom = zoomFactor;
            }
        }
    });
}

// 缩放后画面会自动聚焦,如果聚焦不够清晰,手动微调。
public void focus(boolean forward) {
        if (forward) {
            mLensConfig.focus = (mLensConfig.focus+FOCUS_STEPPER)›mLensConfig.max_focus?mLensConfig.max_focus:(mLensConfig.focus+FOCUS_STEPPER);
        } else {
            mLensConfig.focus = (mLensConfig.focus-FOCUS_STEPPER)‹0?0:(mLensConfig.focus-FOCUS_STEPPER);
        }
        mBasicConfig.manualFocus(mDevice.getDeviceid(), mLensConfig.focus, new RpcCallback‹RpcResponse›() {
            @Override
            public void onComplete(RpcResponse result) {
                if (result.code() == RpcErrorCode.SUCCESS) {
                    Log.i(TAG, "manual focus failed, error code: " + result.code());
                }
            }
        });
    }

设置拌线

// 设置拌线,拌线主要用于判定人流的方向,比如进入、离开、穿过等方向,需要进行人流统计的需要设置拌线。
public void line(int start_x, int start_y, int end_x, int end_y) {
    PeopleFlowStat.getInstance().setDoorLine(mDevice.getDeviceid(), 0, start_x, start_y, end_x, end_y,
            new RpcCallback‹RpcResponse›() {
                @Override
                public void onComplete(RpcResponse result) {
                    if (result.code() == RpcErrorCode.SUCCESS) {
                        stopLive();
                        mView.gotoHomePage();
                    }
                }
            });
}

2. 检查SD卡状态

IPC的录像、人脸识别和人流统计模块的功能都依赖于SD卡,因此需要在使用时确保SD卡插入并成功格式化。建议在发现设备上线后检查SD卡状态,如果获取状态失败则建议60s后再次获取(因为IPC重启后需要一定时间启动所有服务)。

检查SD卡状态&格式化

private void checkSdcardStatus() {
        mBasicConfig.getMemoryCardStatus(mDevice.getDeviceid(),
                new RPCCallback‹RPCResponse‹ExternalStorageBean››() {
                    @Override
                    public void onComplete(RPCResponse‹ExternalStorageBean› result) {
                        Log.d(TAG, "code: " + result.code() + ", sdcard status: " + result.data().status);
                        if (result.code() == 0 && result.data().status != 2) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    int message = R.string.ipc_prompt_format_sdcard;
                                    switch (result.data().status) {
                                        case 0:
                                            message = R.string.ipc_prompt_format_sdcard_none;
                                            break;
                                        case 1:
                                            message = R.string.ipc_prompt_format_sdcard;
                                            break;
                                        case 3:
                                            message = R.string.ipc_prompt_format_sdcard_broken;
                                            break;
                                    }
                                    CommonDialog sdcardDialog = new CommonDialog.Builder(context)
                                            .setMessage(message)
                                            .setCancelButton(R.string.ipc_cancel)
                                            .setConfirmButton(R.string.ipc_format_sdcard, new DialogInterface.OnClickListener() {
                                                @Override
                                                public void onClick(DialogInterface dialog, int which) {
                                                    mBasicConfig.formatMemoryCard(mDevice.getDeviceid(),
                                                            new RPCCallback‹RPCResponse›() {
                                                                @Override
                                                                public void onComplete(RPCResponse result) {
                                                                    Log.d(TAG, "code: " + result.code());
                                                                }
                                                            });
                                                }
                                            })
                                            .create();
                                    sdcardDialog.show();
                                }
                            });
                        }
                    }
                });
    }

3. 直播&人脸识别

目前仅FM020支持人脸识别功能。

启动消息通道接收服务

启动此服务后才能接收到来自IPC的人脸识别、动态侦测等消息,启动此服务必须指定IP地址。

private void initSdk() {
    ... ...
    mConnectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT ›= Build.VERSION_CODES.M) {
        if (mConnectivityManager != null) {
            mUsedNetwork = mConnectivityManager.getActiveNetwork();
            if (mUsedNetwork != null) {
                MessageCenter.startMessageReceiver(NetworkUtil.getIpAddress(this, mUsedNetwork), HTTP_SERVER_PORT);
            }
            // 为适配网络切换的情况,动态重启消息接收服务
            mConnectivityManager.registerNetworkCallback(new NetworkRequest.Builder().build(),
                    new ConnectivityManager.NetworkCallback() {
                        @Override
                        public void onLost(@NonNull Network network) {
                            super.onLost(network);
                            Log.i(TAG, "onLost");
                            if (network.equals(mUsedNetwork)) {
                                MessageCenter.stopMessageReceiver();
                                mUsedNetwork = null;
                                Network activeNetwork = mConnectivityManager.getActiveNetwork();
                                if (activeNetwork != null) {
                                    Log.i(TAG, "if: " + mConnectivityManager.getLinkProperties(activeNetwork).getInterfaceName());
                                    mUsedNetwork = activeNetwork;
                                    MessageCenter.startMessageReceiver(NetworkUtil.getIpAddress(getApplicationContext(), mUsedNetwork), HTTP_SERVER_PORT);
                                }
                            }
                        }

                        @Override
                        public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
                            super.onCapabilitiesChanged(network, networkCapabilities);
                            Log.i(TAG, "onCapabilitiesChanged: " + networkCapabilities.toString());
                            if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) && mUsedNetwork == null) {
                                mUsedNetwork = network;
                                MessageCenter.startMessageReceiver(NetworkUtil.getIpAddress(getApplicationContext(), mUsedNetwork), HTTP_SERVER_PORT);
                            }
                        }
                    });
        }
    }
    ... ...
}

注册人脸识别回调

private void registerCallback() {
    mFaceDetectListener = new FaceDetectListener() {
        @Override
        public void onFaceDetect(FaceRecognitionEvent event) {
            Bitmap bitmap = null;
            try {
                bitmap = downloadImage(event.pic_url);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if(bitmap == null) {
                return;
            }
            Person person = new Person();
            person.setBitmap(bitmap);
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
            long tlong = Long.parseLong(event.report_time) * 1000;
            Timestamp ts = new Timestamp(tlong);
            person.setPersonDate(sdf.format(ts));
            person.setPersonID(event.faceid);
            person.setPersonName(event.group_name);
            person.setSex(event.gender);
            person.setPersonAgeRange(event.age_range);
            personList.add(0, person);
            if (personList.size() › personListRecyclerSize) {
                personList.get(personListRecyclerSize).getBitmap().recycle();
                personList.remove(personListRecyclerSize);
            }
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    personListAdapter.notifyDataSetChanged();
                }
            });
        }
    };

    MessageCenter.registerFaceDetectListener(mFaceDetectListener);
}

订阅人脸识别消息

private void subscribeFaceRecognition() {
    List‹String› events = new ArrayList‹›();

    events.add("face_recog_event");
    MessageCenter.getInstance().subscribeEvent(mDevice.getDeviceid(), events, new RpcCallback‹RpcResponse›() {
        @Override
        public void onComplete(RpcResponse result) {
            Log.i(TAG, "subscribeEvent, code:" + result.code());
        }
    });
}

直播

// rtsp直播流的默认账号/密码是admin/admin
private void openMediaPlayer() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            VideoStream.getInstance().getLiveStream(mDevice.getDeviceid(),
                    new RpcCallback‹RpcResponse‹LiveAddress››() {
                        @Override
                        public void onComplete(RpcResponse‹LiveAddress› result) {
                            if (result.code() == RpcErrorCode.SUCCESS) {
                                Log.i(TAG, "live url: " + result.data().fhd_live_url);
                                if (mPlayer == null) {
                                    mPlayer = new SunmiPlayer(context);
                                    mPlayer.setListener(new SunmiPlayerListener() {
                                        @Override
                                        public void onPrepared(IMediaPlayer iMediaPlayer) {
                                            iMediaPlayer.start();
                                        }
                                    });
                                    mPlayer.setSurface(mVideoView.getHolder().getSurface());
                                    String liveUrl = result.data().fhd_live_url.replaceFirst("^rtsp://", "rtsp://admin:admin@");
                                    Log.i(TAG, "real url: " + liveUrl);
                                    mPlayer.setUp(liveUrl);
                                }
                            } else {
                                Log.e(TAG, " IPC Error: " + result.code());
                                showToast(getApplicationContext(), "IPC Error: "+ result.code());
                            }
                        }
            });
        }
    }).start();
}

实体类

  1. IPCameraInfo类
  2. RpcResponse类
  3. FaceRecognitionEvent类
  4. MotionDetectEvent
  5. RpcErrorCode类

1. IPCameraInfo类

public class IPCameraInfo implements Serializable {
    /**
     * 序列号
     */
    private String deviceid;

    /**
     * 设备型号
     */
    private String model;

    /**
     * 固件版本号
     */
    private String firmware;

    /**
     * 设备MAC地址
     */
    private String mac;

    /**
     * 设备IP地址
     */
    private String ip;

    /**
     * 设备名称
     */
    private String name;

    /**
     * 设备类型
     */
    private String type;

    /**
     * 设备接入的网络类型;AP-WIFI接入,LAN-有线接入
     */
    private String network;
}

2. RpcResponse类

public class RpcResponse‹T› {
    private int code;
    private @Nullable T data;

    public int code() {
        return code;
    }

    public @Nullable T data() {
        return data;
    }
}

泛型T有以下取值:

public class IpcDeviceData {
    // 设备序列号
    public String sn;
    // 设备型号
    public String model_name;
    // 设备名称
    public String name;
    // 软件版本号
    public String software_version;
    // 硬件版本号
    public String hardware_version;
    // IP地址
    public String ip;
    // MAC地址
    public String mac;
}
public class WifiConfiguration {
    // 当前连接的SSID
    public String ssid;
    // 当前SSID的密码
    public String password;
}
public class ScanResultCollection {
    // 返回扫描到的AP个数
    public int num;
    // 扫描到的AP
    public List‹ScanResult› ap_list;

    public static class ScanResult {
        // 扫描到AP的ssid
        public String ssid;
        // 扫描到AP的加密方式
        public String key_mgmt;
    }
}
public class LensConfiguration {
    // 当前的焦距
    public int zoom;
    // 能够调整的焦距最大值
    public int max_zoom;
    // 当前的聚焦值
    public int focus;
    // 能够调整的聚焦最大值
    public int max_focus;
    // 聚焦点在x方向的像素百分比
    public int focused_x;
    // 聚焦点在y方向的像素百分比
    public int focused_y;
}
public class IrConfiguration {
    // 夜视模式:0表示关闭,1表示开启,2表示自动。一般选2。
    public int irmode;
}
public class MotionDetectConfig {
    // 动态侦测移动灵敏度,范围[0, 3],0表示关闭,数值越大,越灵敏。
    public int motion_level;
    //  动态侦测声音灵敏度,范围[0, 3],0表示关闭,数值越大,越灵敏。
    public int audio_level;
    /**
     * 动态侦测时间设置参数
     * 以周为一个循环,用0xYY来表示选择哪一天,具体是0x80直接表示7×24小时,其余的,
     * 以7bit来表示哪一天被选上,0x01表示选择周一,0x02表示选择周二,0x40表示选择
     * 周天,0x7f表示选择一个礼拜的7天,与0x80的区别只是0x80直接默认724小时,而
     * 0x7f选了7天后,还可以设置具体的开始时间和结束时间。
     */
    public int weekday;
    /**
     * 动态侦测时间设置参数
     * 用分钟来表示,以一天24小时为例,以分钟为最小粒度,总共24*60这样的时间数值,
     * 60表示01:00,121表示02:01,依次类推。范围[0,1440]
     */
    public long start_time;
    /**
     * 动态侦测时间设置参数
     * 用分钟来表示,以一天24小时为例,以分钟为最小粒度,总共24*60这样的时间数值,
     * 60表示01:00,121表示02:01,依次类推。范围[0,1440]
     */
    public long stop_time;
}
public class IpcName {
    // IPC名称
    public String name;
}
public class LedConfiguration {
    // 指示灯开关:0表示关闭指示灯,1表示开启指示灯,即可以亮
    public int led_switch;
}
public class Rotation {
    // 画面旋转角度
    public int rotation;
}
public class SupportRotations {
    // 支持的画面旋转角度:{"0","90","180","270"}
    public List‹String› angles;
}
public class ExternalStorage {
    // SD卡的四种状态:0表示未插入SD卡;1表示已插入SD卡但未初始化;2表示SD卡已插入且正常;3表示SD卡无法识别
    public int status;
}
public class LiveAddress {
    // 高清直播地址,RTSP协议
    public String hd_live_url;
    // 全高清直播地址,RTSP协议
    public String fhd_live_url;
}
public class PlaybackUrl {
    // 视频回放URL,RTSP协议
    public String playback_url;
}
public class VideoRecordCollection {
    // 符合条件的视频总数量,每个视频大概1分钟时长
    public int total_num;
    // 当前返回的视频数量
    public int return_num;
    // 视频片段列表
    public List‹VideoClip› record_list;

    public static class VideoClip {
        // 视频的开始时间
        public long start_time;
        // 视频的结束时间
        public long end_time;
        // 视频的下载链接
        public String url;
    }
}
public class SnapshotUrl {
    // 快照下载地址
    public String snapshot_url;
}
public class PresentVideoClip {
    // 视频片段下载链接,在生成后4~12s生效
    public String url;
}
public class GroupCollection {
    // 分组数量
    public int num;
    // 分组列表
    public List‹GroupInfo› face_group;
}
public class GroupInfo {
    // 分组最大容量
    public int capacity;
    // 分组内当前记录数量
    public int count;
    // 分组名称
    public String name;
    // 分组描述
    public String description;
    // stranger分组独有
    public int period;
    // stranger分组独有,代表一个生人在一定时间内(period设置,单位为天)来过多少次(times设置)就移动到熟人分组中去。
    public int times;
}
public class FaceAttributeCollection {
    // 分组自定义属性数量
    public int num;
    // 自定义属性名称列表
    public List‹String› name_list;
}
public class DeleteFaceDetails {
    // 删除成功的人脸ID列表
    public List‹String› success_list;
    // 删除失败的人脸ID列表
    public List‹String› failed_list;
    // 不存在的人脸ID列表
    public List‹String› not_exist_list;
}
public class FaceRecord {
    // 人脸ID
    public String faceid;
    // 所在分组名称
    public String group_name;
    // 年龄,为空则表示用户没有设置过此人脸的年龄
    public int age;
    // 所属年龄段,1表示1~6岁,2表示7~12岁,3表示13~18岁,4表示19~28岁,5表示29~35岁,6表示36~45岁,7表示45~55岁,8表示55岁~100
    public int age_range;
    // 性别,0表示未知,1表示男性,2表示女性
    public int gender;
    // 到达过的总次数
    public int arrive_count;
    // 最后到达时间戳
    public int arrive_time;
    // 人脸截图
    public String pic_url;
}
public class DoorLineConfig {
    // 参照分辨率:取值0和1,0表示1080P的分辨率,1表示720P的分辨率
    public int resolution;
    // 拌线的左边端点X坐标
    public int start_x;
    // 拌线的左边端点Y坐标
    public int start_y;
    // 拌线的右边端点X坐标
    public int end_x;
    // 拌线的右边端点Y坐标
    public int end_y;
}
public class PeopleStatCollection {
    // 总人流数量/统计粒度内的人流数量
    public int total;
    public List‹PeopleStatUnit› stat_list;
}
public class PeopleStatUnit {
    // 统计粒度的开始时间
    public long start_time;
    // 统计粒度的结束时间
    public long end_time;
    // 统计的总人数
    public int total;
    // 整数数组,表示男性统计数据,共有8个整数,从第一个整数开始依次表
    // 示1~6岁、7~12岁、13~18岁、19~28岁、29~35岁、36~45岁、46~55岁、
    // 56岁~100岁的男性人数。
    public List‹Integer› male_num_stat;
    // 整数数组,表示女性统计数组,含义同上
    public List‹Integer› female_num_stat;
}
public class VisitorCollection {
    // 符合条件的总人脸数量
    public int total_num;
    // 当前人脸数量
    public int return_num;
    public List‹FaceRecord› face_list;
}
public class VisitDetails {
    // 总到访次数
    public int arrive_count;
    // 到访的具体时间戳
    public List‹Long› came_in_time;
}
public class IpcEventCollection {
    // 订阅的事件数量
    public int num;
    // 订阅的事件列表
    public List‹IpcEvent› sub_event;

    public static class IpcEvent {
        public String event;
        public List‹String› http_callback;
    }
}
public class AiFaceConfig {
    // 人脸优选时间:表示在视频的这个时间范围内优选出人脸质量较好的一帧
    int optimize_seconds;
    // 人脸截图的人脸框大小阈值,人脸边长大于snap_size_thr才会进行截图并提取特征
    public int snap_size_thr;
}
public class PeopleFlowStatConfig {
    // 去重间隔(单位:秒):同一人脸在facerecog_interval时间内只被统计一次
    int facerecog_interval;
    // 人流统计模式,0-抓拍模式  1-正常模式;抓拍模式:不进行人流方向判断,抓拍即识别
    int customer_judgemode;
}

3. FaceRecognitionEvent类

public class FaceRecognitionEvent {
    // 事件ID
    public long event_id;
    // 人脸ID
    public String faceid;
    // 云端对应的人脸ID
    public String cloud_faceid;
    // 分组名称
    public String group_name;
    // 年龄
    public String age;
    // 年龄段
    public String age_range;
    // 性别
    public String gender;
    // 人脸识别总次数
    public int arrive_count;
    // 人脸截图
    public String pic_url;
    // 事件类型
    public String event_type;
    // IPC序列号
    public String sn;
    // 事件上报时间
    public String report_time;
}

4. MotionDetectEvent类

public class MotionDetectEvent {
    // 事件ID
    public long event_id;
    // 事件类型
    public String event_type;
    // 事件发生的时间戳,UNIX时间戳
    public long report_time;
    // 动态侦测检测到的类型,1表示画面变化,2表示声音变化,3表示既有画面变化,也有声音变化
    public int detect_type;
    // 视频下载路径
    public String video_url;
    // 发出此消息的IPC序列号
    public String sn;
}

5. RpcErrorCode类

public class RpcErrorCode {
    // 正常,操作成功
    public static final int SUCCESS = 0;
    // app_id不合法
    public static final int APPID_INVALID = 1;
    // 无效的输入参数
    public static final int PARAMS_INVALID = 2;
    // 未知错误
    public static final int UNKNOWN = 3;
    // 请求激活的设备没有联网
    public static final int DEVICE_NOT_ONLINE = 4;
    // app_id或者secret key错误
    public static final int SECRET_KEY_INVALID = 5;
    // URL错误
    public static final int URL_NOT_FOUND = 6;
    // 设备未激活
    public static final int DEVICE_NOT_ACTIVATED = 7;
    // 设备激活失败
    public static final int DEVICE_ACTIVATE_FAILED = 8;
    // 设备已激活,不需要重复激活
    public static final int DEVICE_ACTIVATED = 9;
    // 设备已绑定,激活失败
    public static final int DEVICE_BINDED = 10;
    // SN错误,激活失败
    public static final int SN_DISMATCH = 11;
    // 操作不允许
    public static final int OP_NOT_ALLOWED = 12;
    // 操作不支持
    public static final int OP_NOT_SUPPORT = 13;

    // SSID不符合规范
    public static final int WIRELESS_SSID_INVALID = 100;
    // 密码不合法
    public static final int WIRELESS_PASSWORD_INVALID = 101;

    // 焦距范围不合法
    public static final int LENS_ZOOM_PARAM_INVALID = 110;
    // 聚焦范围不合法
    public static final int LENS_FOCUS_PARAM_INVALID = 111;
    // 自动聚焦的百分比错误
    public static final int LENS_AUTOFOCUS_PARAM_INVALID = 112;
    // 夜视模式参数不合法
    public static final int LENS_IRMODE_PARAM_INVALID = 113;

    // 动态侦测画面灵敏度不合法
    public static final int DETECT_MOTION_LEVEL_INVALID = 114;
    // 动态侦测声音灵敏度不合法
    public static final int DETECT_AUDIO_LEVEL_INVALID = 115;
    // 动态侦测日期不合法
    public static final int DETECT_WEEKDAY_INVALID = 116;
    // 动态侦测开始时间或者结束时间不合法
    public static final int DETECT_TIME_PERIOD_INVALID = 117;

    // 名字长度超出范围
    public static final int CAM_INFO_NAME_INVALID = 118;
    // 指示灯开关参数错误
    public static final int CAM_INFO_LED_INVALID = 119;
    // 旋转参数不合法
    public static final int CAM_INFO_ROTATION_INVALID = 120;
    // 指定时间段内的视频数据不存在
    public static final int CAM_INFO_VIDEO_NOT_EXIST = 121;
    // 指定的页码不存在
    public static final int CAM_PAGE_NOT_EXIST = 122;

    // 人脸分组重名
    public static final int GROUP_NAME_EXISTED = 200;
    // 人脸分组名称不合法
    public static final int GROUP_NAME_INVALID = 201;
    // 分组容量超出范围
    public static final int GROUP_CAPACITY_INVALID = 202;
    // 人脸分组ID不存在
    public static final int GROUP_ID_INVALID = 203;
    // 指定人脸分组不存在
    public static final int GROUP_NOT_EXIST = 204;
    // 要删除的人脸分组还有人脸,请先删除分组中的所有人脸
    public static final int GROUP_NOT_EMPTY = 205;
    // 存在同样的人脸ID
    public static final int FACE_ID_EXISTED = 206;
    // 指定人脸ID不存在
    public static final int FACE_ID_NOT_EXIST = 207;
    // 超出人脸分组的容量大小
    public static final int GROUP_OVERFLOW = 208;
    // 人脸ID操作不允许
    public static final int FACE_ID_OP_NOT_ALLOWED = 209;
    // 人脸照片不合格
    public static final int FACE_ID_PIC_NOT_QUALIFIED = 210;
    // 人脸服务未开启
    public static final int FACE_SERVICE_NOT_RUNNING = 211;
    // 人脸分组描述不合法
    public static final int GROUP_DESCRIPTION_INVALID = 212;

    // SD卡不存在
    public static final int SDCARD_NOT_PLUGGED = 220;
    // SD卡格式化失败,原因未知
    public static final int SDCARD_FORMAT_FAILED = 221;

    // 回放时间参数不正确
    public static final int PALYBACK_TIME_INVALID = 230;
    // 查询录像时间参数不正确
    public static final int RECORD_TIME_INVALID = 231;
    // RTSP服务未开启
    public static final int RTSP_NOT_RUNNING = 232;
    // 截图不成功
    public static final int SNAPSHOT_FAILED = 233;
    // 查询录像page参数不正确
    public static final int RECORD_PAGE_INVALID = 234;
    // 录像不存在
    public static final int RECORD_NOT_EXIST = 235;
    // 剪切的视频还未准备好
    public static final int CLIP_FRAGMENT_NOT_READY = 236;
    // 视频剪切服务未启动
    public static final int CLIP_SERVICE_NOT_RUNNING = 237;

    // 人脸属性名称不合法
    public static final int ATTRIBUTE_NAME_INVALID = 240;
    // 人脸属性重名
    public static final int ATTRIBUTE_NAME_EXISTED = 241;
    // 人脸属性数量超过最大限制
    public static final int ATTRIBUTE_NUM_EXCEED = 242;
    // 指定人脸属性不存在
    public static final int ATTRIBUTE_NAME_NOT_EXISTED = 243;

    // 拌线左边端点X坐标超出范围
    public static final int PARAMS_START_X_INVALID = 260;
    // 拌线左边端点Y坐标超出范围
    public static final int PARAMS_START_Y_INVALID = 261;
    // 拌线右边端点X坐标超出范围
    public static final int PARAMS_END_X_INVALID = 262;
    // 拌线右边端点Y坐标超出范围
    public static final int PARAMS_END_Y_INVALID = 263;
    // 分辨率设置超出范围
    public static final int PARAMS_RESOLUTION_INVALID = 264;
    // 人流统计信息粒度参数超出范围
    public static final int PARAMS_PERIOD_INVALID = 265;
    // 开始时间设置异常,必须使用UNIX时间戳
    public static final int PARAMS_START_TIME_INVALID = 266;
    // 结束时间设置异常,必须使用UNIX时间戳
    public static final int PARAMS_END_TIME_INVALID = 267;
    // 查询参数order设置异常
    public static final int PARAMS_ORDER_INVALID = 268;
    // 查询参数group name设置异常
    public static final int PARAMS_GROUP_NAME_INVALID = 269;
    // 查询参数gender设置异常
    public static final int PARAMS_GENDER_INVALID = 270;
    // 查询参数age设置异常
    public static final int PARAMS_AGE_INVALID = 271;
    // 查询参数age_range设置异常
    public static final int PARAMS_AGE_RANGE_INVALID = 272;
    // 查询参数page_num设置异常
    public static final int PARAMS_PAGE_NUM_INVALID = 273;
    // 查询参数page_size设置异常
    public static final int PARAMS_PAGE_SIZE_INVALID = 274;
    // 查询参数faceid设置异常
    public static final int PARAMS_FACE_ID_INVALID = 275;
    // 拌线右边端点X坐标-拌线左边端点X坐标差值小于100,距离不足
    public static final int PARAMS_X_DISTANCE_INVALID = 276;
    // 传入参数不是合理的json table格式
    public static final int PARAMS_JSON_TABLE_INVALID = 277;
    // 配置保存失败
    public static final int SET_CONFIG_FAIL = 278;
    // 配置读取失败
    public static final int GET_CONFIG_FAIL = 279;
    // 数据库中未发现人脸信息
    public static final int FACE_ID_INFO_NO_FOUND = 280;
    // 无效的时区设置
    public static final int TIMEZONE_INVALID = 281;
    // 无效的人形侦测参数
    public static final int INVALID_HUMAN_DETECTION_PARAM = 282;
    // 照片提取人脸特征失败
    public static final int FACE_ID_PIC_NO_FEATURE = 283;
    // 查询参数 用户新增人脸属性 设置异常

    public static final int USER_DEFINED_ATTRIBUTE_NOT_EXIST = 284;
    // 查询参数 用户新增人脸属性值 数据类型设置异常
    public static final int INVALID_USER_DEFINED_ATTRIBUTE_TYPE = 285;

    // 订阅的消息事件不存在
    public static final int SUBSCRIBE_EVENT_NOT_EXIST = 310;
    // 无效的消息回调URL
    public static final int INVALID_HTTP_CALLBACK_URL = 311;
}

MessageCenter 消息中心接口

  1. 启动消息监听
  2. 停止消息监听
  3. 注册人脸识别事件回调
  4. 注销人脸识别事件回调
  5. 注册动态侦测事件回调
  6. 注销动态侦测事件回调
  7. 获取实例
  8. 订阅消息
  9. 取消已订阅消息
  10. 查询已订阅消息

1. 启动消息监听

描述

开始监听IPC设备上报的消息事件。

接口

public static void startMessageReceiver(String host, int port);

参数说明

参数名称描述示例
host本地Ip地址。192.168.1.101
port本地port端口。8080

代码示例

2. 停止消息监听

描述

停止监听IPC设备上报的消息事件。

接口

public static void stopMessageReceiver();

参数说明

本接口没有参数。

3. 注册人脸识别事件回调

描述

注册人脸识别事件回调,在线的IPC设备识别到人脸后,上抛人脸识别事件。

接口

public static void registerFaceDetectListener(FaceDetectListener listener);

参数说明

参数名称描述示例
listener人脸识别回调

代码示例

MessageCenter.registerFaceDetectListener(new FaceDetectListener() {
    @Override
    public void onFaceDetect(FaceRecognitionEvent faceRecogEvent) {
        if (userName == null) {
            showToast("发现未注册的用户");
        } else {
            showToast("发现用户[ " + faceRecogEvent.faceid + " ]");
        }
    }
});

4. 注销人脸识别事件回调

描述

注销人脸识别事件回调。

接口

public static void unregisterFaceDetectListener(FaceDetectListener listener);

参数说明

参数名称描述示例
listener人脸识别回调

5. 注册动态侦测事件回调

描述

注册动态侦测事件回调,在线的IPC捕捉到动态侦测事件后,上抛该消息。

接口

public static void registerMotionDetectListener(MotionDetectListener listener);

参数说明

参数名称描述示例
listener动态侦测回调

代码示例

MessageCenter.registerMotionDetectListener(new MotionDetectListener() {
    @Override
    public void onDynamicDetect(DynamicDetectEvent dynamicDetectEvent) {
        showToast("设备" + dynamicDetectEvent.sn + "触发了" + dynamicDetectEvent.detect_type "事件");
    }
});

6. 注销动态侦测事件回调

描述

注销动态侦测事件回调。

接口

public static void unregisterMotionDetectListener(MotionDetectListener listener);

参数说明

参数名称描述示例
listener动态侦测回调

7. 获取实例

描述

获取实例。

接口

public static MessageCenter getInstance();

8.订阅消息

描述

订阅消息接口用于向IPC设备端订阅相关的消息,一旦订阅了消息,当设备端产生了相关消息的时候,便会向订阅时传入的回调接口发送一个HTTP POST消息,从而达到通知订阅者的目的。

接口

public void subscribeEvent(String deviceId, List‹String› events, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
events事件类型,可以是[“face_recog_event”,”dynamic_detect_event”]或者其中一个,其中”face_recog_event”仅FM020支持 [“face_recog_event”]
callback 调用结果

回调示例

List‹String› events = new ArrayList‹›();

events.add("face_recog_event");
MessageCenter.getInstance().subscribeEvent("FS101D8BS00096", events, new RpcCallback‹RpcResponse›() {
    @Override
    public void onComplete(RpcResponse result) {
        Log.i(TAG, "return code= " + result.code());
        if (result.code() == RpcErrorCode.SUCCESS) {
            Log.i(TAG, "event subscribe success");
        } else {
            Log.i(TAG, "event subscribe failed, code:" + result.code());
        }
    }

    @Override
    // 异常回调,例如未发现对应IPC设备
    public void onError(Throwable t) {
        Log.i(TAG, "Exception: " + t.getMessage());
    }
});

注:参考以下实现,后续接口不再说明。

响应参数

字段名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有0、1、2、5、310、311,见错误码的描述

9. 取消已订阅消息

描述

用于取消已经向IPC设备端订阅过的消息,取消订阅后,当设备端产生相关消息时,便不会向对应的回调地址发送HTTP POST消息。

接口

public void unsubscribeEvent(String deviceId, List‹String› events, RpcCallback‹RpcResponse› callback);

参数说明

参数名称 描述 示例
deviceIdIPC序列号C201D98T00094
events事件类型,可以是[“face_recog_event”,”dynamic_detect_event”]或者其中一个,其中”face_recog_event”仅FM020支持 [“face_recog_event” ]
callback调用结果

响应参数

字段名称 类型描述
codeint 返回码,表示操作的结果;
本接口返回码有0、1、2、5、310,见错误码的描述

10. 查询所有已订阅消息

描述

用于查询IPC设备端所有订阅的消息,当设备端产生相关消息时,会向对应的回调地址发送HTTP POST消息。

接口

public void getSubscribedEvents(String deviceId, RpcCallback‹RpcResponse‹IpcEventCollection›› callback);

参数说明

字段名称 描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

字段名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有 0、1、2、3、5、7, 见错误码的描述
dataIpcEventCollection
返回码成功才会有此字段,详见RpcResponse.IpcEventCollection

PeopleFlowStat 人流统计接口

  1. 设置进门拌线坐标
  2. 获取进门拌线坐标
  3. 获取指定时间内的到访人流统计信息
  4. 获取指定时间内的路过人流统计信息
  5. 获取指定时间内的离开人流统计信息
  6. 获取指定时间内的到访列表
  7. 获取指定人脸的到访记录

仅商米AI识客摄像机支持该模块。

1. 设置进门拌线坐标

描述

进门拌线是IPC设备用来判断某个人是否已经进来的基础,因此对于人脸识别和客流统计,需要通过此接口来设置这个拌线的坐标。

接口

public void setDoorLine(String deviceId, int resolution, int start_x, int start_y, int end_x, int end_y, RpcCallback‹RpcResponse› callback);

参数说明

参数名称 描述示例
deviceIdIPC序列号C201D98T00094
resolution只能取值0和1,0表示1080P的分辨率,1表示720P的分辨率0
start_x拌线的左边端点X坐标,1080p范围0<=x<=1920,720p范围0<=x<=1280500
start_y拌线的左边端点Y坐标,1080p范围0<=y<=1080,720p范围0<=y<=720 500
end_x拌线的右边端点X坐标,1080p范围0<=x<=1920,720p范围0<=x<=1280 500
end_y拌线的右边端点Y坐标,1080p范围0<=y<=1080,720p范围0<=y<=720 500
callback调用结果

响应参数

字段名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、277,278,见错误码的描述

2. 获取进门拌线坐标

描述

获取进门拌线的坐标信息。

接口

public void getDoorLine(String deviceId, RpcCallback‹RpcResponse‹DoorLineConfig›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

字段名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、260、261、262、263、264、276、277、279,见错误码的描述
dataDoorLineConfig返回码成功才会有此字段,详见RpcResponse.DoorLineConfig

3. 获取指定时间内的到访人流统计信息

描述

获取指定某一时间内的人流统计信息,如果设备不存在这个时间内的信息则会返回错误。

接口

public void getComeInPeopleStat(String deviceId, long start_time, long end_time, int period, RpcCallback‹RpcResponse‹PeopleStatCollection›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
start_timeUnix格式时间戳,精确至秒,开始时间,时间是整小时或者整天或者半小时的时间戳,譬如2019-07-01,2019-07-01 10:00,或者
2019-07-01 10:30这样的时间对应的时间戳
1578969264
end_timeUnix格式时间戳,精确至秒,结束时间。时间要求同上 1579055640
period人流统计信息的粒度,分为30min、hour和day三种统计粒度,取值分别为1,2和32
callback调用结果

响应参数

字段名称 类型 描述
codeint 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、211、220、265、266、267、277、280,见错误码的描述
dataPeopleStatCollection返回码成功才会有此字段,详见RpcResponse.PeopleStatCollection

4. 获取指定时间内的路过人流统计信息

描述

获取指定某一时间内的经过人流统计信息,如果设备不存在这个时间内的信息则会返回错误。

接口

public void getPassByPeopleStat(String deviceId, long start_time, long end_time, int period, RpcCallback‹RpcResponse‹PeopleStatCollection›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
start_timeUnix格式时间戳,精确至秒,开始时间,时间是整小时或者整天或者半小时的时间戳,譬如2019-07-01,2019-07-01 10:00,或者
2019-07-01 10:30这样的时间对应的时间戳
1578969264
end_timeUnix格式时间戳,精确至秒,结束时间。时间要求同上 1579055640
period人流统计信息的粒度,分为30min、hour和day三种统计粒度,取值分别为1,2和32
callback调用结果

响应参数

字段名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、211、220、265、266、267、277、280,见错误码的描述
dataPeopleStatCollection返回码成功才会有此字段,详见RpcResponse.PeopleStatCollection

5. 获取指定时间内的离开人流统计信息

描述

获取指定某一时间内的人流统计信息,如果设备不存在这个时间内的信息则会返回错误。

接口

public void getGoOutPeopleStat(String deviceId, long start_time, long end_time, int period, RpcCallback‹RpcResponse‹PeopleStatCollection›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
start_timeUnix格式时间戳,精确至秒,开始时间,时间是整小时或者整天或者半小时的时间戳,譬如2019-07-01,2019-07-01 10:00,或者
2019-07-01 10:30这样的时间对应的时间戳
1578969264
end_timeUnix格式时间戳,精确至秒,结束时间。时间要求同上 1579055640
period人流统计信息的粒度,分为30min、hour和day三种统计粒度,取值分别为1,2和32
callback调用结果

响应参数

字段名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、211、220、265、266、267、277、280,见错误码的描述
dataPeopleStatCollection返回码成功才会有此字段,详见RpcResponse.PeopleStatCollection

6. 获取指定时间内的到访列表

描述

获取指定时间内,来过次数排名前N的人脸ID列表信息。

接口

public void getVisitorList(String deviceId, Map‹String, String› options, RpcCallback‹RpcResponse‹VisitorCollection›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
options限定获取来访记录的参数,option说明中的所有参数都需要转换成String类型传入。见下表options说明
callback调用结果

options说明

参数名称 类型 描述是否必须 示例
start_timelongUnix时间戳Y1578969264
end_timelongUnix时间戳Y1579055640
orderint表示抵达次数排名前order的人脸信息Y50
group_namestring指定某个人脸分组,默认为所有人脸分组Nvip
genderint性别,1表示男性,2表示女性,默认不分性别N1
age_rangeint年龄段,1表示1~6岁,2表示7~12岁,3表示13~18岁,4表示19~28岁,
5表示29~35岁,6表示36~45岁,7表示45~55岁,8表示55岁~100
N4
ageint年龄,与上面age_range是或的关系,不是与的关系。即查询age_range或
者age满足的人脸,只要有一个符合即可。
N4
item1string可以根据自定义属性来匹配,自定义属性1的匹配。如果需要使用自定义属
性查询,请确保指定的人脸分组添加过对应的自定义属性,否则查询失败(生
人与熟人分组不能添加自定义属性)
N value1
item2string自定义属性2的匹配N value2
item3string自定义属性3的匹配N value3
item4string自定义属性4的匹配N value4
item5string自定义属性5的匹配N value5
page_numint当前页码,默认值和最小值为1N1
page_sizeint当前页面条目数,默认为10,范围为[1, 100]N10

响应参数

参数名称 类型 描述
codeint 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、211、220、265、266、267、277、280,见错误码的描述
dataVisitorCollection返回码成功才会有此字段,详见RpcResponse.VisitorCollection

7. 获取指定人脸的到访记录

描述

查询指定某个人在指定时间内的到访记录。

接口

public void getFaceVisitDetail(String deviceId, long start_time, long end_time, String faceId, RpcCallback‹RpcResponse‹VisitDetails›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
start_timeUnix时间戳,开始时间1578969264
end_timeUnix时间戳,结束时间1579055640
faceId人脸ID 000001
callback调用结果

响应参数

字段名称类型描述
codeint 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、211、220、265、266、267、277、280,见错误码的描述
dataVisitDetails返回码成功才会有此字段,详见RpcResponse.VisitDetails

FaceManage 人脸库管理接口

  1. 新建人脸分组
  2. 编辑人脸分组
  3. 设置生人到熟人的迁移条件
  4. 删除人脸分组
  5. 获取人脸分组列表
  6. 新增人脸的属性
  7. 删除人脸的属性
  8. 获取指定人脸分组新增属性列表
  9. 新增人脸
  10. 删除人脸
  11. 更新人脸
  12. 获取人脸
  13. 获取人脸列表
  14. 获取到达时间最旧的人脸
  15. 以人脸图片获取人脸
  16. 清空指定人脸分组

目前仅商米AI识客摄像机支持该模块。 当设备既绑定在数字店铺下,又激活了设备端API时,本节的编辑类接口不可用,即只能用到云端API的人脸分组管理接口来管理人脸库。

1. 新建人脸分组

描述

通过此接口新建一个人脸分组,并配置其属性。人脸分组当前最多支持10个,系统默认存在两个人脸分组,分别是生人分组和熟人分组,即用户最多还可以创建8个分组。

接口

public void createGroup(String deviceId, String groupName, int capacity, String description, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
name 分组名称,不长于32个汉字,目前系统默认存在“生人”和 “熟人”两个分组生人
capacity 分组容量,所有分组容量加起来不得超过3W10000
description 分组的描述,不超过50个汉字。黑卡的客户
callback调用结果

注:

1. 名称第一个字符不得为空格 ;

2. 默认生人库名为stranger,默认熟人库名为regular 。

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、200、201、202、211、212、220,见错误码的描述

2. 编辑人脸分组

描述

通过此接口编辑指定人脸分组的属性。

接口

public void updateGroup(String deviceId, String oldGroupName, String groupName, int capacity, String description, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
oldGroupName 要编辑的人脸分组名称 黑卡客户
groupName 修改后的分组名称,可与旧的一样 金卡客户
capacity 修改后的分组容量,可与旧的一样 10000
description 分组的描述,不超过50个汉字。 办卡升级
callback调用结果

注:

1.修改默认生人分组和熟人分组的属性时候,name必须与old_name一致,即不允许修改默认分组的组名;

2.名称第一个字符不得为空格。

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、200、201、202、204、211、212、220,见错误码的描述

3. 设置生人到熟人的迁移条件

描述

系统在激活时会默认创建生人分组和熟人分组两个组,且设备会默认把某个生人来的次数满足一定条件(默认7天内来了5次)的情况下,自动把这个生人移动到熟人分组。

通过此接口可修改生人移动到熟人分组的移动条件。

接口

public void updateMigration(String deviceId, int arrive_times, int period, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
arrive_times 必选,生人分组才需要的属性,取值范围1~10 5
period 必选,生人分组才需要的属性,取值范围1~100,单位为天 20
callback调用结果

注:

arrive_times和period是生人分组才需要修改的属性,代表一个生人在一定时间内(period设置,单位为天)来过多少次(arrive_times设置)就移动到熟人分组中去。 

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、204、211、220,见错误码的描述

4. 删除人脸分组

描述

删除指定人脸分组。

接口

public void deleteGroup(String deviceId, String groupName, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
groupName 要删除的分组名称,生人和熟人分组不能被删除,分组中有人脸也不能删除,只能先清空。 黑卡客户
callback调用结果

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、201、204、205、211、220,见错误码的描述

5. 获取人脸分组列表

描述

通过此接口获取IPC上所有的人脸分组信息。

接口

public void getGroupList(String deviceId, RpcCallback‹RpcResponse‹GroupCollection›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、211、220,见错误码的描述
dataGroupCollection返回码成功才会有此字段,详见RpcResponse.GroupCollection

6. 新增人脸的属性

描述

库中给每个人脸预置了一些属性,可以通过此接口为指定人脸分组中的人脸增加最多5个属性。

强烈建议在创建新分组后添加人脸前,按需求先调用本接口添加人脸的属性,而不是在添加人脸后中途调用本接口添加人脸ID属性。

接口

public void addFaceInfoItem(String deviceId, String groupName, List‹String› attrs, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
groupName 人脸分组名称 vip
attrs 类型为数组,属性名称列表,每个属性类型是string,属性长度最大为50字节 [“hobby”]
callback调用结果

注:

1. 默认库不允许添加人脸ID属性;

2. 以下字段作为保留字段,不允许作为新添加的属性名: group_name, pic, age, gender, faceid, age_range, arrive_times, pic_url, total_num, return_num。

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、204、211、220、240、241、242,见错误码的描述

7. 删除人脸的属性

描述

对于指定分组中的自定义属性,用户可以在不需要的时候删除,这里建议用户不要轻易删除。

接口

public void removeFaceInfoItem(String deviceId, String groupName, List‹String› attrs, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
groupName 人脸分组名称 vip
attrs 类型为数组,属性名称列表,每个属性类型是string,属性长度最大为50字节 [“hobby”]
callback调用结果

注:

默认库不允许删除人脸ID属性

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、204、211、220、240、241、242、243,见错误码的描述

8. 获取指定人脸分组新增属性列表

描述

通过此接口可以查询某个特定人脸分组中用户通过2.4.6指令添加的所有属性列表。

接口

public void getFaceInfoItem(String deviceId, String groupName, RpcCallback‹RpcResponse‹FaceAttributeCollection›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
groupName分组名称 stranger
callback调用结果

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、204、211、220,见错误码的描述
dataFaceAttributeCollection返回码成功才会有此字段,详见RpcResponse.FaceAttributeCollection

9. 新增人脸

描述

通过此接口可以向某个特定的人脸分组增加新人脸,并给每个人脸配置相关属性值。一次增加一个人脸。

接口

public void addFaceRecord(String deviceId, Map‹String, String› options, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
options人脸记录相关属性参数,option说明中的所有参数都需要转换成String类型传入。详见以下options说明
callback调用结果

options说明

参数名称 类型 描述 是否 必须 示例
faceidstring人脸id,不超过16个英文字符,目前只支持INT32数据转换的字符串。N11024
pic file jpg/png格式的人脸图片文件,最大分辨率为1920*1080,大小在1MB以内 Y 11024.jpg
group_name string 分组名称 Y stranger
age int 预置属性,年龄 N 14
gender int 预置属性,性别,0表示未知,1表示男性,2表示女性 N 1
item1 string 自定义属性1 N value1
item2 string 自定义属性2 N value2
item3 string 自定义属性3 N value3
item4 string 自定义属性4 N value4
item5 string 自定义属性5 N value5

注:

1.上面的预置属性是IPC数据库中内置的人脸具备的属性,其他的item1/item2/item3/item4/item5是用户自定义属性,若要使用自定义属性,则要调用2.4.6一节的接口来添加自定义属性,如果用户没有先添加人脸属性,直接在这个接口加上对应属性的key-value,IPC设备是不会处理那些属性的;

2.对于age属性,如果不设定,则会由摄像头自动设置此人的年龄段;

3.对于gender,如果不设定,则会由摄像头自动设置此人的性别。

响应参数

字段名称 类型 描述 示例
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、204、206、208、210、211、220,见错误码的描述

10. 删除人脸

描述

通过此接口可以删除指定人脸分组中的某些人脸。

接口

public void deleteFaceRecord(String deviceId, String groupName, List‹String› faceidList, RpcCallback‹RpcResponse‹DeleteFaceDetails›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
groupName 分组名称 vip
faceidList 人脸ID列表 [“1988″,”2020”]
callback调用结果

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、204、211、220,见错误码的描述
dataDeleteFaceDetails返回码成功才会有此字段,详见RpcResponse.DeleteFaceDetails

11. 更新人脸

描述

更新指定的人脸信息。

接口

public void updateFaceRecord(String deviceId, Map‹String, String› options, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
options人脸记录相关属性参数,option说明中的所有参数都需要转换成String类型传入。详见以下options说明
callback调用结果

options说明

参数名称 类型 描述 是否必须 示例
group_name string 人脸分组名称 Y stranger
faceid string 人脸ID Y 21
new_group_name string 新人脸分组名称 N VIP
pic file jpg/png格式的人脸图片文件,最大分辨率为1920*1080,大小不超过1MB N example.jpg
age int 预置属性,年龄 N 10
gender int 性别,可更新为1表示男性、2表示女性 N 1
item1 string 自定义属性1 N value1
item2 string 自定义属性2 N value2
item3 string 自定义属性3 N value3
item4 string 自定义属性4 N value4
item5 string 自定义属性5 N value5

响应参数

参数名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、204、207、208、210、211、220,见错误码的描述

注:

上述 hobby、vip_level、weight、phone_num 是用户自定义属性,对应item1/item2/item3/item4,自定义属性可以通过 2.4.6 一节的接口来添加。添加之后方可使用。

12. 获取人脸

描述

通过指定人脸ID获取人脸信息。

接口

public void getFaceRecord(String deviceId, String faceId, RpcCallback‹RpcResponse‹FaceRecord›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
faceId人脸ID105
callback调用结果

响应参数

参数名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、211,见错误码的描述
dataFaceRecord返回码成功才会有此字段,详见RpcResponse.FaceRecord
{    
  "code": 0,    
  "data": {        
    "arrive_time": 1566215943,        
    "arrive_count": 2,        
    "faceid": "4",        
    "group_name": "VIP",        
    "point": "113",         //自定义属性        
    "gender": 1,        
    "age": 10,        
    "age_range": 2,        
    "vip_level": "1",       //自定义属性        
    "hobby": "tennis",      //自定义属性        
    "weight": "60",         //自定义属性        
    "height": "180"        //自定义属性    
  }
}

注:

上述point、hobby、vip_level、weight、height是用户自定义属性,对应item1/item2/item3/item4/itme5,自定义属性可以通过2.4.6一节的接口来添加。添加之后才有返回这些属性。

13. 获取人脸列表

描述

获取指定人脸分组的所有人脸信息。

接口

public void getFaceRecordList(String deviceId, String groupName, int pageNum, int pageSize, RpcCallback‹RpcResponse‹FaceRecordCollection›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
page_num 当前页码,默认值和最小值为1
page_size当前页面条目数,默认为10,范围为[1, 100]
callback调用结果

返回示例

{    
“code”: 0,    
“data”: {        
“total_num”: 2,        
“num”: 2,        
“faceid_list”: [            
{                
“arrive_time”: 1566215929,                
“arrive_count”: 2,                
“faceid”: “3”,                
“point”: “113”,         //自定义属性                
“gender”: 2,                
“vip_level”: “3”,       //自定义属性                
“hobby”: “tennis”,      //自定义属性                 
“weight”: “60”,         //自定义属性                
“height”: “180”,        //自定义属性                
“age”: 10,                
“age_range”: 2            
},            
{                
“arrive_time”: 1566215998                
“arrive_count”: 1                 
“faceid”: “4”,                
“point”: “113”,         //自定义属性                
“gender”: 1,                
“vip_level”: “1”,       //自定义属性                
“hobby”: “tennis”,      //自定义属性                
“weight”: “60”,         //自定义属性                
“height”: “180”,        //自定义属性                
“age”: 10,                
“age_range”: 2            
}        
]    
}
}

14. 获取到达时间最旧的人脸

描述

获取指定人脸分组按到达时间排序最旧的N条人脸信息。

接口

public void getFaceByArrival(String deviceId, String groupName, int num, RpcCallback‹RpcResponse‹FaceRecordCollection›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
groupName 人脸分组名称 VIP
num获取人脸数量,默认值和最小值为1,最大值为10 2
callback调用结果

响应参数

参数名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、207、211,见错误码的描述
dataFaceRecordCollection返回码成功才会有此字段,详见RpcResponse.FaceRecordCollection

返回示例

{
    “code”: 0,
    “data”: {
        “return_num”: 2,
        “faceid_list”: [
            {
                “faceid”: “8”,
                “arrive_time”: 1566215929,
                “arrive_count”: 7,
                “age_range”: 5,
                “gender”: 1,
                “age”: 0,
                “item1”:value1, //自定义属性   
                “item2”:value2, //自定义属性   
                “item3”:value3, //自定义属性   
                “item4”:value4, //自定义属性   
                “item5”:value5 //自定义属性               
            },
            {
                “faceid”: “10”,
                “arrive_time”: 1566110525,
                “arrive_count”: 6,
                “age_range”: 4,
                “gender”: 2,
                “age”: 0,
                “item1”: value1, //自定义属性   
                “item2”:value2, //自定义属性   
                “item3”:value3, //自定义属性   
                “item4”:value4, //自定义属性   
                “item5”:value5 //自定义属性                   
            }
        ]
    }
}

15. 以人脸图片获取人脸

描述

此接口以人脸图片在IPC设备中搜索相似的人脸,返回以特征值匹配认定为同一人的人脸记录。

接口

public void getFaceRecordByPicture(String deviceId, String picPath, RpcCallback‹RpcResponse‹FaceRecord›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
picPath图片路径/mnt/sdcard/1424.jpg
callback调用结果

响应参数

参数名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、210、211、283,见错误码的描述
dataFaceRecord返回码成功才会有此字段,详见RpcResponse.FaceRecord

16. 清空指定人脸分组

描述

清空指定人脸分组内的所有人脸信息.

接口

public void cleanGroup(String deviceId, String groupName, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
groupName图片路径“vip”
callback调用结果

响应参数

参数名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、2、3、12、13、204、220,见错误码的描述

VideoStream 视频流接口

  1. 获取直播流
  2. 获取回放流
  3. 获取录像片段
  4. 获取当前快照
  5. 获取当前视频片段
  6. 视频截取

1.获取直播流

描述

获取指定IPC直播流地址,接口返回两种不同分辨率的直播流,在网络条件有限的情况下建议优先选择播放较低分辨率的直播流。

接口

public void getLiveStream(String deviceId, RpcCallback‹RpcResponse‹LiveAddress›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

参数名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7、232,见错误码的描述
dataLiveAddress返回码成功才会有此字段,详见RpcResponse.LiveAddress

2.获取回放流

描述

获取指定IPC回放流地址。

接口

public void getPlaybackStream(String deviceId, long startTime, long endTime RpcCallback‹RpcResponse‹PlaybackUrl›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
start_time回放开始时间,unix格式的时间戳,秒级1578969264
end_time回放结束时间,unix格式的时间戳,秒级1579055640
callback调用结果

响应参数

参数名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7、230、235,见错误码的描述
dataPlaybackUrl返回码成功才会有此字段,详见RpcResponse.PlaybackUrl

3.获取录像片段

描述

获取指定指定时间内的录像片段。

接口

public void getRecordList(String deviceId, Map‹String, String› options, RpcCallback‹RpcResponse‹VideoRecordCollection›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
options获取的录像范围参数,option说明中的所有参数均需要转换成String类型传入。见下表options说明
callback调用结果

options说明

参数名称类型描述是否必须示例
start_timelong指定开始时间,unix格式的时间戳,秒级Y1578969264
end_timelong指定结束时间,unix格式的时间戳,秒级Y1579055640
page_numint当前页码,默认值和最小值为1N1
page_sizeint当前页面条目数,默认为10,范围为[1, 100]N10

响应参数

参数名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7、231、234、235,见错误码的描述
dataVideoRecordCollection返回码成功才会有此字段,详见RpcResponse.VideoRecordCollection

4.获取当前快照

描述

获取指定IPC当前快照。

接口

public void getSnapshot(String deviceId, RpcCallback‹RpcResponse‹SnapshotUrl›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

参数名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7、233,见错误码的描述
dataSnapshotUrl返回码成功才会有此字段,详见RpcResponse.SnapshotUrl

5.获取当前视频片段

描述

获取当前时间往前(和/或)往后一点时间的视频片段。

获取视频片段的粒度为4s,用户在调用该接口的时候,设备会在截取当前时间之前的一段视频(以4s为单位)+当前时间点的4s片段+当前时间之后的一段视频片段 (以4s为单位) ,并返回用户视频下载连接。

视频下载连接在调用完成后4~12s生效,生效时间与用户传入的following参数有关。

接口

public void getCurVideos(String deviceId, int preceding, int following, RpcCallback‹RpcResponse‹PresentVideoClip›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
preceding当前时间点之前的视频片段长度,只能是0,4,8 0
following当前时间点之后的视频片段长度,只能是0,4,8 8
callback调用结果

响应参数

参数名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、236、237,见错误码的描述
dataPresentVideoClip返回码成功才会有此字段,详见RpcResponse.PresentVideoClip

6. 视频截取

描述

获取任意IPC设备中任意时间段的完整视频片段,时间段小于30min。

接口

public void getRecordUrl(String deviceId, long startTime, long endTime,  RpcCallback‹RpcResponse‹PresentVideoClip›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
startTime起始unix时间1600691948
endTime结束unix时间1600692248
callback调用结果

响应参数

参数名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、236、237,见错误码的描述
dataPresentVideoClip返回码成功才会有此字段,详见RpcResponse.PresentVideoClip

BasicConfig 基本配置接口

  1. 设置无线参数
  2. 设置无线参数(无需签名校验)
  3. 获取无线参数
  4. 获取无线扫描AP列表
  5. 获取无线扫描AP列表 (无需签名校验)
  6. 获取IP参数
  7. 设置IP参数
  8. 调焦
  9. 手动聚焦
  10. 自动聚焦
  11. 调焦聚焦复位
  12. 获取调焦和聚焦参数
  13. 设置夜视模式
  14. 获取夜视模式
  15. 设置动态侦测
  16. 获取动态侦测参数
  17. 设置IPC名称
  18. 获取IPC名称
  19. 设置指示灯开关
  20. 获取指示灯开关
  21. 设置画面旋转角度
  22. 获取画面旋转角度
  23. 获取支持的画面旋转角度
  24. 格式化存储卡
  25. 获取存储卡状态
  26. 获取人脸算法参数
  27. 设置人脸算法参数
  28. 获取人流统计参数
  29. 设置人流统计参数

1. 设置无线参数

描述

配置IPC连接AP的SSID和密码。

接口

public void setWifiConf(String deviceId, String ssid, String password, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
ssid要连接的AP的无线名称,也即SSID,不能超过32个字符WeWork
password要连接的AP的密码,如果无加密,填空即可,不支持WEP,不能超过64个字符12345678
callback调用结果

响应参数

字段名称类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、100、101,见错误码的描述

2. 设置无线参数(无需签名校验)

描述

设备激活前无需签名校验配置 IPC 连接 AP 的 SSID 和密码;设备激活后此接口即失效。

接口

public void setWifiConfWithoutAuth(String deviceId, String ssid, String password, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
ssid要连接的AP的无线名称,也即SSID,不能超过32个字符WeWork
password要连接的AP的密码,如果无加密,填空即可,不支持WEP,不能超过64个字符12345678
callback调用结果

响应参数

字段名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、100、101,见错误码的描述

3. 获取无线参数

描述

获取当前IPC的无线参数。

接口

public void getWifiConf(String deviceId, RpcCallback‹RpcResponse‹WifiConfiguration›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

字段名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、100、101,见错误码的描述
dataWifiConfiguration返回码成功才会有此字段,详见RpcResponse.WifiConfiguration

回调示例

后续接口回调实现与此类似,后续不再进行说明。

new RpcCallback‹RpcResponse‹WifiConfiguration››() {
    @Override
    public void onComplete(RpcResponse‹WifiConfiguration› result) {
        if (result.code() == RpcErrorCode.SUCCESS) {
            WifiConfiguration wifiConf = result.data();
        } else {
            shotToast("response.code: " + result.code());
        }
    }

    @Override
    public void onError(Throwable t) {
        shotToast("Exception: " + t.getMessage());
    }
});

4. 获取无线扫描AP列表

描述

获取当前IPC无线扫描到的AP列表。

接口

public void getApList(String deviceId, RpcCallback‹RpcResponse‹ScanResultCollection›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

字段名称 类型 描述
codeint 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、100、101,见错误码的描述
dataScanResultCollection返回码成功才会有此字段,详见RpcResponse.ScanResultCollection

5. 获取无线扫描AP列表 (无需签名校验)

描述

获取当前IPC无线扫描到的AP列表,设备激活后此接口失效。

接口

public void getApListWithoutAuth(String deviceId, RpcCallback‹RpcResponse‹ScanResultCollection›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

字段名称类型 描述
codeint 返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7、100、101,见错误码的描述
dataScanResultCollection返回码成功才会有此字段,详见RpcResponse.ScanResultCollection

6. 获取IP参数

描述

本接口用于获取IPC的IP地址获取方式。

接口

public void getIpConfiguration(String deviceId, RpcCallback‹RpcResponse‹IpConfiguration›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7,见错误码的描述
dataIpConfiguration返回码成功才会有此字段,详见RpcResponse.IpConfiguration

7. 设置IP参数

描述

本接口用于设置IPC的IP地址获取方式。

接口

public void setIpConfiguration(String deviceId, Map‹String, String› options, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
options可设置的动态侦测的参数集合见下表option说明
callback调用结果

option说明

参数名称 类型 描述 是否必须 示例
protoString获取IP方式, dhcp或者static Y static
ipaddrString Ip地址 N192.168.1.102
netmaskString 子网掩码 N 255.255.255.0
gatewayString 网关 N 192.168.1.1
dns1 String dns服务器地址 N 202.96.128.86
dns2String dns服务器地址 N202.96.134.166

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7,见错误码的描述

8. 调焦

描述

用户根据实际环境,调节镜头的焦距,使得拍摄的画面放大或者缩小。所有的调焦、聚焦等接口仅变焦镜头支持,目前仅商米AI识客摄像机支持变焦镜头。

接口

public void setZoom(String deviceId, int zoom, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
zoom焦距相关参数,取值范围[0, 500]200
callback调用结果

响应参数

字段名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7、110,见错误码的描述

9. 手动聚焦

描述

调焦后镜头会自动聚焦,如果对自动聚焦效果不满意,可以调用此接口手动进行微调。

接口

public void manualFocus(String deviceId, int focus, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
focus聚焦相关参数,取值范围[0, 780]200
callback调用结果

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7、111,见错误码的描述

10. 自动聚焦

描述

设置焦距后,IPC会自动聚焦,可以设置自动聚焦以哪个点(坐标)为中心进行。

接口

public void autoFocus(String deviceId, int focus_x, int focus_y, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述 示例
deviceIdIPC序列号C201D98T00094
focus_x 聚焦点在x方向的像素百分比,合理范围是[0, 100] 50
focus_y 聚焦点在y方向的像素百分比,合理范围是[0, 100] 50
callback调用结果

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7、112,见错误码的描述

11. 调焦聚焦复位

描述

用户可以通过此接口直接复位焦距和聚焦的参数。

接口

public void resetZoomFocus(String deviceId, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7,见错误码的描述

12. 获取调焦和聚焦参数

描述

获取当前IPC镜头的调焦聚焦参数。

接口

public void getZoomFocusConf(String deviceId, RpcCallback‹RpcResponse‹LensConfiguration›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

参数名称类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7,见错误码的描述
dataLensConfiguration返回码成功才会有此字段,详见RpcResponse.LensConfiguration

13. 设置夜视模式

描述

配置镜头的夜视模式。

接口

public void setIrMode(String deviceId, int irmode, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述 示例
deviceIdIPC序列号C201D98T00094
irmode 0表示关闭,1表示开启,2表示自动。一般选2。 2
callback调用结果

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7、113,见错误码的描述

14. 获取夜视模式

描述

获取当前IPC的夜视模式。

接口

public void getIrMode(String deviceId, RpcCallback‹RpcResponse‹IrConfiguration›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

参数名称类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7,见错误码的描述
dataIrConfiguration返回码成功才会有此字段,详见RpcResponse.IrConfiguration

15. 设置动态侦测

描述

IPC的动态侦测支持根据画面变化和声音变化灵敏度来检测和报警,通过本API可以设置相关灵敏度和动态侦测的时间。

接口

public void setMotionDetectConfig(String deviceId, Map‹String, String› options, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
options可设置的动态侦测的参数集合,option说明中的所有参数都需要转换成String类型传入。见下表option说明
callback调用结果

option说明

参数名称 类型 描述 是否必须 示例
motion_level int范围[0, 3],0表示关闭,数值越大,越灵敏。 Y 2
audio_level int 范围[0, 3],0表示关闭,数值越大,越灵敏。 Y 2
weekday int 以周为一个循环,用0xYY来表示选择哪一天,具体是0x80直接表示7×24小时,其余的,
以7bit来表示哪一天被选上,0x01表示选择周一,0x02表示选择周二,0x40表示选择
周天,0x7f表示选择一个礼拜的7天,与0x80的区别只是0x80直接默认724小时,而
0x7f选了7天后,还可以设置具体的开始时间和结束时间。
Y 128(0x80 的十进制)
start_time long用分钟来表示,以一天24小时为例,以分钟为最小粒度,总共24*60这样的时间数值,
60表示01:00,121表示02:01,依次类推。范围[0,1440]
Y 200
stop_time long 用分钟来表示,以一天24小时为例,以分钟为最小粒度,总共24*60这样的时间数值,
60表示01:00,121表示02:01,依次类推。范围[0,1440]
Y 400

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7,见错误码的描述

16. 获取动态侦测参数

描述

获取当前IPC镜头的动态侦测参数。

接口

public void getMotionDetectConfig(String deviceId, RpcCallback‹RpcResponse‹MotionDetectConfig›› callback);

参数说明

本接口没有私有参数,公共参数见HTTP接口调用

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

参数名称类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7,见错误码的描述
dataMotionDetectConfig返回码成功才会有此字段,详见RpcResponse.MotionDetectConfig

17. 设置IPC名称

描述

用户可以设置IPC的名称,以便区分不同的IPC设备。

接口

public void updateName(String deviceId, String name, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述 示例
deviceIdIPC序列号C201D98T00094
name 36个字符以内,12汉字以内 示例名称
callback调用结果

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7、118,见错误码的描述

18. 获取IPC名称

描述

获取当前IPC的名称。

接口

public void getName(String deviceId, RpcCallback‹RpcResponse‹IpcName›› callback);

参数说明

本接口没有私有参数,公共参数见HTTP接口调用

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

参数名称类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7,见错误码的描述
dataIpcName 返回码成功才会有此字段,详见RpcResponse.IpcName

19. 设置指示灯开关

描述

设置指示灯是否需要关闭。

接口

public void setLedSwitch(String deviceId, int ledSwitch, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述 示例
deviceIdIPC序列号C201D98T00094
led_switch 0表示关闭指示灯,1表示开启指示灯,即可以亮 1
callback调用结果

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7、119, 见错误码的描述

20. 获取指示灯开关

描述

获取当前IPC的指示灯状态。

接口

public void getLedSwitch(String deviceId, RpcCallback‹RpcResponse‹LedConfiguration›› callback);

参数说明

本接口没有私有参数,公共参数见HTTP接口调用

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

参数名称类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7, 见错误码的描述
dataLedConfiguration返回码成功才会有此字段,详见RpcResponse.LedConfiguration

21. 设置画面旋转角度

描述

设置拍摄的画面是否需要旋转一定角度,可用的旋转角度可通过获取支持的画面旋转角度获取到。

接口

public void setRotation(String deviceId, int rotation, RpcCallback‹RpcResponse› callback);

参数说明

这里只列出接口的私有参数,公共参数见HTTP接口调用

参数名称描述 示例
deviceIdIPC序列号C201D98T00094
rotation 画面旋转角度
对于FM010,支持的参数有0,90,180,270;
对于FM020,支持的参数有0,180
180
callback调用结果

响应参数

字段名称 类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7、120, 见错误码的描述

22. 获取画面旋转角度

描述

获取当前IPC当前的画面旋转角度。

接口

public void getRotation(String deviceId, RpcCallback‹RpcResponse‹Rotation›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

参数名称类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7, 见错误码的描述
dataRotation返回码成功才会有此字段,详见RpcResponse.Rotation
对于FM010,支持的参数有0,90,180,270;
对于FM020,支持的参数有0,180

23. 获取支持的画面旋转角度

描述

获取当前IPC设备支持的画面旋转角度。

接口

public void getSupportRotationAngles(String deviceId, RpcCallback‹RpcResponse‹SupportRotations›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

参数名称类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7, 见错误码的描述
dataSupportRotations返回码成功才会有此字段,详见RpcResponse.SupportRotations
对于FM010,支持的参数有0,90,180,270;
对于FM020,支持的参数有0,180

24. 格式化存储卡

描述

格式化插入IPC里面的存储卡。

接口

public void formatMemoryCard(String deviceId, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

参数名称类型 描述
code int 返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7、220、221, 见错误码的描述

25. 获取存储卡状态

描述

获取IPC上存储卡状态

接口

public void getMemoryCardStatus(String deviceId, RpcCallback‹RpcResponse‹ExternalStorage›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

类型 描述
int返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7, 见错误码的描述
ExternalStorage返回码成功才会有此字段,详见RpcResponse.ExternalStorage

26. 获取人脸算法参数

描述

获取人脸算法参数,目前仅支持人脸图像优选时间参数。

接口

public void getAiFaceConfig(String deviceId, RpcCallback‹RpcResponse‹AiFaceConfig›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

类型 描述
int返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7, 见错误码的描述
AiFaceConfig返回码成功才会有此字段,详见RpcResponse.AiFaceConfig

27. 设置人脸算法参数

描述

设置人脸算法参数,目前仅支持人脸图像优选时间参数。

接口

public void setAiFaceConfig(String deviceId, Map‹String, String› options, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
options人脸算法相关参数,option说明中的所有参数都需要转换成String类型传入。见下表option说明。
callback调用结果

option说明

参数名称类型描述是否必须示例
optimize_secondsint人脸图像优选时间,人脸算法从人脸出现后在指定的时间范围内选取人脸图像质量较好的进行识别,单位:秒,取值范围[1,6]。Y6

响应参数

类型 描述
int返回码,表示操作的结果;
本接口返回码有:0、1、3、5、7, 见错误码的描述

28. 获取人流统计参数

描述

获取IPC的人流统计参数,目前包含人脸识别去重间隔和人脸识别模式两个参数。

接口

public void getPeopleFlowStatConfig(String deviceId, RpcCallback‹RpcResponse‹PeopleFlowStatConfig›› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
callback调用结果

响应参数

字段名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7,见错误码的描述
dataPeopleFlowStatConfig返回码成功才会有此字段,详见RpcResponse.PeopleFlowStatConfig

29. 设置人流统计参数

描述

设置IPC的人流统计参数,目前包含人脸识别去重间隔和人脸识别模式两个参数。

接口

public void setPeopleFlowStatConfig(String deviceId, Map‹String, String› options, RpcCallback‹RpcResponse› callback);

参数说明

参数名称描述示例
deviceIdIPC序列号C201D98T00094
options人流统计参数,option说明中的所有参数都需要转换成String类型传入。见下表option说明
callback调用结果

option说明

名称类型描述是否必须示例
facerecog_intervalint人脸识别去重间隔,取值[0,86400]。N60
customer_judgemodeint人脸识别模式,0-抓拍模式,1-正常模式。N0

响应参数

字段名称类型描述
codeint返回码,表示操作的结果;
本接口返回码有:0、1、2、3、5、7,见错误码的描述