//保存文件,16进制,封装开头是0xAA,结尾是0x55 private void StoreDataToFile(int intDeviceID, byte[] bytes) { string filename = DateTime.Now.ToString("yyyy-MM-dd") + "--" + DateTime.Now.Hour.ToString() + "-" + DateTime.Now.Minute.ToString() + "-" + DateTime.Now.Second.ToString() + "--" + intDeviceID.ToString();//以日期时间命名,避免文件名重复 byte[] fileStartAndEnd = new byte[2] { 0xAA, 0x55 }; //保存文件的头是AA,尾是55 string url = @"D:\\PipeWeb\\Data\\"; if (!Directory.Exists(url)) //如果不存在就创建file文件夹 { Directory.CreateDirectory(url); //创建该文件夹 string path = url + filename + ".dat"; FileStream F = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite); F.Write(fileStartAndEnd, 0, 1); F.Write(bytes, 0, bytes.Length); F.Write(fileStartAndEnd, 1, 1); F.Flush(); F.Close(); NetDb.addsensorad(intDeviceID, DateTime.Now.ToString(), path); } else { string path = url + filename + ".dat"; FileStream F = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite); F.Write(fileStartAndEnd, 0, 1); F.Write(bytes, 0, bytes.Length); F.Write(fileStartAndEnd, 1, 1); F.Flush(); F.Close(); NetDb.addsensorad(intDeviceID, DateTime.Now.ToString(), path); } }
//处理数据和写入数据库 public void AnalyzeData(byte[] datagramBytes) { try { string msg = null; switch (datagramBytes[2]) { case 0x21: if (datagramBytes[7] == 0x00) { msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--读取开启时长和关闭时长成功" + "\n"; Console.WriteLine(msg); //ShowMsg(msg); } if (datagramBytes[7] == 0x01) { msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--设定开启时长和关闭时长成功" + "\n"; Console.WriteLine(msg); //ShowMsg(msg); } break; case 0x22: if (datagramBytes[9] == 0xAA) { msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--AD采样开始" + "\n"; Console.WriteLine(msg); Log.Debug(msg); } if (datagramBytes[9] == 0x55) { status.adStage = AdStage.AdFinished; NetDb.addsensorinfo(intDeviceID, strAddress, strAddress, status.HeartTime.ToString(), Convert.ToInt32(status.clientStage), Convert.ToInt32(status.adStage)); msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--AD采样结束" + "\n"; Console.WriteLine(msg); Log.Debug(msg); if (status.IsCaptureNow == true) { byte[] CmdAD = { 0xA5, 0xA5, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x06, 0x02, 0x57, 0x00, 0x00, 0x03, 0xE8, 0xFF, 0x5A, 0x5A }; status.IsSendDataToServer = true; status.currentsendbulk = 0; status.datalength = 0; status.adStage = AdStage.AdUploading; NetDb.addsensorinfo(intDeviceID, strAddress, strAddress, status.HeartTime.ToString(), Convert.ToInt32(status.clientStage), Convert.ToInt32(status.adStage)); SendCmd(CmdAD); msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--AD采样结束,属于立即采样,马上进行上传" + "\n"; Log.Debug(msg); } } break; case 0x23: if (datagramBytes.Length >= 1007) { if (status.IsSendDataToServer == true) { status.currentsendbulk++; Console.WriteLine("设备号--" + intDeviceID + "第" + status.currentsendbulk + "包\r\n"); if (status.datalength < status.byteAllData.Length) { // copy data to dataItem Array.Copy(datagramBytes, 7, status.byteAllData, status.datalength, 1000); status.datalength += 1000; Log.Debug("设备号--" + intDeviceID + "存储第" + status.currentsendbulk + "包\r\n"); } if (status.currentsendbulk >= 600) { StoreDataToFile(intDeviceID, status.byteAllData); //置状态为上传完毕 status.currentsendbulk = 0; status.IsSendDataToServer = false; msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--数据上传完毕" + "\n"; Console.WriteLine(msg); Log.Debug(msg); status.adStage = AdStage.AdStored; //上传完成 NetDb.addsensorinfo(intDeviceID, strAddress, strAddress, status.HeartTime.ToString(), Convert.ToInt32(status.clientStage), Convert.ToInt32(status.adStage)); } } } break; case 0x25: if (datagramBytes[9] == 0x55) { msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--设定GPS采样时间成功" + "\n"; Console.WriteLine(msg); Log.Debug(msg); NetDb.UpdateSensorCfg(intDeviceID, "IsSetCapTime", 0); //NetDb.UpdateSensorCfg(intDeviceID, "IsCaptureNow", 0); } break; case 0x26: if (datagramBytes[7] == 0x01) { msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--设定开启时长和关闭时长成功" + "\n"; Console.WriteLine(msg); Log.Debug(msg); NetDb.UpdateSensorCfg(intDeviceID, "IsSetOpenAndCloseTime", 0); } break; case 0x27: int[] gpsData = new int[23]; double Latitude = 0; double Longitude = 0; for (int i = 0; i < 23; i++) { gpsData[i] = datagramBytes[9 + i]; } GPSDistance.getGPSData(gpsData, out Latitude, out Longitude); msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--经度为:" + Longitude + "纬度为:" + Latitude + "\n"; Console.WriteLine(msg); Log.Debug(msg); //把经纬度写入数据库;在addsensorcfg后面加上IsGetGPSinfo,hex加到3 if (Longitude > 0 && Latitude > 0) { //保留6位小数 Longitude = (int)(Longitude * 1000000); Longitude = Longitude / 1000000; Latitude = (int)(Latitude * 1000000); Latitude = Latitude / 1000000; NetDb.UpdateSensorGPSinfo(intDeviceID, Longitude, Latitude); } else { NetDb.UpdateSensorGPSinfo(intDeviceID, -1, -1); } //经纬度信息读取成功,把标志位复位 NetDb.UpdateSensorCfg(intDeviceID, "IsGetGpsInfo", 0); Log.Debug("经纬度信息读取成功,把标志位复位"); break; case 0x28: if (datagramBytes[9] == 0x55) { msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--设定立即采样时间成功" + "\n"; Console.WriteLine(msg); Log.Debug(msg); NetDb.UpdateSensorCfg(intDeviceID, "IsCaptureNow", 0); } break; case 0x29: msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--设定服务器IP成功" + "\n"; Console.WriteLine(msg); Log.Debug(msg); NetDb.UpdateSensorCfg(intDeviceID, "IsSetServerIP", 0); break; case 0x30: msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--设定服务器端口号成功" + "\n"; Console.WriteLine(msg); Log.Debug(msg); NetDb.UpdateSensorCfg(intDeviceID, "IsSetServerPort", 0); break; case 0x31: msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--设定AP名称成功" + "\n"; Console.WriteLine(msg); Log.Debug(msg); NetDb.UpdateSensorCfg(intDeviceID, "IsSetApName", 0); break; case 0x32: msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--设定AP密码成功" + "\n"; Console.WriteLine(msg); Log.Debug(msg); NetDb.UpdateSensorCfg(intDeviceID, "IsSetApPassword", 0); break; case 0x33: msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--重连设定完成" + "\n"; Console.WriteLine(msg); Log.Debug(msg); NetDb.UpdateSensorCfg(intDeviceID, "IsReconnect", 0); NetDb.UpdateSensorInfo(intDeviceID, "Status", 0); //接收到8266的重连确认信息后,置设备状态为不在线0 SendCmd(CmdItem.CmdEnterSleep); break; case 0x34: msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "硬件" + strAddress + "设备号--" + intDeviceID + "--进入休眠" + "\n"; Console.WriteLine(msg); Log.Debug(msg); NetDb.UpdateSensorInfo(intDeviceID, "Status", 2); //设备状态为2表示进入休眠, break; case 0xFF: status.clientStage = ClientStage.idle; status.HeartTime = DateTime.Now; NetDb.UpdateSensorInfo(intDeviceID, "Status", Convert.ToInt32(status.clientStage)); NetDb.UpdateSensorInfoWithTime(intDeviceID, "loginTime", status.HeartTime.ToString()); Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "设备号--" + intDeviceID + "收到心跳包\r\n"); Log.Debug("设备号--" + intDeviceID + "收到心跳包\r\n"); break; default: Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "收到其他类型数据\r\n"); Log.Debug("收到其他类型数据"); break; } if (status.IsSendDataToServer == true) { SendCmd(SetADcmd(status.currentsendbulk));//继续发送AD命令 } } catch (Exception e) { Console.WriteLine(e); Log.Debug(e); } }