# 萤石云开放平台Android SDK使用说明

简介

本文档用于说明萤石开放平台SDK Android版本接口之间的关系以及接口调用顺序,对开放平台SDK Android版本各接口都有详细的说明。

名词解释

名词 释义
accessToken 访问令牌,由server返回给client用于认证
AppKey 应用程序key,AppKey的申请可以参阅: https://open.ys7.com/view/app/app_edit.html
deviceSerial 设备序列号
CameraNo 设备通道号
deviceSerial+CameraNo 摄像头唯一标志
OSD 视频当前时间
PTZ 云台控制,可以通过终端控制操作设备

功能介绍

功能 说明
账号对接(授权登录、sdk接口登录) 授权到萤石云平台,复用萤石云平台能力
摄像头列表 得到对应账号下设备
直播 直播,可设置直播分辨率
查看回放(SD卡、录像机、云存储) 回放
设备对讲 对讲(包含半双工对讲和全双工对讲)
设备的设置功能 设备设置接口api
设备控制接口(云台、镜头画面) 云台控制
WiFi配置 设备wifi配置
直播、回放边播边录 播放过程中录像
直播、回放边播边截屏 播放过程中截屏
告警消息 告警消息获取

工程配置

环境准备
支持 Android Studio 1.4 以上 支持 JDK 7.0 以上版本
支持 Android 手机系统 4.0 以上版本

创建应用

首先,你需要在萤石开放平台官网的 “ 开发者服务-我的应用-应用秘钥 ” 查看Appkey。

安装 SDK

SDK 的安装方式

使用 Gradle 获得

如果是之前采用过直接下载方式的需要删除之前拷贝进来的所有so库文件以及jar包

dependencies {
    /*萤石SDK核心模块,必须依赖*/
    implementation 'com.ezviz.sdk:ezviz-sdk:4.16.1'

    /*视频通话模块,按需使用*/
    implementation 'com.ezviz.sdk:videotalk:1.2.0'

    /*码流获取模块,按需使用*/
    implementation 'com.ezviz.sdk:streamctrl:1.2.0'
 }

ps:最新版本请查看 https://bintray.com/open-ezviz/mobile-sdk

直接下载

不再支持! 请使用 Gradle 集成

配置工程

配置 Android 权限

在 AndroidMainfest.xml 文件中添加:

    <!--基础功能所需权限-->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!--配网所需权限-->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    <!--对讲所需权限-->
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!--视频通话权限所需-->
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

配置build.gradle

    defaultConfig {
       ...
        ndk {
            abiFilters "armeabi-v7a" //自4.8.8版本开始支持arm64-v8a,按需使用
        }
    }
     sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

配置 AndroidManifest.xml

添加如下activity定义,用于sdk中间页显示,包含登录、开通云存储等。

    <activity
        android:name="com.videogo.main.EzvizWebViewActivity"
        android:screenOrientation="portrait"
        android:configChanges="orientation|keyboardHidden">
    </activity>

添加如下广播接收器,用于接收中间页登录成功消息启动其他界面。将you_BroadcastReceiver替换为自己代码中定义的BroadcastReceiver。(Android8.0及以上系统,由于静态注册广播的限制,很可能会收不到登录成功的广播,因此建议改用在代码中动态注册的方式注册BroadcastReceiver)

   <receiver
       android:name="you_BroadcastReceiver"
       android:exported="false" >
       <intent-filter>
            <action android:name="com.videogo.action.OAUTH_SUCCESS_ACTION" />
        </intent-filter>
   </receiver>

SDK初始化

一般建议在application中初始化

/** * sdk日志开关,正式发布需要去掉 */
EZOpenSDK.showSDKLog(true);
/** * 设置是否支持P2P取流,详见api */
EZOpenSDK.enableP2P(false);

/** * APP_KEY请替换成自己申请的 */
EZOpenSDK.initLib(this, APP_KEY);

代码混淆

目前SDK在打包时不能混淆,请添加以下内容

