最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java對接樂橙攝像頭詳細步驟(綁定設(shè)備/直播/控制)

 更新時間:2025年12月21日 10:20:20   作者:苡檸苡茉  
大華樂橙SDK(LechangeSDK)是一套由大華科技推出的智能安防領(lǐng)域?qū)S密浖_發(fā)工具包,下面這篇文章主要介紹了Java對接樂橙攝像頭(綁定設(shè)備/直播/控制)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

接入前準備

開發(fā)前需要去官網(wǎng)注冊,獲取開發(fā)需要的appId 和 appSecret
樂橙官網(wǎng)
樂橙開發(fā)文檔

開始接入

話不多說,直接上代碼。按照這個流程走的話,半天就能完全接入!

常量類

/**
* 我們把這些固定的參數(shù)單獨配置,后續(xù)有變動改這里就可以了
*/
public class MonitorConstants {

    /**
     * 監(jiān)控 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";
}

實體類

/**
* 這里給的案例是一個設(shè)備組綁定一個監(jiān)控。大家根據(jù)自己的業(yè)務(wù)情況去修改
*/
@Data
public class DeviceGroup implements Serializable {

    private static final long serialVersionUID = xxx;

    /**
     * 設(shè)備組id
     */
    private Long id;

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

    /**
     * 設(shè)備組名稱
     */
    private String groupName;

    /**
     * 創(chuàng)建時間
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /**
     * 監(jiān)控編碼
     */
    private String monitorCode;

    /**
     * 監(jiān)控鏈接
     */
    private String monitorUrl;

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

    /**
     * 設(shè)備驗證碼或密碼
     */
    private String code;
}

接口

