Skip to content

Follow Me he

Marco edited this page Sep 30, 2026 · 15 revisions

🇬🇧 English

עקבו אחריי (שיתוף קישור מיקום חי)

קישור שמראה למישהו איפה אתם נמצאים, עכשיו, על אותה מפה שאתם טסים איתה. בלי חשבון, בלי שרת שלנו, בלי הרשמה. אתם משתפים כתובת; מי שפותח אותה רואה את המטוס שלכם נע על המפה של NavAid עד שתפסיקו.

עזר תכנון ואדיבות, לא שירות מעקב. הממסר הוא ברוקר ציבורי חינמי — מאמץ סביר בלבד, ללא אימות. אין היסטוריה. טלפון שמאבד קליטה פשוט מפסיק לשדר, והצופה אומר זאת במפורש במקום לצייר אתכם במקום שבו הייתם לאחרונה.

לשתף

״עקבו אחריי״ פעילה באפליקציה החיה.

  1. לחצו עקבו אחריי בסרגל הכלים. אפשר לעשות זאת על הקרקע, לפני הטיסה — הקישור מועתק מיד ואפשר לשלוח אותו מראש; הצופה מציג "ממתין למיקום" עד שמתחילים לזוז. (כפתור השיתוף שעל המפה — נקודה עם גלי רדיו — הוא אותה פעולה, אבל הוא מופיע רק כשיש מיקום חי שמזין את המפה, ולכן שיתוף לפני הטיסה נעשה מסרגל הכלים.)

  2. הקלידו מזהה — קוד מטוס (4X-CDE) הוא הבחירה המתבקשת, אבל גם אות קריאה או שם עושים את העבודה. שום דבר לא מאמת אותו, והוא אינו חלק מכתובת הקישור — ראו קישור אחד למכשיר למטה. רווחים מוסרים, כך שהרווח שמקלדת הטלפון מוסיפה אחרי השלמה אוטומטית אינו נוסע עם השם.

    השדה לעולם אינו ריק כשהוא נפתח: הקוד שהמכשיר הזה השתמש בו לאחרונה, או הטיסה שעומדת להתבצע (LLHZ-LLHA), או NavAid. השם הוא תווית ולא כתובת — אין התנגשויות — ושדה ריק הוא שיתוף שלא קורה. הטקסט נפתח מסומן, כך שהקלדת אות רישום מחליפה את ההצעה בבת אחת.

    השאלה נשאלת בחלון של האפליקציה ולא ב-window.prompt: דפדפן יכול לחסום אותו אחרי שסוגרים אחד, ו-WebView באנדרואיד מציג אותו רק אם האפליקציה המארחת מממשת זאת — וזה בדיוק המקום שבו משתמשים בעקבו אחריי. חלון שאיש אינו רואה הוא שיתוף שלא קורה.

  3. בטלפון נפתח חלון השיתוף; אחרת הקישור מועתק ללוח. אם עדיין שום דבר לא זורם, אישור ההעתקה אומר זאת — המיקום יתחיל לזוז כשמפעילים מיקום או הקלטה.

  4. הפעילו מיקום או הקלטה כשאתם מוכנים; השידור מתחיל עם המיקום הראשון.

הכפתור משתנה להפסק שיתוף, וכפתור המפה נדלק (◉). לחיצה על אחד מהם מפסיקה. עצירה מנקה את המיקום האחרון מהממסר, כך שהקישור מתרוקן במקום לקפוא במקום הנחיתה.

הכפתור גם מדווח מה מצב החיבור: מתחבר, מתחבר מחדש בזמן שהחיבור קם מחדש, ועוצר בזמן ניקוי המיקום האחרון.

עצירה לא יכולה להיתקע. ניקוי המיקום האחרון דורש אישור מהממסר, וממסר שלא עונה — אין קליטה, הברוקר למטה, רשת אורחים חוסמת — השאיר את הכפתור על עוצר… לתמיד. ההמתנה מוגבלת עכשיו (followMeStopMaxSec, 25 שניות), ולחיצה נוספת על הכפתור מסיימת אותה מיד: השיתוף נעצר כאן, השידור פוסק והמכשיר מבטל את ההסכמה שלו. מה שאי אפשר להבטיח הוא המיקום ששמור כבר בממסר, ולכן האפליקציה אומרת שהממסר לא ענה ומפנה ל🔑 קישור חדש, שכן מבטל אותו.