#========SDK对外接口=======#
-keep class com.ezviz.opensdk.** { *;}

#========以下是hik二方库=======#
-dontwarn com.ezviz.**
-keep class com.ezviz.** { *;}

-dontwarn com.ez.**
-keep class com.ez.** { *;}

-dontwarn com.hc.CASClient.**
-keep class com.hc.CASClient.** { *;}

-dontwarn com.videogo.**
-keep class com.videogo.** { *;}

-dontwarn com.hik.TTSClient.**
-keep class com.hik.TTSClient.** { *;}

-dontwarn com.hik.stunclient.**
-keep class com.hik.stunclient.** { *;}

-dontwarn com.hik.streamclient.**
-keep class com.hik.streamclient.** { *;}

-dontwarn com.hikvision.sadp.**
-keep class com.hikvision.sadp.** { *;}

-dontwarn com.hikvision.netsdk.**
-keep class com.hikvision.netsdk.** { *;}

-dontwarn com.neutral.netsdk.**
-keep class com.neutral.netsdk.** { *;}

-dontwarn com.hikvision.audio.**
-keep class com.hikvision.audio.** { *;}

-dontwarn com.mediaplayer.audio.**
-keep class com.mediaplayer.audio.** { *;}

-dontwarn com.hikvision.wifi.**
-keep class com.hikvision.wifi.** { *;}

-dontwarn com.hikvision.keyprotect.**
-keep class com.hikvision.keyprotect.** { *;}

-dontwarn com.hikvision.audio.**
-keep class com.hikvision.audio.** { *;}

-dontwarn org.MediaPlayer.PlayM4.**
-keep class org.MediaPlayer.PlayM4.** { *;}
#========以上是hik二方库=======#

#========以下是第三方开源库=======#
# JNA
-dontwarn com.sun.jna.**
-keep class com.sun.jna.** { *;}

# Gson
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.idea.fifaalarmclock.entity.***
-keep class com.google.gson.stream.** { *; }

# OkHttp
# JSR 305 annotations are for embedding nullability information.
-dontwarn javax.annotation.**
# A resource is loaded with a relative path so the package of this class must be preserved.
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
-dontwarn org.codehaus.mojo.animal_sniffer.*
# OkHttp platform used only on JVM and when Conscrypt dependency is available.
-dontwarn okhttp3.internal.platform.ConscryptPlatform
# 必须额外加的,否则编译无法通过
-dontwarn okio.**
#========以上是第三方开源库=======#

SDK主要流程

初始化授权流程

图2

服务器对接授权客户:

  1. 第三方服务器通过服务端api接口获取accesstoken和过期时间,accesstoken用来授权,过期时间用来定时刷新accesstoken

  2. 第三方服务器将获取到的accesstoken下发到第三方app(需集成SDK),第三方app调用EZOpenSDK.getInstance().setAccessToken(String accesstoken),来完成授权

    EZOpenSDK.getInstance().setAccessToken(String accessToken);
    
  3. EZOpenSDK会文件缓存accesstoken,下次打开app,初始化时会自动完成授权

  4. 退出登录后需要调

    退出登录授权

    EZOpenSDK.getInstance().logout();
    
    或者
    
    EZOpenSDK.getInstance().setAccessToken(null);
    

针对需要调用EZOpenSDK登录页登录授权的客户:

  1. 使用openLoginPage()方法跳转到登录H5页,此页面可以登录萤石账号
    EZOpenSDK.getInstance().openLoginPage();
    
  2. 登录成功之后会发送广播action为Constant.OAUTH_SUCCESS_ACTION为登录成功,登录成功后,app可以开展自己的业务,以及调用EZOpenSDK的接口,注意登录成功后EZOpenSDK自动完成accesstoken设置授权,第三个app无需再设置accesstoken;
  3. EZOpenSDK会文件缓存accesstoken,下次打开app,初始化时会自动完成授权
  4. 目前针对调用openLoginPage()页面获取accesstoken授权的,EZOpenSDK会内部自动刷新accesstoken,不用担心过期或者失效
  5. 如果需要获取EZOpenSDK内部缓存的accesstoken,调用方法EZOpenSDK.getInstance().getEZAccessToken(),得到EZAccessToken对象,包含accessToken和过去时间,拿accessToken自己去调用萤石api的需要考虑accessToken过期的情况
    EZOpenSDK.getInstance().getEZAccessToke();
    

