الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مناقشة مشروع المونيتور سيستم

مغلق
بدأه m_lahlouh في 28 سبتمبر 2005 · 7 رد · 2,634 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هناك في برنامجك Monitoring System

في موضوع برنامج مراقبة باستخدام كاميرا, اعرض البرنامج هنا بهدف تطويره

استعملت باراميتر

System.Int32 dwRop // raster operation code

في function

private static extern bool BitBlt(
 	 IntPtr hdcDest, // handle to destination DC
 	 int nXDest,  // x-coord of destination upper-left corner
 	 int nYDest,  // y-coord of destination upper-left corner
 	 int nWidth,  // width of destination rectangle
 	 int nHeight, // height of destination rectangle
 	 IntPtr hdcSrc,  // handle to source DC
 	 int nXSrc,   // x-coordinate of source upper-left corner
 	 int nYSrc,   // y-coordinate of source upper-left corner
 	 System.Int32 dwRop  // raster operation code
 	 );

استدعيت هذا الدوال وادخلت عليه القيمة 13369376 فماذا تعني هذه القيمة وهذا الباراميتر ؟؟؟

BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc1, 0, 0, 13369376

تم تعديل هذه المشاركة بواسطة m_lahlouh في 28 سبتمبر 2005 في 19:35

عندما تولد يا ابن آدم يؤذن في اذنك من غير صلاة...

وعندما تموت.... يصلى عليك من غير آذان....

فكأن حياتك في الدنيا ليست سوى... الوقت الذي تمضيه بين الأذان والصلاة...

فلا تقضيه بما لاينفع

Mohammad Lahlouh

mohammadlahlouh.blogspot.com

Make money from your Website or Blog with BidVertiser

#2

اشكرك اخي العزيز على طرح الموضوع للمناقشة

بنسبة للبراميتر الواردة الذكر فهي تعاريف ابتدائية

لحجم الصورة الملتقطة بناء على الرزيليوشن المعد لديك في الشاشة ,

BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, 
Screen.PrimaryScreen.Bounds.Height, dc1, 0, 0, 13369376);

بنسبة لرقم 13369376 فهو خاص برزليوشن الخاص بلألوان بإمكانك التعديل

علية لتقليل او الزيادة ..

#3

سوف اقوم ببعض الشرح لأجزاء البرنامج ..

الكود التالي خاص بتعريف لمكتبة gdi32 وتعريف قيم ابتدائية لحجم الصورة الملتقطة و الألوان ...

  [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
  private static extern bool BitBlt(
  	IntPtr hdcDest, // handle to destination DC
  	int nXDest,  // x-coord of destination upper-left corner
  	int nYDest,  // y-coord of destination upper-left corner
  	int nWidth,  // width of destination rectangle
  	int nHeight, // height of destination rectangle
  	IntPtr hdcSrc,  // handle to source DC
  	int nXSrc,   // x-coordinate of source upper-left corner
  	int nYSrc,   // y-coordinate of source upper-left corner
  	System.Int32 dwRop  // raster operation code
  	);

  [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
  private static extern IntPtr  CreateDC(
              string lpszDriver,        // driver name
     string lpszDevice,        // device name
     string lpszOutput,        // not used; should be NULL
    IntPtr lpInitData	// optional printer data
      );

يقوم الكود التالي بإسناد قيم للبراميترات بناء على الرزيليوشن الموجود لديك وتحديد جهاز العرض و تحويل الصورة الملتقطة الى Stream وتخزينها في مصفوفة من نوع Byte ثم ارسالها بستخدام Network Stream الى الهوست المحدد في textbox

حيث يقوم الجزء الخاص ب server بستقبالها

  private void PerformCapture()
  {

  	IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
  	Graphics g1 = Graphics.FromHdc(dc1);
  	MyImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
  	Graphics g2 = Graphics.FromImage(MyImage);
  	dc1 = g1.GetHdc();
  	IntPtr dc2 = g2.GetHdc();
  	BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc1, 1, 1, 13369376);
  	g1.ReleaseHdc(dc1);
  	g2.ReleaseHdc(dc2);
  	
  	pictureBox1.Image = MyImage;

  	MemoryStream ms = new MemoryStream();// Store it in Binary Array as Stream
  	pictureBox1.Image.Save(ms,pictureBox2.Image.RawFormat);
  	byte[] arrImage = ms.GetBuffer();
  	ms.Close();

  	TcpClient myclient = new TcpClient ("localhost",5020);//Connecting with server
  	NetworkStream myns = myclient.GetStream ();
  	BinaryWriter  mysw = new BinaryWriter (myns);
  	mysw.Write(arrImage);//send the stream to above address
  	mysw.Close ();
  	myns.Close ();
  	myclient.Close ();
  }

الجزء الخاص بسيرفر , يقوم بإنشاء Connection ثم استقبال ال Stream ثم تعبأتها بمصفوفة وتحويلها الى صورة من جديد بستخدام Image.FromStream وعرضها على PictureBox

وهذا هو الكود

mytcpl = new TcpListener (5020);  // Open The Port
mytcpl.Start ();  // Start Listening on That Port
mysocket = mytcpl.AcceptSocket ();  // Accept Any Request From Client and Start a Session
myns = new NetworkStream (mysocket); // Receives The Binary Data From Port
pictureBox1.Image = Image.FromStream(myns);
mytcpl.Stop(); // Close TCP Session

اي استفسار اخر انا بعون الله جاهز للإجابة ... كما انه اذا كان لديك اي اقتراح بتعديل ما لا تتردد بإدراجه وسوف نناقشه بعون الله

تم تعديل هذه المشاركة بواسطة fmo_82 في 28 سبتمبر 2005 في 20:43

#4

يمكن ان يتم استخدام UDP بدل TCP لزيادة سرعة البرنامج ولكن من المعروف ان UDP يفتقر الى عمليات التحقق ولكنه اسرع من ال TCP :

وهذا مثال بسيط يوضح طريقة استخدامه :

UdpClient udpClient = new UdpClient();
udpClient.Connect(tbHost.Text, 8080);
Byte[] sendBytes = Encoding.ASCII.GetBytes("Hello World?");
udpClient.Send(sendBytes, sendBytes.Length);

وهنا طريقة استخدامه مع Thread

private void Form1_Load(object sender, System.EventArgs e)
{
Thread thdUDPServer = new Thread(new ThreadStart(serverThread));
thdUDPServer.Start();
}

public void serverThread()
{
UdpClient udpClient = new UdpClient(8080);
while(true)
{
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any,0);
Byte[] receiveBytes = udpClient.Receive(ref
RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receiveBytes);
lbConnections.Items.Add(
RemoteIpEndPoint.Address.ToString() + ":" +
returnData.ToString()
);
}
}

