1963 lines
80 KiB
VB.net
1963 lines
80 KiB
VB.net
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
|
||
AddErrorFileToErrorfile(g_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", CType(Math.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.Exists(filepath) 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 24:00:00
|
||
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
|