直播

步骤

  1. 创建播放器
  2. 设置handler回调、显示区域、设备如果设置了视频加密,需要设置视频加密密码,默认为设备的6位验证码
  3. 启动播放
  4. 停止播放
  5. 释放播放器

实例代码如下

    EZPlayer player  = EZOpenSDK.getInstance().createPlayer(String deviceSerial,int cameraNo);

    //设置Handler, 该handler将被用于从播放器向handler传递消息
    player.setHandler(mHandler);

    //设置播放器的显示Surface
    player.setSurfaceHold(mHolder);

    /**
     * 设备加密的需要传入密码
     * 传入视频加密密码,用于加密视频的解码,该接口可以在收到ERROR_INNER_VERIFYCODE_NEED或ERROR_INNER_VERIFYCODE_ERROR错误回调时调用
     * @param verifyCode 视频加密密码,默认为设备的6位验证码
     */
    player.setPlayVerifyCode(String verifyCode);

    //开启直播
    player.startRealPlay();

    //停止直播
    player.stopRealPlay();

    //释放资源
    player.release();

说明

  1. 直播播放成功后可以进行以下操作:录像、拍照、画面翻转、对讲、云台控制、声音开关、视频画面缩放,详见api的EZPlayer,其中设备控制该接口的如云台控制和镜头显示功能、对讲,属于限制级接口,要优选通过判断设备的能力集来调用,设备能力集请查看EZDeviceInfo对象的属性值来判断具体方法;

  //开启录像,recordFile录制本地路径,例如:Environment.getExternalStorageDirectory().getPath()+"/abc"
  player.startLocalRecordWithFile(String recordFile)

  //结束本地直播流录像与startLocalRecordWithFile成对使用
  player.stopLocalRecord()

  //截图
  player.capturePicture()

  //声音开关
  player.openSound();
  player.closeSound();


  /**
   * PTZ 控制接口
   * 该接口为耗时操作,必须在线程中调用
   * @param deviceSerial   设备序列号
   * @param cameraNo        通道号
   * @param command ptz控制命令
   * @param action 控制启动/停止
   * @param speed 速度(0-2)
   * @return 操作成功或者失败(返回失败错误码)
   */
    EZopenSDK.getInstance().controlPTZ(String deviceSerial,int cameraNo, EZPTZCommand command, EZPTZAction action, int speed)
  1. EZOpenSDK中的setVideoLevel设置视频清晰度(videoLevel),此调节可以在视频播放前设置也可以在视频播放成功后设置,视频播放成功后设置了清晰度需要先停止播放stopRealPlay然后重新开启播放startRealPlay才能生效;

    EZopenSDK.getInstance().setVideoLevel(String deviceSerial,int cameraNo, int videoLevel);
    
    //设置成功
    // 停止播放 Stop play
    stopRealPlay();
    // 开始播放 start play
    startRealPlay();
    
  2. 开始播放之后在消息回调中会收到

    a、成功消息:102 (EZRealPlayConstants.MSG_REALPLAY_PLAY_SUCCESS), b、视频画面分辨率回调:134 (EZConstants.MSG_VIDEO_SIZE_CHANGED), c、失败消息:103 (EZRealPlayConstants.MSG_REALPLAY_PLAY_FAIL),失败回调时查看errorCode,如果为400035(需要输入验证码)和400036(验证码错误),则需要开发者自己处理让用户重新输入验证密码,并调用setPlayVerifyCode设置密码,然后重新启动播放。