צפייה ושיתוף הם שני דברים נפרדים

דף שנפתח על הקישור של מישהו אחר עוקב אחריו, והוא אינו משתף. לחיצה על "עקבו אחריי" שם שואלת אם לעזוב את הטיסה שאחריה עוקבים: באישור המעקב נפסק והמפה נטענת מחדש בלי הקישור — וזה בדיוק המצב שממנו רוצים לשתף. כל השאר בכתובת נשמר: שפה, מתגי כוונון, מסלול טעון.

פתיחת קישור בזמן ששיתוף פעיל עוצרת אותו, ושיתוף שמור אינו מתחדש בדף שכתובתו נושאת קישור.

לצאת מטיסה שעוקבים אחריה

אין פקד יציאה נפרד — לא על הבאנר ולא במקום אחר. המעקב מחווט לדף מהכתובת שממנה נפתח, ולכן הדרך הישרה החוצה היא אותו דף בלי אותה כתובת. שלוש דרכים להגיע לשם:

  • ללחוץ על "עקבו אחריי" ולאשר. זו הדרך היחידה מתוך האפליקציה: המעקב נפסק והמפה נטענת מחדש בלי ?follow=…#k=…, עם השפה, מתגי הכוונון והמסלול שהיו.
  • לפתוח את הכתובת בלי הקישור — למחוק את ?follow=… ואת #k=…, או לפתוח את navaid.supino.org מחדש.
  • לסגור את הלשונית. שום דבר אינו נשאר פועל: המעקב הוא הדף, וצופה אינו שומר דבר על המטוס שאחריו עקב.

גם פשוט לעזוב מסיים את זה בפועל — צופה רק קורא מיקום שמור ואינו משדר — אבל הבאנר נשאר על המסך עד אחת הפעולות שלמעלה.

למה כל כך נחרץ: הקישור שצופה מחזיק נושא יכולת שמאפשרת גם לשדר לנושא שאחריו עוקבים. דף שעושה את שניהם רחוק טעות אחת משיתוף שמכוון למטוס של מישהו אחר. צי שרוצה בכל זאת את שניהם — מטוס מלווה, שני מטוסים מטלפון אחד — מפעיל את featureFollowMeShareWhileViewing, וגם אז שיתוף יוצר מזהה ומפתח משלו למכשיר הזה.

לצפות

פתיחת הקישור מציגה את המפה עם המטוס עליה:

  • סמל מטוס עם הקוד לצידו, כשהחרטום מצביע לכיוון המסלול המדווח — וזה נשאר נכון גם כשהמפה מסובבת.
  • המפה עוקבת אחרי כל מיקום חדש. זהו מעקב חי, ולכן כל דיווח חדש מקבל את מרכז המסך.
  • שורת מצב מתחת לסרגל הכלים: 4X-ABC · 2001 ft · 95 kt · 002° · 32.1000, 34.8000 · המיקום האחרון לפני 3 שניות. רק מה שהמטוס באמת שידר — גובה חסר פשוט לא מוצג, במקום להופיע כאפס. השורה נקראית נכון בעברית: כל ערך תעופתי נשמר משמאל לימין בתוך משפט מימין לשמאל.
  • הכיוון הוא זה שהטייס קורא. ברשת נוסע מסלול אמיתי; השורה מציגה אותו מגנטי, דרך אותה פונקציה שמציגה את הכיוון לטייס עצמו — דווח מטיסה שבה הטלפון הראה 299 והמחשב שעקב אחריו הראה 304, שזה בדיוק הסטייה המגנטית. מטוס עומד לא מדווח מסלול כלל, ולכן הטלפון נופל למצפן — והשורה מסמנת זאת בדיוק כמו התצוגה של הטייס: ~299°, לאן המטוס מכוון ולא לאן הוא נוסע.
  • המטוס מצויר מעל התרשים, לא מתחתיו. המסלול, ציוני הדרך והשמות שלהם מצוירים על קנבס שיושב מעל כל סמן של המפה, ולכן המטוס הנעקב היה נעלם מתחת לעיגול של נקודת דיווח. עכשיו יש לו שכבה משלו.
  • שעון המפה נעלם בזמן מעקב. דף של עוקב הוא מעקב חי: השעה היא עכשיו, ואין בו דבר שמגיב להסתכלות קדימה בזמן.
  • התיישנות נאמרת, לא מוסתרת. אחרי followMeStaleSec (30 שניות) השורה אומרת שהשידור נפסק והמטוס מתעמעם. מפה שממשיכה בשקט לצייר מטוס במקום האחרון גרועה ממפה שמודה שאינה יודעת.

