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

هل من شرح لكيفية الاتصال ب USB Modem وارسال رسائل منه ؟

بدأه red_scorpion1 في 26 نوفمبر 2013 · 13 رد · 2,790 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

 

طلب منى مشروع الاتصال بجهاز usb modem وذلك لارسال رسئل منهه sms وتنفيذ الاكواد المختصرة مثل تحويل الرصيد وخلافه - ةتعبت من البحث على الانترنت للتوصل للفهم الصحيح والطريقة المثلى لفعل ذلك - فهل من مساعدة فى هذا الموضوع جزاكم الله خيرا ؟

#2

السلام عليكم ..

اعتقد ان الموديم لديك هو GSM Modem  .

How To Send and Receive SMS using GSM Modem

Send and Read SMS through a GSM Modem using AT Commands

ارسال Sms بالعربي عن طريق ال Gsm Modem

ابحث في المنتدى عن gsm sms  و ستجد بعض المواضيع المفيدة .

1

لا إله إلا الله ... محمد رسول الله

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

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

السلام عليكم

بشكل عام انت تحتاج الى معرفة بما بسمى AT Commands .

يمكن استخدام المكتبة GSMCOMM فهي تختصر عليك الكثير من العمل .

#4
TareqVB كتب:

السلام عليكم

بشكل عام انت تحتاج الى معرفة بما بسمى AT Commands .

يمكن استخدام المكتبة GSMCOMM فهي تختصر عليك الكثير من العمل .

 

لم اجد شرح كافى لإستخدام تلك المكتبة فهل من مساعدة ؟

#5
حسام الشامي كتب:

السلام عليكم ..

اعتقد ان الموديم لديك هو GSM Modem  .

How To Send and Receive SMS using GSM Modem

Send and Read SMS through a GSM Modem using AT Commands

ارسال Sms بالعربي عن طريق ال Gsm Modem

ابحث في المنتدى عن gsm sms  و ستجد بعض المواضيع المفيدة .

 

جزيل شكرى اخى الفاضل حسام .... جارى البحث

#6

السلام عليكم ورحمة الله وبركاته

 

وجدت الكود التالى وطبقته ولكن المشكلة فى ارسال الرسائل باللغة العربية فقط فهو يعمل ويقوم بإرسال رسائل باللغة الإنجليزية دون اى مشاكل ولكن اى رسالة باللغة العربية تظهر على هيئة " ؟؟؟؟؟ "

 

الأكواد موجوده بكلاس يسمى "clsSMS"

        public void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                if (e.EventType == SerialData.Chars)
                {
                    receiveNow.Set();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        public SerialPort OpenPort(string p_strPortName, int p_uBaudRate, int p_uDataBits, int p_uReadTimeout, int p_uWriteTimeout)
        {
            receiveNow = new AutoResetEvent(false);
            SerialPort port = new SerialPort();

            try
            {           
                port.PortName = p_strPortName;                 //COM1
                port.BaudRate = p_uBaudRate;                   //9600
                port.DataBits = p_uDataBits;                   //8
                port.StopBits = StopBits.One;                  //1
                port.Parity = Parity.None;                     //None
                port.ReadTimeout = p_uReadTimeout;             //300
                port.WriteTimeout = p_uWriteTimeout;           //300
                port.Encoding = Encoding.GetEncoding("iso-8859-1");
                port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
                port.Open();
                port.DtrEnable = true;
                port.RtsEnable = true;
            }
            catch (Exception)
            {
                throw;
            }
            return port;
        }
        public bool sendMsg(SerialPort port, string PhoneNo, string Message)
        {
            bool isSend = false;

            try
            {
                string recievedData = ExecCommand(port,"AT", 300, "No phone connected");
                recievedData = ExecCommand(port,"AT+CMGF=1", 300, "Failed to set message format.");
                String command = "AT+CMGS=\"" + PhoneNo + "\"";
                recievedData = ExecCommand(port,command, 300, "Failed to accept phoneNo");         
                command = Message  + "\r";
                recievedData = ExecCommand(port,command, 3000, "Failed to send message"); //3 seconds
                if (recievedData.EndsWith("\r\nOK\r\n"))
                {
                    isSend = true;
                }
                else if (recievedData.Contains("ERROR"))
                {
                    isSend = false;
                }
                return isSend;
            }
            catch (Exception)
            {
                throw; 
            }
        }

وأستخدم الكلاس السابق كما يلى

        private void btnSendSMS_Click(object sender, EventArgs e)
        {
            //.............................................. Send SMS ....................................................
            try
            {
                if (objclsSMS.sendMsg(port, txtSIM.Text, txtMessage.Text))
                {
                    //MessageBox.Show("Message has sent successfully");
                    statusBar1.Text = "Message has sent successfully";
                }
                else
                {
                    //MessageBox.Show("Failed to send message");
                    statusBar1.Text = "Failed to send message";
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

قمت بتغيير الكود التالى إلى "UTF-8" ولكن لم تفلح محاولاتى معه ؟

port.Encoding = Encoding.GetEncoding("iso-8859-1");

فهل من مساعدة لتعديل الكود لكى يقبل اللغة العربية ؟

تم تعديل هذه المشاركة بواسطة red_scorpion1 في 26 نوفمبر 2013 في 13:00

#7
اقتباس
لم اجد شرح كافى لإستخدام تلك المكتبة فهل من مساعدة ؟

 

نزل المكتبة ونصبها على جهازك بعد ذلك اضف مرجع الى الملفات

GSMCommShared

GSMCommunication

 

ثم كود الارسال

GsmCommMain comm =new GsmCommMain();

 comm = new GsmCommMain("COM11", 115200, 100);

                comm.Open();


SmsSubmitPdu pdu;
                var dcs = (byte)DataCodingScheme.GeneralCoding.Alpha16Bit;
                // Send message in the default format
                pdu = new SmsSubmitPdu(Message, PhoneNo, dcs);

                comm.SendMessage(pdu);
#8
TareqVB كتب:

 

نزل المكتبة ونصبها على جهازك بعد ذلك اضف مرجع الى الملفات

GSMCommShared

GSMCommunication

 

ثم كود الارسال

GsmCommMain comm =new GsmCommMain();

 comm = new GsmCommMain("COM11", 115200, 100);

                comm.Open();


SmsSubmitPdu pdu;
                var dcs = (byte)DataCodingScheme.GeneralCoding.Alpha16Bit;
                // Send message in the default format
                pdu = new SmsSubmitPdu(Message, PhoneNo, dcs);

                comm.SendMessage(pdu);

 

هل سيتم ارسال الرسالة باللغة العربية دون اى مشاكل ؟

#9
red_scorpion1 كتب:

هل سيتم ارسال الرسالة باللغة العربية دون اى مشاكل ؟

ان شاء الله تعالى حيث اني عملت عليها سابقا وكانت انجح طريقة لارسال العربي .

 

 اذا اردت باستخدام At commands

فعليك اولا تنفيذ الامر (على المودم)

AT+CSCS=?

وتكون النتيجة  (مثال من جهاز عندي)

+CSCS: ("GSM","PCCP437","CUSTOM","HEX")

هنا CS2 غير موجودة والتي تدعم العربي لكن موجود HEX  فيجب الارسال باستخدام Hexadecimal  اي حول النص الى Hexadecimal ثم ارسله

 

لاستخدام Hex نفذ الامر

AT+CSCS="HEX"

 

بعد تعديل الكود الخاص بك السابق يصبح الكود

public bool sendMsg(SerialPort port, string PhoneNo, string Message)
        {
            bool isSend = false;

            try
            {
                string recievedData = ExecCommand(port,"AT", 300, "No phone connected");
                recievedData = ExecCommand(port,"AT+CMGF=1", 300, "Failed to set message format.");
                ExecCommand(port, "AT+CSCS=\"HEX\""  , 3000, "Failed to send message"); //3 seconds
                String command = "AT+CMGS=\"" + PhoneNo + "\"";
                recievedData = ExecCommand(port,command, 300, "Failed to accept phoneNo");         
                command =ConvertTOHex( Message )  + "\r";
                recievedData = ExecCommand(port,command, 3000, "Failed to send message"); //3 seconds
                if (recievedData.EndsWith("\r\nOK\r\n"))
                {
                    isSend = true;
                }
                else if (recievedData.Contains("ERROR"))
                {
                    isSend = false;
                }
                return isSend;
            }
            catch (Exception)
            {
                throw;
            }
        }

وفقط تحتاج الى ConvertTOHex  للتحويل الى Hexa .

1
#10
TareqVB كتب:

ان شاء الله تعالى حيث اني عملت عليها سابقا وكانت انجح طريقة لارسال العربي .

 

 اذا اردت باستخدام At commands

فعليك اولا تنفيذ الامر (على المودم)

AT+CSCS=?

وتكون النتيجة  (مثال من جهاز عندي)

+CSCS: ("GSM","PCCP437","CUSTOM","HEX")

هنا CS2 غير موجودة والتي تدعم العربي لكن موجود HEX  فيجب الارسال باستخدام Hexadecimal  اي حول النص الى Hexadecimal ثم ارسله

 

لاستخدام Hex نفذ الامر

AT+CSCS="HEX"

 

بعد تعديل الكود الخاص بك السابق يصبح الكود

public bool sendMsg(SerialPort port, string PhoneNo, string Message)
        {
            bool isSend = false;

            try
            {
                string recievedData = ExecCommand(port,"AT", 300, "No phone connected");
                recievedData = ExecCommand(port,"AT+CMGF=1", 300, "Failed to set message format.");
                ExecCommand(port, "AT+CSCS=\"HEX\""  , 3000, "Failed to send message"); //3 seconds
                String command = "AT+CMGS=\"" + PhoneNo + "\"";
                recievedData = ExecCommand(port,command, 300, "Failed to accept phoneNo");         
                command =ConvertTOHex( Message )  + "\r";
                recievedData = ExecCommand(port,command, 3000, "Failed to send message"); //3 seconds
                if (recievedData.EndsWith("\r\nOK\r\n"))
                {
                    isSend = true;
                }
                else if (recievedData.Contains("ERROR"))
                {
                    isSend = false;
                }
                return isSend;
            }
            catch (Exception)
            {
                throw;
            }
        }

وفقط تحتاج الى ConvertTOHex  للتحويل الى Hexa .

 

السلام عليكم ورحمة الله وبركاتة

 

اخى الفاضل TareqVB المشكلة التى اواجهها الأن هى ( عند تنفيذ اكواد USSD ) عدم إستقبالى للرد من المودم وذلك فى حالة اذا كان الرد باللغة العربية فهو يظهر لى على هيئة ارقام ؟؟ وان كانت الرسالة باللغة الإنجليزية فهى تظهر دون اى مشاكل ولكنى احتاج للتعديل عليها حيث انه يظهر بعض الاحرف التى لا افهم معناها واضطر لإزالتها 

 

الكود المستخدم لتنفيذ اوامر USSD:

port.Close();


port.BaudRate = 921600;
port.PortName = com1.Text;
port.Parity = Parity.None;
port.DataBits = 8;
port.StopBits = StopBits.One;
port.ReadTimeout = 3000;
port.WriteTimeout = 3000;
port.DataReceived += port_DataReceived;
port.Open();

//تحويل جمله طاير
if (men.SelectedIndex == 8)
{
//*666*2*X*Y*Z#
port.Write(String.Format("AT+CUSD=1,\"{0}\"{1}", goml1.Text + mob.Text + "*" + int.Parse(val.Text) + "*" + pass1.Text + "#", Environment.NewLine));
}

//تحويل قطاعي طاير
if (men.SelectedIndex == 7)
{
//*666*2*X*Y*Z#
port.Write(String.Format("AT+CUSD=1,\"{0}\"{1}", katay1.Text + mob.Text + "*" + int.Parse(val.Text) + "*" + pass1.Text + "#", Environment.NewLine));
}

//معرفة رقم الموبايل
if (men.SelectedIndex == 4)
{
//*666*2*X*Y*Z#
port.Write(String.Format("AT+CUSD=1,\"{0}\"{1}", mob_no1.Text, Environment.NewLine));
//messag.Text = Session["msg"].ToString();

}

//معرفة تاريخ ووقت الشبكة
if (men.SelectedIndex == 3)
{
//*666*2*X*Y*Z#
port.Write(String.Format("AT+CUSD=1,\"{0}\"{1}", date11.Text, Environment.NewLine));
}
//معرفة رصيد التحويل
if (men.SelectedIndex == 6)
{
//*666*2*X*Y*Z#
port.Write(String.Format("AT+CUSD=1,\"{0}\"{1}", exch_credit1.Text + pass1.Text + "#", Environment.NewLine));
//messag.Text = Session["msg"].ToString();
}
//معرفة رصيد المكالمات
if (men.SelectedIndex == 5)
{
//*666*2*X*Y*Z#
port.Write(String.Format("AT+CUSD=1,\"{0}\"{1}", call_credit1.Text, Environment.NewLine));
//messag.Text = Session["msg"].ToString();
}
//ussd ارسال رساله
if (men.SelectedIndex ==0)
{
//*666*2*X*Y*Z#
port.Write(String.Format("AT+CUSD=1,\"{0}\"{1}", sendussd1.Text + mess.Text, Environment.NewLine));
//messag.Text = Session["msg"].ToString();
}

//اجراء مكالمة
if (men.SelectedIndex == 2)
{
//*666*2*X*Y*Z#
port.Write(String.Format("AT+CUSD=1,\"{0}\"{1}", call1.Text + mob.Text, Environment.NewLine));
//messag.Text = Session["msg"].ToString();
}


////ارسال رساله
if (men.SelectedIndex == 1)
{
try
{
if (objclsSMS.sendMsg(port, mess.Text, mob.Text))
{
//MessageBox.Show("Message has sent successfully");
lblmsg.Text = "Message has sent successfully";
}
else
{
//MessageBox.Show("Failed to send message");
lblmsg.Text = "Failed to send message";

}
}
catch (Exception)
{
throw;
}

}

كود إستقبال الرد من المودم:

        void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort spL = (SerialPort)sender;
            byte[] buf = new byte[spL.BytesToRead];
            spL.Read(buf, 0, buf.Length);

            foreach (Byte b in buf)
            {
                mm += b.ToString();
            }

            var result = Encoding.UTF8.GetString(buf);//just return OK

            string x = result.Remove(0, 11);
            o = x.Remove(x.Length - 13);
           lblmsg.Text = o;
        }

فكيف يمكن استقبال الرسالة باللغة العربية - وكيف يمكن الاستغناء عن الجزء الذى اقوم فيه بتنسيق الرسالة بحيث اعرض الرسالة التى استقبلها كما هى سواء باللغة العربية او الانجليزية ؟

تم تعديل هذه المشاركة بواسطة red_scorpion1 في 10 ديسمبر 2013 في 15:48

#11

السلام عليكم

 

هل من حل جزاكم الله خيرا ؟

#12

كذلك الجزء "ConvertTOHex" لا يعمل فهل هو كلاس ؟

#13

السلام عليكم ورحمة الله وبركاته

 

لعدم وجود حل حتى الأن ( للأسف الشديد ) قمت بعمل موضوع منفصل لتلك المشكلة فى قسم ← التحكم الصناعي وربط الحاسب بالعالم الخارجي لمتابعة الموضوع والتوصل إلى حل 

تم تعديل هذه المشاركة بواسطة red_scorpion1 في 30 ديسمبر 2013 في 02:06

#14

الا يوجد اى حل ؟

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…