@Override
public void handleMessage(Message msg) {
    switch (msg.what) {
        case EZConstants.EZRealPlayConstants.MSG_REALPLAY_PLAY_SUCCESS:
            //播放成功
            break;
        case EZConstants.EZRealPlayConstants.MSG_REALPLAY_PLAY_FAIL:
            //播放失败,得到失败信息
            ErrorInfo errorinfo = (ErrorInfo) msg.obj;
            //得到播放失败错误码
            int code = errorinfo.errorCode
            //得到播放失败模块错误码
            String codeStr = errorinfo.moduleCode
            //得到播放失败描述
            String description = errorinfo.description
            //得到播放失败解决方方案
            String description = errorinfo.sulution
            break;
        case EZConstants.MSG_VIDEO_SIZE_CHANGED:
            //解析出视频画面分辨率回调
            try {
                String temp = (String) msg.obj;
                String[] strings = temp.split(":");
                int mVideoWidth = Integer.parseInt(strings[0]);
                int mVideoHeight = Integer.parseInt(strings[1]);
                //解析出视频分辨率
            } catch (Exception e) {
                e.printStackTrace();
            }
            break;
        default:
            break;
    }
}

回放

步骤

  1. 创建播放器
  2. 设置handler回调、显示区域、设备如果设置了视频加密,需要设置视频加密密码,默认为设备的6位验证码
  3. 启动播放
  4. 停止播放
  5. 释放播放器

实例代码如下

  EZPlayer player  = EZOpenSDK.getInstance().createPlayer(String deviceSerial,int cameraNo);

  //设置Handler, 该handler将被用于从播放器向handler传递消息
  player.setHandler(mHandler);

  //设置播放器的显示Surface
  player.setSurfaceHold(mHolder);

  /**
   * 设备加密的需要传入密码
   * 传入视频加密密码,用于加密视频的解码,该接口可以在收到ERROR_INNER_VERIFYCODE_NEED或ERROR_INNER_VERIFYCODE_ERROR错误回调时调用
   * @param verifyCode 视频加密密码,默认为设备的6位验证码
   */
  player.setPlayVerifyCode(String verifyCode);


  /**
   * 开始云存储远程回放
   * @param cloudFile 云存储文件信息  参见下文中的 查询云存储录像信息列表
   * @return  true 表示成功, false 表示失败
   */
  player.startPlayback(EZCloudRecordFile cloudFile)

  //或者
  /**
   * 开始远程SD卡回放
   * @param deviceFile SD卡文件信息  参见下文中的 查询远程SD卡存储录像信息列表
   * @return  true 表示成功, false 表示失败
   */
  player.startPlayback(EZDeviceRecordFile deviceFile)

  //或者
  /**
    * 开始远程SD卡回放---按时间回放
    * @param startTime 开始时间
    * @param stopTime 结束时间
    * @return  true 表示成功, false 表示失败
    */
  player.startPlayback(Calendar startTime, Calendar stopTime)


  /**
    *  停止远程回放
    */
  player.stopPlayback()