צופה שנכנס באמצע הטיסה רואה את המטוס מיד: המיקום האחרון נשמר בממסר, ואין צורך לחכות לשידור הבא.

התכנית נוסעת עם המיקום

שיתוף נושא גם את המסלול, בנושא נפרד ושמור לצד המיקום. הצופה נשאל, לא נכפה עליו: הטייס משתף מסלול (LLHZ → LLHA). לטעון אותו? הפעולה מחליפה את המסלול במפה שלכם. תשובה שלילית תקפה לאותה תכנית — חיבור מחדש מביא שוב את אותה חבילה שמורה, ושאלה זהה שנייה היא הדרך שבה שאלות נסגרות בלי שקוראים אותן.

השאלה היא חלון של האפליקציה עצמה, לא confirm() של הדפדפן. WebView מציג כזה רק אם האפליקציה המארחת מממשת אותו, ולכן ב-APK השאלה מעולם לא נשאלה ונענתה בשקט "לא".

שלושה דברים מחליטים אם בכלל שואלים:

  • תכנית מוצעת רק כשיש מטוס שטס אותה. שני הנושאים שמורים, והמסלול שורד את המיקום — אחרי עצירה הממסר עדיין עשוי להחזיק את התכנית — ולכן המסלול ממתין עד שמגיע מיקום חי ולא מיושן. דווח כעצירת השיתוף מודיעה לי שלטייס יש מסלול.

  • תכנית שכבר על המפה אינה שאלה. ציון דרך מול ציון דרך: אם הם זהים אין מה להחליט, ולכן נראה היה ששתי התשובות לא עושות דבר.

  • "לא" שורד רענון. שני הנושאים נמסרים מחדש בכל טעינה של הדף, ולכן התשובה נשמרת לאותה לשונית. דווח כרענון שואל על המסלול שכבר טעון.

  • נשלח כשהשיתוף מתחבר, כך שקישור שנפתח לפני שהמטוס זז כבר מחזיק את התכנית, ונשלח מחדש כשהמסלול משתנה — הסטה שסוכמה באוויר מגיעה למי שעוקב. עם השהיה קצרה, ולא נשלח כלל כשהתכנית לא באמת השתנתה.

  • מוצפן באותו מפתח כמו המיקום: הממסר נושא תכנית שהוא לא יכול לקרוא.

  • נדחס תחילה, כי החבילה שמורה ויושבת על ממסר ציבורי חינמי עד שהשיתוף נפסק — תכנית של 20 ציוני דרך עם שינויי תדר יורדת מכ-7.6KB לכ-0.6KB. החבילה מציינת באיזה דוחס נעשה שימוש, כך שהצופה לעולם לא צריך לנחש או להסכים מראש.

  • עצירה מנקה גם אותה יחד עם המיקום. קישור שכבר לא אומר איפה המטוס לא צריך להמשיך לחלק לאן הוא התכוון.

  • מסלול גדול מ-followMeRouteMaxKb לא מתפרסם כלל במקום להתפרסם חלקית, ושום דבר אחר בשיתוף לא מפסיק לעבוד.

שיתוף ששורד הפעלה מחדש

