public void AddHardwareSendPic(string GpsCode, BoShiJiePicture pic) { lock (HardwareSendPic) { HardwareSendPic.Add(GpsCode, pic); pic.UploadFramesCompleted = new BoShiJiePicture.UploadFramesCompletedHandler(BoShiJiePictures.Instance.UploadFramesCompletedHandler); } }
/// <summary> /// 新增照片接收实体 /// </summary> /// <param name="picture"></param> /// <param name="task"></param> /// <param name="fragement"></param> private void AddPicReciver(BoShiJiePicture picture, TakePicTask task, GPSPictureFragment fragement) { if (task.TaskType == SimpleCmdType.NormalSeriateShoot) { } else { picture = new BoShiJiePicture(task.GPSCode, (byte)fragement.FragementCount, (byte)fragement.CameraID, (byte)fragement.Status); } }
/// <summary> /// 写照片文件到指定目录 /// </summary> private void SavePictureInfoToDB(string gpsCode, string httpFileName, BoShiJiePicture picture) { YouWeiGPSData picture_YouWeiData = new YouWeiGPSData(); //去掉前缀的GPSCode picture_YouWeiData.BaseData.GPSCode = gpsCode.Remove(0, base.CodePrefix.Length); picture_YouWeiData.BaseData.PhotoPath = httpFileName; picture_YouWeiData.BaseData.IsPhotoData = true; picture_YouWeiData.FullGpsCode = gpsCode; int photoType = 0; switch (picture.TakeKind) { case 2: case 3: //上车拍照或开门拍照 photoType = 3; break; default: //默认实时拍照 photoType = 2; if (PicTaskPool.ContainsKey(gpsCode) && PicTaskPool[gpsCode].Count > 0) { //取出队首的任务 TakePicTask task = PicTaskPool[gpsCode].Peek(); if (task.TaskType == SimpleCmdType.TimingShoot) { photoType = 1; } else if (task.TaskType == SimpleCmdType.TakePictureForDoorShot) { photoType = 3; } } break; } picture_YouWeiData.BaseData.ReportTime = DateTime.Now; picture_YouWeiData.BaseData.ReceiveTime = DateTime.Now; picture_YouWeiData.BaseData.DoorStatus = (picture.TakeKind == 0x02 || picture.TakeKind == 0x03) ? 1 : 0; picture_YouWeiData.BaseData.PlunderState = picture.TakeKind == 0x01 ? 0 : 1; picture_YouWeiData.BaseData.RealTimePhotoType = photoType; picture_YouWeiData.BaseData.CameraId = picture.CameraNo; //} //StorageService.Store(new List<GPSDataEntity>() { picture_YouWeiData.BaseData }, base.CodePrefix); StorageService.GetQueue().Enqueue(picture_YouWeiData.BaseData); //向应用层发送图片路径 TakePictureAckMsg(ref picture_YouWeiData, false, true); }
/// <summary> /// 处理图像帧 /// </summary> /// <param name="data">帧数据</param> private void ProcessPictureFrame(byte[] data) { GPSPictureFragment fragement = DecodePictureStream(data); string strFullGpsCode = base.CodePrefix + fragement.GPSCode; Logger.Trace(string.Format("[收到图片数据]CameraNo:{0} FrameCount:{1}/{2} VehicleID:{3}", fragement.CameraID, (int)fragement.WhichFragement, fragement.FragementCount, strFullGpsCode)); switch (fragement.Status) { case 1: case 2: case 3: string strPicType = ""; switch (fragement.Status) { case 1: strPicType = "劫警拍照"; break; case 2: strPicType = "上车拍照"; break; case 3: strPicType = "开门延时拍照"; break; } //上车拍照或开门拍照 BoShiJiePicture Hardpicture = null; if (!HardwareSendPic.ContainsKey(strFullGpsCode)) { Logger.Trace("添加" + strPicType + "接收图片实体,GPScode:" + strFullGpsCode); Hardpicture = new BoShiJiePicture(strFullGpsCode, (byte)fragement.FragementCount, (byte)fragement.CameraID, (byte)fragement.Status); AddHardwareSendPic(strFullGpsCode, Hardpicture); } Hardpicture = HardwareSendPic[strFullGpsCode]; Hardpicture.UpdateFrame((byte)fragement.WhichFragement, fragement.Data); break; default: if (PicTaskPool[strFullGpsCode].Count <= 0) { return; } TakePicTask task = PicTaskPool[strFullGpsCode].Peek(); //当前拍照的摄像头编号和上传数据中的编号是否一致 if (task.Status == TakePicTaskStatus.LastPicFinished || task.CameraList[task.CurrentCameraIndex] != fragement.CameraID) { Logger.Trace(string.Format("[补传或已超时照片的数据,抛弃]CameraNo:{0}; VehicleID:{1}", fragement.CameraID, strFullGpsCode)); return; } var picture = BoShiJiePictures.Instance[strFullGpsCode]; //接收实体不存在 if (picture == null) { if (task.CameraList[task.CurrentCameraIndex] == fragement.CameraID) { picture = new BoShiJiePicture(task.GPSCode, (byte)fragement.FragementCount, (byte)fragement.CameraID, (byte)fragement.Status); BoShiJiePictures.Instance.AddPic(picture); Logger.Trace(string.Format("[新增接收照片实体]CameraNo:{0}; VehicleID:{1}", fragement.CameraID, task.GPSCode)); } else { Logger.Trace(string.Format("[补传或已超时照片的数据,抛弃]CameraNo:{0}; VehicleID:{1}", fragement.CameraID, strFullGpsCode)); return; } } picture.UpdateFrame((byte)fragement.WhichFragement, fragement.Data); break; } }
//private byte[] CreateTakePhotoCommandStream(string gpsCode,int cameraID) //{ // byte[] gpsCodeStream=Transfer.TransferGPSCode16ToBytes(GetRawGPSCode(gpsCode)); // byte crc =(byte)( 0x28 ^ 0x08 ^ gpsCodeStream[0] ^ gpsCodeStream[1] ^ gpsCodeStream[2] ^ gpsCodeStream[3] ^ gpsCodeStream[4] ^ (byte)cameraID); // return new byte[] { 0x29, 0x29, 0x28, 0x00, 0x08, gpsCodeStream[0], gpsCodeStream[1], gpsCodeStream[2], gpsCodeStream[3], (byte)cameraID, crc, 0x0D }; //} /// <summary> /// 将拍照数据写成图片文件 /// </summary> internal void WritePicFile(BoShiJiePicture picture) { //图片存放目录名 string folderName = DateTime.Now.ToString("yyyMMdd"); //图片存放文件名 string picFileName = DateTime.Now.ToString("yyyyMMddHHmmss"); //web端查询图片目录 string httpFileName = folderName; int nIndex = PhotoPath.IndexOf("|"); string strShortGpsCode = picture.VehicleID.Remove(0, base.CodePrefix.Length); string folder = PhotoPath.Substring(0, nIndex) + "\\" + strShortGpsCode + "\\" + folderName; FileStream stream = null; if (Directory.Exists(folder) == false) { Directory.CreateDirectory(folder); } try { string picFileExtension = ".jpg"; string DistFileName = folder + "\\" + picFileName + "_" + picture.CameraNo.ToString() + picFileExtension; stream = new FileStream(DistFileName, FileMode.Append); httpFileName += "/" + picFileName + "_" + picture.CameraNo.ToString() + picFileExtension; for (int i = 1; i <= picture.Frames.Count; i++) { var frame = picture.Frames[(byte)i]; stream.Write(frame, 0, frame.Length); } stream.Close(); try { Bitmap bmp = new Bitmap(DistFileName); } catch (Exception ex) { Logger.Error("图片无法显示,不保存到数据库"); return; } //MemoryStream ms = new MemoryStream(); //for (int i = 1; i <= picture.Frames.Count; i++) //{ // var frame = picture.Frames[(byte)i]; // ms.Write(frame, 0, frame.Length); //} //System.Drawing.Image image = System.Drawing.Image.FromStream(ms); //image.Save("c:\\bsj" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg"); //将图片路径存入数据库 SavePictureInfoToDB(picture.VehicleID, httpFileName, picture); Logger.Trace("GpsBoShiJie--Gps:" + picture.VehicleID + " Saved picture", null); } catch (Exception ex) { Logger.Error("GpsBoShiJie.BoShiJieDataParser.writePicFile:" + ex.ToString(), null); } }