说明

  1. 查询云存储录像信息列表
    /**
    * 查询云存储录像信息列表
    * 该接口中有网络操作,需要在线程中调用
    * @param deviceSerial 设备序列号
    * @param cameraNo     camera的序号,EZCameraInfo.cameraNo
    * @param startTime    查询时间范围开始时间
    * @param endTime      查询时间范围结束时间
    * @return 云存储录像信息列表
    * @throws BaseException
    */
     EZopenSDK.getInstance().searchRecordFileFromCloud(String deviceSerial, int cameraNo, Calendar startTime, Calendar endTime)
    
  2. 查询远程SD卡存储录像信息列表
    /**
    * 查询远程SD卡存储录像信息列表
    * 当设备关联了NVR存储设备后,此时查找的是NVR设备中录像,不再提供查找设备SD卡中录像
    * 该接口为耗时操作,必须在线程中调用
    */
    EZopenSDK.getInstance().searchRecordFileFromDevice(String deviceSerial, int cameraNo, Calendar startTime, Calendar endTime)
    
  3. 回放播放成功后可以进行以下操作:录像、拍照、声音开关、视频画面缩放、拖动进度seekPlayback播放,具体方法见api的EZPlayer;

    /**
    * 根据偏移时间播放
    * 拖动进度条时调用此接口。先停止当前播放,再把offsetTime作为起始时间按时间回放
    * 建议使用stopPlayback+startPlayback(offsetTime,stopTime代替此接口
    * @param offsetTime 录像偏移时间
    */
    player.seekPlayback(Calendar offsetTime)
    
  4. getOSDTime获取当前回放时间点,如果回放开始时间8:00,结束时间9:00,getOSDTime时间为8:30,那么播放进度为50%;
  5. 回放播放成功后可以调用pausePlayback(暂停远程回放播放)和 resumePlayback(恢复远程回放播放);

    /**
    * 暂停远程回放播放
    */
    player.pausePlayback()
    
    /**
    * 恢复远程回放播放
    */
    player.resumePlayback()
    
  6. 开始播放之后在消息回调中会收到

    a、成功消息:205 (EZConstants.EZPlaybackConstants.MSG_REMOTEPLAYBACK_PLAY_SUCCUSS), b、失败消息:206 (EZConstants.EZPlaybackConstants.MSG_REMOTEPLAYBACK_PLAY_FAIL),失败回调时查看errorCode,如果为400035(需要输入验证码)和400036(验证码错误),则需要开发者自己处理让用户重新输入验证密码,并调用setPlayVerifyCode设置密码,然后重新启动播放。 c、视频画面分辨率回调:134 (EZConstants.MSG_VIDEO_SIZE_CHANGED)

对讲

步骤

  1. 创建对讲播放器
  2. 设置handler回调、设备如果设置了视频加密,需要设置视频加密密码,默认为设备的6位验证码
  3. 启动对讲
  4. 停止对讲
  5. 释放对讲播放器

实例代码如下

    EZPlayer talk  = EZOpenSDK.getInstance().createPlayer(String deviceSerial,int cameraNo);
    //设置Handler, 该handler将被用于从播放器向handler传递消息
    talk.setHandler(mHandler);
    /**
      * 设备加密的需要传入密码
      * 传入视频加密密码,用于加密视频的解码,该接口可以在收到ERROR_INNER_VERIFYCODE_NEED或ERROR_INNER_VERIFYCODE_ERROR错误回调时调用
      * @param verifyCode 视频加密密码,默认为设备的6验证码
      */
    talk.setPlayVerifyCode(String verifyCode);


    //开启对讲, isDeviceTalkBack参数是用于判断对讲的设备,true表示与当前设备对讲,false表示与NVR设备下的IPC通道对讲。
    talk.startVoiceTalk(boolean isDeviceTalkBack)

    //开启对讲
    talk.startVoiceTalk();

    //关闭对讲
    talk.stopVoiceTalk();

    //注意对于半双工对讲:需要调用上面接口开启对讲
    //开启对讲后能听到设备端声音,但是设备端听不到自己的声音,需要以下操作setVoiceTalkStatus

    //设备端听,手机端说
    talk.setVoiceTalkStatus(true);

    //手机端听,设备端说
    talk.setVoiceTalkStatus(false);

说明

  1. 对讲流程需要根据设备的对讲能力进行区分处理。EZDeviceInfo中的isSupportTalk可获取到设备的对讲能力,0-不支持对讲,1-支持全双工对讲,3-支持半双工对讲。 同一设备需要开启不同功能(直播/回放/对讲)的播放器时,需要分别对每个功能创建一个播放器。播放器的功能是单一的

  2. 关于对讲功能,如果播放有声音输出,则在开启对讲前需要关闭播放的声音closeSound,关闭对讲后开启播放的声音openSound,详见demo;

  3. 开始对讲之后在消息回调中会收到

    a、成功消息:113 (RealPlayMsg.MSG_REALPLAY_VOICETALK_SUCCESS), b、失败消息:114 (RealPlayMsg.MSG_REALPLAY_VOICETALK_FAIL),失败回调时查看errorCode,如果为400035(需要输入验证码)和400036(验证码错误),则需要开发者自己处理让用户重新输入验证密码,并调用setPlayVerifyCode设置密码,然后重新启动播放。

