Java对接乐橙摄像头详细步骤(绑定设备/直播/控制)

 更新时间:2025年12月21日 10:20:20   作者:苡柠苡茉  
大华乐橙SDK(LechangeSDK)是一套由大华科技推出的智能安防领域专用软件开发工具包,下面这篇文章主要介绍了Java对接乐橙摄像头(绑定设备/直播/控制)的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

接入前准备

开发前需要去官网注册,获取开发需要的appId 和 appSecret
乐橙官网
乐橙开发文档

开始接入

话不多说,直接上代码。按照这个流程走的话,半天就能完全接入!

常量类

/**
* 我们把这些固定的参数单独配置,后续有变动改这里就可以了
*/
public class MonitorConstants {

    /**
     * 监控 redis key
     */
    public static final String MONITOR_CODE_KEY = "monitor_code_key";

    /**
     * appId
     */
    public static final String APP_ID = "xxx";

    /**
     * appSecret
     */
    public static final String APP_SECRET = "xxx";
}

实体类

/**
* 这里给的案例是一个设备组绑定一个监控。大家根据自己的业务情况去修改
*/
@Data
public class DeviceGroup implements Serializable {

    private static final long serialVersionUID = xxx;

    /**
     * 设备组id
     */
    private Long id;

    /**
     * 用户id
     */
    private Long userId;

    /**
     * 设备组名称
     */
    private String groupName;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /**
     * 监控编码
     */
    private String monitorCode;

    /**
     * 监控链接
     */
    private String monitorUrl;

    /**
     * 0-上,1-下,2-左,3-右
     */
    private String operation;

    /**
     * 设备验证码或密码
     */
    private String code;
}

接口

	/**
     * 监控绑定
     *
     * @param deviceGroup
     * @return
     */
    @PutMapping("/monitorBind")
    public AjaxResult monitorBind(@RequestBody DeviceGroup deviceGroup) {

        //判断设备组是否已经绑定监控
        int countGroup = monitorService.getGroupMonitorCount(deviceGroup.getId());
        if (countGroup > 0) {
            return error("设备组只能绑定一个监控!");
        }

        //根据监控编码判断监控是否被绑定
        int count = monitorService.getMonitorIsBinding(deviceGroup.getMonitorCode());
        if (count > 0) {
            return error("监控已被绑定,请检查!");
        }

        return toAjax(monitorService.monitorBind(deviceGroup));
    }

    /**
     * 监控操作
     *
     * @param deviceGroup
     * @return
     */
    @PostMapping("/controlMovePTZ")
    public AjaxResult controlMovePTZ(@RequestBody DeviceGroup deviceGroup) {
        monitorService.controlMovePTZ(deviceGroup);
        return success();
    }

绑定设备和获取直播流地址

业务层