בעבר סגירת האפליקציה באמצע טיסה הרגה את הקישור — ואף אחד לא משתף קישור מחדש בגובה 2000 רגל. כעת הפעלה (נושא, מפתח, קוד מטוס) נשמרת במכשיר, ו-NavAid ממשיכה אותה בהפעלה הבאה, עם הודעה שאומרת זאת.

האפליקציה נסגרה בכוח, הטלפון אותחל, הלשונית נטענה מחדש אותו קישור, השיתוף ממשיך מעצמו
לחצתם הפסק אותו קישור. השידור נפסק והמיקום האחרון נמחק, כך שהצופה רואה מסך ריק — אבל שיתוף מחדש מחייה בדיוק את אותה כתובת
עבר חודש אותו קישור. followMeResumeHr אינו מפקיע אותו כל עוד ההתמדה דלוקה
הוקלד מזהה אחר אותו קישור. השם הוא תווית על השידור, לא חלק מהכתובת שלו
לחצתם 🔑 קישור חדש נושא ומפתח חדשים. הקישור הישן מפסיק לעבוד לכל מי שמחזיק בו
נמחקו נתוני האתר, טלפון אחר, פרופיל דפדפן אחר קישור חדש — ההפעלה חיה רק במכשיר הזה

featureFollowMePersist דלוק כברירת מחדל, גם בקוד וגם בגיסט: "אותו קישור בכל פעם" לא יכול להיות תלוי בהצלחת בקשת רשת. הקישור שייך למכשיר, והוא מהסוג שיכול לחיות בקבוצת ואטסאפ של המועדון.

העסקה, בגלוי. קישור שנמסר למישהו ימשיך לעבוד בכל טיסה עתידית מהמכשיר הזה, תחת כל שם. עצירה לא מחזירה אותו ושינוי שם לא מחזיר אותו. קישור חדש הוא הדבר היחיד שכן.

🔑 קישור חדש

ליד עקבו אחריי, ומוצע בכל פעם שהמכשיר מחזיק קישור — בשיתוף או לא, כי המחשבה השנייה על מי מחזיק אותו מגיעה בדרך כלל על הקרקע. הכפתור מבקש אישור, והאישור אומר מה באמת נאבד ולא רק שואל אם אתם בטוחים.

  • תוך כדי שיתוף — נוצר קישור חדש ונמסר מיד לגיליון השיתוף או ללוח.
  • בזמן חוסר פעילות — היכולת השמורה נזרקת; השיתוף הבא ייצור חדשה.

המזהה שורד בשני המקרים: הוא התווית, לא היכולת.

featureFollowMeNewLink מסיר את הכפתור בלבד, בלי להסיר את עקבו אחריי. followMeLinkPerName (כבוי) מחזיר את המזהה לתוך היכולת: שם אחר יוצר נושא ומפתח אחרים. שימו לב למה שהוא לא עושה — נשמרת הפעלה אחת למכשיר, ולכן חזרה לשם קודם יוצרת קישור שלישי ולא משחזרת את הראשון.

שיתוף ציבורי: לראות ולהיראות על ידי כל טייסי NavAid

