שקע נשלט: תיאור והאקינג

בתחתית הערמה של מוצרי הבית החכם, מבחינת תחכום ומחיר, אפשר למצוא למשל שקע חשמלי שמכבים ומדליקים עם שלט רחוק ייעודי (נקרא באנגלית "Remote outlet"). בואו נראה איך המוצר הזה בנוי, מה הוא משדר/קולט, ואיך אפשר להתערב בשידורים שלו בעזרת ארדואינו וקיט RF זול.

שקע נשלט ושלט שולט

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

הצד השני של השקע

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

הנה הלוח הלא-מדהים שבתוך השלט הרחוק (שמופעל בסוללת 12V), משני צדיו. יש על הלוח הזה רק ג'וק אחד, כנראה מתוצרת Holtek ועם הכיתוב HS2303-PT, אך בינתיים לא הצלחתי למצוא עליו מידע ברור. האנטנה מובנית ב-PCB כמוליך נחושת רגיל.

הלוח שבשלט הרחוק
הלוח שבשלט הרחוק (לחצו להגדלה)

התדר 433.92MHz שהזכרנו אמור להיות מוכר לכל מייקר מקומי. זהו תדר "חופשי" ונפוץ מאוד בשלטים-רחוקים של שערי חניה, מכוניות וסוגים מסויימים של מוצרים ביתיים, וגם בהרבה מודולים סיניים למייקרים. ה-RF Kit המפורסם והזול מאוד הוא צמד של משדר ומקלט בתדר זה, ואחרי ששיחקתי איתו קצת בעבר, החלטתי שאני מתעב אותו בגלל איכות השידור והקליטה העלובה. למרות זאת שמרתי כמה יחידות בצד בשביל האקינג, בדיוק כפי שעשיתי כעת.

יחידות RF Kit סיני זול, למעלה המקלט ולמטה המשדר

ראשית, חיברתי מקלט מ-RF Kit לספק כוח וללוג'יק אנלייזר, והקלטתי את השידור המתקבל כשאני לוחץ על לחצן ON ולאחר מכן על OFF בשלט של השקע (בזוג מס' 1). במבט מרחוק, זה מה שהתקבל:

מה שמקלט ה-RF ראה, ממעוף הציפור
מה שמקלט ה-RF ראה, ממעוף הציפור (לחצו להגדלה)

כמובן, רוב מה שרואים כאן אינו המידע ששודר באמת. למקלטי ה-RF יש מה שנקרא AGC – Automatic Gain Control, מנגנון שמנסה להבדיל ולהפריד כמיטב יכולתו בין רמות ה-HIGH וה-LOW בגלי הרדיו הנקלטים. אם אין שום שידור, ה-AGC מתאמץ עוד ועוד עד שהוא "מדמיין" אותות ברעש הסביבתי האקראי. אבל אחרי שידור ממשי, שבו הבדלי העוצמה הם גדולים וניכרים יחסית, ישנו פרק זמן קצר בו ה-AGC עדיין מצפה להבדלים כאלה, ואז הרעש הסביבתי אינו מתבטא בפלט. אלה ה"חורים" שרואים בצילום המסך למעלה. כדי למצוא את מה שהשלט הוציא, צריך להתמקד באזורים שנמצאים ממש לפני כל חור. הנה אחד מהם, וסימנתי בו (בטקסט לבן) מה שנראה לי כביטים וחלקים בעלי משמעות אחרים:

שידור ON של זוג מס' 1 בשלט
שידור ON של זוג מס' 1 בשלט (לחצו להגדלה)