设备添加流程

  1. 查询设备信息(probeDeviceInfo接口)的所获得对象是EZProbeDeviceInfoResult,需要开异步调用,EZProbeDeviceInfoResult 对象包含查询的设备信息,以及异常情况

    final EZProbeDeviceInfoResult result = EZOpenSDK.getInstance().probeDeviceInfo(mDeviceSerial,deviceType);
    if (result.getBaseException() == null){
     //查询成功,添加设备
      return;
    }else{
     switch (result.getBaseException().getErrorCode()){
         case 120023:
             // TODO: 2018/6/25  设备不在线,未被用户添加 (这里需要网络配置)
         case 120002:
             // TODO: 2018/6/25  设备不存在,未被用户添加 (这里需要网络配置)
         case 120029:
             // TODO: 2018/6/25  设备不在线,已经被自己添加 (这里需要网络配置)
             runOnUiThread(new Runnable() {
                 @Override
                 public void run() {
                   if (result.getEZProbeDeviceInfo() == null){
                        // 未查询到设备信息,不确定设备支持的配网能力,需要用户根据指示灯判断
                        //若设备指示灯红蓝闪烁,请选择smartconfig配网
                        //若设备指示灯蓝色闪烁,请选择设备热点配网
                    }else{
                        // 查询到设备信息,根据能力级选择配网方式
                        if (probeDeviceInfo.getSupportAP() == 2) {
                            //选择设备热单配网
                        }
                        if (probeDeviceInfo.getSupportWifi() == 3) {
                              //选择smartconfig配网
                        }
                        if (probeDeviceInfo.getSupportSoundWave() == 1) {
                            //选择声波配网
                        }
                    }
                 }
             });
             break;
         case 120020:
             // TODO: 2018/6/25 设备在线,已经被自己添加 (给出提示)
         case 120022:
             // TODO: 2018/6/25  设备在线,已经被别的用户添加 (给出提示)
         case 120024:
             // TODO: 2018/6/25  设备不在线,已经被别的用户添加 (给出提示)
         default:
             // TODO: 2018/6/25 请求异常
             showToast("Request failed = "
                     + result.getBaseException().getErrorCode());
             break;
     }
    }
    
  2. 热点配网模式

    /**
    * AP配网接口,默认为"EZVIZ_"+设备序列号,设备AP热点密码默认为"EZVIZ_"+设备验证码,默认自动连接设备热点,需要获取可扫描wifi的权限
    * @param ssid WiFi的ssid
    * @param password WiFi的密码
    * @param deviceSerial 设备序列号
    * @param verifyCode 设备验证码
    * @param apConfigCallback 结果回调
    */
    EZOpenSDK.getInstance().startAPConfigWifiWithSsid( final String ssid, final String password,String deviceSerial,final String verifyCode, final APWifiConfig.APConfigCallback apConfigCallback);
    /**
    * AP配网接口
    * @param ssid WiFi的ssid
    * @param password WiFi的密码
    * @param deviceSerial 设备序列号
    * @param verifyCode 设备验证码
    * @param routerName 设备热点名称,可传空,默认为"EZVIZ_"+设备序列号
    * @param routerPassword 设备热点密码,可传空,默认为"EZVIZ_"+设备验证码
    * @param isAutoConnectDeviceHotSpot 是否自动连接设备热点,需要获取可扫描wifi的权限;如果开发者已经确认手机连接到设备热点,则传false
    * @param apConfigCallback 结果回调
    */
    EZOpenSDK.getInstance().startAPConfigWifiWithSsid(final String ssid, final String password,String deviceSerial,final String verifyCode,final String routerName, final String routerPassword,boolean isAutoConnectDeviceHotSpot, final APWifiConfig.APConfigCallback apConfigCallback);
    /**
    * 停止AP配网
    */
    EZOpenSDK.getInstance().stopAPConfigWifiWithSsid();
    /**
    * 热点配网回调
    */
    APWifiConfig.APConfigCallback apConfigCallback = new APWifiConfig.APConfigCallback(){
    
    @Override
    public void onSuccess() {
     // TODO: 2018/6/28 配网成功
      EZOpenSDK.getInstance().stopAPConfigWifiWithSsid();
      Log.d(TAG, "startAPConfigWifiWithSsid onSuccess mDeviceSerial = " + mDeviceSerial);
    }
    
    @Override
    public void OnError(int code) {
     // TODO: 2018/6/28 配网失败
     EZOpenSDK.getInstance().stopAPConfigWifiWithSsid();
     Log.d(TAG, "startAPConfigWifiWithSsid  OnError mDeviceSerial = " + mDeviceSerial);
     switch (code) {
         case 15:
             // TODO: 2018/7/24 超时
             break;
         case 1:
             // TODO: 2018/7/24 参数错误
             break;
         case 2:
             // TODO: 2018/7/24 设备ap热点密码错误
             break;
         case 3:
             // TODO: 2018/7/24  连接ap热点异常
             break;
         case 4:
             // TODO: 2018/7/24 搜索WiFi热点错误
             break;
         default:
               // TODO: 2018/7/24 未知错误
               // 更多错误码请见枚举类 EZConfigWifiErrorEnum 相关说明
               break;
             }
         }
    
  1. 无线配网模式 调用wifi一键配置,startConfigWifi和stopConfigWifi要成对出现,开启配置后,配置时长开发这个可以自己定义一个定时器,到时间后调用stopConfigWiFi(),停止配网。

    /**
    * 开始WiFi配置
    * @param context  应用 activity context
    * @param deviceSerial   配置设备序列号
    * @param ssid  连接WiFi SSID
    * @param password  连接  WiFi 密码
    * @param back     配置回调
    */
    EZOpenSDK.getInstance().startConfigWifi(Context context,String deviceSerial, String ssid, String password, EZOpenSDKListener.EZStartConfigWifiCallback back);
    /**
    * 开始WiFi配置
    * @since 4.8.3
    * @param context  应用 activity context
    * @param deviceSerial   配置设备序列号
    * @param ssid  连接WiFi SSID
    * @param password  连接  WiFi 密码
    * @param mode      配网的方式,EZWiFiConfigMode中列举的模式进行任意组合(EZWiFiConfigMode.EZWiFiConfigSmart:普通配网;EZWiFiConfigMode.EZWiFiConfigWave:声波配网),例  如:EZWiFiConfigMode.EZWiFiConfigSmart|EZWiFiConfigMode.EZWiFiConfigWave
    * @param back     配置回调
    */
    EZOpenSDK.getInstance().startConfigWifi(Context context,String deviceSerial, String ssid, String password, int mode,EZOpenSDKListener.EZStartConfigWifiCallback back);
    /**
    * 停止Wifi配置
    */
    EZOpenSDK.getInstance().stopConfigWiFi();
    /**
    * 配网回调
    */
    EZOpenSDKListener.EZStartConfigWifiCallback mEZStartConfigWifiCallback =
      new EZOpenSDKListener.EZStartConfigWifiCallback() {
          @Override
          public void onStartConfigWifiCallback(String deviceSerial,final EZConstants.EZWifiConfigStatus status) {
              AutoWifiConnectingActivity.this.runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                    if (status == EZConstants.EZWifiConfigStatus.DEVICE_WIFI_CONNECTED) {
                          //设备wifi连接成功
    
                      } else if (status == EZConstants.EZWifiConfigStatus.DEVICE_PLATFORM_REGISTED) {
                          EZWiFiConfigManager.stopConfigWiFi();
                          //设备注册到平台成功,可以调用添加设备接口添加设备
    
                      }
                  }
              });
          }
      };
    