اقترح استخدام ال UDP في البرنامج ... ما هو رأيكم

#5

السلام

ما هو IPEndPoint ؟

IPAddress.Any؟

يقال ان باستخدام Udp يمكن عمل broadcasting اي ارسال لاكثر من جهاز في نفس الوقت، كيف يتم هذا؟؟

عندما تولد يا ابن آدم يؤذن في اذنك من غير صلاة...

وعندما تموت.... يصلى عليك من غير آذان....

فكأن حياتك في الدنيا ليست سوى... الوقت الذي تمضيه بين الأذان والصلاة...

فلا تقضيه بما لاينفع

Mohammad Lahlouh

mohammadlahlouh.blogspot.com

Make money from your Website or Blog with BidVertiser

#6

اخي العزيز m_lahlouh ,

بنسبة IPEndPoint فهي ميثود تقوم من خلالها بإسناد العنوان و رقم البورت الخاصة بالهوست الذي تود الإرسال اليه وهنا طريقة استخدامه :

IPEndPoint endpoint = new IPEndPoint(address, port);

ثم نسنده الى السوكت كما يلي

tempSocket = 
    new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

بنسبة ل IPAddress.Any يستخدم لعمل برودكاست للراسالة على كل الأجهزة الموجودة في الشبكة , حيث يفترض بالهوست ان يقوم بعمل ليسن على الأجهزة الموجودة في الشبكة وبدون تحديد هدف معين , كما في المثال السابق الذكر

لاحظ المثال الموجود في هذه الصفحة :

http://www.codeproject.com/csharp/multicast.asp

تم تعديل هذه المشاركة بواسطة fmo_82 في 2 أكتوبر 2005 في 13:03

#7

شكرا سأدرس الموضوع

ولكن احتاج لان ارسل stream فهل يمكن؟؟

وهل يجب ان يكون الـ ip الخاص بالأجهزة هو من class D حتى تعمل خاصية الـ broadcasting????

عندما تولد يا ابن آدم يؤذن في اذنك من غير صلاة...

وعندما تموت.... يصلى عليك من غير آذان....

فكأن حياتك في الدنيا ليست سوى... الوقت الذي تمضيه بين الأذان والصلاة...

فلا تقضيه بما لاينفع

Mohammad Lahlouh

mohammadlahlouh.blogspot.com

Make money from your Website or Blog with BidVertiser

#8

بتأكيد تستطيع استخدام ال UDP لإرسال Stream بل انه يفضل استخدامه في حالة كون البث من النوع برودكاست كون ان عملية التحقق من وصول البكتس غير مهمة ,في المثال التالي قمت بستخدامه لإرسال الصورة بدلا من TCP:

UdpClient udpClient = new UdpClient();
udpClient.Connect(IPAddress.Any, PortNumber);
MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms,pictureBox2.Image.RawFormat);
byte[] arrImage = ms.GetBuffer();
ms.Close(); 

NetworkStream myns = udpClient .GetStream ();
BinaryWriter  mysw = new BinaryWriter (myns);
mysw.Write(arrImage);

mysw.Close ();
myns.Close ();
udpClient.Close();

بنسبة لسؤال الثاني لا يهم ما هو نوع الماسك الذي يستخدم ولكن يشترط استخدام ماسك موحد لكل الأجهزة على الشبكة , وفي حالة وجود اكثر من ماسك لا بد من استخدام راوتر لربط الشبكتين , المهم انه عند استخدام اسلوب البرود كاست بستخدام ال UDP لا بد من ان تكون جميع الأجهزة متصلة مع بعضها وتستطيع رؤية بعضها البعض على الشبكة ..

تم تعديل هذه المشاركة بواسطة fmo_82 في 3 أكتوبر 2005 في 01:23

هذا الموضوع مغلق.

مواضيع مشابهة