# 智慧影像科專案-PeopleDirection
###### tags: `智慧影像科專案`
## 操作過程
### 資料庫(**DbTest.java**)
#### 啟動DbMaker資料庫(Jserver Manager)

#### 登入DbMaker資料庫(JDBATool)

#### 清除舊有表格People,以及創建新的表格People
:::success
執行```DbTest.java```
:::

### Samba資料庫取資料(**App.java**)
:::success
執行```App.java```
:::
#### 若成功輸出則印出檔案名稱

#### 成功在兩個資料夾對傳資料

### 分析本地端的Log檔案(**countperson.java**)
#### 原先資料庫表格是空的

:::success
執行```countperson.java```
:::
#### 執行`countperson.java`後
程式每15分鐘會執行一遍

#### 資料庫重新整理後的畫面

## 程式碼
### `DbTest.java`
#### *根據要使用的功能去刪除註解*
```java=
package com.samba.PeopleDirection;
import java.lang.Class;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
//import java.sql.ResultSet;
import java.sql.SQLException;
//import java.sql.Statement;
public class DbTest {
public static void main (String[] args) throws SQLException, InstantiationException, IllegalAccessException{
String driver = "dbmaker.sql.JdbcOdbcDriver";
//連結driver載入驅動程式
try {
Class.forName(driver).newInstance();
}
catch(ClassNotFoundException e) {
//System.out.println(e.getMessage());
}
// 使用 try {} 可以讓 Connection 結束後自動執行 close() 以關閉資料庫。
try (Connection conn = DriverManager.getConnection("jdbc:DBMaker://127.0.0.1:7777/DATA_DB","SYSADM","");) {
//刪除表
PreparedStatement Dt = conn.prepareStatement("DROP TABLE People;");
Dt.execute();
//創建表
PreparedStatement Ct = conn.prepareStatement
("CREATE TABLE People( Datetime varchar(80) NOT NULL "
+ ",Total integer NOT NULL );");
Ct.execute();
// 插入資料
/*PreparedStatement ps = conn.prepareStatement("INSERT INTO People (Datetime ,Type ,Direction ,Total) VALUES(? ,? ,? ,?);");
ps.setInt(1,20190731);
ps.setString(2,"person");
ps.setInt(3,1);
ps.setInt(4,10);*/
//ps.execute();
// 插入資料
//PreparedStatement ps = conn.prepareStatement("INSERT INTO users (name, mail) VALUES(?, ?);");
//ps.execute();
//刪除資料
//PreparedStatement pd = conn.prepareStatement("DELETE FROM People WHERE Total='person' ;");
//pd.execute();
//ps.setString(1, "Shin");
//ps.setString(2, "my@shin.com");
//ps = conn.prepareStatement("SELECT * FROM People;");
// 查詢資料
//ResultSet rs = ps.executeQuery();
//while (rs.next()) {
//System.out.println("Query : " + rs.getString("Datetime") + " , "+ rs.getString("Total"));
//}
}
}
}
```
### `App.java`
```java =
package com.samba.PeopleDirection;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.sql.SQLException;
import java.io.File;
import java.util.*;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONArray;
import java.lang.Class;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
//import java.sql.ResultSet;
public class countperson {
//設定排程時間
public void ScheduleDelay() throws InstantiationException, IllegalAccessException, SQLException {
Timer timer = new Timer();
timer.schedule(new DateTask123() ,1000 ,900000);//第一次執行延遲1秒,每隔15分鐘就執行一次這個Function
try {
Thread.sleep(1000);
}
catch(InterruptedException e) {
}
//timer.cancel();
System.out.println("End testScheduleDelay:" + new Date() + "\n");
}
//主程式
public static void main(String[] args) throws InstantiationException, IllegalAccessException, SQLException {
countperson GL = new countperson();
GL.ScheduleDelay();
}
}
//因為TimerTask需要透過繼承,因此另起一個Class給主程式繼承
class DateTask123 extends TimerTask {
static DateTask123 DT = new DateTask123();
//計算Log檔裡特定欄位的資料
public static String PersonCounting(String documentTxt ,String documentJson ,String ac) {
// 讀取nameID.txt檔案中的NAMEID欄位(key)對應值(value)並存儲
ArrayList<String> list = new ArrayList<String>();
BufferedReader brname;
try {
brname = new BufferedReader(new FileReader("D:/SHIN/SYS/智慧影像科專案/BS_PeopleCounting/src/json/test/"+documentTxt));// 讀取NAMEID對應值
String sname = null;
while ((sname = brname.readLine()) != null) {
list.add(sname);// 將對應value新增到連結串列儲存
}
brname.close();
} catch (IOException e1) {
e1.printStackTrace();
}
// 讀取原始json檔案並進行操作和輸出
try {
BufferedReader br = new BufferedReader(new FileReader(
"D:/SHIN/SYS/智慧影像科專案/BS_PeopleCounting/src/json/test/"+documentJson));// 讀取原始json檔案
//BufferedWriter bw = new BufferedWriter(new FileWriter(
// "src/json/test/"+documentJson));// 輸出新的json檔案
String s = null;
int round=0;
int[] sum = new int[15];
while ((s = br.readLine()) != null) {
try {
JSONObject dataJson = new JSONObject(s);// 建立一個包含原始json串的json物件
{
JSONArray tag = dataJson.getJSONArray("tag");
for (int i = 0; i < tag.length(); i++) {
JSONObject info = tag.getJSONObject(i);// 獲取tag陣列的第i個json物件
double value = info.getDouble("direction");// 讀取info物件裡的direction欄位值
JSONArray type = info.getJSONArray("objectTypes");//讀取info物件裡的objectTypes陣列值
String person = type.toString();// JSONArray 轉 String
boolean status = person.contains("person");//判斷Array值
if(status) {
double pn = Math.ceil(value);//無條件進位value值
if(pn > 0) {
for(int j=1 ; j<12 ; j++ ) {
if(pn == j) {
round++;
sum[j]++;
} } } } } }
} catch (JSONException e) {
e.printStackTrace();
}
}
br.close();
for(int k=1 ; k<12 ; k++ ) {
//System.out.println("路徑方向為" +k +" : " +sum[k] +"人");
}
//轉換字型
ac = Integer.toString(round);
} catch (IOException e) {
e.printStackTrace();
}
return ac;
}
//連結資料庫(創建、刪除、插入資料、查詢)
public static void DbConnect( String documentTxt ,int round ,int finish) throws SQLException, InstantiationException, IllegalAccessException {
String driver = "dbmaker.sql.JdbcOdbcDriver";
//連結driver載入驅動程式
try {
Class.forName(driver).newInstance();
}
catch(ClassNotFoundException e) {
//System.out.println(e.getMessage());
}
// 使用 try {} 可以讓 Connection 結束後自動執行 close() 以關閉資料庫。
try (Connection conn = DriverManager.getConnection("jdbc:DBMaker://127.0.0.1:7777/DATA_DB","SYSADM","");) {
//創建表
//PreparedStatement Ct = conn.prepareStatement
//("CREATE TABLE People( Datetime varchar(80) NOT NULL "
// + ",Total integer NOT NULL );");
//Ct.execute();
//刪除表
//PreparedStatement Dt = conn.prepareStatement("DROP TABLE People;");
//Dt.execute();
// 插入資料
PreparedStatement ps = conn.prepareStatement("INSERT INTO People (Datetime ,Total) VALUES(? ,?);");
ps.setString(1,documentTxt);
ps.setInt(2,round);
ps.execute();
//PreparedStatement ps = conn.prepareStatement("INSERT INTO users (name, mail) VALUES(?, ?);");
//ps.execute();
//刪除資料
//PreparedStatement pd = conn.prepareStatement("DELETE FROM People WHERE Type='person' ;");
//pd.execute();
ps = conn.prepareStatement("SELECT * FROM People;");
// 查詢資料
/*ResultSet rs = ps.executeQuery();
if(finish != 0) {
while (rs.next()) {
System.out.println("Query : " + rs.getString("Datetime") + " : " + rs.getString("Total"));
}
}*/
}
}
//取得本地端資料夾內的資料、檔案數量
public int getlist(File f) {
int size = 0;
File []flist = new File[] {};
flist = f.listFiles();
System.out.println(flist);
size=flist.length;
for (int i = 0; i < flist.length; i++) {
if (flist[i].isDirectory()) {
size = size + getlist(flist[i]);
size--;
}
}
//System.out.println(size);
return size;
}
//此Class_DateTask1232的主程式
public void testrun() throws InstantiationException, IllegalAccessException, SQLException {
//////////////////////////////////////////////////
//countperson GL = new countperson();
int count = 0;
int finish =0 ;
int total=0,TotalTxt=0,round=0;
String ac = null ,documentTxt = null ,documentJson = null ;
File f = new File("D:/SHIN/SYS/智慧影像科專案/BS_PeopleCounting/src/json/test/");
ArrayList<String>fileList = new ArrayList<String>();
String[] self = new String[] {};
self=f.list();
for (int r=0 ; r<DT.getlist(f) ; r++) {
fileList.add(self[TotalTxt]);
TotalTxt++;
}
for(int g=0;g<fileList.size();g++){
//將每份Txt結果寫進DBMaker
documentTxt = (fileList.get(g));
documentJson = (fileList.get(g));
//System.out.println(fileList.get(g)); //印出資料夾內的檔名
round = Integer.valueOf(PersonCounting(documentTxt ,documentJson ,ac));
//System.out.println("此份Log : " +round +"人");
total = total +round;
//System.out.println("全部Log總人數 : "+total +"人");
DbConnect(documentTxt,round,finish);
count = count + round;
}
//Final
documentTxt = "總人數 ";
round = count;
finish++;
//最終結果統計寫進DBMaker
DbConnect(documentTxt,round,finish);
}
//執行Timetask的Function
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Task 執行時間:" + new Date());
try {
DT.testrun();
} catch (InstantiationException | IllegalAccessException | SQLException e) {
e.printStackTrace();
}
}
}
```
### `countperson.java`
``` java=
package com.samba.PeopleDirection;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.sql.SQLException;
import java.io.File;
import java.util.*;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONArray;
import java.lang.Class;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
//import java.sql.ResultSet;
public class countperson {
//設定排程時間
public void ScheduleDelay() throws InstantiationException, IllegalAccessException, SQLException {
Timer timer = new Timer();
timer.schedule(new DateTask123() ,1000 ,900000);//第一次執行延遲1秒,每隔15分鐘就執行一次這個Function
try {
Thread.sleep(1000);
}
catch(InterruptedException e) {
}
//timer.cancel();
System.out.println("End testScheduleDelay:" + new Date() + "\n");
}
//主程式
public static void main(String[] args) throws InstantiationException, IllegalAccessException, SQLException {
countperson GL = new countperson();
GL.ScheduleDelay();
}
}
//因為TimerTask需要透過繼承,因此另起一個Class給主程式繼承
class DateTask123 extends TimerTask {
static DateTask123 DT = new DateTask123();
//計算Log檔裡特定欄位的資料
public static String PersonCounting(String documentTxt ,String documentJson ,String ac) {
// 讀取nameID.txt檔案中的NAMEID欄位(key)對應值(value)並存儲
ArrayList<String> list = new ArrayList<String>();
BufferedReader brname;
try {
brname = new BufferedReader(new FileReader("D:/SHIN/SYS/智慧影像科專案/BS_PeopleCounting/src/json/test/"+documentTxt));// 讀取NAMEID對應值
String sname = null;
while ((sname = brname.readLine()) != null) {
list.add(sname);// 將對應value新增到連結串列儲存
}
brname.close();
} catch (IOException e1) {
e1.printStackTrace();
}
// 讀取原始json檔案並進行操作和輸出
try {
BufferedReader br = new BufferedReader(new FileReader(
"D:/SHIN/SYS/智慧影像科專案/BS_PeopleCounting/src/json/test/"+documentJson));// 讀取原始json檔案
//BufferedWriter bw = new BufferedWriter(new FileWriter(
// "src/json/test/"+documentJson));// 輸出新的json檔案
String s = null;
int round=0;
int[] sum = new int[15];
while ((s = br.readLine()) != null) {
try {
JSONObject dataJson = new JSONObject(s);// 建立一個包含原始json串的json物件
{
JSONArray tag = dataJson.getJSONArray("tag");
for (int i = 0; i < tag.length(); i++) {
JSONObject info = tag.getJSONObject(i);// 獲取tag陣列的第i個json物件
double value = info.getDouble("direction");// 讀取info物件裡的direction欄位值
JSONArray type = info.getJSONArray("objectTypes");//讀取info物件裡的objectTypes陣列值
String person = type.toString();// JSONArray 轉 String
boolean status = person.contains("person");//判斷Array值
if(status) {
double pn = Math.ceil(value);//無條件進位value值
if(pn > 0) {
for(int j=1 ; j<12 ; j++ ) {
if(pn == j) {
round++;
sum[j]++;
} } } } } }
} catch (JSONException e) {
e.printStackTrace();
}
}
br.close();
for(int k=1 ; k<12 ; k++ ) {
//System.out.println("路徑方向為" +k +" : " +sum[k] +"人");
}
//轉換字型
ac = Integer.toString(round);
} catch (IOException e) {
e.printStackTrace();
}
return ac;
}
//連結資料庫(創建、刪除、插入資料、查詢)
public static void DbConnect( String documentTxt ,int round ,int finish) throws SQLException, InstantiationException, IllegalAccessException {
String driver = "dbmaker.sql.JdbcOdbcDriver";
//連結driver載入驅動程式
try {
Class.forName(driver).newInstance();
}
catch(ClassNotFoundException e) {
//System.out.println(e.getMessage());
}
// 使用 try {} 可以讓 Connection 結束後自動執行 close() 以關閉資料庫。
try (Connection conn = DriverManager.getConnection("jdbc:DBMaker://127.0.0.1:7777/DATA_DB","SYSADM","");) {
//創建表
//PreparedStatement Ct = conn.prepareStatement
//("CREATE TABLE People( Datetime varchar(80) NOT NULL "
// + ",Total integer NOT NULL );");
//Ct.execute();
//刪除表
//PreparedStatement Dt = conn.prepareStatement("DROP TABLE People;");
//Dt.execute();
// 插入資料
PreparedStatement ps = conn.prepareStatement("INSERT INTO People (Datetime ,Total) VALUES(? ,?);");
ps.setString(1,documentTxt);
ps.setInt(2,round);
ps.execute();
//PreparedStatement ps = conn.prepareStatement("INSERT INTO users (name, mail) VALUES(?, ?);");
//ps.execute();
//刪除資料
//PreparedStatement pd = conn.prepareStatement("DELETE FROM People WHERE Type='person' ;");
//pd.execute();
ps = conn.prepareStatement("SELECT * FROM People;");
// 查詢資料
/*ResultSet rs = ps.executeQuery();
if(finish != 0) {
while (rs.next()) {
System.out.println("Query : " + rs.getString("Datetime") + " : " + rs.getString("Total"));
}
}*/
}
}
//取得本地端資料夾內的資料、檔案數量
public int getlist(File f) {
int size = 0;
File []flist = new File[] {};
flist = f.listFiles();
size=flist.length;
for (int i = 0; i < flist.length; i++) {
if (flist[i].isDirectory()) {
size = size + getlist(flist[i]);
size--;
}
}
//System.out.println(size);
return size;
}
//此Class_DateTask1232的主程式
public void testrun() throws InstantiationException, IllegalAccessException, SQLException {
//////////////////////////////////////////////////
//countperson GL = new countperson();
int count = 0;
int finish =0 ;
int total=0,TotalTxt=0,round=0;
String ac = null ,documentTxt = null ,documentJson = null ;
File f = new File("D:/SHIN/SYS/智慧影像科專案/BS_PeopleCounting/src/json/test/");
ArrayList<String>fileList = new ArrayList<String>();
String[] self = new String[] {};
self=f.list();
for (int r=0 ; r<DT.getlist(f) ; r++) {
fileList.add(self[TotalTxt]);
TotalTxt++;
}
for(int g=0;g<fileList.size();g++){
//將每份Txt結果寫進DBMaker
documentTxt = (fileList.get(g));
documentJson = (fileList.get(g));
//System.out.println(fileList.get(g)); //印出資料夾內的檔名
round = Integer.valueOf(PersonCounting(documentTxt ,documentJson ,ac));
//System.out.println("此份Log : " +round +"人");
total = total +round;
//System.out.println("全部Log總人數 : "+total +"人");
DbConnect(documentTxt,round,finish);
count = count + round;
}
//Final
documentTxt = "總人數 ";
round = count;
finish++;
//最終結果統計寫進DBMaker
DbConnect(documentTxt,round,finish);
}
//執行Timetask的Function
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Task 執行時間:" + new Date());
try {
DT.testrun();
} catch (InstantiationException | IllegalAccessException | SQLException e) {
e.printStackTrace();
}
}
}
```