特别说明: 账户下删除设备重新wifi配置并且添加过程中,请在重置设备等待2分钟以后再调用wifi配置的相关接口可以提高wifi配置的成功率,否则会降低成功率,因为重置设备以后我们平台将在2分钟内得到设备下线的状态,只有平台认为下线了,wifi配置成功率才会高。

注意 1: DEVICE_WIFI_CONNECTED和DEVICE_PLATFORM_REGISTED状态上报可能会丢失,此时可在适当时机查询设备当前的状态(调用接口probeDeviceInfo),根据设备状态进行后续操作

注意 2:针对海康设备在添加可能需要激活,需要在局域网中先搜索到设备,然后判断是否已激活(萤石设备是免激活的),如未激活需要调用激活接口激活

//sadp 局域网搜索设备
EZHCNetDeviceSDK.getInstance().startLocalSearch(new EZHCNetDeviceSDK.SadpDeviceFoundListener() {
            @Override
            public void onDeviceFound(final EZSADPDeviceInfo sadp_device_info) {
                LogUtil.d(TAG,
                    "onDeviceFound  " + sadp_device_info.getDeviceSerial() + "  " + sadp_device_info.getDeviceSerial());
                    //搜索到设备
                    //判断设备是否激活
                  boolean isActivied =  sadp_device_info.isActived();

            }
        });

