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对接乐橙摄像头内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java继承映射的三种使用方法示例

    Java继承映射的三种使用方法示例

    继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,这篇文章主要介绍了Java继承映射的三种使用方法示例,需要的朋友可以参考下
    2025-06-06
  • java为什么使用BlockingQueue解决竞态条件问题面试精讲

    java为什么使用BlockingQueue解决竞态条件问题面试精讲

    这篇文章主要为大家介绍了java为什么使用BlockingQueue解决竞态条件问题面试精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • JDK1.8下载、安装和环境配置超详细教程(最新最完整)

    JDK1.8下载、安装和环境配置超详细教程(最新最完整)

    jdk1.8是一款功能强大的Java语音软件开发工具包,JDK是学好Java的第一步,本文重点给大家介绍JDK1.8下载、安装和环境配置教程,需要的朋友可以参考下
    2022-11-11
  • 快速了解Maven

    快速了解Maven

    这篇文章主要介绍了快速了解Maven,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Java如何实现N叉树数据结构

    Java如何实现N叉树数据结构

    这篇文章主要介绍了Java如何实现N叉树数据结构问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 在SpringBoot中使用YourKit进行性能调优的教程详解

    在SpringBoot中使用YourKit进行性能调优的教程详解

    在应用程序的开发过程中,性能调优是一个重要的环节,在SpringBoot应用程序中,我们可以使用YourKit来进行性能调优,YourKit是一款非常强大的Java性能调优工具,在本文中,我们将介绍如何在 SpringBoot应用程序中使用YourKit进行性能调优
    2023-06-06
  • java通过cglib动态生成实体bean的操作

    java通过cglib动态生成实体bean的操作

    这篇文章主要介绍了java通过cglib动态生成实体bean的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • SpringBoot实现启动项目后立即执行的方法总结

    SpringBoot实现启动项目后立即执行的方法总结

    在项目开发中某些场景必须要用到启动项目后立即执行方式的功能,所以这篇文章就来和大家聊聊实现立即执行的几种方法,希望对大家有所帮助
    2023-05-05
  • 浅析JVM的垃圾回收器

    浅析JVM的垃圾回收器

    这篇文章主要介绍了JVM垃圾回收器的相关资料,帮助大家更好的理解和学习Java虚拟机的相关知识,感兴趣的朋友可以了解下
    2020-11-11
  • Java实现图片上传至FastDFS入门教程

    Java实现图片上传至FastDFS入门教程

    这篇文章主要介绍了Java实现图片上传至FastDFS入门教程,通过前端ajax提交图片到后端,java处理服务器文件上传至FastDFS文件服务器系统,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论