Imports System.Data.Common Imports System.Data.SQLite Imports System.IO Imports System.Text Imports System.Threading Imports Scripting Public Class LogParsing Enum Debugtype log = 1 End Enum Enum LNetComm N_Send = 1 '网络发送数据 N_Recv '网络接收数据 End Enum ''' ''' 日志数据 - 设备通讯信息 ''' Enum LCOMM ASK_TO_Reply = 1 '轮询回复数据 Send_Control 'RCU下发控制数据 Control_Reply 'RCU控制回复数据 Adjust_Baud '设备调整波特率 End Enum ''' ''' 温控器设备数据结构 ''' 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 ''' ''' BLV设备类型 ''' 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 ''' ''' 日志数据 - 系统运行信息 ''' Enum LSYS PHY_Change = 1 'PHY状态变化记录 DevInfo_Error '设备链表信息错误 API_State '升级状态 NET_ARGC '网络初始化参数 MQTT_ARGC 'MQTT参数 NetComm_State '网络通讯状态 NET_DafaultARGC '网络默认参数 End Enum Enum LOG_DEV_State Online = &H1 Offline = &H2 End Enum ''' ''' 日志数据类型 ''' Enum log_type Launcher = 1 'Launcher信息记录 SYS_Record '系统运行信息记录 Device_COMM '设备通讯记录 Device_Online '设备通讯状态记录 Global_Parameters '所有设备状态定期记录 - 暂时还没用 Net_COMM '网络通讯记录 - 暂时还没定 Logic_Record '逻辑处理记录 - 暂时还没定 End Enum ''' ''' 日志数据 - Launcher记录信息 ''' Enum LLauncher ''' ''' 校验APP ''' App_Check = 1 ''' ''' 读取APP ''' Read_App ''' ''' 写Flash ''' Write_Flash ''' ''' 恢复出厂设置 ''' Factory_Reset ''' ''' 复位信号源 ''' 0x00:软件复位 ''' 0x01:上电复位 ''' 0x02:看门狗复位 ''' 0x03:外部手动复位 ''' 0x05:从下电模式唤醒时的复位 - 通过WCHISPTool烧录后的复位 ''' Reset_Source End Enum Public Structure LogDataInfoStruct Public MAC As String 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 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 ''' ''' 文件名结构解析 ''' 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 ''' ''' dat原始文件内容中的数据格式 ''' 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 Private Shared Log_Data_Len_Max As Int16 = 512 Private g_Queue As Queue Sub New() InsertData = True g_Queue = New Queue() IsCreationDbFile() ' CreateTable("Insqlite_UserTest") End Sub Public Function ScanFile(g_StrPath As String) End Function Public Function Parsefile(path As String, strFileName As String) As Boolean Dim MacDataList As New List(Of List(Of LogDataInfoStruct)) Dim ObjFileSystem As New FileSystemObject Dim ErrMsg As String = "" Dim AvalibFileList As New List(Of Scripting.File) If IsFileReady(strFileName) = False Then Return False Dim tmpFileInfo As New FileInfo(strFileName) Dim LastModified As Integer = (Now - tmpFileInfo.LastWriteTime).Minutes Dim ObjFileExtName As String = tmpFileInfo.Extension.ToUpper '获取文件后缀名 Dim FileSize As Long = tmpFileInfo.Length If ObjFileExtName <> ".DAT" OrElse FileSize = 0 OrElse LastModified < 1 Then If ObjFileExtName <> ".DAT" OrElse FileSize = 0 Then IO.File.Delete(strFileName) '删除非法文件 End If Return False End If '文件内容读取到 objfile 中 '’ShowRichTextBox(RichTextBox1, ">>>read:" & strFileName) Dim ObjFile As Scripting.File = ObjFileSystem.GetFile(strFileName) '解析文件名,获取MAC、酒店id、房号、生成日期等信息 Dim tmpFileNameInfo As fileNameInfoStruct = GetFileNameInfo(ObjFile) Dim tablenamelog As String = "TBL_Rcu_Log" ' If CreateTable(tablenamelog) Then '解析文件内容,获取详细文件信息 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(path, strFileName) '错误文件 ' Return False '读取文件失败 'End If '文件数据入队列了 【通过线程进行入库】 'g_Queue.Enqueue(tmpDataInfoList) '文件解析合法 '’ShowRichTextBox(RichTextBox1, ">>>add:" & strFileName) AddAvalibFileToErrorfile(path, strFileName) '建表 '线程入库 ' StartThread() 'Else ' Return False 'End If Return True End Function Public Event Fileschedule(ispass As Integer, ismax As Boolean) ''' ''' 解析文件内容 ''' ''' ''' Private Function GetFileInfoList(ByVal datFileName As fileNameInfoStruct, ByVal datFile As Scripting.File, ByRef fileInfoList As List(Of LogDataInfoStruct), ByRef ErrMsg As String) As Boolean Dim result As Boolean = True '确认文件是否存在 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 Addnode As LogDataInfoStruct 'Dim wacth As New Stopwatch 'wacth.Restart() '开启计时 RaiseEvent Fileschedule(file_data.Length, False) 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) '读取数据长度 RaiseEvent Fileschedule(sampleArr_showlen, True) 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) sampleArr_showlen += 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) '保存一份数据,添加到列表中 If fileInfoList.Count = 0 Then Addnode = File_Data_Parsing_To_Iten(datFileName, data_buff, Nothing) Else Addnode = File_Data_Parsing_To_Iten(datFileName, data_buff, fileInfoList.Item(fileInfoList.Count - 1)) End If fileInfoList.Add(Addnode) '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) result = False End If Else sampleArr_showlen += 1 'AnalysisLog("Data Len Fail!!! Now Len:" & sampleArr_showlen) result = False Console.WriteLine("Data Len Error!!! " & sampleArr_showlen) End If Else sampleArr_showlen += 1 result = False End If 'delay(1) 'Application.DoEvents() End While RaiseEvent Fileschedule(sampleArr_len, True) Catch ex As Exception AdminLog.ApplicationLog.WriteErrorLog(ex) End Try '数据添加到列表 ' fileInfoList = File_Data_Parsing_To_List(datFileName, data_list) Return result End Function Public Function File_Data_Parsing_To_Iten(ByVal datFileName As fileNameInfoStruct, databuff() As Byte, lastdata As LogDataInfoStruct) As LogDataInfoStruct Dim save_data As New LogDataInfoStruct 'Dim parsing_string As String Dim hour_tick As Int32 Dim hour_temp As Int32 Dim data_date As Int32 '数据类型及长度等 'save_data.original_data = file_data(idx) save_data.Log_SN = databuff(LOG_DATA_FORMAT.SN) save_data.Log_Type = databuff(LOG_DATA_FORMAT.Type) hour_temp = databuff(LOG_DATA_FORMAT.Len_8) save_data.Log_Len = (databuff(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 = (databuff(LOG_DATA_FORMAT.Date_L) And &HFF) '记录时间 hour_temp = databuff(LOG_DATA_FORMAT.Date_H) data_date = data_date Or (hour_temp << 8) hour_tick = databuff(LOG_DATA_FORMAT.Time8B) hour_temp = databuff(LOG_DATA_FORMAT.Time16B) hour_tick = hour_tick Or (hour_temp << 8) hour_temp = databuff(LOG_DATA_FORMAT.Time24B) hour_tick = hour_tick Or (hour_temp << 16) hour_temp = databuff(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(databuff, 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(lastdata, 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 save_data.MAC = datFileName.MAC ' 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}") ' Console.WriteLine($"解析数据包({idx})") Return save_data End Function 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 save_data.MAC = datFileName.MAC 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}") Console.WriteLine($"解析数据包({idx})") ' 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 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 ''' ''' 本条数据与上条数据的时间差 ''' ''' ''' ''' 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 Get_Data_Time_Difference2(lastdata As 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 If IsNothing(lastdata) Then Return temp_tick 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 = lastdata.Log_DateTime.year + 2000 If lastdata.Log_DateTime.month = 0 Then temp_time2.month = lastdata.Log_DateTime.month + 1 Else temp_time2.month = lastdata.Log_DateTime.month End If If lastdata.Log_DateTime.day = 0 Then temp_time2.day = lastdata.Log_DateTime.day + 1 Else temp_time2.day = lastdata.Log_DateTime.day End If temp_time2.hour = lastdata.Log_DateTime.hour temp_time2.minute = lastdata.Log_DateTime.minute temp_time2.second = lastdata.Log_DateTime.second temp_time2.milliscond = lastdata.Log_DateTime.milliscond 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 Return temp_tick End Function Private Sub AddErrorFileToErrorfile(g_StrPath As String, strFileName As String) Dim errorfilepath As String = g_StrPath & "\NG\" If Not IO.Directory.Exists(errorfilepath) Then IO.Directory.CreateDirectory(errorfilepath) End If Dim filen As String = strFileName.Substring(strFileName.LastIndexOf("\") + 1) Dim bufa() As String = filen.Split("_") errorfilepath = errorfilepath & bufa(0) & "\" If Not IO.Directory.Exists(errorfilepath) Then IO.Directory.CreateDirectory(errorfilepath) End If errorfilepath = errorfilepath & filen 'IO.File.Copy(strFileName, errorfilepath, True) ' IO.File.Delete(strFileName) Try My.Computer.FileSystem.MoveFile(strFileName, errorfilepath) Catch ex As Exception AdminLog.ApplicationLog.WriteErrorLog($"文件{strFileName}移动到{vbCrLf }{errorfilepath}{vbCrLf} 失败!{vbCrLf} 问题详情{vbCrLf }{ex.Message }") End Try End Sub Private Sub AddAvalibFileToErrorfile(g_StrPath As String, strFileName As String) Dim errorfilepath As String = g_StrPath & "\OK\" If Not IO.Directory.Exists(errorfilepath) Then IO.Directory.CreateDirectory(errorfilepath) End If Dim filen As String = strFileName.Substring(strFileName.LastIndexOf("\") + 1) Dim bufa() As String = filen.Split("_") errorfilepath = errorfilepath & bufa(0) & "\" If Not IO.Directory.Exists(errorfilepath) Then IO.Directory.CreateDirectory(errorfilepath) End If errorfilepath = errorfilepath & filen 'IO.File.Copy(strFileName, errorfilepath, True) ' IO.File.Delete(strFileName) Try My.Computer.FileSystem.MoveFile(strFileName, errorfilepath) Catch ex As Exception AdminLog.ApplicationLog.WriteErrorLog($"文件{strFileName}移动到{vbCrLf }{errorfilepath}{vbCrLf} 失败!{vbCrLf} 问题详情{vbCrLf }{ex.Message }") End Try End Sub ''' ''' Launcher类型数据解析 ''' ''' ''' 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 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 ''' ''' 解析数据内容 ''' 按照数据类型来解析,用于加载表格时的数据显示 - 简单的内容解析 ''' ''' ''' 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 ''' ''' 事件处理记录信息解析 ''' ''' ''' 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("-", " ")) Dim net_type As Byte = data_content(0) Select Case net_type Case Debugtype.log Type_Param.Add("调试日志") Type_Param.Add(Encoding.GetEncoding("GBK").GetString(data_content, 1, data_content.Length - 1)) End Select Return Type_Param End Function ''' ''' 网络处理记录信息解析 ''' ''' ''' 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 ''' ''' 所有设备状态定期保存数据解析 ''' ''' ''' 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 ''' ''' 设备通讯数据解析 ''' ''' ''' 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 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 ''' ''' 获取设备类型 ''' ''' 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 ''' ''' 设备通讯状态数据解析 ''' ''' ''' 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 ''' ''' 和校验取余数 ''' 求Byte数组的和校验取余数 ''' ''' Byte数组 ''' 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 ''' ''' 判断文件是否被占用 ''' ''' ''' 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 #Region "线程入库" Private g_FileDataToSql As Thread 'Private g_IsThread As Boolean = False Public Sub StartThread() If IsNothing(g_FileDataToSql) Then g_FileDataToSql = New Thread(AddressOf FileDataToSqlRuning) End If If g_FileDataToSql.IsAlive Then Return g_FileDataToSql = New Thread(AddressOf FileDataToSqlRuning) g_FileDataToSql.Start() End Sub Public InsertData As Boolean Public Sub FileDataToSqlRuning() Dim tmpDataInfoList As List(Of LogDataInfoStruct) Dim starttime As Date = Date.Now Dim tsp As TimeSpan If InsertData Then While True If g_Queue.Count > 0 Then starttime = Date.Now tmpDataInfoList = g_Queue.Dequeue() 'WriteDataToDB(tmpDataInfoList) tsp = Now - starttime Console.WriteLine("线程入库时间:" & tsp.TotalMilliseconds) Else Exit While End If End While Else g_Queue.Clear() End If End Sub #End Region #Region "数据库操作" Public DbConnString As String = "Server=blv-cloud-db.mysql.rds.aliyuncs.com;Port=3307;Database=rculog;Uid=blv_rcu;Pwd=fnadiaJDIJ7546;charset=utf8;" Public Function CreateTable(tadblname As String) As Boolean Dim localConn As New DbConnectionStringBuilder localConn.Add("Data Source", $"{Application.StartupPath }\LocalDB\LogService.db") 'localConn.Add("Password", "123456") Dim LocalConnString As String = localConn.ToString() Using db As New DbExecutor(DbExecutor.DbTypeEnum.Mysql, DbConnString) Try db.Open() Dim CreateTableStr As String = MysqlCreateTablecolumn(tadblname) db.ExecuteNonQuery(CreateTableStr) db.Close() Return True Catch ex As Exception ' MsgBox($"Create Tableco Error, {ex.Message}") AdminLog.ApplicationLog.WriteErrorLog($"Create Tableco Error, {ex.Message}") db.Close() Return False End Try End Using End Function ''' ''' 拼接sql语句入库 ''' ''' ''' Private Function WriteDataToDB(lstLogData As List(Of LogDataInfoStruct)) As Boolean 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 dic As New Dictionary(Of String, String) Dim trans As DbTransaction Dim Isauto As Integer = 0 Using db As New DbExecutor(DbExecutor.DbTypeEnum.Mysql, DbConnString) Try Try db.Open() Catch ex As Exception Console.WriteLine($"Open local db Error, {ex.Message}") ' MsgBox($"Open local db Error, {ex.Message}") AdminLog.ApplicationLog.WriteErrorLog($"Open database Error, {ex.Message}") Return False End Try trans = db.BeginTransaction For Each logDataInfo As LogDataInfoStruct In lstLogData ' AddLoadSqlRequestData(logDataInfo.MAC, logDataInfo, logDataInfo.parsing) '本地入库 '组插入键值对 dic.Clear() InsertDictionary(dic, logDataInfo.MAC, logDataInfo, logDataInfo.parsing) '添加测试记录 Dim tablenamelog As String = "TBL_Rcu_Log" Dim cmdText As String = db.CmdHelper.Insert(tablenamelog, dic) Try db.ExecuteNonQuery(cmdText) Catch ex As Exception db.Close() 'MsgBox($"Insert Table error,{ex.Message} {vbCrLf }{cmdText}") AdminLog.ApplicationLog.WriteErrorLog($"Insert Table error, {ex.Message}") Return False End Try Isauto = Isauto + 1 If Isauto > 500 Then trans.Commit() trans = db.BeginTransaction Isauto = 0 Thread.Sleep(1000) End If Next trans.Commit() db.Close() Return True Catch ex As Exception Console.WriteLine($"写库失败:{ex.ToString }") AdminLog.ApplicationLog.WriteErrorLog(ex) db.Close() Return False End Try End Using 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 LogDataInfoStruct, parsing_data As List(Of String)) '组插入键值对 Dim dic As New Dictionary(Of String, String) InsertDictionary(dic, strMacAdd, logDataInfo, parsing_data) 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() Using db As New DbExecutor(DbExecutor.DbTypeEnum.Mysql, DbConnString) 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 {strMacAdd} ( '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 {strMacAdd} ") 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("", strMacAdd, colname, typeString)) Catch ex As Exception db.Close() MsgBox($"Add column[{strMacAdd}] To Table error,{ex.Message}") Return False End Try '插入字段语句 End If Next '添加测试记录 Dim cmdText As String = db.CmdHelper.Insert(strMacAdd, 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 Public Sub IsCreationDbFile() '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") 'End If End Sub Public Sub InsertDictionary(ByRef dic As Dictionary(Of String, String), strMacAdd As String, logDataInfo As 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("-", " ") 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(), " ") End Sub Public Function MysqlCreateTablecolumn(strMacAdd As String) Dim result As String result = $"CREATE TABLE IF NOT EXISTS `{strMacAdd}` ( `ID` int NOT NULL AUTO_INCREMENT , `TimeSpan` varchar(254) DEFAULT NULL, `mac` varchar(254) DEFAULT NULL, `createdatetime` varchar(254) DEFAULT NULL, `logfilename` varchar(254) DEFAULT NULL, `logprojectid` varchar(254) DEFAULT NULL, `logroomid` varchar(254) DEFAULT NULL, `log_valid` varchar(254) DEFAULT NULL, `log_sn` varchar(254) DEFAULT NULL, `log_len` varchar(254) DEFAULT NULL, `log_datetime` varchar(254) DEFAULT NULL, `log_timespan` varchar(254) DEFAULT NULL, `log_type` varchar(254) DEFAULT NULL, `log_content` text DEFAULT NULL, `type_param_1` text DEFAULT NULL, `type_param_2` text DEFAULT NULL, `type_param_3` text DEFAULT NULL, `type_param_4` text DEFAULT NULL, `type_param_5` text DEFAULT NULL, `type_param_6` text DEFAULT NULL, `type_param_7` text DEFAULT NULL, `type_param_8` text DEFAULT NULL, `type_param_9` text DEFAULT NULL, `type_param_10` text DEFAULT NULL, `remark` varchar(254) DEFAULT NULL, PRIMARY KEY (`ID`) ) " Return result End Function Public Function CreateTablecolumn(strMacAdd As String) Dim result As String result = $"Create Table if Not exists {strMacAdd} ( [ID] integer COLLATE BINARY NOT NULL PRIMARY KEY AUTOINCREMENT, [TimeSpan] varchar(16) COLLATE BINARY DEFAULT 'Null', [mac] varchar(8) COLLATE BINARY DEFAULT 'Null', [createdatetime] varchar(24) COLLATE BINARY DEFAULT 'Null', [logfilename] varchar(40) COLLATE BINARY DEFAULT 'Null', [logprojectid] varchar(8) COLLATE BINARY DEFAULT 'Null', [logroomid] varchar(8) COLLATE BINARY DEFAULT 'Null', [log_valid] varchar(8) COLLATE BINARY DEFAULT 'Null', [log_sn] varchar(8) COLLATE BINARY DEFAULT 'Null', [log_len] varchar(8) COLLATE BINARY DEFAULT 'Null', [log_datetime] varchar(24) COLLATE BINARY DEFAULT 'Null', [log_timespan] varchar(8) COLLATE BINARY DEFAULT 'Null', [log_type] varchar(8) COLLATE BINARY DEFAULT 'Null', [log_content] varchar(40) COLLATE BINARY DEFAULT 'Null', [type_param_1] varchar(8) COLLATE BINARY DEFAULT 'Null', [type_param_2] varchar(16) COLLATE BINARY DEFAULT 'Null', [type_param_3] varchar(8) COLLATE BINARY DEFAULT 'Null', [type_param_4] varchar(16) COLLATE BINARY DEFAULT 'Null', [type_param_5] varchar(32) COLLATE BINARY DEFAULT 'Null', [type_param_6] varchar(8) COLLATE BINARY DEFAULT 'Null', [type_param_7] varchar(8) COLLATE BINARY DEFAULT 'Null', [type_param_8] varchar(8) COLLATE BINARY DEFAULT 'Null', [type_param_9] varchar(8) COLLATE BINARY DEFAULT 'Null', [type_param_10] varchar(8) COLLATE BINARY DEFAULT 'Null', [remark] varchar(8) COLLATE BINARY DEFAULT 'Null');" Return result 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 ''' ''' 字符串显示 DateTime ''' ''' ''' 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 #End Region Public Function Gettablename() As List(Of String) Dim dic As New List(Of String) Dim localConn As New DbConnectionStringBuilder localConn.Add("Data Source", $"{Application.StartupPath }\LocalDB\LogService.db") 'localConn.Add("Password", "123456") Dim LocalConnString As String = localConn.ToString() Dim CreateTableStr As String = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;" Dim dtCol As DataTable Using db As New DbExecutor(DbExecutor.DbTypeEnum.Sqlite, LocalConnString) Try db.Open() dtCol = db.ExecuteDataTable(CreateTableStr) For i As Integer = 1 To dtCol.Rows.Count - 1 If dtCol.Rows(i)(0).ToString.Contains("sqlite_") Then Continue For dic.Add(dtCol.Rows(i)(0).ToString) Next db.Close() Return dic Catch ex As Exception MsgBox($"Create Tableco Error, {ex.Message}") db.Close() Return Nothing End Try End Using End Function Public Function DeleteTable(tabname As String) As Boolean Dim dic As New List(Of String) Dim localConn As New DbConnectionStringBuilder localConn.Add("Data Source", $"{Application.StartupPath }\LocalDB\LogService.db") 'localConn.Add("Password", "123456") Dim LocalConnString As String = localConn.ToString() Dim CreateTableStr As String = $"DROP TABLE '{tabname}';" Using db As New DbExecutor(DbExecutor.DbTypeEnum.Sqlite, LocalConnString) Try db.Open() db.ExecuteNonQuery(CreateTableStr) db.Close() Return True Catch ex As Exception MsgBox($"Create Tableco Error, {ex.Message}") db.Close() Return False End Try End Using End Function Public Function QueryDatabase(tabname As String) As DataTable Dim dic As New List(Of String) Dim localConn As New DbConnectionStringBuilder localConn.Add("Data Source", $"{Application.StartupPath }\LocalDB\LogService.db") 'localConn.Add("Password", "123456") Dim LocalConnString As String = localConn.ToString() Dim CreateTableStr As String = $"DROP TABLE '{tabname}';" Dim udt As DataTable Using db As New DbExecutor(DbExecutor.DbTypeEnum.Sqlite, LocalConnString) Try db.Open() udt = db.ExecuteDataTable($"Select * From {tabname} ") db.Close() Return udt Catch ex As Exception MsgBox($"Create Tableco Error, {ex.Message}") db.Close() Return Nothing End Try End Using End Function End Class