记录获取大华摄像头tiktoken流程

轻应用组件开发使用。
账户信息

	private static final String appId = "设备账户appid";
    private static final String appSecret = "设备账户appsecret";
    //获取tiktoken所有accessToken
    private static String accessToken = "";

获取时间戳

	public static Long getTime(){
        String date = DateUtil.getDate(DateUtil.DateFormat1);
        date = date.replace("-","/");
        System.err.println(date);
        String s = String.valueOf(new Date(date).getTime());
        s = s.substring(0,s.length()-3);
        return Long.valueOf(s);
    }

计算请求参数sign

	private static String sign (long time,String nonce){
        String signStr = "time:"+time+",nonce:"+nonce+",appSecret:"+appSecret;
        return MD5(signStr);
    }

    /**
     * 16进制32位
     */
    public final static String MD5(String str) {
        char hexDigits[] = { // 用来将字节转换成 16 进制表示的字符
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        try {
            byte[] strTemp = str.getBytes();
            MessageDigest mdTemp = MessageDigest.getInstance("MD5");
            mdTemp.update(strTemp);
            byte tmp[] = mdTemp.digest(); // MD5 的计算结果是一个 128 位的长整数,
            // 用字节表示就是 16 个字节
            char strs[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
            // 所以表示成 16 进制需要 32 个字符
            int k = 0; // 表示转换结果中对应的字符位置
            for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
                // 转换成 16 进制字符的转换
                byte byte0 = tmp[i]; // 取第 i 个字节
                strs[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
                // >>> 为逻辑右移,将符号位一起右移
                strs[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
            }
//            return new String(strs).toUpperCase(); // 换后的结果转换为字符串
            return new String(strs); // 换后的结果转换为字符串
        } catch (Exception e) {
            return null;
        }
    }

获得accessToken

	public static String getAccessToken(){
        long time = getTime();
        String nonce = UUID.randomUUID().toString();
        String id = UUID.randomUUID().toString();
        String sign = sign(time,nonce);
        Map map = new HashMap();

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

        Map<String,Object> params = new HashMap<>();
        map.put("system",system);
        map.put("id",id);
        map.put("params",params);
        try{
            String jsonStr = JSON.toJSONString(map);
            String s = HttpUtil.doPostJson("https://openapi.lechange.cn:443/openapi/accessToken", jsonStr);
            System.err.println("s"+s);
            JSONObject object = JSON.parseObject(s);
            JSONObject rootObject = new JSONObject(object);
            JSONObject result = rootObject.getJSONObject("result");
            JSONObject data = result.getJSONObject("data");
            accessToken = data.getString("accessToken");
        }catch (Exception e){}
        return accessToken;
    }

获取TikToken
type:播放类型----0:所有权限;1:实时预览;2:录像回放(云录像+本地录像);
deviceId:设备序列号;channelId:设备通道号
如摄像头设备全部存储在一天硬盘录像机中,那设备序列号可直接使用录像机的设备号
轻应用授权token,新获取的kitToken有效期为2个小时。

	public static String getTikToken(String type,String deviceId,int channelId){
        long time = getTime();
        String nonce = UUID.randomUUID().toString();
        String id = UUID.randomUUID().toString();
        String sign = sign(time,nonce);
        Map map = new HashMap();
        if("".equals(accessToken)){
            getAccessToken();
        }
        Map<String,Object> system = new HashMap<>();
        system.put("ver","1.0");
        system.put("appId",appId);
        system.put("sign",sign);
        system.put("time",time);
        system.put("nonce",nonce);

        Map<String,Object> params = new HashMap<>();
        params.put("type",type);
        params.put("deviceId",deviceId);
        params.put("channelId",String.valueOf(channelId));
        params.put("token",accessToken);

        map.put("system",system);
        map.put("id",id);
        map.put("params",params);
        try{
            String jsonStr = JSON.toJSONString(map);
            String s = HttpUtil.doPostJson("https://openapi.lechange.cn:443/openapi/getKitToken", jsonStr);
            System.err.println("s"+s);
            JSONObject object = JSON.parseObject(s);
            JSONObject rootObject = new JSONObject(object);
            JSONObject result = rootObject.getJSONObject("result");
            JSONObject data = result.getJSONObject("data");
            String tikToken = data.getString("kitToken");
            System.err.println(tikToken);
            return tikToken;
        }catch (Exception e){}
        return "";
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下代码获取大华摄像头的rtsp地址和ip: ```java import com.dahua.netsdk.linux.callback.fRealDataCallBackEx; import com.dahua.netsdk.linux.structs.NET_DVR_DEVICEINFO_V30; import com.dahua.netsdk.linux.structs.NET_DVR_PREVIEWINFO; import com.dahua.netsdk.linux.structs.NET_DVR_STREAM_INFO; import com.dahua.netsdk.linux.structs.NET_DVR_STREAM_MODE; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; public class DahuaCamera { private static final String IP_ADDRESS = "192.168.1.64"; private static final String USERNAME = "admin"; private static final String PASSWORD = "admin123"; private static final int CHANNEL = 1; private static final int STREAM_TYPE = 0; private static final int CONNECT_TIMEOUT = 5000; private static final int RECONNECT_INTERVAL = 5000; private static final int REALPLAY_TYPE = 0; private static final int DISPLAY_TYPE = 1; private static final int BUFFER_SIZE = 1024 * 1024; private static NativeLong lUserID = new NativeLong(-1); private static NativeLong lRealPlayHandle = new NativeLong(-1); private static fRealDataCallBackEx cbRealData = new fRealDataCallBackEx() { @Override public void invoke(NativeLong lRealHandle, int dwDataType, Pointer pBuffer, int dwBufSize, Pointer pUser) { // do nothing } }; public static void main(String[] args) { NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30(); lUserID = HCNetSDK.INSTANCE.NET_DVR_Login_V30(IP_ADDRESS, (short) 8000, USERNAME, PASSWORD, deviceInfo); if (lUserID.longValue() == -1) { System.out.println("Login failed: " + HCNetSDK.INSTANCE.NET_DVR_GetLastError()); return; } NET_DVR_PREVIEWINFO previewInfo = new NET_DVR_PREVIEWINFO(); previewInfo.lChannel = new NativeLong(CHANNEL); previewInfo.dwStreamType = STREAM_TYPE; previewInfo.dwLinkMode = 0; previewInfo.bBlocked = true; previewInfo.hHwnd = null; NET_DVR_STREAM_INFO streamInfo = new NET_DVR_STREAM_INFO(); streamInfo.dwSize = streamInfo.size(); streamInfo.dwStreamID = new NativeLong(1); streamInfo.dwField = 1; streamInfo.dwChannel = new NativeLong(CHANNEL); NET_DVR_STREAM_MODE streamMode = new NET_DVR_STREAM_MODE(); streamMode.dwSize = streamMode.size(); streamMode.byGetStreamType = 0; streamMode.byRes1 = 0; streamMode.byRes2 = 0; streamMode.union = new NET_DVR_STREAM_MODE._union(); streamMode.union.getStream = streamInfo; IntByReference error = new IntByReference(); lRealPlayHandle = HCNetSDK.INSTANCE.NET_DVR_RealPlay_V40(lUserID, previewInfo, cbRealData, null); if (lRealPlayHandle.longValue() == -1) { System.out.println("RealPlay failed: " + HCNetSDK.INSTANCE.NET_DVR_GetLastError()); return; } byte[] sOutBuffer = new byte[BUFFER_SIZE]; IntByReference pInt = new IntByReference(0); if (!HCNetSDK.INSTANCE.NET_DVR_GetCurrentStreamURL(lRealPlayHandle, sOutBuffer, BUFFER_SIZE, pInt)) { System.out.println("GetCurrentStreamURL failed: " + HCNetSDK.INSTANCE.NET_DVR_GetLastError()); return; } String rtspUrl = new String(sOutBuffer, 0, pInt.getValue()); System.out.println("RTSP URL: " + rtspUrl); HCNetSDK.INSTANCE.NET_DVR_StopRealPlay(lRealPlayHandle); HCNetSDK.INSTANCE.NET_DVR_Logout(lUserID); } } ``` 其中,IP_ADDRESS、USERNAME、PASSWORD、CHANNEL、STREAM_TYPE 分别代表大华摄像头的IP地址、用户名、密码、通道号和码流类型。运行该代码后,会输出大华摄像头的RTSP地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值