Files
Desktop_RCULogAgent/Form1.vb

1963 lines
80 KiB
VB.net
Raw Normal View History

2025-12-11 11:39:02 +08:00
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Data
Imports System.Net
Imports System.Net.WebRequestMethods
Imports Scripting
Imports System.IO
Imports System.IO.Path
Imports MySql.Data.MySqlClient
Imports Aliyun.Api.LOG.Data
Imports System.Threading
Imports Aliyun.Api.LOG.Response
Imports RCU_LogAgent_sqllite.UTSModule
Imports Microsoft.VisualBasic
Imports System.Data.Common
Imports RCU_LogAgent_sqllite.UTSModule.DbConnect
Imports System.Data.SQLite
Public Class Form1
Private Shared Log_Data_Len_Max As Int16 = 512
Enum MyParama
Parma1
Parma2
Parma3
Parma4
Parma5
Parma6
Parma7
Parma8
Parma9
Parma10
End Enum
''' <summary>
''' 日志数据类型
''' </summary>
Enum log_type
Launcher = 1 'Launcher信息记录
SYS_Record '系统运行信息记录
Device_COMM '设备通讯记录
Device_Online '设备通讯状态记录
Global_Parameters '所有设备状态定期记录 - 暂时还没用
Net_COMM '网络通讯记录 - 暂时还没定
Logic_Record '逻辑处理记录 - 暂时还没定
End Enum
''' <summary>
''' 日志数据 - Launcher记录信息
''' </summary>
Enum LLauncher
''' <summary>
''' 校验APP
''' </summary>
App_Check = 1
''' <summary>
''' 读取APP
''' </summary>
Read_App
''' <summary>
''' 写Flash
''' </summary>
Write_Flash
''' <summary>
''' 恢复出厂设置
''' </summary>
Factory_Reset
''' <summary>
''' 复位信号源
''' 0x00软件复位
''' 0x01上电复位
''' 0x02看门狗复位
''' 0x03外部手动复位
''' 0x05从下电模式唤醒时的复位 - 通过WCHISPTool烧录后的复位
''' </summary>
Reset_Source
End Enum
''' <summary>
''' 日志数据 - 系统运行信息
''' </summary>
Enum LSYS
PHY_Change = 1 'PHY状态变化记录
DevInfo_Error '设备链表信息错误
API_State '升级状态
NET_ARGC '网络初始化参数
MQTT_ARGC 'MQTT参数
NetComm_State '网络通讯状态
NET_DafaultARGC '网络默认参数
End Enum
''' <summary>
''' 日志数据 - 设备通讯信息
''' </summary>
Enum LCOMM
ASK_TO_Reply = 1 '轮询回复数据
Send_Control 'RCU下发控制数据
Control_Reply 'RCU控制回复数据
Adjust_Baud '设备调整波特率
End Enum
''' <summary>
''' 日志数据 - 所有设备状态信息
''' </summary>
Enum LGlobal
G_Para = 1 '参数数据
G_Dev '设备数据
End Enum
Enum LNetComm
N_Send = 1 '网络发送数据
N_Recv '网络接收数据
End Enum
Enum LOG_DEV_State
Online = &H1
Offline = &H2
End Enum
''' <summary>
''' BLV设备类型
''' </summary>
Enum BLV_DEVICE_TYPE
RS485_Switch = &H6 'T1开关
RS485_Temp = &H7 'T1温控器
RS485_Card = &HA 'T1插卡取电
RS485_IR_SEND = &HF '红外转发
RS485_RGB_Light = &H12 'RGB灯带
RS485_XiaoBao = &H13 '小宝语音
RS485_Time = &H23 '时间同步
C12Dimming = &H12 'BLV_Cx Dimming设备
C5Music = &H15 'BLV_Cx MUSIC设备
C5IO = &HF1 'BLV_Cx IO设备
PC_TEST = &HF2 'BLV_Cx PC测试
End Enum
''' <summary>
''' dat原始文件内容中的数据格式
''' </summary>
Enum LOG_DATA_FORMAT
Hand = 0
SN '日志每条数据增加序列号
Len
Len_8 '新增
Check
Date_H '年5bit 月5bit 日5bit
Date_L
Type
Time8B '小时时间戳
Time16B
Time24B
Time32B
Data
End Enum
''' <summary>
''' 解析后的数据包格式
''' </summary>
Class Parsing_Data_List
Public original_data() As Byte '数据包
Public type As Byte '数据类型
Public sn As Byte '序号
Public tick As New LOG_DATE '日期时间
Public len As Int32 '长度
Public interval_time As Int64 '时间间隔
Public data() As Byte '文件数据内容
Public parsing As String '解析
End Class
''' <summary>
''' 温控器设备数据结构
''' </summary>
Class Device_Temp
Public on_off As Byte '开关机
Public mode As Byte '模式
Public fan As Byte '风速
Public valve As Byte '阀门
Public set_temp As Byte '设置温度
Public indoor_temp As Byte '室内温度
End Class
''' <summary>
''' dat 文件内的日期数据结构
''' </summary>
Class LOG_DATE
Public year As UInt16
Public month As Byte
Public day As Byte
Public hour As Byte
Public minute As Byte
Public second As Byte
Public milliscond As UInt16
End Class
Public Structure Log_DateStruct
Public year As UInt16
Public month As Byte
Public day As Byte
Public hour As Byte
Public minute As Byte
Public second As Byte
Public milliscond As UInt16
End Structure
''' <summary>
''' 文件名结构解析
''' </summary>
Public Structure fileNameInfoStruct
Public MAC As String
Public HotelId As String
Public RoomId As String
Public CreateDateTime As String
Public LogFileName As String
End Structure
''' <summary>
''' 文件内容结构解析
''' </summary>
Public Structure LogDataInfoStruct
Public Log_Valid As Boolean
Public Log_SN As UInt16
Public Log_Len As UInt16
Public Log_DateTime As Log_DateStruct
Public Log_TimeSpan As Int64
Public Log_Type As Byte
Public Log_Content() As Byte
Public HotelId As String
Public RoomId As String
Public CreateDateTime As String
Public LogFileName As String
Public parsing As List(Of String)
End Structure
Public isFirstrecord As Boolean = False
Public gIsAutoFresh As Boolean = True
''' <summary>
''' 开始扫描按钮
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
TIM_AutoRefersh.Stop() '扫描期间关闭自动刷新
ScanFile() '启动扫描
Button2.PerformClick() '重新获取扫描时间间隔
TIM_AutoRefersh.Start() '扫描完成后重新开启自动刷新
End Sub
'Dim g_StrPath As String = "D:\Sync\RD_PC\Project\BLV_RcuLogAgent\data\"
'Dim g_StrPath As String = "D:\VB_UDP"
''' <summary>
''' 搜索数据
''' </summary>
Private Sub ScanFile()
Dim g_StrPath As String = DirPath_txt.Text
'Console.WriteLine($"开始扫描")
ShowRichTextBox(RichTextBox1, "***************************************************************")
ShowRichTextBox(RichTextBox1, "开始扫描,路径:" & g_StrPath)
Dim nowtime As Date = Now
If Directory.Exists(g_StrPath) = False Then Return '指定目录不存在
Dim ObjFileSystem As New FileSystemObject
Dim datas As IReadOnlyCollection(Of String) = My.Computer.FileSystem.GetFiles(g_StrPath) '获取文件夹内的文件路径集合
Dim RecordList As New Dictionary(Of String, List(Of List(Of LogDataInfoStruct)))
Dim AvalibFileList As New List(Of Scripting.File)
Dim ErrMsg As String = ""
Dim totalProcessedRecord As Integer = 0
Dim totalProcessedFileCount As Integer = 0
lab_TheartMonitor.Text = 0
For Each strFileName As String In datas
Try
ShowRichTextBox(RichTextBox1, "---- 开始解析:" & strFileName)
'如果文件占用就跳过,继续循环
If IsFileReady(strFileName) = False Then Continue For
Dim tmpFileInfo As New FileInfo(strFileName)
Dim LastModified As Integer = (Now - tmpFileInfo.LastWriteTime).Minutes
Dim ObjFileExtName As String = tmpFileInfo.Extension.ToUpper '获取文件后缀名
Dim FileSize As Integer = tmpFileInfo.Length
'Dim LastModified As Integer = (Now - IO.File.GetLastWriteTime(strFileName)).Minutes
'Dim ObjFileExtName As String = GetExtension(strFileName).ToUpper '获取文件后缀名
'Dim FileSize As Integer = ObjFile.Size
'MsgBox(strFileName & " : " & tmpFileInfo.LastWriteTime & vbCrLf &
' strFileName & " : " & tmpFileInfo.Length & vbCrLf &
' strFileName & " : " & FileSize & vbCrLf & vbCrLf &
' strFileName & " : " & tmpFileInfo.Extension.ToUpper & vbCrLf &
' strFileName & " : " & ObjFileExtName & vbCrLf)
'MsgBox(strFileName & " : " & tmpFileInfo.LastWriteTime & vbCrLf &
' strFileName & " : " & ObjFile.DateLastModified & vbCrLf & vbCrLf &
' strFileName & " : " & tmpFileInfo.Length & vbCrLf &
' strFileName & " : " & FileSize & vbCrLf & vbCrLf &
' strFileName & " : " & tmpFileInfo.Extension.ToUpper & vbCrLf &
' strFileName & " : " & ObjFileExtName & vbCrLf)
If ObjFileExtName <> ".DAT" OrElse
FileSize = 0 OrElse
LastModified < 1 Then
If ObjFileExtName <> ".DAT" OrElse
FileSize = 0 Then
DeleteErrorFile(g_StrPath strFileName) '删除非法文件
End If
Continue For
End If
'文件内容读取到 objfile 中
'ShowRichTextBox(RichTextBox1, ">>>read" & strFileName)
Dim ObjFile As Scripting.File = ObjFileSystem.GetFile(strFileName)
'解析文件名获取MAC、酒店id、房号、生成日期等信息
Dim tmpFileNameInfo As fileNameInfoStruct = GetFileNameInfo(ObjFile)
'解析文件内容,获取详细文件信息
Dim tmpDataInfoList As New List(Of LogDataInfoStruct) '读取文件内容保存在此变量
'ShowRichTextBox(RichTextBox1, ">>>get" & strFileName)
Dim tmpResult As Boolean = GetFileInfoList(tmpFileNameInfo, ObjFile, tmpDataInfoList, ErrMsg)
If tmpResult = False Then
AddErrorFileToErrorfileg_StrPath strFileName '错误文件
Continue For '读取文件失败
End If
'文件解析合法
'ShowRichTextBox(RichTextBox1, ">>>add" & strFileName)
AvalibFileList.Add(ObjFile)
'Console.WriteLine($"解析时间:{(Now - nowtime).TotalMilliseconds}")
'打印文件信息
'ConsoleWirteFileInfo(ObjFile)
Dim MacDataList As New List(Of List(Of LogDataInfoStruct))
'判断键值对是否存在
Dim tmpKey As String = tmpFileNameInfo.MAC
If RecordList.ContainsKey(tmpKey) Then
'存在,加入新值
RecordList(tmpKey).Add(tmpDataInfoList)
Else
'不存在,创建键值对,并加入新值
MacDataList.Add(tmpDataInfoList)
RecordList.Add(tmpFileNameInfo.MAC, MacDataList)
End If
totalProcessedFileCount += 1
totalProcessedRecord += tmpDataInfoList.Count
Dim tmpStrMsg As String = totalProcessedFileCount &
" : 解析文件成功:" & strFileName & vbNewLine &
" Size " & ObjFile.Size &
" ,Reocrd: " & tmpDataInfoList.Count &
" ,Total: " & totalProcessedRecord
ShowRichTextBox(RichTextBox1, tmpStrMsg)
If totalProcessedRecord > 10000 Then Exit For '記錄20000條以後先解析寫庫
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
ShowRichTextBox(RichTextBox1, "Error" & ex.ToString)
Continue For
End Try
Next
Try
nowtime = Now
'写数据库
ShowRichTextBox(RichTextBox1, "准备写入数据库!")
Dim tmpWriteDbResult As Boolean = WriteDataToDB(RecordList)
If tmpWriteDbResult = True Then
'写库成功:移动文件
'exeDeleteFileList(AvalibFileList)
'上传到ftp
Else
'写库失败:退出并打印错误信息
Return
End If
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
ShowRichTextBox(RichTextBox1, "Error" & ex.ToString)
End Try
Console.WriteLine($"写库执行时间:{(Now - nowtime).TotalMilliseconds}")
End Sub
''' <summary>
''' 添加错误文件到错误文件夹 会删除源文件
''' </summary>
''' <param name="g_StrPath"> 错误文件夹的路径</param>
''' <param name="strFileName">错误文件完整路径</param>
Private Sub AddErrorFileToErrorfile(g_StrPath As String, strFileName As String)
Dim errorfilepath As String = g_StrPath & "Errorfilepath\"
If Not IO.Directory.Exists(errorfilepath) Then
IO.Directory.CreateDirectory(errorfilepath)
End If
errorfilepath = errorfilepath & strFileName.Substring(strFileName.LastIndexOf("\") + 1)
IO.File.Copy(strFileName, errorfilepath, True)
IO.File.Delete(strFileName)
End Sub
Private Sub DeleteErrorFile(g_StrPath As String, strFileName As String)
'Dim errorfilepath As String = g_StrPath & "Errorfilepath\"
'If Not IO.Directory.Exists(errorfilepath) Then
' IO.Directory.CreateDirectory(errorfilepath)
'End If
'errorfilepath = errorfilepath & strFileName.Substring(strFileName.LastIndexOf("\") + 1)
'IO.File.Copy(strFileName, errorfilepath)
IO.File.Delete(strFileName)
End Sub
''' <summary>
''' 拼接sql语句入库
''' </summary>
''' <param name="dataDict"></param>
''' <returns></returns>
Private Function WriteDataToDB(ByVal dataDict As Dictionary(Of String, List(Of List(Of LogDataInfoStruct)))) As Boolean
Dim tmpDelayTime As Integer = 0
Dim tmpLogCntWithMac As Integer = 0
Try
'解析键值对,生成缓存数据
For Each strMacAdd As String In dataDict.Keys
'解析集合数据
For Each lstLogDataInfo As List(Of LogDataInfoStruct) In dataDict(strMacAdd)
For Each logDataInfo As LogDataInfoStruct In lstLogDataInfo
tmpLogCntWithMac += 1
'AddSLSRequestData(strMacAdd, logDataInfo, logDataInfo.parsing) '阿里云入库
'每满1000条后停下来等先入库
'If _LogList.Count > 1000 Then
' ShowRichTextBox(RichTextBox1, " ... ... _LogList.Count:" & _LogList.Count & ", 等待入库...")
' gIsSlsWrited = False
' While gIsSlsWrited = False
' Application.DoEvents()
' End While
' ShowRichTextBox(RichTextBox1, " ... ... 入库完成!")
'End If
AddLoadSqlRequestData(strMacAdd, logDataInfo, logDataInfo.parsing) '本地入库
Next
'delay(1)
Application.DoEvents()
Next
ShowRichTextBox(RichTextBox1, " --- MAC" & strMacAdd & " , cnt:" & tmpLogCntWithMac)
tmpLogCntWithMac = 0
Next
Return True
Catch ex As Exception
'Console.WriteLine($"写库失败")
AdminLog.ApplicationLog.WriteErrorLog(ex)
Return False
End Try
End Function
Private _1970StartDateTime As DateTime = TimeZone.CurrentTimeZone.ToLocalTime(New System.DateTime(1970, 1, 1, 0, 0, 0, 0))
Public Function AddLoadSqlRequestData(strMacAdd As String, logDataInfo As Form1.LogDataInfoStruct, parsing_data As List(Of String))
Dim DataTimes As String = Parsing_DateTime(logDataInfo.Log_DateTime)
Dim data_string = BitConverter.ToString(logDataInfo.Log_Content).Replace("-", " ")
Dim dic As New Dictionary(Of String, String)
dic.Add("TimeSpan", CTypeMath.Round((DateTime.Now - _1970StartDateTime).TotalSeconds, MidpointRounding.AwayFromZero) UInteger))
dic.Add("MAC".ToLower(), $"{strMacAdd}")
dic.Add("CreateDateTime".ToLower(), $"{logDataInfo.CreateDateTime}")
dic.Add("LogFileName".ToLower(), $"{logDataInfo.LogFileName}")
dic.Add("LogProjectid".ToLower(), $"{logDataInfo.HotelId}")
dic.Add("LogRoomid".ToLower(), $"{logDataInfo.RoomId}")
dic.Add("Log_Valid".ToLower(), $"{logDataInfo.Log_Valid}")
dic.Add("Log_SN".ToLower(), $"{logDataInfo.Log_SN}")
dic.Add("Log_Len".ToLower(), $"{logDataInfo.Log_Len}")
dic.Add("Log_DateTime".ToLower(), $"{DataTimes}")
dic.Add("Log_TimeSpan".ToLower(), $"{logDataInfo.Log_TimeSpan}")
dic.Add("Log_Type".ToLower(), $"{logDataInfo.Log_Type}")
dic.Add("Log_Content".ToLower(), $"{data_string}")
dic.Add("Type_Param_1".ToLower(), $"{parsing_data(0)}")
dic.Add("Type_Param_2".ToLower(), $"{parsing_data(1)}")
dic.Add("Type_Param_3".ToLower(), $"{parsing_data(2)}")
dic.Add("Type_Param_4".ToLower(), $"{parsing_data(3)}")
dic.Add("Type_Param_5".ToLower(), $"{parsing_data(4)}")
dic.Add("Type_Param_6".ToLower(), $"{parsing_data(5)}")
dic.Add("Type_Param_7".ToLower(), $"{parsing_data(6)}")
dic.Add("Type_Param_8".ToLower(), $"{parsing_data(7)}")
dic.Add("Type_Param_9".ToLower(), $"{parsing_data(8)}")
dic.Add("Type_Param_10".ToLower(), $"{parsing_data(9)}")
dic.Add("Remark".ToLower(), " ")
If Not IO.File.Exists($"{Application.StartupPath }\LocalDB\LogService.db") Then
If Not IO.Directory.Exists($"{Application.StartupPath }\LocalDB") Then
IO.Directory.CreateDirectory($"{Application.StartupPath }\LocalDB")
End If
SQLiteConnection.CreateFile($"{Application.StartupPath }\LocalDB\LogService.db")
Dim Main_dataBase_file As FileInfo = New FileInfo($"{Application.StartupPath }\LocalDB\LogService.db")
' IO.File.OpenWrite($"{Application.StartupPath }\LocalDB\LogService.db")
End If
Dim LocalConnString As String
Dim localConn As New DbConnectionStringBuilder
localConn.Add("Data Source", $"{Application.StartupPath }\LocalDB\LogService.db")
'localConn.Add("Password", "123456")
LocalConnString = localConn.ToString()
Dim Rusclog As String = "Rusc_log"
Using db As New DbExecutor(DbExecutor.DbTypeEnum.Sqlite, LocalConnString)
Try
db.Open()
Catch ex As Exception
Console.WriteLine($"Open local db Error, {ex.Message}")
MsgBox($"Open local db Error, {ex.Message}")
Return False
End Try
'建表
Dim CreateTableStr As String = "Create Table if Not exists Rusc_log ( 'ID' integer COLLATE BINARY NOT NULL PRIMARY KEY AUTOINCREMENT );"
Try
db.ExecuteNonQuery(CreateTableStr)
Catch ex As Exception
db.Close()
MsgBox($"Create Table error,{ex.Message}")
Return False
End Try
'添加字段
Dim dtCol As DataTable
Try
dtCol = db.ExecuteDataTable($"Select * From Rusc_log")
Catch ex As Exception
MsgBox($"Select Table error,{ex.Message}")
db.Close()
Return False
End Try
Dim length As Integer
Dim typeString As String
For Each colname As String In dic.Keys
If String.IsNullOrWhiteSpace(colname) Then Continue For '剔除无效数据库字段名
length = GetFiledLength(dic(colname).Length)
If length = -1 Then
Throw New Exception($"字段[{colname}] 超过最大长度2048的限制,无法入库!")
Else
typeString = $"varchar({length})"
End If
If dtCol.Columns.Contains(colname) Then '当前数据表是否已经存在对应列信息
Else
Try
db.ExecuteNonQuery(db.CmdHelper.DbAddCol("", "Rusc_log", colname, typeString))
Catch ex As Exception
db.Close()
MsgBox($"Add column[{colname}] To Table error,{ex.Message}")
Return False
End Try '插入字段语句
End If
Next
'添加测试记录
Dim cmdText As String = db.CmdHelper.Insert(Rusclog, dic)
Try
db.ExecuteNonQuery(cmdText)
Catch ex As Exception
db.Close()
MsgBox($"Insert Table error,{ex.Message}")
Return False
End Try
db.Close()
End Using
End Function
Private Shared Function GetFiledLength(len As Integer) As Integer
Dim result As Integer
If len = 0 Then
result = 8
ElseIf len <= 2048 Then
If len Mod 8 = 0 Then
result = len
Else
result = ((len \ 8) + 1) * 8
End If
Else
result = -1
End If
Return result
End Function
#Region "SLS--阿里云入库"
'' <summary> 此处以深圳为例,其它地域请根据实际情况填写 </summary>
Private _Endpoint As String = "cn-shenzhen.log.aliyuncs.com"
'' <summary> 阿里云访问密钥AccessKey </summary>
Private _AccessKeyId As String = "LTAI5tFDX4g74gJvEsdidRtD"
'' <summary> 阿里云访问密钥AccessKeySecret </summary>
Private _AccessKeySecret As String = "mN7DDagPbjcKc5qFgHEIGvmasUsRF7"
''' <summary> Project名称 </summary>
Private _Project As String = "rucs-project"
''' <summary> Logstore名称 </summary>
Private _Logstore As String = "rucs-log-db"
''' <summary> 主题 </summary>
Private _Topic As String = "chengwei"
Private _SLS As New LogService(_Endpoint, _AccessKeyId, _AccessKeySecret, _Project, _Logstore, _Topic)
Private _LogList As New List(Of LogItem)
Private Shared ReadOnly SLSLock As New Object()
''' <summary>
''' 数据加入集合,统一入库
''' </summary>
''' <param name="strMacAdd"></param>
''' <param name="logDataInfo"></param>
''' <param name="parsing_data"></param>
Private Sub AddSLSRequestData(strMacAdd As String, logDataInfo As LogDataInfoStruct, parsing_data As List(Of String))
SyncLock SLSLock
Dim logList As LogItem = _SLS.AddUdpLogItem(strMacAdd, logDataInfo, parsing_data)
_LogList.Add(logList)
End SyncLock
End Sub
Public gIsSlsWrited As Boolean = True
''' <summary>
''' 循环入库
''' </summary>
Private Sub StartPutSLSRequest()
While True
tb_SlsBuffCnt.Text = _LogList.Count
lab_TheartMonitor.Text = lab_TheartMonitor.Text + 1
If _LogList.Count > 0 Then
Dim tempLogList As New List(Of LogItem)
SyncLock _LogList
tempLogList.AddRange(_LogList.ToArray)
_LogList.Clear()
End SyncLock
ShowRichTextBox(RichTextBox1, "准备写入SLS日志数据库" & tempLogList.Count)
Try
'For i = 0 To tempLogList.Count - 1
' Console.WriteLine($"============{i}=============")
' For t = 0 To tempLogList(i).Contents.Count - 1
' Console.WriteLine($"缓存数据入库:{tempLogList(i).Contents(t).Value}")
' Next
'Next
'Console.WriteLine($"SLS 缓存入库:{tempLogList.Count} 个")
Dim tmpResult As PutLogsResponse = _SLS.AddLogs(tempLogList, True)
Dim txt As String = $"SLS入库成功{tempLogList.Count} 个"
ShowRichTextBox(RichTextBox1, txt)
'写库成功:移动文件
TransferFile(tempLogList)
gIsSlsWrited = True
Catch ex As Exception
Console.WriteLine($"SLS 缓存入库异常:{tempLogList.Count} 个, {ex.Message}")
Dim txt As String = $"SLS 缓存入库异常:{tempLogList.Count} 个, {ex.Message}"
ShowRichTextBox(RichTextBox1, txt)
gIsSlsWrited = True
End Try
End If
'Thread.Sleep(50)
Thread.Sleep(1000) '1秒
End While
End Sub
Public Function SLS_AddLogs(logList As List(Of LogItem)) As Boolean
Try
'For i = 0 To tempLogList.Count - 1
' Console.WriteLine($"============{i}=============")
' For t = 0 To tempLogList(i).Contents.Count - 1
' Console.WriteLine($"缓存数据入库:{tempLogList(i).Contents(t).Value}")
' Next
'Next
'Console.WriteLine($"SLS 缓存入库:{tempLogList.Count} 个")
_SLS.AddLogs(logList)
Dim txt As String = $"SLS入库成功{logList.Count} 个"
ShowRichTextBox(RichTextBox1, txt)
Return True
Catch ex As Exception
'Console.WriteLine($"SLS 缓存入库异常:{logList.Count} 个, {ex.Message}")
Dim txt As String = $"SLS 缓存入库异常:{logList.Count} 个, {ex.Message}"
ShowRichTextBox(RichTextBox1, txt)
Return False
End Try
End Function
Public FtpHost As String = "boonlivenas.synology.me"
Public FtpPort As Integer = 50
Public FtpUser As String = "Blv_Studio"
Public FtpPwd As String = "5gSrn63N"
Public FtpPath As String = "\BLV_Studio_Data\BLV_Studio\RCU_Log\"
Private Sub TransferFile(logItem As List(Of LogItem))
Dim dic As New Dictionary(Of String, String
Dim txtid As Int64 = 0
Dim txt As String = $"開始移動文件"
ShowRichTextBox(RichTextBox1, txt)
For i = 0 To logItem.Count - 1
Dim filepath As String = DirPath_txt.Text & "\" & logItem(i).Contents(2).Value
Dim serverfilepath As String = FtpPath & logItem(i).Contents(0).Value & "\" & logItem(i).Contents(2).Value
txtid = i
'For t = 0 To logItem(i).Contents.Count - 1
' txt = $"【{logItem(i).Contents(t).Key} {logItem(i).Contents(t).Value}】,{vbCrLf}"
'Next
'txt = $"第【{i}】包数据入库完成:{vbCrLf}{txt}"
'ShowRichTextBox(RichTextBox1, txt)
If IO.File.Existsfilepath Then
If dic.ContainsKey(serverfilepath) Then
Else
dic.Add(serverfilepath, filepath)
End If
End If
'Console.WriteLine($"============{logItem(i).Contents(2).Value}=============")
Next
'FTPUploadingFile(dic) '移动到FTP目录
MoveFileToBakPath(dic, "c:\Blv_Rcu_Tftp_FTP_BAK\") '将文件移动到备份目录
End Sub
''' <summary>
''' 上传文件,驱动函数带删除源文件
''' </summary>
''' <param name="SyncToLoadFile"></param>
Public Function FTPUploadingFile(SyncToLoadFile As Dictionary(Of String, String)) As Boolean
Try
UtsFtp.InitConnectParams(FtpPort, FtpUser, FtpPwd)
Dim ftp As UtsFtp = UtsFtp.CreateObject()
ftp.FtpHost = FtpHost
'For Each filepath In _SyncToLoadFile
'ftp.FtpDownload("/Data/Model/485Model/3.txt", _SyncLoadDirPath & "3.txt")
Dim FtpUploadReturnMsg As String = ""
ftp.FtpUpload_UdpLogOnly(SyncToLoadFile, "c:\Blv_Rcu_Tftp_FTP_BAK\", FtpUploadReturnMsg)
Dim txt As String = $" {FtpUploadReturnMsg},文件数量:{SyncToLoadFile.Count } 个"
ShowRichTextBox(RichTextBox1, txt)
SyncToLoadFile.Clear()
' Next
Return True
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
MoveFileToBakPath(SyncToLoadFile, "c:\Blv_Rcu_Tftp_FTP_BAK\")
Return False
End Try
End Function
Public Sub MoveFileToBakPath(ByVal FtpDownloadfile As Dictionary(Of String, String),
ByVal BAK_Path As String)
Dim srcFullFilePath As String = ""
Dim PureFileName As String = ""
Dim destFilePath As String = ""
Dim destFullFileName As String = ""
Dim macAdd As String = ""
Dim txt As String = ""
Try
For Each loadfile In FtpDownloadfile
srcFullFilePath = loadfile.Value '完整原文件名
PureFileName = GetFileName(srcFullFilePath) '源文件纯文件名’
macAdd = GetMacFormPureFileName(PureFileName)
destFilePath = BAK_Path & macAdd '完整目标文件夹’
destFullFileName = destFilePath & "\" & PureFileName '完整目标文件名’
'创建文件夹
If Not System.IO.Directory.Exists(destFilePath) Then
System.IO.Directory.CreateDirectory(destFilePath)
ShowRichTextBox(RichTextBox1, "创建文件夹:" & destFilePath)
End If
IO.File.Copy(srcFullFilePath, destFullFileName, True)
IO.File.Delete(srcFullFilePath)
txt = " 移动文件:" & srcFullFilePath & " -> " & destFullFileName
ShowRichTextBox(RichTextBox1, txt)
Next
txt = " 移动文件到备份文件夹,数量:" & FtpDownloadfile.Count
ShowRichTextBox(RichTextBox1, txt)
Catch ex As Exception
txt = ex.ToString & "," & vbNewLine &
"src = " & srcFullFilePath & "," & vbNewLine &
"dest= " & destFullFileName
ShowRichTextBox(RichTextBox1, txt)
End Try
End Sub
'从纯文件名中取出MAC地址
Public Function GetMacFormPureFileName(pureFileName As String) As String
If Mid(pureFileName, 9, 1) = "_" Then
Return Microsoft.VisualBasic.Left(pureFileName, 8)
Else
Return "ErrMacAdd"
End If
End Function
'从完整的文件名中分理出文件名
Public Function GetFileName(FilePathFileName As String) As String '获取文件名 aaa.txt
Dim i As Integer, J As Integer
i = Len(FilePathFileName)
J = InStrRev(FilePathFileName, "\")
Return Mid(FilePathFileName, J + 1, i)
End Function
'从完整的文件名中分理出路径
Public Function GetFilePath(FilePathFileName As String) As String '获取路径路径 c:\dir1001\
'On Error Resume Next
Dim J As Integer
J = InStrRev(FilePathFileName, "\")
Return Mid(FilePathFileName, 1, J)
End Function
'判断目录是否存在的函数 传入String值 返回Boolean值
Private Function DirExist(ByVal Str_Path As String) As Boolean
Return System.IO.Directory.Exists(Str_Path)
End Function
'判断文件是否存在的函数 传入String值 返回Boolean值
Private Function FileExist(ByVal Str_File As String) As Boolean
Return System.IO.File.Exists(Str_File)
End Function
#End Region
#Region "数据库建表--未使用,当前入阿里云数据库"
''' <summary>
''' 找表,建表
''' </summary>
''' <param name="strMacAdd"></param>
''' <param name="tableName"></param>
Private Function FindTable(dbcmd As DbCmdHelper dbe As DbExecutor, strMacAdd As String, ByRef tableName As String) As Boolean
Try
Dim ColumnList As New List(Of String)
ColumnList.Add("LogTableName") '总表内MAC的表名
'查询MAC总表中MAC对应的表
Dim SelectMac As String = dbcmd.Search("LogTableName", "TBL_MAC_LIST", $"MAC='{strMacAdd}'")
Dim Selectdt = dbe.ExecuteDataTable(SelectMac)
If Selectdt.Rows.Count > 0 Then
'有表则加入数据
Dim TableNames As String = Selectdt.Rows(0)(0).ToString
Console.WriteLine($"查到有 MAC:{strMacAdd} 表名:{TableNames}")
tableName = TableNames
isFirstrecord = False
Return True
Else
isFirstrecord = True
Return CreateTable(dbcmd, dbe, tableName) '没有查询到表则建表
End If
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
Return False
End Try
End Function
''' <summary>
''' 判断表内MAC个数 建表
''' </summary>
''' <param name="dbe"></param>
''' <param name="tableName"></param>
''' <returns></returns>
Private Function CreateTable(dbcmd As DbCmdHelper, dbe As DbExecutor, ByRef tableName As String) As Boolean
'没有表判断日志总表内当前使用表名内MAC地址是否有不同的100个,大于100则创建新表不够则将MAc数据加入此表中
Dim LogTableColumnList As New List(Of String)
LogTableColumnList.Add("LogTableName") '当前使用表名
LogTableColumnList.Add("MAC_Count") '当前表内的MAC个数
Try
Dim SelectLogTableName As String = dbcmd.Search(LogTableColumnList, "TBL_LogTable_List", "ID=(select max(ID) from TBL_LogTable_List)")
Dim SelectLogTabledt = dbe.ExecuteDataTable(SelectLogTableName)
If SelectLogTabledt.Rows.Count > 0 Then
If SelectLogTabledt.Rows(0)(1) < 100 Then Return True '表内MAC数据小于100条,直接返回将数据入库
'大于100条则新建表
Dim CreateStr As String = "`ID` int(11) NOT NULL AUTO_INCREMENT,
`MAC` varchar(254) DEFAULT NULL,`CreateDateTime` varchar(254) DEFAULT NULL,
`LogFileName` varchar(254) DEFAULT NULL,`LogProjectid` int(11) DEFAULT NULL,
`LogRoomid` int(11) DEFAULT NULL,`Log_Valid` varchar(254) DEFAULT 'NULL',
`Log_SN` int(11) DEFAULT NULL,`Log_Len` int(11) DEFAULT NULL,
`Log_DateTime` varchar(254) DEFAULT NULL,`Log_TimeSpan` varchar(254) DEFAULT NULL,
`Log_Type` varchar(254) DEFAULT NULL,`Log_Content` longtext DEFAULT 'NULL',
`Type_Param_1` longtext DEFAULT 'NULL',`Type_Param_2` longtext DEFAULT 'NULL',
`Type_Param_3` longtext DEFAULT 'NULL',`Type_Param_4` longtext DEFAULT 'NULL',
`Type_Param_5` longtext DEFAULT 'NULL',`Type_Param_6` longtext DEFAULT 'NULL',
`Type_Param_7` longtext DEFAULT 'NULL',`Type_Param_8` longtext DEFAULT 'NULL',
`Type_Param_9` longtext DEFAULT 'NULL',`Type_Param_10` longtext DEFAULT 'NULL',
`Remark` longtext DEFAULT 'NULL',PRIMARY KEY (`ID`)"
Dim oldtableName As String() = SelectLogTabledt.Rows(0)(0).ToString.Split("_")
Dim newTableName As String = oldtableName(0) & $"_{oldtableName(1)}" & $"_{Integer.Parse(oldtableName(2)) + 1}"
tableName = newTableName
Dim CreateTableStr As String = dbcmd.CreateTableWhenNotExists(tableName, CreateStr)
Dim InsertData As String = dbcmd.Insert("TBL_LogTable_List", "LogTableName,TblCreateDateTime,MAC_Count", $"'{tableName}','{Now}','0'")
dbe.ExecuteNonQuery($"{CreateTableStr}{InsertData}")
Else
'创建表
Dim CreateStr As String = "`ID` int(11) NOT NULL AUTO_INCREMENT,
`MAC` varchar(254) DEFAULT NULL,`CreateDateTime` varchar(254) DEFAULT NULL,
`LogFileName` varchar(254) DEFAULT NULL,`LogProjectid` int(11) DEFAULT NULL,
`LogRoomid` int(11) DEFAULT NULL,`Log_Valid` varchar(254) DEFAULT 'NULL',
`Log_SN` int(11) DEFAULT NULL,`Log_Len` int(11) DEFAULT NULL,
`Log_DateTime` varchar(254) DEFAULT NULL,`Log_TimeSpan` varchar(254) DEFAULT NULL,
`Log_Type` varchar(254) DEFAULT NULL,`Log_Content` longtext DEFAULT 'NULL',
`Type_Param_1` longtext DEFAULT 'NULL',`Type_Param_2` longtext DEFAULT 'NULL',
`Type_Param_3` longtext DEFAULT 'NULL',`Type_Param_4` longtext DEFAULT 'NULL',
`Type_Param_5` longtext DEFAULT 'NULL',`Type_Param_6` longtext DEFAULT 'NULL',
`Type_Param_7` longtext DEFAULT 'NULL',`Type_Param_8` longtext DEFAULT 'NULL',
`Type_Param_9` longtext DEFAULT 'NULL',`Type_Param_10` longtext DEFAULT 'NULL',
`Remark` longtext DEFAULT 'NULL',PRIMARY KEY (`ID`)"
Dim InsertData As String = dbcmd.Insert("TBL_LogTable_List", "LogTableName,TblCreateDateTime,MAC_Count", $"'{tableName}','{Now}','0'")
Dim CreateTableStr As String = dbcmd.CreateTableWhenNotExists(tableName, CreateStr)
dbe.ExecuteNonQuery($"{CreateTableStr}{InsertData}")
End If
Return True
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
Return False
End Try
End Function
#End Region
''' <summary>
''' 解析文件名
''' </summary>
''' <param name="datFile"></param>
''' <returns></returns>
Private Function GetFileNameInfo(ByVal datFile As Scripting.File) As fileNameInfoStruct
Dim tmpFileInfo As New fileNameInfoStruct
Dim FileNameStr As String = datFile.Name
Dim Strbyte As String() = FileNameStr.Split("_")
Try
tmpFileInfo.MAC = Strbyte(0)
tmpFileInfo.HotelId = Strbyte(1)
tmpFileInfo.RoomId = Strbyte(2)
'tmpFileInfo.CreateDateTime = datFile.DateLastModified
tmpFileInfo.CreateDateTime = Format(datFile.DateLastModified, "yyyy-MM-dd HH:mm:ss")
tmpFileInfo.LogFileName = datFile.Name
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
End Try
Return tmpFileInfo
End Function
''' <summary>
''' 解析文件内容
''' </summary>
''' <param name="datFile"></param>
''' <returns></returns>
Private Function GetFileInfoList(ByVal datFileName As fileNameInfoStruct,
ByVal datFile As Scripting.File,
ByRef fileInfoList As List(Of LogDataInfoStruct),
ByRef ErrMsg As String) As Boolean
'确认文件是否存在
If IO.File.Exists(datFile.Path) = False Then
ErrMsg = "文件不存在"
Return False
End If
'读取文件内容
Dim file_data As Byte() = My.Computer.FileSystem.ReadAllBytes(datFile.Path)
Dim sampleArr_len As UInt32 = file_data.Length
Dim sampleArr_showlen As UInt32 = 0
Dim data_len As UInt16
Dim data_end As Byte
Dim data_list As New List(Of Byte())
'Dim wacth As New Stopwatch
'wacth.Restart() '开启计时
Try
While sampleArr_showlen < sampleArr_len
If file_data(sampleArr_showlen) = &HA5 And sampleArr_showlen + 3 < sampleArr_len Then '判断文件头
data_len = file_data(sampleArr_showlen + LOG_DATA_FORMAT.Len) Or (file_data(sampleArr_showlen + LOG_DATA_FORMAT.Len_8) << 8) '读取数据长度
If data_len < Log_Data_Len_Max And sampleArr_showlen + data_len - 1 < file_data.Length Then
data_end = file_data(sampleArr_showlen + data_len - 1)
'Console.WriteLine($"Data Len :{data_len:d} Data :{data_end:X}")
If sampleArr_showlen + data_len <= sampleArr_len AndAlso file_data(sampleArr_showlen + data_len - 1) = &H5A Then '判断文件尾
Dim data_buff(data_len - 1) As Byte
Dim data_string As String
Array.Copy(file_data, sampleArr_showlen, data_buff, 0, data_len)
If GetSumCheckMod(data_buff, data_len) = &H0 Then
'Console.WriteLine("Data Check Succ !\r\n")
'Parsing_a_piece_of_data(data_buff, show_form DataGridView1)
data_list.Add(data_buff) '保存一份数据,添加到列表中
sampleArr_showlen += data_len '数据偏移
data_string = BitConverter.ToString(data_buff)
data_string = data_string.Replace("-", " ")
'Console.WriteLine(data_string)
Else
AnalysisLog("Data Check Fail !\r\n")
Console.WriteLine("Data Check Fail !\r\n")
End If
Else
sampleArr_showlen += 1
AnalysisLog("Data Len Fail!!! Now Len:" & sampleArr_showlen)
Console.WriteLine("Data Len Fail!!! Now Len:" & sampleArr_showlen)
End If
Else
sampleArr_showlen += 1
AnalysisLog("Data Len Fail!!! Now Len:" & sampleArr_showlen)
Console.WriteLine("Data Len Error!!! " & sampleArr_showlen)
End If
Else
sampleArr_showlen += 1
End If
delay(1)
'Application.DoEvents()
End While
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
End Try
'数据添加到列表
fileInfoList = File_Data_Parsing_To_List(datFileName, data_list)
Return True
End Function
Public Sub AnalysisLog(msg As String)
Dim tim As String = Now.ToString("yyyy-MM-dd HH:mm:ss")
RichTextBox1.Text = $"{ RichTextBox1.Text }{tim} : {msg}{vbCrLf }"
End Sub
''' <summary>
''' 将数据添加进集合
''' </summary>
''' <param name="datFileName"></param>
''' <param name="file_data"></param>
''' <returns></returns>
Public Function File_Data_Parsing_To_List(ByVal datFileName As fileNameInfoStruct,
ByVal file_data As List(Of Byte())) As List(Of LogDataInfoStruct)
Dim data_num As Int32 = file_data.Count
Dim hour_tick As Int32
Dim hour_temp As Int32
Dim data_date As Int32
Console.WriteLine($"当前有效数据总包数:{data_num}")
Dim tmpDataList As New List(Of LogDataInfoStruct)
'Try
For idx = 0 To data_num - 1
Dim save_data As New LogDataInfoStruct
Dim parsing_string As String
'数据类型及长度等
'save_data.original_data = file_data(idx)
save_data.Log_SN = file_data(idx)(LOG_DATA_FORMAT.SN)
save_data.Log_Type = file_data(idx)(LOG_DATA_FORMAT.Type)
hour_temp = file_data(idx)(LOG_DATA_FORMAT.Len_8)
save_data.Log_Len = (file_data(idx)(LOG_DATA_FORMAT.Len) Or (hour_temp << 8)) - LOG_DATA_FORMAT.Data '数据长度
If save_data.Log_Len > Log_Data_Len_Max Then
'save_data.len = Log_Data_Len_Max 数据长度超过数据最大长度
' Return tmpDataList
End If
'日期
data_date = (file_data(idx)(LOG_DATA_FORMAT.Date_L) And &HFF) '记录时间
hour_temp = file_data(idx)(LOG_DATA_FORMAT.Date_H)
data_date = data_date Or (hour_temp << 8)
hour_tick = file_data(idx)(LOG_DATA_FORMAT.Time8B)
hour_temp = file_data(idx)(LOG_DATA_FORMAT.Time16B)
hour_tick = hour_tick Or (hour_temp << 8)
hour_temp = file_data(idx)(LOG_DATA_FORMAT.Time24B)
hour_tick = hour_tick Or (hour_temp << 16)
hour_temp = file_data(idx)(LOG_DATA_FORMAT.Time32B)
hour_tick = hour_tick Or (hour_temp << 24)
save_data.Log_DateTime.year = (data_date >> 10) And &H1F
save_data.Log_DateTime.month = (data_date >> 5) And &H1F
save_data.Log_DateTime.day = (data_date) And &H1F
'时间
save_data.Log_DateTime.hour = hour_tick \ 3600000
'防止24:00:00 溢出 Momo 2022-06-26 240000
If save_data.Log_DateTime.hour >= 24 Then save_data.Log_DateTime.hour = 0
hour_temp = hour_tick Mod 3600000
save_data.Log_DateTime.minute = hour_temp \ 60000
hour_temp = hour_temp Mod 60000
save_data.Log_DateTime.second = hour_temp \ 1000
save_data.Log_DateTime.milliscond = hour_temp Mod 1000
'分离文件内容中的数据
Dim copy As UInt16 = save_data.Log_Len - 1
Dim parsing_data(copy - 1) As Byte
Array.Copy(file_data(idx), LOG_DATA_FORMAT.Data, parsing_data, 0, copy)
save_data.Log_Content = parsing_data
parsing_string = BitConverter.ToString(parsing_data)
parsing_string = parsing_string.Replace("-", " ")
'Console.WriteLine($"parsing_string:{parsing_string}")
parsing_string = $"Data SN:{save_data.Log_SN:d} TYPE:{save_data.Log_Type:d} Len:{save_data.Log_Len:d} data_date:{data_date:X} hour_tick:{hour_tick:X}"
' Console.WriteLine(parsing_string)
'解析数据内容
Dim Parsing_Param As New List(Of String)
Parsing_Data_Content(save_data.Log_Type, parsing_data, Parsing_Param) '解析
'判断Param参数,不够10个则补足
If Parsing_Param.Count > 0 Then
Dim len As Integer = 10 - Parsing_Param.Count
Dim par(len - 1) As String
Parsing_Param.AddRange(par)
End If
save_data.parsing = Parsing_Param
save_data.Log_TimeSpan = Get_Data_Time_Difference2(tmpDataList, save_data) '时间差
save_data.Log_Valid = True
save_data.HotelId = datFileName.HotelId
save_data.RoomId = datFileName.RoomId
save_data.CreateDateTime = datFileName.CreateDateTime
save_data.LogFileName = datFileName.LogFileName
Dim savedata As String = $"[HotelId:{save_data.HotelId }],{vbCrLf}[RoomId:{save_data.RoomId}],{vbCrLf}[LogFileName:{save_data.LogFileName }],{vbCrLf}[Log_SN:{save_data.Log_SN }],{vbCrLf}[Log_Len:{save_data.Log_SN}],{vbCrLf}[Log_DateTime:{ newtime_h(save_data).ToString("yyyy-MM-dd HH:mm:ss") }],{vbCrLf}[Log_TimeSpan:{save_data.Log_TimeSpan}],{vbCrLf}[Log_Type:{Parsing_Param}],{vbCrLf}[CreateDateTime:{save_data.CreateDateTime}],{vbCrLf}[LogFileName:{save_data.LogFileName }]"
Console.WriteLine($"解析数据包({idx}):{vbCrLf}{savedata}")
' AnalysisLog($"解析数据包({idx}):{vbCrLf}{savedata}")
'将解析后的数据添加到列表中
tmpDataList.Add(save_data)
delay(1)
Next
'Catch ex As Exception
' AdminLog.ApplicationLog.WriteErrorLog(ex)
'End Try
Return tmpDataList
End Function
''' <summary>
''' 本条数据与上条数据的时间差
''' </summary>
''' <param name="data_list"></param>
''' <param name="data"></param>
''' <returns></returns>
Public Function Get_Data_Time_Difference2(data_list As List(Of LogDataInfoStruct), data As LogDataInfoStruct) As Int64
Dim temp_tick As Int64 = 0
Dim temp_time As New Log_DateStruct
Dim temp_time2 As New Log_DateStruct
Dim temp_num As Int32
temp_num = data_list.Count '获取当前数据列表中有多少条数据
'Console.WriteLine($"now list num:{temp_num:00}")
If temp_num >= 1 Then
temp_time.year = data.Log_DateTime.year + 2000
If data.Log_DateTime.month = 0 Then
temp_time.month = data.Log_DateTime.month + 1
Else
temp_time.month = data.Log_DateTime.month
End If
If data.Log_DateTime.day = 0 Then
temp_time.day = data.Log_DateTime.day + 1
Else
temp_time.day = data.Log_DateTime.day
End If
temp_time.hour = data.Log_DateTime.hour
temp_time.minute = data.Log_DateTime.minute
temp_time.second = data.Log_DateTime.second
temp_time.milliscond = data.Log_DateTime.milliscond
temp_time2.year = data_list(temp_num - 1).Log_DateTime.year + 2000
If data_list(temp_num - 1).Log_DateTime.month = 0 Then
temp_time2.month = data_list(temp_num - 1).Log_DateTime.month + 1
Else
temp_time2.month = data_list(temp_num - 1).Log_DateTime.month
End If
If data_list(temp_num - 1).Log_DateTime.day = 0 Then
temp_time2.day = data_list(temp_num - 1).Log_DateTime.day + 1
Else
temp_time2.day = data_list(temp_num - 1).Log_DateTime.day
End If
temp_time2.hour = data_list(temp_num - 1).Log_DateTime.hour
temp_time2.minute = data_list(temp_num - 1).Log_DateTime.minute
temp_time2.second = data_list(temp_num - 1).Log_DateTime.second
temp_time2.milliscond = data_list(temp_num - 1).Log_DateTime.milliscond
Dim tmpSn As UInt16 = data_list(temp_num - 1).Log_SN
Try
Dim temp_date1 As New DateTime(temp_time.year, temp_time.month, temp_time.day, temp_time.hour, temp_time.minute, temp_time.second)
Dim temp_date2 As New DateTime(temp_time2.year, temp_time2.month, temp_time2.day, temp_time2.hour, temp_time2.minute, temp_time2.second)
temp_tick = DateDiff(DateInterval.Second, temp_date2, temp_date1) 'temp_date1 - temp_date2
temp_tick = temp_tick * 1000 + temp_time.milliscond - temp_time2.milliscond
Catch ex As Exception
ShowRichTextBox(RichTextBox1, " xxx 时间格式错误tempDate1" & tmpSn & "," & temp_time.year & "," & temp_time.month & "," & temp_time.day & "," & temp_time.hour & "," & temp_time.minute & "," & temp_time.second)
ShowRichTextBox(RichTextBox1, " xxx 时间格式错误tempDate2" & tmpSn & "," & temp_time2.year & "," & temp_time2.month & "," & temp_time2.day & "," & temp_time2.hour & "," & temp_time2.minute & "," & temp_time2.second)
End Try
End If
Return temp_tick
End Function
Public Function newtime_h(data As LogDataInfoStruct) As DateTime
Dim temp_time As New Log_DateStruct
temp_time.year = data.Log_DateTime.year + 2000
If data.Log_DateTime.month = 0 Then
temp_time.month = data.Log_DateTime.month + 1
Else
temp_time.month = data.Log_DateTime.month
End If
If data.Log_DateTime.day = 0 Then
temp_time.day = data.Log_DateTime.day + 1
Else
temp_time.day = data.Log_DateTime.day
End If
temp_time.hour = data.Log_DateTime.hour
temp_time.minute = data.Log_DateTime.minute
temp_time.second = data.Log_DateTime.second
temp_time.milliscond = data.Log_DateTime.milliscond
Dim temp_date1 As New DateTime(temp_time.year, temp_time.month, temp_time.day, temp_time.hour, temp_time.minute, temp_time.second)
Return temp_date1
End Function
#Region "数据内容解析"
''' <summary>
''' 解析数据内容
''' 按照数据类型来解析,用于加载表格时的数据显示 - 简单的内容解析
''' </summary>
''' <param name="data_content"></param>
''' <returns></returns>
Public Function Parsing_Data_Content(data_type As Byte, data_content As Byte(), ByRef Type_Param As List(Of String)) As List(Of String)
Dim dev_temp As New Device_Temp
Try
Select Case data_type
Case log_type.Launcher
Type_Param.Add("Launcher信息")
Type_Param = Parsing_LogData_Launcher_Content(data_content, Type_Param)
Case log_type.SYS_Record
Type_Param.Add("系统信息")
Type_Param = Parsing_LogData_SYS_Record_Content(data_content, Type_Param)
Case log_type.Device_COMM
Type_Param.Add("设备通讯")
Type_Param = Parsing_LogData_Device_COMM_Content(data_content, Type_Param)
Case log_type.Device_Online
Type_Param.Add("设备通讯状态")
Type_Param = Parsing_LogData_Device_Online_Content(data_content, Type_Param)
Case log_type.Global_Parameters
Type_Param.Add("定期保存设备信息")
Type_Param = Parsing_LogData_Global_Parameters_Content(data_content, Type_Param)
Case log_type.Net_COMM
Type_Param.Add("网络处理")
Type_Param = Parsing_LogData_Net_COMM_Content(data_content, Type_Param)
Case log_type.Logic_Record
Type_Param.Add("事件处理")
Type_Param = Parsing_LogData_Logic_Record_Content(data_content, Type_Param)
Case Else
Type_Param.Add("数据类型错误")
End Select
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
End Try
Return Type_Param
End Function
''' <summary>
''' Launcher类型数据解析
''' </summary>
''' <param name="data_content"></param>
''' <returns></returns>
Public Function Parsing_LogData_Launcher_Content(data_content As Byte(), ByRef Type_Param As List(Of String)) As List(Of String)
Dim Launcher_type As Byte = data_content(0)
Try
Select Case Launcher_type
Case LLauncher.App_Check
Type_Param.Add("校验APP")
If data_content(1) = &H0 Then
Type_Param.Add("相同")
ElseIf data_content(1) = &H1 Then
Type_Param.Add("APP版本号不同")
ElseIf data_content(1) = &H2 Then
Type_Param.Add("特征区CRC不同")
ElseIf data_content(1) = &H3 Then
Type_Param.Add("Flash APP地址错误")
ElseIf data_content(1) = &H4 Then
Type_Param.Add("Flash APP数据校验错误")
ElseIf data_content(1) = &H5 Then
Type_Param.Add("Flash APP标志未置位")
ElseIf data_content(1) = &H6 Then
Type_Param.Add("Flash 特征区的CRC校验错误")
ElseIf data_content(1) = &H7 Then
Type_Param.Add("MCU Flash数据校验错误")
ElseIf data_content(1) = &H8 Then
Type_Param.Add("MCU Flash的APP标志未置位")
ElseIf data_content(1) = &H9 Then
Type_Param.Add("MCU Flash特征区的CRC校验错误")
Else
Type_Param.Add("数据错误")
End If
Case LLauncher.Read_App
Type_Param.Add("读取APP")
If data_content(1) = &H0 Then
Type_Param.Add("成功")
ElseIf data_content(1) = &H1 Then
Type_Param.Add("失败")
End If
Case LLauncher.Reset_Source
Type_Param.Add("复位源")
If data_content(1) = &H0 Then
Type_Param.Add("软件复位")
ElseIf data_content(1) = &H1 Then
Type_Param.Add("上电复位")
ElseIf data_content(1) = &H2 Then
Type_Param.Add("看门狗超时复位")
ElseIf data_content(1) = &H3 Then
Type_Param.Add("外部手动复位")
ElseIf data_content(1) = &H5 Then
Type_Param.Add("从下电模式唤醒时的复位")
Else
Type_Param.Add($"复位源位置:{data_content(1):00}")
End If
Case Else
Type_Param.Add("数据类型错误")
End Select
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
End Try
Return Type_Param
End Function
''' <summary>
''' 系统运行信息数据解析
''' </summary>
''' <param name="data_content"></param>
''' <returns></returns>
Public Function Parsing_LogData_SYS_Record_Content(data_content As Byte(), ByRef Type_Param As List(Of String)) As List(Of String)
'data_parsing = "系统运行数据解析" & BitConverter.ToString(data_content).Replace("-", " ")
Dim sys_type As Byte = data_content(0)
Try
Select Case sys_type
Case LSYS.PHY_Change
Type_Param.Add("网络PHY状态记录")
If data_content(1) = &H0 Then
Type_Param.Add("拔出")
ElseIf data_content(1) = &H1 Then
Type_Param.Add("插入")
Else
Type_Param.Add($"PHY状态错误 {data_content(1)}")
End If
Case LSYS.DevInfo_Error
Type_Param.Add("设备链表读取信息错误记录")
Type_Param.Add($"设备类型:{data_content(1)}")
Type_Param.Add($"地址:{data_content(2)}")
Type_Param.Add($"链表信息读取错误")
Case LSYS.API_State
Type_Param.Add("系统升级信息")
If data_content(1) = &H1 Then
Type_Param.Add("串口升级")
ElseIf data_content(1) = &H2 Then
Type_Param.Add("网络升级")
Else
Type_Param.Add("错误升级类型")
End If
If data_content(2) = &H1 Then
Type_Param.Add("写入成功")
ElseIf data_content(2) = &H2 Then
Type_Param.Add("写入失败")
ElseIf data_content(2) = &H3 Then
Type_Param.Add("文件块数错误")
ElseIf data_content(2) = &H4 Then
Type_Param.Add("MD5校验错误")
ElseIf data_content(2) = &H5 Then
Type_Param.Add("CRC校验错误")
ElseIf data_content(2) = &H6 Then
Type_Param.Add("跳转Launcher")
Else
Type_Param.Add("未知状态")
End If
Case LSYS.NET_ARGC
Type_Param.Add("网络初始化:")
Type_Param.Add($"IP : {data_content(1)}.{data_content(2)}.{data_content(3)}.{data_content(4)}")
Type_Param.Add($"MAC : {data_content(5)}.{data_content(6)}.{data_content(7)}.{data_content(8)}.{data_content(9)}.{data_content(10)}")
Type_Param.Add($"服务器IP : {data_content(11)}.{data_content(12)}.{data_content(13)}.{data_content(14)}")
Type_Param.Add($"TFTP服务器IP : {data_content(15)}.{data_content(16)}.{data_content(17)}.{data_content(18)}")
Type_Param.Add($"MQTT服务器IP : {data_content(19)}.{data_content(20)}.{data_content(21)}.{data_content(22)}")
Case LSYS.MQTT_ARGC
Type_Param.Add("MQTT初始化参数")
Type_Param.Add("还没解析")
Case LSYS.NetComm_State
Type_Param.Add("云端通讯状态")
If data_content(1) = &H0 Then
Type_Param.Add("服务器状态:离线")
ElseIf data_content(1) = &H1 Then
Type_Param.Add("本地服务器通信正常")
ElseIf data_content(1) = &H2 Then
Type_Param.Add("云端服务器通信正常")
Else
Type_Param.Add("云端通讯状态 - 未知状态")
End If
Case LSYS.NET_DafaultARGC
Type_Param.Add("网络初始化")
Type_Param.Add($"IP : {data_content(1)}.{data_content(2)}.{data_content(3)}.{data_content(4)}")
Type_Param.Add($"网关 : {data_content(5)}.{data_content(6)}.{data_content(7)}.{data_content(8)}")
Type_Param.Add($"子网掩码 : {data_content(9)}.{data_content(10)}.{data_content(11)}.{data_content(12)}")
Type_Param.Add($"DNS_IP : {data_content(13)}.{data_content(14)}.{data_content(15)}.{data_content(16)}")
If data_content(17) = &H1 Then
Type_Param.Add("网络ArgcFlag标志PC设置参数")
Else
Type_Param.Add("网络ArgcFlag标志主机默认参数")
End If
If data_content(18) = &H2 Then
Type_Param.Add("DHCP标志关闭DHCP")
Else
Type_Param.Add("DHCP标志启动DHCP")
End If
If data_content(19) = &H1 Then
Type_Param.Add("使用本地服务器标志")
Else
Type_Param.Add("使用云端服务器标志")
End If
Case Else
Type_Param.Add($"系统运行信息 类型错误{sys_type}")
End Select
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
Type_Param.Add("数据异常----")
End Try
Return Type_Param
End Function
''' <summary>
''' 设备通讯数据解析
''' </summary>
''' <param name="data_content"></param>
''' <returns></returns>
Public Function Parsing_LogData_Device_COMM_Content(data_content As Byte(), ByRef Type_Param As List(Of String)) As List(Of String)
Dim data_type As Byte = data_content(0)
Dim data_port As Byte = data_content(1)
Dim data_baud As UInt32
Dim data_buff(data_content.Length - 7) As Byte
Array.Copy(data_content, 6, data_buff, 0, data_content.Length - 6)
data_baud = data_content(5)
data_baud = (data_baud << 8) Or data_content(4)
data_baud = (data_baud << 8) Or data_content(3)
data_baud = (data_baud << 8) Or data_content(2)
Try
Select Case data_type
Case LCOMM.Adjust_Baud '设备切换通讯波特率
Type_Param.Add($"设备切换通讯波特率")
data_baud = data_content(6)
data_baud = (data_baud << 8) Or data_content(5)
data_baud = (data_baud << 8) Or data_content(4)
data_baud = (data_baud << 8) Or data_content(3)
Obtaining_The_Device_Type(data_content(1), Type_Param)
Type_Param.Add($" 设备地址:{data_content(2)}")
Type_Param.Add($" 切换波特率:{data_baud}" & vbCrLf)
Case LCOMM.ASK_TO_Reply '轮询回复数据
Type_Param.Add($"轮询回复数据")
Type_Param.Add($"Port_{data_port} ")
Type_Param.Add($"Baud:{data_baud} ")
Type_Param.Add("485通讯数据:" & BitConverter.ToString(data_buff).Replace("-", " "))
DataTypes.Parsing_485Data_type(data_buff, Type_Param)
Case LCOMM.Control_Reply 'RCU下发数据
Type_Param.Add($"RCU下发数据")
Type_Param.Add($"Port_{data_port}")
Type_Param.Add($"Baud:{data_baud}")
Type_Param.Add("485通讯数据:" & BitConverter.ToString(data_buff).Replace("-", " "))
DataTypes.Parsing_485Data_type(data_buff, Type_Param)
Case LCOMM.Send_Control 'RCU接收控制回复数据
Type_Param.Add($"RCU接收控制回复数据")
Type_Param.Add($"Port_{data_port}")
Type_Param.Add($"Baud:{data_baud}")
Type_Param.Add("485通讯数据:" & BitConverter.ToString(data_buff).Replace("-", " "))
DataTypes.Parsing_485Data_type(data_buff, Type_Param)
Case Else
Type_Param.Add("类型错误:" & BitConverter.ToString(data_content).Replace("-", " "))
End Select
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
End Try
Return Type_Param
End Function
Public Sub Parsing_485Data_type(data_count As Byte(), ByRef Type_Param As List(Of String))
End Sub
''' <summary>
''' 获取设备类型
''' </summary>
''' <returns></returns>
Public Function Obtaining_The_Device_Type(data As Byte, ByRef Type_Param As List(Of String)) As List(Of String)
Try
Select Case data
Case BLV_DEVICE_TYPE.C12Dimming
Type_Param.Add("设备类型:C12调光设备")
Case BLV_DEVICE_TYPE.C5IO
Type_Param.Add("设备类型:C5IO设备")
Case BLV_DEVICE_TYPE.C5Music
Type_Param.Add("设备类型:C5Music设备")
Case BLV_DEVICE_TYPE.PC_TEST
Type_Param.Add("设备类型:BLV PC TEST")
Case BLV_DEVICE_TYPE.RS485_Card
Type_Param.Add("设备类型:RS485 插卡取电")
Case BLV_DEVICE_TYPE.RS485_IR_SEND
Type_Param.Add("设备类型:RS485 红外转发")
Case BLV_DEVICE_TYPE.RS485_RGB_Light
Type_Param.Add("设备类型:RS485 RGB灯带")
Case BLV_DEVICE_TYPE.RS485_Switch
Type_Param.Add("设备类型:RS485 开关")
Case BLV_DEVICE_TYPE.RS485_Temp
Type_Param.Add("设备类型:RS485 温控器")
Case BLV_DEVICE_TYPE.RS485_Time
Type_Param.Add("设备类型:时间同步")
Case BLV_DEVICE_TYPE.RS485_XiaoBao
Type_Param.Add("设备类型:RS485 小宝语音")
Case Else
Type_Param.Add($"未知设备:{data}")
End Select
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
End Try
Return Type_Param
End Function
''' <summary>
''' 设备通讯状态数据解析
''' </summary>
''' <param name="data_content"></param>
''' <returns></returns>
Public Function Parsing_LogData_Device_Online_Content(data_content As Byte(), ByRef Type_Param As List(Of String)) As List(Of String)
Dim dev_type As Byte = data_content(0)
Dim dev_addr As Byte = data_content(1)
Dim dev_state As Byte = data_content(2)
Try
Type_Param.Add("设备状态改变")
Type_Param = Obtaining_The_Device_Type(dev_type, Type_Param)
Type_Param.Add($"设备地址:{dev_addr} ")
If dev_state = LOG_DEV_State.Offline Then
Type_Param.Add("设备状态:离线")
ElseIf dev_state = LOG_DEV_State.Online Then
Type_Param.Add("设备状态:在线")
Else
Type_Param.Add($"状态错误:{dev_state}")
End If
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
End Try
Return Type_Param
End Function
''' <summary>
''' 所有设备状态定期保存数据解析
''' </summary>
''' <param name="data_content"></param>
''' <returns></returns>
Public Function Parsing_LogData_Global_Parameters_Content(data_content As Byte(), ByRef Type_Param As List(Of String)) As List(Of String)
Type_Param.Add("所有设备状态定期保存数据解析" & BitConverter.ToString(data_content).Replace("-", " "))
Return Type_Param
End Function
''' <summary>
''' 网络处理记录信息解析
''' </summary>
''' <param name="data_content"></param>
''' <returns></returns>
Public Function Parsing_LogData_Net_COMM_Content(data_content As Byte(), ByRef Type_Param As List(Of String)) As List(Of String)
Dim net_type As Byte = data_content(0)
Dim net_port As UInt16
Select Case net_type
Case LNetComm.N_Recv
Try
Type_Param.Add("网络接收记录")
Type_Param.Add($"套接字序号(1~4):{data_content(1)}")
Type_Param.Add($"接收IP:{data_content(2)}.{data_content(3)}.{data_content(4)}.{data_content(5)}")
net_port = data_content(7)
net_port <<= 8
net_port = net_port Or data_content(6)
Type_Param.Add($"接收端口Port:{net_port}")
Type_Param.Add("Data:" & BitConverter.ToString(data_content, 8).Replace("-", " "))
DataTypes.Check_Network_Data(data_content, Type_Param, True)
Catch ex As Exception
Type_Param.Add("网络数据解析错误:" & BitConverter.ToString(data_content, 1).Replace("-", " "))
End Try
Case LNetComm.N_Send
Try
Type_Param.Add("网络发送记录")
Type_Param.Add($"套接字序号(1~4):{data_content(1)}")
Type_Param.Add($"发送IP:{data_content(2)}.{data_content(3)}.{data_content(4)}.{data_content(5)}")
net_port = data_content(7)
net_port <<= 8
net_port = net_port Or data_content(6)
Type_Param.Add($"发送端口Port:{net_port}")
Type_Param.Add("Data:" & BitConverter.ToString(data_content, 8).Replace("-", " "))
DataTypes.Check_Network_Data(data_content, Type_Param, False)
Catch ex As Exception
Console.WriteLine("网络数据解析错误:长度不够")
Type_Param.Add("网络数据解析错误:" & BitConverter.ToString(data_content, 1).Replace("-", " "))
End Try
End Select
Return Type_Param
End Function
''' <summary>
''' 事件处理记录信息解析
''' </summary>
''' <param name="data_content"></param>
''' <returns></returns>
Public Function Parsing_LogData_Logic_Record_Content(data_content As Byte(), ByRef Type_Param As List(Of String)) As List(Of String)
Type_Param.Add("事件处理记录信息解析" & BitConverter.ToString(data_content).Replace("-", " "))
Return Type_Param
End Function
#End Region
''' <summary>
''' 字符串显示 DateTime
''' </summary>
''' <param name="data_list"></param>
''' <returns></returns>
Public Function Parsing_DateTime(data_list As Log_DateStruct) As String
Dim temp_string As String
temp_string = $"20{data_list.year:00}-{data_list.month:00}-{data_list.day:00} {data_list.hour:00}:{data_list.minute:00}:{data_list.second:00}.{data_list.milliscond:000}"
'temp_string = $"{data_list.hour:00}:{data_list.minute:00}:{data_list.second:00}.{data_list.milliscond:000}"
Return temp_string
End Function
''' <summary>
''' 和校验取余数
''' 求Byte数组的和校验取余数
''' </summary>
''' <param name="dataPacket">Byte数组</param>
''' <returns></returns>
Public Function GetSumCheckMod(dataPacket As Byte(), datalen As Byte) As Byte
Dim sum As Integer
For idx = 0 To datalen - 1
sum += dataPacket(idx)
sum = sum And &HFF
Next
Dim sumMod As Byte = &HFF - sum
Return sumMod
End Function
''' <summary>
''' 打印文件信息
''' </summary>
''' <param name="datFile"></param>
Private Sub ConsoleWirteFileInfo(ByVal datFile As Scripting.File)
Console.WriteLine($"-------------------------------------------")
Console.WriteLine($"文件名:{datFile.Name}")
Console.WriteLine($"文件路径:{datFile.Path}")
Console.WriteLine($"文件修改时间:{datFile.DateLastModified}") ' 文件修改时间
Console.WriteLine($"文件创建时间:{datFile.DateCreated}") '文件创建时间
Console.WriteLine($"文件访问时间:{datFile.DateLastAccessed}") '文件访问时间
Console.WriteLine($"文件大小:{datFile.Size}") '文件大小 字节为单位
End Sub
Dim aliyun_sql As Thread
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
My.Settings.Reload()
DirPath_txt.Text = My.Settings.path
Count_txt.Text = My.Settings.timeout
If DirPath_txt.Text = "" Then DirPath_txt.Text = "c:\"
If Count_txt.Text = "" Then Count_txt.Text = "600"
Control.CheckForIllegalCrossThreadCalls = False '加入这句代码就可以在别的线程访问窗体控件了
_count = Count_txt.Text
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf UpdateTime))
aliyun_sql = New Thread(AddressOf StartPutSLSRequest)
aliyun_sql.Start()
Me.Text = "RCU Udp Log Agent ( Build:" & Application.ProductVersion & ")"
End Sub
Private Sub UpdateTime()
While True
ShowSendCount(Label3, Now.ToString("yyyy-MM-dd HH:mm:ss"))
Thread.Sleep(300)
End While
End Sub
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
My.Settings.path = DirPath_txt.Text
My.Settings.timeout = Count_txt.Text
My.Settings.Save()
Environment.Exit(0)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles SelectFile_btn.Click
Dim tmpRcuModelFile As String
Using dlg As New FolderBrowserDialog
dlg.Description = "请选择入库文件夹!"
dlg.SelectedPath = Application.StartupPath
If dlg.ShowDialog <> DialogResult.OK Then Return
DirPath_txt.Text = dlg.SelectedPath
End Using
End Sub
Private onoff_flag As Boolean = False
Private Sub ONOFF_btn_Click(sender As Object, e As EventArgs) Handles ONOFF_btn.Click
'更新刷新时间
Button2.PerformClick()
If gIsAutoFresh = True Then
gIsAutoFresh = False
'关闭自动刷新
ONOFF_btn.Text = "开始自动刷新"
ShowRichTextBox(RichTextBox1, "已禁用自动刷新")
Else
gIsAutoFresh = True
'开启自动刷新’
ONOFF_btn.Text = "关闭自动刷新"
ShowRichTextBox(RichTextBox1, "已启用自动刷新")
End If
End Sub
''' <summary>
''' 定时器技计数
''' </summary>
Public _count As Integer = 0
Public gIsSlsWriteSuceed As Boolean = False
Private Delegate Sub ShowSendRichTextBox(textbox As RichTextBox, index As String)
Private Sub ShowRichTextBox(textbox As RichTextBox, index As String)
Try
Dim tmpStrTimeNow As String = Format(Now(), "MM-dd HH:mm:ss")
Dim tmpStr As String = "[" & tmpStrTimeNow & "]:" & index & vbNewLine
If textbox.InvokeRequired Then
Dim show As New ShowSendRichTextBox(AddressOf ShowRichTextBox)
textbox.Invoke(show, textbox, tmpStr)
Else
textbox.AppendText(tmpStr)
End If
If textbox.Lines.Count > 1000 Then textbox.Clear()
'自动滚到最后一行
textbox.SelectionStart = textbox.TextLength
textbox.ScrollToCaret()
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
End Try
End Sub
Private Delegate Sub ShowSendCountDelegate(textbox As Label, index As String)
Private Sub ShowSendCount(textbox As Label, index As String)
Try
If textbox.InvokeRequired Then
Dim show As New ShowSendCountDelegate(AddressOf ShowSendCount)
textbox.Invoke(show, textbox, index)
Else
textbox.Text = index
End If
Catch ex As Exception
AdminLog.ApplicationLog.WriteErrorLog(ex)
End Try
End Sub
Public Sub delay(ByRef Interval As Double)
Dim time As DateTime = DateTime.Now
Dim Span As Double = Interval * 10000 '因为时间是以100纳秒为单位。
While ((DateTime.Now.Ticks - time.Ticks) < Span)
Application.DoEvents()
End While
End Sub
Private Sub Empty_btn_Click(sender As Object, e As EventArgs) Handles Empty_btn.Click
RichTextBox1.Text = ""
End Sub
Private Sub Count_txt_TextChanged(sender As Object, e As EventArgs) Handles Count_txt.TextChanged
End Sub
Private Function IsALLNum(numstr As String) As Boolean
If (numstr.Length = 0) Then
Return False
End If
For Each c As Char In numstr
If Not Char.IsNumber(c) Then
Return False
End If
Next
Return True
End Function
Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click
Dim counttxt As String = Count_txt.Text
If counttxt = "" Then counttxt = "300"
If CInt(counttxt) > 60000 Or CInt(counttxt) < 30 Then
_count = 30
Else
_count = CInt(counttxt)
End If
TextBox3.Text = _count
ShowRichTextBox(RichTextBox1, "_count = " & _count)
End Sub
Private Sub TIM_AutoRefersh_Tick(sender As Object, e As EventArgs) Handles TIM_AutoRefersh.Tick
If gIsAutoFresh = True Then
If _count > 0 Then
'倒计时
_count = _count - 1
TextBox3.Text = _count
Else
'倒计时到 0
TIM_AutoRefersh.Stop() '暂停计时
ScanFile() '启动扫描
Button2.PerformClick() '扫描完成后将时间恢复
TIM_AutoRefersh.Start() '恢复计时
End If
End If
End Sub
''' <summary>
''' 判断文件是否被占用
''' </summary>
''' <param name="filepath"></param>
''' <returns></returns>
Public Function IsFileReady(ByVal filepath As String) As Boolean '检查文件是否正在被使用的函数
If IO.File.Exists(filepath) = False Then
Return True
Exit Function '如果filpath文件不存在也就不没有被占用应该返回true
End If
Try
IO.File.Open(filepath, FileMode.Open).Close()
Return True
Catch e As Exception
'MsgBox("Writing was disallowed, as expected: " & e.ToString())
Return False
End Try
End Function
End Class