בעבר ניתחתי ג'וקים של שלטי RF פשוטים, מדגם PT2262/72. אפשר היה לחשוב שכאן יהיה משהו דומה, אך דפוסי ה-HIGH/LOW כאן לא התאימו לפורמט שהצגתי בפוסט ההוא, ומה שחשוב יותר, בניגוד למקרה שלפנינו כעת, הג'וק הקולט שם (ה-72') אינו מסוגל ללמוד ולהתאים את עצמו למשדר. בשקע הנשלט יש שני ג'וקים: אחד הוא מגבר שרת LM358, מן הסתם בשביל אותות הרדיו, והג'וק השני מסומן בכיתוב המסתורי KX-002.

הלוח שביחידת השקע הנשלט
הלוח שביחידת השקע הנשלט (לחצו להגדלה)

קשה לדעת אם הסיגנלים שסימנתי כ"Start" ו-"Stop" הם בעצמם ביטים. בלעדיהם יש כאן 23 ביטים – מספר לא עגול בעליל, אז באופן שרירותי למדי החלטתי שה-Start הוא כן ביט, שערכו 0. לפי צורת פענוח זו, יש כאן שלושה בייטים בסך הכול, שנראים בייצוג בינארי ככה:

01111111-10011000-00001111

השידור שהתקבל בהמשך, בלחיצה על OFF, היה דומה מאוד:

01111111-10011000-00000111

הביט היחיד שהשתנה הוא הרביעי מימין: 1 להדלקה ו-0 לכיבוי. בהנחה הסבירה שאין כאן איזשהו קידוד משוכלל, זהו בפשטות ביט ה-on/off. מה לגבי המספר? הנה הביטים שהתקבלו, למשל, בפקודת ON למספר 2:

01111111-10011000-00001011

הסתבר ששלושת הביטים האחרונים הם אלה שמייצגים את מספר הנמען, אך הם לא תואמים את המספרים העשרוניים שעל השלט – 111 הוא אחד, 011 הוא שניים, 101 הוא שלוש ו-110 הוא ארבע. השידור של לחצן All Off הכללי היה יוצא דופן בכך שהסתיים בארבעת הביטים 1000.

התזמונים, אגב, היו זהים בכל מקרה: כ-300 מיקרו-שניות לפולס/רווח קצר של ביט, כ-900 לפולס/רווח ארוך של ביט, וכ-9.8 אלפיות השנייה בין שידורים, שפשוט חוזרים על עצמם כל עוד הלחצן לחוץ (גם אין preamble, איזשהו סיגנל "תיאום" ייחודי לפני מחזור השידורים). זהו קצב שידור של כ-830 ביטים לשנייה, מספיק איטי כדי לשחזר שידורים בארדואינו אפילו בלי להזדקק לעבודה ישירה עם טיימרים. אז קדימה, לעבודה!

כתבתי קוד פשוט לארדואינו שמוציא סיגנלים מתוזמנים למשדר ה-RF Kit, כחיקוי לשידורי ON/OFF מלחצני השלט ועבור מספר שהשקע כבר למד. אחרי תיקון באג זעיר או שניים, זה עבד מעולה. ממרחק של כמטר וחצי, שידור יחיד הספיק כמעט תמיד כדי להדליק או לכבות את השקע, ושני שידורים ברצף הצליחו בכל הפעמים שבדקתי. לאחר מכן הוספתי לקוד, בפונקציה setup, שידור שמטרתו ללמד את השקע אם הוא עבר איפוס. בניסוי וטעייה גיליתי שנדרשים לפחות 6 שידורים רצופים זהים כדי שהשקע יקלוט את הזהות החדשה שלו.

המשכתי ושיחקתי עם השידורים כדי לראות אילו זהויות נוספות השקע יכול ללמוד. בהתחלה בדקתי את רצפי הביטים שכבר איתרתי עבור המספרים האחרים, ואחר כך גם את הרצפים שלא היו בכלל בשלט (001, 100 ו-010). כולם עבדו היטב. גם כששיניתי ביטים נוספים במעלה הרצף (משמאל לביט ה-on/off), כולל ביט ה-Start, השקע הצליח ללמוד את הזהות החדשה בלי בעיה!

יחד עם זאת, כדי שלחצן ה"כיבוי האוניברסלי" יעבוד, הביטים משמאל לביט ה-on/off צריכים להיות זהים לאלה שבשידור הלמידה. הביטים האלה הם כביכול תעודת הזהות של המערכת באופן כללי, ואילו שלושת הביטים בסוף הם הכתובת של כל יחידה נפרדת בתוך המערכת. המשמעות המעשית היא שאם אני האקר זדוני שרוצה לכבות שקע נשלט של מישהו אחר, אני צריך לגלות את "תעודת הזהות" הנכונה של המערכת שלו. יכול להיות שכל המערכות האלה נמכרות עם אותה תעודת זהות בדיוק, ויכול בתיאוריה להיות גם מקרה קיצוני, שבו היצרן מקצה תעודת זהות שונה לגמרי לכל מערכת – שמתפרסת על פני 20 ביטים.

בחישוב זריז של כ-39 אלפיות שנייה ברוטו לשידור, ושני שידורים זהים ברצף כדי להבטיח קליטה, ו-2-בחזקת-20 אפשרויות לתעודת זהות, אנחנו מגיעים לממוצע של 5.68 שעות לפיצוח, ומקסימום של פי שניים מזה. לא מאוד פרקטי! ייתכן שאפשר לקצר באחוז מסוים את פרקי הזמן השונים, אך אנחנו נעצור כאן.

הערה: אחרי שהכנתי את רוב הפוסט, מצאתי את השרשור הזה מ-2010, שמנתח גאדג'ט מאותו סוג, מגיע לממצאים דומים ואף טוען שהג'וק KX-002 הוא למעשה PIC בתחפושת!

להרשמה
הודע לי על
0 תגובות
Inline Feedbacks
הראה את כל התגובות