בחלון השיתוף יש תיבת ציבורי, כבויה עד שמסמנים אותה (נשמר במכשיר). אותה הגדרה היא גם מתג תחת שיתוף בתפריט — ציבורי (כל טייסי NavAid רואים אותי) — שעובד גם באמצע שיתוף: מסומן, אתם מופיעים בציבור מהמיקום הבא; לא מסומן, אתם יורדים מהערוץ הציבורי מיד.

  • הקישור שלכם לא משתנה. הוא עדיין מראה רק אתכם, למי שמחזיק בו.
  • ציבורי מפרסם את המטוס גם בערוץ ציבורי של אותו ממסר: מזהה, מיקום, גובה, מהירות וכיוון. חתום, לא מוצפן — ציבורי פירושו ציבורי: כל מי שמחובר לממסר יכול לקרוא. עצירה מוחקת אותו.
  • שכבות נוספות ← טייסי NavAid ← הצג טייסי NavAid ציבוריים מציג כל מטוס ציבורי, עם המזהה ומהירות · גובה לידו (הסמל מצביע בכיוון הטיסה האמיתי). הם גדלים מעט כשמתקרבים. מטוס שהשתתק מתעמעם אחרי 2 דקות ומציין לפני כמה זמן נשמע לאחרונה (95 kt · 2500 ft · 4 min); אחרי 30 דקות הוא נעלם.
  • כדי לראות אחרים צריך לשתף בעצמכם כציבורי. עד אז המתג מעומעם ואומר זאת. החריג היחיד הוא קישור הצפייה הסודי, https://navaid.supino.org/?pilots=: הוא מציג את כולם בלי לשתף, ומתאים את המפה אליהם. האפליקציה מחזיקה רק את ה־SHA-256 של הסוד (publicPilotsViewHash), כך שסוד חדש הוא שינוי ב־gist.
  • המטוס שלכם לעולם לא מוצג כמטוס של מישהו אחר — גם לא ישן: הטלפון זוכר את המזהים הציבוריים האחרונים שלו, כך שמיקום שנשאר מקישור קודם לא חוזר כזר.
  • אף אחד לא יכול להזיז את המטוס שלכם. המזהה הציבורי שלו הוא טביעת האצבע של מפתח החתימה, ומנה תחת המזהה הזה שנחתמה על ידי מישהו אחר נדחית. כל אחד יכול לפרסם מטוס משלו — כמו בכל ערוץ ציבורי. מוצגים לכל היותר 200.

זה כלל בתוך האפליקציה, לא פרטיות: הערוץ הציבורי קריא בממסר הציבורי. שיתוף שנגמר בלי עצירה (קריסה, טלפון שנכבה) משאיר את המיקום האחרון בממסר; הצופים מסננים אותו לפי גילו.

מפתחות כוונון: featureFollowMePublic (פעיל), publicPilotsViewHash, followMePublicZoomGrow (0.12), followMePublicDimSec (120), followMePublicDropSec (1800).

מי רואה מה

הממסר רואה בתים מוצפנים בנושא שאי אפשר לנחש. הוא לא יכול לקרוא את המיקום או את קוד המטוס
כל מי שיש לו את הקישור רואה את כל מה שהמטוס שולח. הוא אינו יכול לשדר: הקישור נושא את חצי האימות של מפתח החתימה, לעולם לא את חצי החתימה
אנחנו כלום. אין שרת של NavAid בנתיב הזה
כולם (רק כשסומן ציבורי) המזהה, המיקום, הגובה, המהירות והכיוון שלכם, לא מוצפנים, בערוץ הציבורי — ראו שיתוף ציבורי

המיקום מוצפן (AES-GCM) לפני שהוא עוזב את המטוס. המפתח נוסע בפרגמנט של הקישור — החלק אחרי # — שדפדפנים לעולם אינם שולחים לשום שרת. הנושא הוא 16 בתים אקראיים; קוד המטוס הוא תווית בתוך המטען המוצפן, לא חלק מהכתובת.

התייחסו לקישור כמו למפתח, כי זה מה שהוא. שתפו אותו עם אנשים, לא עם מקומות.

צופה קורא, ואינו כותב

