اطلاعیه

Collapse
No announcement yet.

[آموزش] تعیین موقعیت مکانی بدون ماژول GPS فقط با ESP8266

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    [آموزش] تعیین موقعیت مکانی بدون ماژول GPS فقط با ESP8266

    سلام دوستان.
    بله عنوان اشتباه نشده. هممون میدونیم که تا حالا برای بدست آوردن موقعیت مکانی باید یا از ماژولهای gps یا gsm استغاده می کردیم، یا از طریقی (با سیم و یا بیسیم) اطلاعات رو از گوشی و تبلت و لپتاپ می گرفتیم. ولی آیا راهی نیست که بتونیم بدون نیاز به موارد بالا مستقیم موقعیت رو بدست بیاریم؟؟
    خوشبختانه چرا هست
    قبل از ادامه عرض کنم که این اطلاعات برای اولین بار (البته اولین بار در بخش سخت افزاری) در ایران مطرح میشه. اینم باید بگم که بنده برای دوستانم فقط باز نشرش میدم. ایده اول از دوست عزیزی در گیت هاب هست که در ادامه لینکش رو قرار میدم.

    هممون از سرویسهای google map و مشتقاتش استفاده کردیم و راجبش اطلاعات داریم. این سرویس از چند سال پیش امکاناتی رو اضافه کرده که سایتها و اپلیکیشن ها می توانند از طریق api گوگل، باهاش کار کنند و موقعیت مکانی مخاطبان سایت و برنامه را بدست بیاورند (البته با اجازه خود کاربر)
    حالا چطوری؟؟؟
    لطفا نقل قولی از این تاپیک رو بخونید تا متوجه بشوید:
    سیستم تخمین موقعیت بر اساس آنتنهای موبایل اطراف میباشد.. این سیستم جهت تخمین موقعیت نیازی به سیستم ماهواره ای GPS ندارد و برای مواردی کاربرد خواهد داشت که خودرو داخل تونل یا پارکینگهای مسقف قرار دارد و به دلیل مسقف بودن محل امکان موقعیت یابی ماهواره ای GPS وجود نداشته باشد..

    اما روش کار این سیستم چگونه است؟
    دکلهای مخابراتی که با نام BTS یا Base Transceiver Station شناخته میشوند را همگی دیده ایم.. هر BTS دارای مشخصات منحصر بفردی در دنیا میباشد.. این مشخصات شامل موارد زیر میباشند : MCC یا Mobile Country Code که نشان دهنده کد کشور میباشد...MNC یا Mobile Network Code که کد اپراتور سرویس دهنده میباشد... LAC یا Location Area Code نشان دهنده کد منطقه میباشد و CellID که نشاندهنده کد آن دکل BTS در منطقه میباشد.. سیستم دزدگیر و ردیاب ماهواره ای خودرو با بدست آوردن این مشخصات از روی نزدکترین دکلهای اطراف که دارای سیگنال قویتری هستند و میانگین گیری کردن از موقعیت آنها نزدیکترین موقعیت را تخمین میزند..همانطور که گفته شد این تخمین نیازی به سیستم GPS نداشته و حتی در مکانهای مسقف نیز محدوده مکانی خودرو را تخمین میزند.
    api چیست؟
    مختصرا بخوام بگم یسری دستورات و روشی هست که (در اینجا) گوگل مشخص کرده که شما با این دستورات بسادگی میتونید درخواستهاتون رو بفرستید بهش وجوابها رو هم بگیرید.
    مقدمه تمومه
    گرفتن API KEY:
    میخوایم با سرویس google geolocation کار کنیم. در ابتدا نیاز به یک api key مخصوص به خودمون داریم که پس از اینکه وارد اکانت گوگل خود شدید، میتوانید از طریق این لینکاون رو برای خودتان بسازید. البته برای باز شدن صفحه به دلیل اینکه این سرویس مثل تقریبا همه سرویسهای گوگل برای آیپی ایران بسته است نیازمند راهی جهت عبور از آن می باشید.به هر نحوی که خود می توانید وارد صفحه ذکر شده شوید و روی get a key کلیک کنید:

    مرحله بعدش اگر قبلا پروژه ای ساخته باشید ازتون میخواد که یکی از اونها رو از تو لیست انتخاب کنید و یا اگر دفعه اول باشه ( یادم نیست درست فکر کنم باید یه اسم برای پروژتون انتخاب کنید:

    حال کلید داده شده را کپی و در یک جای امن ذخیره کنید.
    جدیدترین ویرایش توسط digi-rx; ۱۳:۳۲ ۱۳۹۶/۰۹/۱۰.
    تاپیک ویدیوهای آموزشی حواشی آردوینو و ESP

    #2
    پاسخ : [آموزش] تعیین موقعیت مکانی بدون ماژول GPS فقط با ESP8266

    قبل از ادامه مطلب پیشنهاد میکنم دوستان یسری اطلاعات درمورد انواع ارتباط با اینترنت و پروتکل های ارتباطیش و انواع درخواستها و ... کسب کنند که برای کار با ماژولهای esp شدیدا مورد نیاز است. یکی از این اطلاعات هم شناخت و کار با فرمت json می باشد که اگه بتونید خوب باهاش کار کنید، پروژه های مشابه این پروژه براحتی میتونید راه اندازی کنید و با api مربوطه ارتباط برقرار کنید. پروژه هایی مثل دستورات صدا و کلامی ، اطلاعات آب وهوا و دما ، ساعت ntp و...
    برای راه اندازی و برنامه نویسی esp8266 با آردوینو هم میتوانید از این لینک استفاده کنید.
    برنامه تویسی:
    برنامش چیز خاصی نداره فقط باید درخواست رو تحت همون فرمت json ارسال و اطلاعات رو هم با همون فرمت دریافت کنید. خبر خوب اینکه یه دوست عزیزی این کاررو هم برامون انجام داده و کارمون رو راحت و آسون کرده
    در صفحه گیت هاب ایشون دو فایل آردوینو هست: یکی خروجی رو روی oled نشون میده و دیگری در پنجره سریال مانیتور. چون ما معمولا طول وعرض جغرافیایی بدست آورده را نه برای نمایش بلکه برای ارسال یا دیدن در نقشه و ... نیاز دارم پس من از فایل Geolocation_without_display.ino استفاده کردم. فقط موارد زیررا بایدمتناسب با شرایط خودتان در فایل تغییر بدهید:
    - myssid و mypass » نام و پسورد مودم برای اتصال به اینترنت ماژولesp
    -
    homeMobileCountryCode » همان mcc (تعریف در پست قبل)
    - key » همان api key که از گوگل گرفتیم
    - homeMobileNetworkCode» همان mnc (تعریف در پست قبل)
    mcc و mnc رو میتونید از یکی ازاین دو لینک بگیرید: این لینک یا این لینک
    که mccبرای ایران 432 هست و mnc بستگی به اپراتور اینترنتتون داره.
    /*********************************************************************
    This is the code for Fetching your location from Google Geolocation API

    This code is provided by
    techiesms
    *********************************************************************/


    #include <ESP8266HTTPClient.h>
    #include <ArduinoJson.h>
    #include "ESP8266WiFi.h"



    char myssid[] = "SSID" // your network SSID (name)
    char mypass[] = "PASS" // your network password




    //Credentials for Google GeoLocation API...
    const char* Host = "www.googleapis.com";
    String thisPage = "/geolocation/v1/geolocate?key=";
    String key = "YOUR_API_KEY";


    int status = WL_IDLE_STATUS;
    String jsonString = "{\n";


    double latitude = 0.0;
    double longitude = 0.0;
    double accuracy = 0.0;
    int more_text = 1; // set to 1 for more debug output



    void setup() {

    Serial.begin(115200);
    Serial.println("Start");
    // Set WiFi to station mode and disconnect from an AP if it was previously connected
    WiFi.mode(WIFI_STA);
    WiFi.disconnect();
    delay(100);
    Serial.println("Setup done");
    // We start by connecting to a WiFi network
    Serial.print("Connecting to ");
    Serial.println(myssid);
    WiFi.begin(myssid, mypass);


    while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    }
    Serial.println(".");

    }


    void loop() {


    char bssid[6];
    DynamicJsonBuffer jsonBuffer;
    Serial.println("scan start");
    // WiFi.scanNetworks will return the number of networks found
    int n = WiFi.scanNetworks();
    Serial.println("scan done");
    if (n == 0)
    Serial.println("no networks found");
    else
    {
    Serial.print(n);
    Serial.println(" networks found...");


    if (more_text) {
    // Print out the formatted json...
    Serial.println("{");
    Serial.println("\"homeMobileCountryCode\": 432,"); // this is a real UK MCC
    Serial.println("\"homeMobileNetworkCode\": 19,"); // and a real UK MNC
    Serial.println("\"radioType\": \"gsm\","); // for gsm
    Serial.println("\"carrier\": \"Vodafone\","); // associated with Vodafone
    //Serial.println("\"cellTowers\": ["); // I'm not reporting any cell towers
    //Serial.println("],");
    Serial.println("\"wifiAccessPoints\": [");
    for (int i = 0; i < n; ++i)
    {
    Serial.println("{");
    Serial.print("\"macAddress\" : \"");
    Serial.print(WiFi.BSSIDstr(i));
    Serial.println("\",");
    Serial.print("\"signalStrength\": ");
    Serial.println(WiFi.RSSI(i));
    if (i < n - 1)
    {
    Serial.println("},");
    }
    else
    {
    Serial.println("}");
    }
    }
    Serial.println("]");
    Serial.println("}");
    }
    Serial.println(" ");
    }
    // now build the jsonString...
    jsonString = "{\n";
    jsonString += "\"homeMobileCountryCode\": 432,\n"; // this is a real UK MCC last 234
    jsonString += "\"homeMobileNetworkCode\": 19,\n"; // and a real UK MNC lasr 27
    jsonString += "\"radioType\": \"gsm\",\n"; // for gsm
    jsonString += "\"carrier\": \"Vodafone\",\n"; // associated with Vodafone
    jsonString += "\"wifiAccessPoints\": [\n";
    for (int j = 0; j < n; ++j)
    {
    jsonString += "{\n";
    jsonString += "\"macAddress\" : \"";
    jsonString += (WiFi.BSSIDstr(j));
    jsonString += "\",\n";
    jsonString += "\"signalStrength\": ";
    jsonString += WiFi.RSSI(j);
    jsonString += "\n";
    if (j < n - 1)
    {
    jsonString += "},\n";
    }
    else
    {
    jsonString += "}\n";
    }
    }
    jsonString += ("]\n");
    jsonString += ("}\n");
    //--------------------------------------------------------------------


    Serial.println("");


    WiFiClientSecure client;


    //Connect to the client and make the api call
    Serial.print("Requesting URL: ");
    Serial.println("https://" + (String)Host + thisPage + "AIzaSyCYNXIYINPmTNIdusMjJloS4_BXSOff1_g");
    Serial.println(" ");
    if (client.connect(Host, 443)) {
    Serial.println("Connected");
    client.println("POST " + thisPage + key + " HTTP/1.1");
    client.println("Host: " + (String)Host);
    client.println("Connection: close");
    client.println("Content-Type: application/json");
    client.println("User-Agent: Arduino/1.0");
    client.print("Content-Length: ");
    client.println(jsonString.length());
    client.println();
    client.print(jsonString);
    delay(500);
    }


    //Read and parse all the lines of the reply from server
    while (client.available()) {
    String line = client.readStringUntil('\r');
    if (more_text) {
    Serial.print(line);
    }
    JsonObject& root = jsonBuffer.parseObject(line);
    if (root.success()) {
    latitude = root["location"]["lat"];
    longitude = root["location"]["lng"];
    accuracy = root["accuracy"];
    }
    }


    Serial.println("closing connection");
    Serial.println();
    client.stop();


    Serial.print("Latitude = ");
    Serial.println(latitude, 6);
    Serial.print("Longitude = ");
    Serial.println(longitude, 6);
    Serial.print("Accuracy = ");
    Serial.println(accuracy);

    }

    اجرا:
    پس از کامپایل و اجرا در پنجره سریال مانیتور، مقدار دو عبارت
    Latitudeو Longitude طول و عرض جغرافیایی ما هستند.
    نمایش:
    برای مشاهده میتوانید از این لینک استفاده کرده ، مقادیر بالا را درآن جایگزین کرده و در مرورگر کروم یا ... لینک مذکور رو اجرا کنید

    Find local businesses, view maps and get driving directions in Google Maps.

    18z میزان زوم تصویر می باشد.
    ممنون میشم بازخورد و نتیجه کارتان را اینجا مطرح نمایید.
    جدیدترین ویرایش توسط digi-rx; ۱۷:۳۷ ۱۳۹۶/۰۹/۲۲.
    تاپیک ویدیوهای آموزشی حواشی آردوینو و ESP

    دیدگاه


      #3
      پاسخ : [آموزش] تعیین موقعیت مکانی بدون ماژول GPS فقط با ESP8266

      با سلام
      esp8266 ارتباطش با mcc و mnc توی این برنامه چیه ؟
      اگر نیازی به ماژول gsm نیست پس mcc و mnc ; که مربوط به سیم کارت های مختلف میشه چیه پس؟؟

      دیدگاه


        #4
        پاسخ : [آموزش] تعیین موقعیت مکانی بدون ماژول GPS فقط با ESP8266

        نوشته اصلی توسط k1 نمایش پست ها
        اگر نیازی به ماژول gsm نیست پس mcc و mnc ; که مربوط به سیم کارت های مختلف میشه چیه پس؟؟
        من هم فکر می کنم ماژول esp8266 به تنهایی کافی نیست و حتما یه ماژول GSM باید باشه! و وقتی بدرد میخوره که بخواهیم موقعیت یک گوشی رو بدست بیاریم! یعنی مثلا ESP8266 تو خونه باشه و ماژول gsm یا گوشی گم بشه و بخواهیم پیداش کنیم!
        البته در کل اطلاعاتی رو که دوستمون در اشتراک گذاشتند خیلی مفید و جالب بود

        دیدگاه


          #5
          پاسخ : [آموزش] تعیین موقعیت مکانی بدون ماژول GPS فقط با ESP8266

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

          دیدگاه


            #6
            پاسخ : [آموزش] تعیین موقعیت مکانی بدون ماژول GPS فقط با ESP8266

            سلام
            دقت این وضعیت بر می گرده به دیتابیس و آخرین اتصال های شما با GPS و اتصال به اینترنت با سرورهای گوگل ، که برای خیلی از کاربردهای "مکان بسته" واقعا کارایی داره ( مثلا همین که در مکان بسته آدرس شهر یا حتی منطقه شهرداری رو بر می گردونه واقعا نعمتی هست). من قدردان وقت و لطفی هستم که ایشون برای این آموزش و مطلع کردن از شیوه ای آدرس یابی با اینترنت گذاشتن
            هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

            دیدگاه


              #7
              پاسخ : [آموزش] تعیین موقعیت مکانی بدون ماژول GPS فقط با ESP8266

              نوشته اصلی توسط k1 نمایش پست ها
              با سلام
              esp8266 ارتباطش با mcc و mnc توی این برنامه چیه ؟
              اگر نیازی به ماژول gsm نیست پس mcc و mnc ; که مربوط به سیم کارت های مختلف میشه چیه پس؟؟
              سلام. از همه دوستان ممنونم که نظراتشون رو عنوان میکنند. سپاسگذارم.
              دوست عزیز، اول باید عرض کنم که تو ماژول GSM شما از طریق امواج رادیویی موقعیت روبدست میارید اما در این روش از طریق اینترنت. کار ماژول ESP8266 هم در اینجا صرفا همین هست یعنی برقراری امکان ارتباطات اینترنتی. چطوری؟
              همانطور که در پست های قبل ذکر شد، هر دکل مخابراتی اطلاعات مکانیش در دنیا ثبت شده می باشد. (1)
              در ارتباط اینترنتی بصورت پروتکل TCP اطلاعات بصورت مجموعه ای از pocket (بسته ها) ی اطلاعاتی ارسال می شوند.که هر بسته علاوه بر دیتای اینترنتی، یسری اطلاعات دیگر هم در آن قید میشود ( در تمام بسته ها بدون استثنا) مانند آی پی های فرستنده و گیرنده و مک آدرس و زمان و اطلاعات روترهایی که در مسیر ارسال نقش داشته اند. (2)
              حال وقتی این بسته ها از هر کدام از این روترها و دکل های مخابراتی عبور میکنند اطلاعات آنها (مانند موقعیت مکانی آن دکل) هم به انتهای این بسته اطلاعاتی اضافه می شود.
              مطمئنن تو همه این سالها تو خیلی از سایتهای خارجی رفتید که اسم شهرتون رو یه گوشه سایت مشخص میکنه. یا حتی گوگل یا سایتهای بانکی از این روشها برای مسدود کردن خدماتشون بما استفاده میکنند. این از همین اطلاعات بسته ها استفاده میشه. حالا گوگل اومده چند سال قبل این سیستم رو تخصصی تر کرده و این امکانات رو با api مخصوص خودش در اختیار سایتها قرار میده. (البته بصورت دقیق تر)
              دوست عزیز من ماژول GSM واقعیتش کار نکردم اما مطمئنن فرمایش شما صحیح هست که اونها هم از mcc و mnc استفاده میکنند. (مربوط به اطلاعات همون دکلها: یکیش برای کشور اون یکی برای اپراتور خدماتی)
              اما قبل از ارسال این مطلب من خودم این برنامه را در esp اجرا کرده و تمام اون مراحل که عرض کردم رو از اجرا کردم. نتیجش این بود که :
              اولین بار که اجرا کردم خبری mnc و mcc و معناشون نداشتم و تو برنامه هم تغییر ندادم. اما پس از اجرای برنامه موقعیت مکانی خروجی از سریال مونیتور رو تو لینک گوگل مپ گذاشته و براحتی با درجه زوم 21 خانه خودمون رو مشخص کرد. حتی تونستم عکس پشت بام رو هم از کنار صفحه گوگل مپ ببینم.
              اما یه هفته بعدش همون کد همش نتیجه غلط میداد. یه جای دیگه رو تو کرج نشون میداد. این شد که تحقیق کردم و کد اون دو مورد رو تو برنامه اصلاح کرده و بعدش دوباره جواب صحیح بدست اومد.
              این نتیجه تست واقعی برنامه بود که کار کرد.

              دلیل: ادغام دو پست برای جلوگیری از اسپم

              نوشته اصلی توسط leader. نمایش پست ها
              تعیین موقعییت مکانی از طریق اینترنت( توسط esp یا ماژولهای مشابه) هرچند قابل پیاده سازی هست ولی!
              ولی خطا محاسباتی در این مدل زیاده واگر صرفا هدف تععین موقییت مکانی باشد استفاده از این مدل کاری کاملا غیر حرفه ای هست
              در یه سایت خارجی خوندم که اطلاعات این روش دقت کمتر از 50 متر دارد. خودم تونستم همونطور که عرض شد عکس خونه خودمون رو ببینم اما این مشخص نمیکنه دقیقا که دقتش مثلا 50 متره یا 70 متر. بخاطر همین از دوستانی که این برنامه رو اجرا میکنند ممنون میشم که نتیجه و دقت حاصل شده رو تو این تاپیک به اشتراک بزارند.
              در مورد مزیتش، هر دستگاهی بدرد موارد مخصوص بخودش می خوره. مطمئنن بیشتر جاها ماژول gsm بدرد میخوره اما یسری جاها هم این ماژول مخصوصا با توجه به قیمت 10 تومنی و عدم نیاز به میکروی جداگانه.
              مثلا فرض کنید که شما با این ماژول دستگاهی ساخته و تولید انبوه کرده اید. حال برای اینکه بدانبد مثلا چند مشتری در تهران از دستگاه شما استفاده میکنند (برای کارای بازاریابی و فروش) براحتی میتونیدبدون هیچ افزایش قیمتی فقط با اضافه کردن این کد نتیجه بگیرید. (صرفا یک مثال بود)
              تاپیک ویدیوهای آموزشی حواشی آردوینو و ESP

              دیدگاه


                #8
                پاسخ : [آموزش] تعیین موقعیت مکانی بدون ماژول GPS فقط با ESP8266

                نوشته اصلی توسط baby_1 نمایش پست ها
                دقت این وضعیت بر می گرده به دیتابیس و آخرین اتصال های شما با GPS و اتصال به اینترنت با سرورهای گوگل ، که برای خیلی از کاربردهای "مکان بسته" واقعا کارایی داره ( مثلا همین که در مکان بسته آدرس شهر یا حتی منطقه شهرداری رو بر می گردونه واقعا نعمتی هست). من قدردان وقت و لطفی هستم که ایشون برای این آموزش و مطلع کردن از شیوه ای آدرس یابی با اینترنت گذاشتن
                تشکر میکنم. ادای دینه بزرگوار.

                این رو فراموش کردم بگم. من اینترنتم adsl مخابرات هست. ( نه ایرانسل و ...) دکل مخابرات هم جایی این نزدیکی ها به چشمم نخورده. حدود یکی دو کیلومتر با فاصله از ما دکل خود مرکز مخابراتی هست. از اونجا هم که اینترنت با کابل تلفن میاد تا خونه. (هر چند ، احتمالا تا مخابرات هم با کابل میاد) در رابطه با دقتش عرض کردم.
                تاپیک ویدیوهای آموزشی حواشی آردوینو و ESP

                دیدگاه

                لطفا صبر کنید...
                X