/**
     * 监控绑定
     *
     * @param deviceGroup
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int monitorBind(DeviceGroup deviceGroup) {

        //获取token
        String token = getToken();

        //绑定设备
        bindDevice(deviceGroup, token);

        //创建设备源直播地址
        String monitorUrl = bindDeviceLive(deviceGroup, token);
        if (monitorUrl == null) {
            throw new RuntimeException("创建设备源直播地址失败!");
        }

        deviceGroup.setMonitorUrl(monitorUrl);

        return monitorMapper.monitorBind(deviceGroup);
    }

获取token(关键)

/**
     * 获取token
     *
     * @return
     */
    private String getToken() {

        try {
            //从redis获取token
            Object cacheObject = redisCache.getCacheObject(MonitorConstants.MONITOR_CODE_KEY);
            if (cacheObject != null) {
                return cacheObject.toString();
            }
            Map<String, Object> requestParams = paramsInit(Collections.emptyMap());
            String requestData = JSONObject.toJSONString(requestParams);

            String result = HttpClientUtil.getToken("https://openapi.lechange.cn/openapi/accessToken", requestData);
            JSONObject jsonObject = JSONObject.parseObject(result);
            if ("0".equals(JSONObject.from(jsonObject.get("result")).get("code"))) {
                String token = JSONObject.from(JSONObject.from(jsonObject.get("result")).get("data")).get("accessToken").toString();
                redisCache.setCacheObject(MonitorConstants.MONITOR_CODE_KEY, token, 2, TimeUnit.DAYS);
                return token;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

绑定设备(关键)

/**
     * 绑定设备
     *
     * @param deviceGroup
     * @param token
     */
    private void bindDevice(DeviceGroup deviceGroup, String token) {

        try {

            Map<String, Object> paramsMap = new HashMap<>();
            paramsMap.put("token", token);
            paramsMap.put("deviceId", deviceGroup.getMonitorCode());
            paramsMap.put("code", deviceGroup.getCode());

            Map<String, Object> requestParams = paramsInit(paramsMap);
            String requestData = JSONObject.toJSONString(requestParams);

            String result = HttpClientUtil.getToken("https://openapi.lechange.cn/openapi/bindDevice", requestData);
            JSONObject jsonObject = JSONObject.parseObject(result);
            if (!"0".equals(JSONObject.from(jsonObject.get("result")).get("code"))) {
                throw new RuntimeException();
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("绑定设备失败!");
        }
    }

创建设备源直播地址(关键)

 /**
     * 创建设备源直播地址
     *
     * @param deviceGroup
     * @param token
     * @return
     */
    private String bindDeviceLive(DeviceGroup deviceGroup, String token) {

        try {

            Map<String, Object> paramsMap = new HashMap<>();
            paramsMap.put("token", token);
            paramsMap.put("deviceId", deviceGroup.getMonitorCode());
            paramsMap.put("channelId", "0");
            paramsMap.put("streamId", 0);

            Map<String, Object> requestParams = paramsInit(paramsMap);
            String requestData = JSONObject.toJSONString(requestParams);

            String result = HttpClientUtil.getToken("https://openapi.lechange.cn/openapi/bindDeviceLive", requestData);
            JSONObject jsonObject = JSONObject.parseObject(result);
            if ("0".equals(JSONObject.from(jsonObject.get("result")).get("code"))) {
                JSONObject jo = JSONObject.from(JSONObject.from(jsonObject.get("result")).get("data"));
                JSONArray streams = JSONArray.parseArray(jo.get("streams").toString());
                return JSONObject.from(streams.get(2)).get("hls").toString();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

统一封装请求参数(关键)

/**
     * 封装请求参数
     *
     * @param paramsMap
     * @return
     */
    protected static Map<String, Object> paramsInit(Map<String, Object> paramsMap) {
        long time = System.currentTimeMillis() / 1000;
        String nonce = UUID.randomUUID().toString();
        String id = UUID.randomUUID().toString();

        StringBuilder paramString = new StringBuilder();
        paramString.append("time:").append(time).append(",");
        paramString.append("nonce:").append(nonce).append(",");
        paramString.append("appSecret:").append(MonitorConstants.APP_SECRET);

        String sign = "";
        // 计算MD5得值
        try {
            sign = DigestUtils.md5Hex(paramString.toString().trim().getBytes("UTF-8"));
        } catch (Exception e) {
            e.printStackTrace();
        }

        Map<String, Object> systemMap = new HashMap<String, Object>();
        systemMap.put("ver", "1.0");
        systemMap.put("sign", sign);
        systemMap.put("appId", MonitorConstants.APP_ID);
        systemMap.put("nonce", nonce);
        systemMap.put("time", time);

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("system", systemMap);
        map.put("params", paramsMap);
        map.put("id", id);
        return map;
    }

设备控制

业务层

/**
     * 监控操作
     *
     * @param deviceGroup
     */
    @Override
    public void controlMovePTZ(DeviceGroup deviceGroup) {

        //获取token
        String token = getToken();

        //监控操作
        control(deviceGroup, token);
    }

获取token(关键)

同上

发送指令(关键)

 /**
     * 云台移动控制
     *
     * @param deviceGroup
     * @param token
     * @return
     */
    private void control(DeviceGroup deviceGroup, String token) {

        try {

            Map<String, Object> paramsMap = new HashMap<>();
            paramsMap.put("token", token);
            paramsMap.put("deviceId", deviceGroup.getMonitorCode());
            paramsMap.put("channelId", "0");
            paramsMap.put("operation", deviceGroup.getOperation());
            paramsMap.put("duration", "1000");

            Map<String, Object> requestParams = paramsInit(paramsMap);
            String requestData = JSONObject.toJSONString(requestParams);

            String result = HttpClientUtil.getToken("https://openapi.lechange.cn/openapi/controlMovePTZ", requestData);
            JSONObject jsonObject = JSONObject.parseObject(result);
            if (!"0".equals(JSONObject.from(jsonObject.get("result")).get("code"))) {
                throw new RuntimeException();
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("监控移动控制失败!");
        }
    }

总结

1.这里是把生成的直播地址存到数据库,只需要生成一次。后续除非是设备解绑,不然这个链接是长期有效的。

2.设备控制是给的默认1秒,每次上下左右移动的持续时长可以自定义。

3.这里只是给出代码案例,彦祖亦菲们根据自己的实际业务场景来修改。

到此这篇关于Java对接乐橙摄像头(绑定设备/直播/控制)的文章就介绍到这了,更多相关Java对接乐橙摄像头内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Lombok使用@Tolerate实现冲突兼容问题

    Lombok使用@Tolerate实现冲突兼容问题

    这篇文章主要介绍了Lombok使用@Tolerate实现冲突兼容问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Java 配置log 将日志信息输出到指定日志文件中

    Java 配置log 将日志信息输出到指定日志文件中

    这篇文章主要介绍了Java 配置log 将日志信息输出到指定日志文件中,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Java  中桥接模式——对象结构型模式的实例详解

    Java 中桥接模式——对象结构型模式的实例详解

    这篇文章主要介绍了Java 中桥接模式——对象结构型模式的实例详解的相关资料,希望通过本文大家能掌握这部分知识,需要的朋友可以参考下
    2017-09-09
  • SpringBoot应用中PDF添加水印的五种实现方案对比

    SpringBoot应用中PDF添加水印的五种实现方案对比

    在 Spring Boot 应用中实现 PDF 添加水印,这篇文章为大家整理了五种常见方案及详细实现步骤,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-08-08
  • java中ThreadLocal的应用场景实例分析

    java中ThreadLocal的应用场景实例分析

    在本篇文章里小编给大家整理的是一篇关于java中ThreadLocal的应用场景实例分析,对此有兴趣的朋友们可以学习参考下。
    2021-02-02
  • mybatis使用pagehelper插件过程详解

    mybatis使用pagehelper插件过程详解

    这篇文章主要介绍了mybatis使用pagehelper插件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • SpringBoot Validation提示信息国际化配置方式

    SpringBoot Validation提示信息国际化配置方式

    这篇文章主要介绍了SpringBoot Validation提示信息国际化配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • springcloud微服务基于redis集群的单点登录实现解析

    springcloud微服务基于redis集群的单点登录实现解析

    这篇文章主要介绍了springcloud微服务基于redis集群的单点登录实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • java中stream的peek()用法详解

    java中stream的peek()用法详解

    这篇文章主要介绍了java中stream的peek()用法详解,peek的作用是
    改变元素的内部状态,对每个object执行 saveInfomation(object, params),然后把结果收集到一个 List 里,这里涉及到了最终操作,需要的朋友可以参考下
    2024-01-01
  • Java 解析Markdown文档格式的两种方式

    Java 解析Markdown文档格式的两种方式

    CommonMark和Flexmark是两种用于解析Markdown文档的Java库,CommonMark提供了一种简洁和一致的Markdown格式语法规范,但不支持目录解析,而Flexmark是一个基于CommonMark的扩展库,不仅遵循了CommonMark规范,还提供了更多灵活的API和扩展功能
    2024-10-10

最新评论