כל מנה חתומה. המטוס מחזיק מפתח פרטי ECDSA P-256; הקישור נושא את החצי הציבורי לצד מפתח ההצפנה (#k=<הצפנה>&v=<אימות>), והצופה בודק את החתימה על כל מיקום ועל כל מסלול לפני הציור. צופה שינסה לשדר לנושא מיקום משלו יחתום במפתח שאין לו, ושאר הצופים יתעלמו.

החתימה נוסעת בתוך האובייקט המוצפן ולא מוצמדת אחריו — הצמדה הייתה שוברת את AES-GCM לכל קישור שכבר באוויר.

מכשיר זוכר את מפתח האימות שראה עבור מטוס (עד 32 מהם, ב-navaid.followVerified), כך שקישור שממנו הוסר v= אינו יכול להוריד בשקט צופה שכבר בדק. followMeRequireSignedLinks (כבוי) מרחיק לכת ומסרב לקישור בלי מפתח אימות בכלל; כבוי כברירת מחדל כדי שקישורים שנוצרו לפני החתימות ימשיכו להיפתח.

מפתחות כוונון (gist / חלונית הכוונון)

מפתח ברירת מחדל מה הוא עושה
featureFollowMe true האם השיתוף מוצע בכלל
featureFollowMePersist true קישור אחד למכשיר, לתמיד
featureFollowMeNewLink true להציע את הכפתור 🔑 קישור חדש
followMeLinkPerName false דלוק: מזהה אחר יוצר קישור אחר
followMeResumeHr 12 כמה שעות אפשר להמשיך הפעלה שמורה — רק כשההתמדה כבויה
followMeRateSec 2 שניות בין שידורי מיקום
followMeStopMaxSec 25 כמה זמן עצירה ממתינה לממסר לפני שהיא נעצרת כאן בכל מקרה
featureFollowMeRoute true לשתף את המסלול לצד המיקום
followMeRouteCompress gzip כיצד המסלול המשותף נדחס: gzip, deflate-raw או off
followMeRouteMaxKb 64 המסלול הגדול ביותר שיפורסם, נמדד לפי מה שיוצא לרשת
followMeRouteDebounceMs 1500 המתנה אחרי עריכת מסלול לפני שידור מחדש
featureFollowMeShareWhileViewing false לאפשר לדף לשתף בזמן שהוא עוקב אחרי מישהו אחר
followMeStaleSec 30 מתי הצופה קובע שהשידור נפסק
followMeBroker wss://broker.emqx.io:8084/mqtt הממסר הציבורי
followMePlanePx 26 גודל סמל המטוס אצל העוקב
followMePlaneColor #182839 צבע סמל המטוס אצל העוקב

כיבוי featureFollowMe ב-gist גם מסיים שיתוף שכבר רץ — אי אפשר לעצור שיתוף בעזרת פקד שהרגע הוסתר. זה קורה רק כשה-gist באמת מגיע: כשל בטעינה באוויר לעולם אינו נחשב "התכונה בוטלה".

נשמר במכשיר בלבד ואינו מסונכרן ל-Drive: navaid.followMeSession (נושא + מפתח — הרשאה, לא העדפה) ו-navaid.followMeCode.

מהקרקע: שני כלי Python

שניהם דורשים paho-mqtt ו-cryptography: python3 -m pip install -r scripts/requirements-follow-me.txt

הדפסת השידור כטקסט — שימושי ליומן טיסה, או לבדיקה שהקישור באמת משדר לפני שמאשימים את הטלפון:

./scripts/follow-me-tail.py 'https://navaid.supino.org/?follow=<id>#k=<key>'
# 18:29:30  4X-TST   32.10000, 34.80000  2001 ft  95 kt  007°  age 2s
./scripts/follow-me-tail.py --json '<link>' | tee flight.jsonl
./scripts/follow-me-tail.py --once '<link>'

הטסת מסלול מדומה לתוך קישור, כדי לראות את הצופה עובד בלי מטוס:

python3 scripts/follow-me-simulator.py                        # תבנית LLHZ ← LLHA
python3 scripts/follow-me-simulator.py route.json --speed-kt 120
python3 scripts/follow-me-simulator.py --speed-factor 10

הסקריפט מדפיס את כתובת העוקב שאליה הוא משדר. שמרו אותה פרטית — הפרגמנט שלה נושא את המפתח, שמעניק גם שידור וגם צפייה.

אם העוקב לא רואה כלום

  • הקישור איבד את הפרגמנט. אפליקציות צ׳אט לפעמים חותכות ב-#. בלי #k=… אין מפתח ואי אפשר לפענח דבר. follow-me-tail.py אומר זאת במפורש.
  • הטייס הפסיק לשתף, או שהאפליקציה אינה פועלת. השורה אומרת "ממתין למיקום".
  • למטוס אין קליטה. השידור נפסק, והשורה מתיישנת אחרי 30 שניות.

NavAid · 🇮🇱 עברית

For pilots

For developers


🇮🇱 עברית

לטייסים

למפתחים


🌐 Live 🧪 Staging 📦 Repo 💡 Ideas / bugs

Clone this wiki locally