配置Intellij IDEA
第一个java程序:
/**
* @Author:Romulus
* @Date:2022/9/6-09-06-1:18
* @Description:PACKAGE_NAME
* @version:1.0
*/
public class version1 {
public static void main(String[] args){
System.out.println("Hello,My first Java Project");
}
}
运行结果:
python版本
源码
#!D:/workplace/python
# -*- coding: utf-8 -*-
# @File : main0906.py
# @Author:Romulushe
# @Time : 2022/9/6 22:39
# @Software: PyCharm
# @Use: PyCharm
# coding=utf-8
'''
HKCam.py
'''
import os
import platform
from HCNetSDK import *
from PlayCtrl import *
import numpy as np
import time
import cv2
class HKCam(object):
def __init__(self, camIP, username, password, devport=8000):
# 登录的设备信息
self.DEV_IP = create_string_buffer(camIP.encode())
self.DEV_PORT = devport
self.DEV_USER_NAME = create_string_buffer(username.encode())
self.DEV_PASSWORD = create_string_buffer(password.encode())
self.WINDOWS_FLAG = False if platform.system() != "Windows" else True
self.funcRealDataCallBack_V30 = None
self.recent_img = None # 最新帧
self.n_stamp = None # 帧时间戳
self.last_stamp = None # 上次时间戳
# 加载库,先加载依赖库
if self.WINDOWS_FLAG:
os.chdir(r'./lib/win')
self.Objdll = ctypes.CDLL(r'./HCNetSDK.dll') # 加载网络库
self.Playctrldll = ctypes.CDLL(r'./PlayCtrl.dll') # 加载播放库
else:
os.chdir(r'./lib/linux')
self.Objdll = cdll.LoadLibrary(r'./libhcnetsdk.so')
self.Playctrldll = cdll.LoadLibrary(r'./libPlayCtrl.so')
# 设置组件库和SSL库加载路径
self.SetSDKInitCfg()
# 初始化DLL
self.Objdll.NET_DVR_Init()
# 启用SDK写日志
self.Objdll.NET_DVR_SetLogToFile(3, bytes('./SdkLog_Python/', encoding="utf-8"), False)
os.chdir(r'../../')
# 登录
(self.lUserId, self.device_info) = self.LoginDev()
self.Playctrldll.PlayM4_ResetBuffer(self.lUserId, 1)
print(self.lUserId)
if self.lUserId < 0:
err = self.Objdll.NET_DVR_GetLastError()
print('Login device fail, error code is: %d' % self.Objdll.NET_DVR_GetLastError())
# 释放资源
self.Objdll.NET_DVR_Cleanup()
exit()
else:
print(f'摄像头[{camIP}]登录成功!!')
self.start_play()
time.sleep(1)
def start_play(self, ):
# global funcRealDataCallBack_V30
self.PlayCtrl_Port = c_long(-1) # 播放句柄
# 获取一个播放句柄
if not self.Playctrldll.PlayM4_GetPort(byref(self.PlayCtrl_Port)):
print(u'获取播放库句柄失败')
# 定义码流回调函数
self.funcRealDataCallBack_V30 = REALDATACALLBACK(self.RealDataCallBack_V30)
# 开启预览
self.preview_info = NET_DVR_PREVIEWINFO()
self.preview_info.hPlayWnd = 0
self.preview_info.lChannel = 1 # 通道号
self.preview_info.dwStreamType = 0 # 主码流
self.preview_info.dwLinkMode = 0 # TCP
self.preview_info.bBlocked = 1 # 阻塞取流
# 开始预览并且设置回调函数回调获取实时流数据
self.lRealPlayHandle = self.Objdll.NET_DVR_RealPlay_V40(self.lUserId, byref(self.preview_info),
self.funcRealDataCallBack_V30, None)
if self.lRealPlayHandle < 0:
print('Open preview fail, error code is: %d' % self.Objdll.NET_DVR_GetLastError())
# 登出设备
self.Objdll.NET_DVR_Logout(self.lUserId)
# 释放资源
self.Objdll.NET_DVR_Cleanup()
exit()
def SetSDKInitCfg(self, ):
# 设置SDK初始化依赖库路径
# 设置HCNetSDKCom组件库和SSL库加载路径
# print(os.getcwd())
if self.WINDOWS_FLAG:
strPath = os.getcwd().encode('gbk')
sdk_ComPath = NET_DVR_LOCAL_SDK_PATH()
sdk_ComPath.sPath = strPath
self.Objdll.NET_DVR_SetSDKInitCfg(2, byref(sdk_ComPath))
self.Objdll.NET_DVR_SetSDKInitCfg(3, create_string_buffer(strPath + b'\libcrypto-1_1-x64.dll'))
self.Objdll.NET_DVR_SetSDKInitCfg(4, create_string_buffer(strPath + b'\libssl-1_1-x64.dll'))
else:
strPath = os.getcwd().encode('utf-8')
sdk_ComPath = NET_DVR_LOCAL_SDK_PATH()
sdk_ComPath.sPath = strPath
self.Objdll.NET_DVR_SetSDKInitCfg(2, byref(sdk_ComPath))
self.Objdll.NET_DVR_SetSDKInitCfg(3, create_string_buffer(strPath + b'/libcrypto.so.1.1'))
self.Objdll.NET_DVR_SetSDKInitCfg(4, create_string_buffer(strPath + b'/libssl.so.1.1'))
def LoginDev(self, ):
# 登录注册设备
device_info = NET_DVR_DEVICEINFO_V30()
lUserId = self.Objdll.NET_DVR_Login_V30(self.DEV_IP, self.DEV_PORT, self.DEV_USER_NAME, self.DEV_PASSWORD,
byref(device_info))
return (lUserId, device_info)
def read(self, ):
while self.n_stamp == self.last_stamp:
continue
self.last_stamp = self.n_stamp
return self.n_stamp, self.recent_img
def DecCBFun(self, nPort, pBuf, nSize, pFrameInfo, nUser, nReserved2):
if pFrameInfo.contents.nType == 3:
t0 = time.time()
# 解码返回视频YUV数据,将YUV数据转成jpg图片保存到本地
# 如果有耗时处理,需要将解码数据拷贝到回调函数外面的其他线程里面处理,避免阻塞回调导致解码丢帧
nWidth = pFrameInfo.contents.nWidth
nHeight = pFrameInfo.contents.nHeight
# nType = pFrameInfo.contents.nType
dwFrameNum = pFrameInfo.contents.dwFrameNum
nStamp = pFrameInfo.contents.nStamp
# print(nWidth, nHeight, nType, dwFrameNum, nStamp, sFileName)
YUV = np.frombuffer(pBuf[:nSize], dtype=np.uint8)
YUV = np.reshape(YUV, [nHeight + nHeight // 2, nWidth])
img_rgb = cv2.cvtColor(YUV, cv2.COLOR_YUV2BGR_YV12)
self.recent_img, self.n_stamp = img_rgb, nStamp
def RealDataCallBack_V30(self, lPlayHandle, dwDataType, pBuffer, dwBufSize, pUser):
# 码流回调函数
if dwDataType == NET_DVR_SYSHEAD:
# 设置流播放模式
self.Playctrldll.PlayM4_SetStreamOpenMode(self.PlayCtrl_Port, 0)
# 打开码流,送入40字节系统头数据
if self.Playctrldll.PlayM4_OpenStream(self.PlayCtrl_Port, pBuffer, dwBufSize, 1024 * 1024):
# 设置解码回调,可以返回解码后YUV视频数据
# global FuncDecCB
self.FuncDecCB = DECCBFUNWIN(self.DecCBFun)
self.Playctrldll.PlayM4_SetDecCallBackExMend(self.PlayCtrl_Port, self.FuncDecCB, None, 0, None)
# 开始解码播放
if self.Playctrldll.PlayM4_Play(self.PlayCtrl_Port, None):
print(u'播放库播放成功')
else:
print(u'播放库播放失败')
else:
print(u'播放库打开流失败')
elif dwDataType == NET_DVR_STREAMDATA:
self.Playctrldll.PlayM4_InputData(self.PlayCtrl_Port, pBuffer, dwBufSize)
else:
print(u'其他数据,长度:', dwBufSize)
def release(self):
self.Objdll.NET_DVR_StopRealPlay(self.lRealPlayHandle)
if self.PlayCtrl_Port.value > -1:
self.Playctrldll.PlayM4_Stop(self.PlayCtrl_Port)
self.Playctrldll.PlayM4_CloseStream(self.PlayCtrl_Port)
self.Playctrldll.PlayM4_FreePort(self.PlayCtrl_Port)
PlayCtrl_Port = c_long(-1)
self.Objdll.NET_DVR_Logout(self.lUserId)
self.Objdll.NET_DVR_Cleanup()
print('释放资源结束')
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.release()
if __name__ == "__main__":
camIP = '192.168.1.64'
DEV_PORT = 8000
username = 'admin'
password = 'ms00a1@2022'
hkclass = HKCam(camIP, username, password)
last_stamp = 0
while True:
t0 = time.time()
n_stamp, img = hkclass.read()
last_stamp = n_stamp
cv2.imshow('camera', cv2.resize(img, (800, 600)))
kkk = cv2.waitKey(1)
if kkk == ord('q'):
break
hkclass.release()
安装依赖
pip install --user flask -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install --user jpype1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install --user subprocess -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install --user chardet -i https://pypi.tuna.tsinghua.edu.cn/simple
python调用jar包
import jpype
jvmPath = jpype.getDefaultJVMPath()
# print(jvmPath)
# jvmPath = ur'D:\Program Files\Java\jdk-18.0.1.1\bin\server\jvm.dll'
# jpype.startJVM(jvmPath)
# jpype.java.lang.System.out.println("hello world!")
# 启动
jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=TemDataCollectDemo.jar")
jpype.shutdownJVM()
路径不能有中文
import os
import jpype
def sendMessage():
# 1.加载jar包
jarpath = os.path.join(os.path.abspath("."), "TemDataCollectDemo.jar")
print(jarpath)
# 2.获取jvm.dll 的文件路径
jvmPath = jpype.getDefaultJVMPath()
print(jvmPath)
# 3.开启jvm
jpype.startJVM(jvmPath, "-ea", "-Djava.class.path=%s" % (jarpath))
print("jvmPath")
# 4.加载java类(参数是java的长类名)
# MainProcess = jpype.JClass(jarpath+"TemDataCollectDemo.src.Main") # 加载类
MainProcess = jpype.JClass("TemDataCollectDemo.Main") # 加载类
# 5.实例化java对象
javaInstance =MainProcess()
# 6.调用java方法,由于我写的是静态方法,直接使用类名就可以调用方法
javaInstance.main()
# 7.关闭jvm
jpype.shutdownJVM()
pass
sendMessage()
参考链接
参考链接1
参考链接2
报错
Java MySql
wait_timeout=31536000
interactive_timeout=31536000
Java数据库
package jdbc;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestJDBC {
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn = null;
try {
//1.数据库连接的4个基本要素
//①JDBC URL用于标识一个被注册的驱动程序,驱动程序管理器通过这个URL选择正确的驱动程序,从而建立到数据库的连接;
//jdbc:表示URL中的协议
//mysql:子协议,用于标识mysql数据库驱动程序
//localhost:本机的IP地址
//3306:mysql 默认端口号
//test:表示访问test数据库
String url = "jdbc:mysql://192.168.50.132:3306/bim";
//user:登录数据库的用户名
String user = "root"; //自己的账号
//password:用户名对应的密码,这些都是自己之前设定的
String password = "root"; //自己的密码
//mySql的驱动:com.mysql.jdbc.Driver
String driverName = "com.mysql.jdbc.Driver";
//2.实例化Driver
Class clazz = Class.forName(driverName);
Driver driver = (Driver) clazz.newInstance();
//3.通过DriverManager来注册驱动
DriverManager.registerDriver(driver);
//4.通过DriverManager的getConnection方法,获取Connection类的对象
System.out.println("url:"+url);
System.out.println("user:"+user);
System.out.println("password:"+password);
try {
conn = DriverManager.getConnection(url, user, password);
}
catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("yes");
System.out.println("ERROR:"+e);
e.printStackTrace();}
//5.打印出conn对象
System.out.println(conn);
//获取statement对象
/*Statement statement = connection.createStatement();*/
String sql = "select * from stu";
PreparedStatement preparedStatement = conn.prepareStatement(sql);
//执行语句
/**/
ResultSet resultSet = preparedStatement.executeQuery(sql);
//返回地数据存储在result中
while (resultSet.next()){
System.out.print("[");
System.out.print( resultSet.getInt(1)+"\t"); //第一列 对应的字段
// System.out.print( resultSet.getInt("id")+"\t");
System.out.print( resultSet.getString("name")+"\t");
System.out.print( resultSet.getString("sex")+"\t");
System.out.println("]");
}
if (resultSet != null){
resultSet.close();
}
if(preparedStatement != null){
preparedStatement.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
//当conn不为空时
if(conn != null)
//关闭conn资源
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Java下载链接
mysql-connector-java8.0.28.jar
package jdbc;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestJDBC {
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn = null;
try {
//1.数据库连接的4个基本要素
//①JDBC URL用于标识一个被注册的驱动程序,驱动程序管理器通过这个URL选择正确的驱动程序,从而建立到数据库的连接;
//jdbc:表示URL中的协议
//mysql:子协议,用于标识mysql数据库驱动程序
//localhost:本机的IP地址
//3306:mysql 默认端口号
//test:表示访问test数据库
// String url = "jdbc:mysql://localhost:3306/bim";
String url = "jdbc:mysql://localhost:3306/bim?autoReconnect=true&failOverReadOnly=false&useSSL=false&serverTimezone=UTC";
//user:登录数据库的用户名
String user = "root"; //自己的账号
//password:用户名对应的密码,这些都是自己之前设定的
String password = "root"; //自己的密码
//mySql的驱动:com.mysql.jdbc.Driver
String driverName = "com.mysql.jdbc.Driver";
//2.实例化Driver
Class clazz = Class.forName(driverName);
Driver driver = (Driver) clazz.newInstance();
//3.通过DriverManager来注册驱动
DriverManager.registerDriver(driver);
//4.通过DriverManager的getConnection方法,获取Connection类的对象
System.out.println("url:"+url);
System.out.println("user:"+user);
System.out.println("password:"+password);
try {
conn = DriverManager.getConnection(url, user, password);
}
catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("yes");
System.out.println("ERROR:"+e);
e.printStackTrace();}
//5.打印出conn对象
if (conn==null)
System.out.println("conn=null");
else
System.out.println(conn);
//获取statement对象
/*Statement statement = connection.createStatement();*/
String sql = "select * from stu";
System.out.println("成功");
PreparedStatement preparedStatement = conn.prepareStatement(sql);
//执行语句
/**/
ResultSet resultSet = preparedStatement.executeQuery(sql);
//返回地数据存储在result中
while (resultSet.next()){
System.out.print("[");
System.out.print( resultSet.getInt(1)+"\t"); //第一列 对应的字段
// System.out.print( resultSet.getInt("id")+"\t");
System.out.print( resultSet.getString("name")+"\t");
System.out.print( resultSet.getString("sex")+"\t");
System.out.println("]");
}
if (resultSet != null){
resultSet.close();
}
if(preparedStatement != null){
preparedStatement.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
//当conn不为空时
if(conn != null)
//关闭conn资源
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//获取statement对象
/*Statement statement = connection.createStatement();*/
// Connection con = null;
PreparedStatement stmt = null;
ResultSet rs = null;
String sql = "insert into stu values ('6','李白','女')";
stmt = conn.prepareStatement(sql);
// int result =stmt.executeUpdate();// 返回值代表收到影响的行数
System.out.println("插入成功");