	/**
     * 監(jiān)控綁定
     *
     * @param deviceGroup
     * @return
     */
    @PutMapping("/monitorBind")
    public AjaxResult monitorBind(@RequestBody DeviceGroup deviceGroup) {

        //判斷設(shè)備組是否已經(jīng)綁定監(jiān)控
        int countGroup = monitorService.getGroupMonitorCount(deviceGroup.getId());
        if (countGroup > 0) {
            return error("設(shè)備組只能綁定一個監(jiān)控!");
        }

        //根據(jù)監(jiān)控編碼判斷監(jiān)控是否被綁定
        int count = monitorService.getMonitorIsBinding(deviceGroup.getMonitorCode());
        if (count > 0) {
            return error("監(jiān)控已被綁定,請檢查!");
        }

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

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

綁定設(shè)備和獲取直播流地址

業(yè)務(wù)層

/**
     * 監(jiān)控綁定
     *
     * @param deviceGroup
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int monitorBind(DeviceGroup deviceGroup) {

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

        //綁定設(shè)備
        bindDevice(deviceGroup, token);

        //創(chuàng)建設(shè)備源直播地址
        String monitorUrl = bindDeviceLive(deviceGroup, token);
        if (monitorUrl == null) {
            throw new RuntimeException("創(chuàng)建設(shè)備源直播地址失敗!");
        }

        deviceGroup.setMonitorUrl(monitorUrl);

        return monitorMapper.monitorBind(deviceGroup);
    }

獲取token(關(guān)鍵)

/**
     * 獲取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;
    }

綁定設(shè)備(關(guān)鍵)

/**
     * 綁定設(shè)備
     *
     * @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("綁定設(shè)備失敗!");
        }
    }

創(chuàng)建設(shè)備源直播地址(關(guān)鍵)

 /**
     * 創(chuàng)建設(shè)備源直播地址
     *
     * @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;
    }

統(tǒng)一封裝請求參數(shù)(關(guān)鍵)

/**
     * 封裝請求參數(shù)
     *
     * @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;
    }

設(shè)備控制

業(yè)務(wù)層

/**
     * 監(jiān)控操作
     *
     * @param deviceGroup
     */
    @Override
    public void controlMovePTZ(DeviceGroup deviceGroup) {

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

        //監(jiān)控操作
        control(deviceGroup, token);
    }

獲取token(關(guān)鍵)

同上

發(fā)送指令(關(guān)鍵)

 /**
     * 云臺移動控制
     *
     * @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("監(jiān)控移動控制失敗!");
        }
    }

總結(jié)

1.這里是把生成的直播地址存到數(shù)據(jù)庫,只需要生成一次。后續(xù)除非是設(shè)備解綁,不然這個鏈接是長期有效的。

2.設(shè)備控制是給的默認1秒,每次上下左右移動的持續(xù)時長可以自定義。

3.這里只是給出代碼案例,彥祖亦菲們根據(jù)自己的實際業(yè)務(wù)場景來修改。

到此這篇關(guān)于Java對接樂橙攝像頭(綁定設(shè)備/直播/控制)的文章就介紹到這了,更多相關(guān)Java對接樂橙攝像頭內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Lombok使用@Tolerate實現(xiàn)沖突兼容問題

    Lombok使用@Tolerate實現(xiàn)沖突兼容問題

    這篇文章主要介紹了Lombok使用@Tolerate實現(xiàn)沖突兼容問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java 配置log 將日志信息輸出到指定日志文件中

    Java 配置log 將日志信息輸出到指定日志文件中

    這篇文章主要介紹了Java 配置log 將日志信息輸出到指定日志文件中,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • Java  中橋接模式——對象結(jié)構(gòu)型模式的實例詳解

    Java 中橋接模式——對象結(jié)構(gòu)型模式的實例詳解

    這篇文章主要介紹了Java 中橋接模式——對象結(jié)構(gòu)型模式的實例詳解的相關(guān)資料,希望通過本文大家能掌握這部分知識,需要的朋友可以參考下
    2017-09-09
  • SpringBoot應(yīng)用中PDF添加水印的五種實現(xiàn)方案對比

    SpringBoot應(yīng)用中PDF添加水印的五種實現(xiàn)方案對比

    在 Spring Boot 應(yīng)用中實現(xiàn) PDF 添加水印,這篇文章為大家整理了五種常見方案及詳細實現(xiàn)步驟,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-08-08
  • java中ThreadLocal的應(yīng)用場景實例分析

    java中ThreadLocal的應(yīng)用場景實例分析

    在本篇文章里小編給大家整理的是一篇關(guān)于java中ThreadLocal的應(yīng)用場景實例分析,對此有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-02-02
  • mybatis使用pagehelper插件過程詳解

    mybatis使用pagehelper插件過程詳解

    這篇文章主要介紹了mybatis使用pagehelper插件過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • SpringBoot?Validation提示信息國際化配置方式

    SpringBoot?Validation提示信息國際化配置方式

    這篇文章主要介紹了SpringBoot?Validation提示信息國際化配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • springcloud微服務(wù)基于redis集群的單點登錄實現(xiàn)解析

    springcloud微服務(wù)基于redis集群的單點登錄實現(xiàn)解析

    這篇文章主要介紹了springcloud微服務(wù)基于redis集群的單點登錄實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • java中stream的peek()用法詳解

    java中stream的peek()用法詳解

    這篇文章主要介紹了java中stream的peek()用法詳解,peek的作用是
    改變元素的內(nèi)部狀態(tài),對每個object執(zhí)行 saveInfomation(object, params),然后把結(jié)果收集到一個 List 里,這里涉及到了最終操作,需要的朋友可以參考下
    2024-01-01
  • Java 解析Markdown文檔格式的兩種方式

    Java 解析Markdown文檔格式的兩種方式

    CommonMark和Flexmark是兩種用于解析Markdown文檔的Java庫,CommonMark提供了一種簡潔和一致的Markdown格式語法規(guī)范,但不支持目錄解析,而Flexmark是一個基于CommonMark的擴展庫,不僅遵循了CommonMark規(guī)范,還提供了更多靈活的API和擴展功能
    2024-10-10

最新評論

马鞍山市| 兖州市| 织金县| 大名县| 安达市| 苏尼特右旗| 德保县| 崇左市| 泌阳县| 同江市| 依兰县| 特克斯县| 贵阳市| 沧源| 赤水市| 青阳县| 德格县| 桐梓县| 双桥区| 天等县| 浦城县| 延庆县| 伊金霍洛旗| 临江市| 鹤峰县| 井研县| 太原市| 万荣县| 板桥市| 西青区| 福州市| 奉节县| 双辽市| 常德市| 绵阳市| 仁寿县| 绥中县| 图片| 永顺县| 莱芜市| 九江市|