//sadp 关闭局域网搜索设备
EZHCNetDeviceSDK.getInstance().stopLocalSearch();

//sadp 局域网设备激活
new Thread(new Runnable() {
            @Override
            public void run() {
                final int result = EZHCNetDeviceSDK.getInstance().activeDeviceWithSerial(deviceSerial, mPassword);
                if (result == 1) {
                    // TODO: 2017/8/15 Activation successful
                    return;
                }else {
                    //TODO: 2017/8/15 Activation failed
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if(result == 2020){
                                // TODO: 2017/8/16 密码太弱

                            }else{
                                // TODO: 2017/8/16 激活失败

                            }
                        }
                    });
                }
            }
        }).start();

附录:


目前以下设备类型支持AP配网功能

国内型号 海外型号
CS-C4Wi-3C2WFR HSFLC1(VOXX定制型号)
CS-C4Wi-3C2EFR HSDB2(VOXX定制型号)
CS-C4W-3C2WFR CS-CV206-C0-3B2WFR-KJDS
CS-C3A-1C2WPMFBR CS-CV206-C0-1A1WFR-KJDS
CS-CV310-A0-3B1WFR-KJDS
CS-CV310-A0-1B2WFR-KJDS
CS-CV246-B0-3B2WFR-KJDS

附录:


声波配网支持以下设备类型及对应最低版本,仅供参考

设备型号 设备具体 版本号 声波配置
C2C CS-C2C-1B2WFR V5.1.2 build 180313 支持
C6P CS-C6P-7A3WFR V5.3.2 build 180117 支持
C2HC CS-C2HC-3B2WFR V5.2.4 build 180125 支持
C3W CS-C3W-3B1WFR V5.2.4 build 180131 支持
C5S CS-C5S-1B2WFR V5.2.4 build 180129 支持
C5Si CS-C5Si-3C2WFR V5.2.4 build 180307 支持
C6H CS-C6H-3B1WFR V5.2.4 build 180129 支持
C6C CS-C6C-3B2WFR V5.2.4 build 180129 支持
C6HC CS-C6HC-3B2WFR V5.2.4 build 180129 支持

参考资料

若文档有未尽之处,请参考以下资料。 1.萤石SDK demo,点击跳转到github下载

results matching ""

    No results matching ""