Java對接樂橙攝像頭詳細(xì)步驟(綁定設(shè)備/直播/控制)
接入前準(zhǔ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è)備控制是給的默認(rèn)1秒,每次上下左右移動的持續(xù)時長可以自定義。
3.這里只是給出代碼案例,彥祖亦菲們根據(jù)自己的實際業(yè)務(wù)場景來修改。
到此這篇關(guān)于Java對接樂橙攝像頭(綁定設(shè)備/直播/控制)的文章就介紹到這了,更多相關(guān)Java對接樂橙攝像頭內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java為什么使用BlockingQueue解決競態(tài)條件問題面試精講
這篇文章主要為大家介紹了java為什么使用BlockingQueue解決競態(tài)條件問題面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
JDK1.8下載、安裝和環(huán)境配置超詳細(xì)教程(最新最完整)
jdk1.8是一款功能強(qiáng)大的Java語音軟件開發(fā)工具包,JDK是學(xué)好Java的第一步,本文重點給大家介紹JDK1.8下載、安裝和環(huán)境配置教程,需要的朋友可以參考下2022-11-11
Java如何實現(xiàn)N叉樹數(shù)據(jù)結(jié)構(gòu)
這篇文章主要介紹了Java如何實現(xiàn)N叉樹數(shù)據(jù)結(jié)構(gòu)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
在SpringBoot中使用YourKit進(jìn)行性能調(diào)優(yōu)的教程詳解
在應(yīng)用程序的開發(fā)過程中,性能調(diào)優(yōu)是一個重要的環(huán)節(jié),在SpringBoot應(yīng)用程序中,我們可以使用YourKit來進(jìn)行性能調(diào)優(yōu),YourKit是一款非常強(qiáng)大的Java性能調(diào)優(yōu)工具,在本文中,我們將介紹如何在 SpringBoot應(yīng)用程序中使用YourKit進(jìn)行性能調(diào)優(yōu)2023-06-06
SpringBoot實現(xiàn)啟動項目后立即執(zhí)行的方法總結(jié)
在項目開發(fā)中某些場景必須要用到啟動項目后立即執(zhí)行方式的功能,所以這篇文章就來和大家聊聊實現(xiàn)立即執(zhí)行的幾種方法,希望對大家有所幫助2023-05-05

