• 0
m_lahlouh

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

سؤال

هناك في برنامجك 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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

7 إجابة على هذا السؤال .

  • 0

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

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

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

الكود التالي خاص بتعريف لمكتبة 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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يمكن ان يتم استخدام 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 في البرنامج ... ما هو رأيكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام

ما هو IPEndPoint ؟

IPAddress.Any؟

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخي العزيز 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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بتأكيد تستطيع استخدام ال 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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .