دستور بررسی شماره تلفن ارسال کننده پیامک

1 سال قبل
188 بازدید

0

سلام.مدتی پیش سوالی مطرح کردم برای برنامه ای که رله تنها درصورت دریافت پیلمک از شماره تعریف شده عمل کند که با راهنمایی خوب دوستان خیلی موارد برنامه حل شد اما یک مشکل اساسی هست که  نمیدانیم با چه دستوری باید شماره همراه ارسال کننده پیامک را بررسی کنیم که در شرط قرار دهیم که اگر با شماره های تعریف شده در آرایه مطابقت نداشت عمل نکند!

لطفا راهنمایی بفرمایید آردینو با چه دستوری شماره ارسال کننده پیلمک را میتواند بررسی کند؟

ویرایش سوال:

برنامه ما اینطوری است که میخواهیم فقط با 3 شماره از شماره های تعریف شده این رله روشن و خاموش شود:

 


کد کامل برنامه که میخواهیم با 3 شماره ای که تعریف میکنیم رله فعال یا غیر فعال شود در سوال درج شد....
لازم بذکر است برنامه ای که زحمت کشیده اید در ویرایش اول نوشته اید بله درست کار میکند و به خوبی مقایسه بین دو رشته را انجام میدهد اما مشکل من این است که نمیتوانم برنامه را طوری بنویسم که شماره پیامک دریافتی را مقایسه کند، یعنی نمیدانم چطور این مقایسه را هنگام ارسال پیامک انجام دهم، ممنون میشوم کمک بفرمایید

 

 

19 آذر 01 در 10:43
مهندس قدیم
7

افزودن دیدگاه

1 پاسخ ثبت شده است
0

با سلام

در سوال قبلی شما نیز گفته شد بهتر است از string استفاده کنید برای این امر.

اما به هر حال برای نمونه در یک نمونه ماژول پیامک دریافتی به صورت زیر دریافت می شود.

حال برای بررسی این پیام از دستور های زیر استفاده می شود. توجه کنید که مقدار newText به صورت نمونه می باشد و دیتایش مشابه این عکس می باشد. شما از دستور 

Serial.readStringUntil('\n');

برای دریافت هر خط از پیام های بالا را استفاده میکنید و خط های \t\n به معنی خط بعدی می باشد.

String numbers[3]={"123456789","+98912012345678","test"};//some exampel nunmber
String newText = "+CMT: \"+98912012345678\",,\"2022/12/07,18:00:00+04\"\t\non\t\n"; // a sampel of resive sms from gsm model
//                        |                |
String number = newText.substring(newText.indexOf('+',4),newText.indexOf(',')-1); //brack a string to part of holde resive number
for (byte i = 0; i < 3; i++)// loop to find a mach number 
{
    if(number.equals(numbers[i])){
        //your function
    }
}

 

لطفا در سوال های بعدی خود کدی که نوشته اید را قرار بدهید تا بر اساس کد شما بررسی انجام بشود.

 

ویرایش اول:

کد را بر روی یک اردوینو تست کردم و مشکلی نداشت به درستی شماره را پیدا میکرد.

کد کامل:

void setup() {
  Serial.begin(115200);

  String numbers[3] = {"123456789", "+98912012345678", "test"}; //some exampel nunmber
  String newText = "+CMT: \"+98912012345678\",,\"2022/12/07,18:00:00+04\"\t\non\t\n"; // a sampel of resive sms from gsm model
  //                        |                |
  String number = newText.substring(newText.indexOf('+', 4), newText.indexOf(',') - 1); //brack a string to part of holde resive number
  Serial.println(number);
  for (byte i = 0; i < 3; i++)// loop to find a mach number
  {
    if (number.equals(numbers[i])) {
      Serial.print("Number is find in : \t\t");
      Serial.println(i);
    } else {
      Serial.print("Number is not find in : \t");
      Serial.println(i);
    }
  }
}

void loop() {

}

خروجی کد:

19 آذر 01 در 06:06
محمد دمیرچی
3670

سلام و سپاس فراوان از مهندس دمیرچی عزیز; این برنامه ای هست که دقیقا از کدهایی که شما فرمودید هم درآن استفاده کردیم اما متاسفانه درست کار نمیکند و رله حتی با شماره های ثبت شده هم فعال و غیر فعال نمیشود, لازم به ذکر است روشهای دیگری هم امتحان شده اما جواب نگرفتیم و اینک از راهنمایی و روش شما داریم استفاده میکنیم که این هم نتوانستیم جواب بگیریم) void loop() { if(gsmSerial.available()){ inputString = ""; delay(1000); while(gsmSerial.available()){ incomingByte = gsmSerial.read(); inputString += incomingByte; } delay(100); Serial.print("input : "); Serial.print(inputString); Serial.println(" end"); String numbers[3]={"+98--------","+98--------","+98--------"}; String newText = Serial.readStringUntil('\n'); String number = newText.substring(newText.indexOf('+',4),newText.indexOf(',')-1); //brack a string to part of holde resive number for (byte i = 0; i < 3; i++) { if(number.equals(numbers[i])){ inputString.toUpperCase(); Serial.println("input up : " + inputString); if (inputString.indexOf("ON") > 0 ){ digitalWrite(6, HIGH); } if (inputString.indexOf("OFF") > 0){ digitalWrite(6, LOW); } } } }}  – مهندس قدیم 01-09-20 در 08:02

با سلام لطفا سوال و کد خود را با ویرایش سوال در بخش سوال قرار بدهید. به این صورت نمی شود اطلاعات را خواند.  – محمد دمیرچی 01-09-21 در 09:00

سلام و عرض ادب. سوال ویرایش شد......  – مهندس قدیم 01-09-21 در 10:40

با سلام کدی که نوشته اید کار نمیکند، چند باری خدمتتون عرض کردم از دستور readStringUntil('\n') برای خواندن سریال استفاده کنید. در کد خود نیز در هیچ جایی تعیین نکرده اید که دیتا شما ورودیش به چه صورت می باشد و پردازش کند. لطفا به توضیحاتی که داده ام اندکی توجه کنید و مقداری در رفرنس دستور های آردوینو مطالعه داشته باشید که هر دستور به چه صورت کار میکند.  – محمد دمیرچی 01-09-23 در 10:18

افزودن دیدگاه


انجمن کافه‌ربات © 1400