תארו לעצמכם: מאה חיישני טמפרטורה במחסן, כל אחד עם 10 KB RAM, שולחים נתונים לטאבלט הנייד של טכנאי. HTTP כבד מדי, MQTT דורש broker. הפתרון הוא CoAP (פרוטוקול יישומים מוגבל, המתואר ב-RFC 7252). כמפתחי מובייל, אנו נתקלים לעתים קרובות באינטגרציה של פרוטוקול כזה. הסמנטיקה של CoAP זהה: GET, POST, PUT, DELETE, קודי תגובה (2.05 Content = 200, 4.04 Not Found = 404). אבל הוא רץ מעל UDP, תופס עשרות בתים במקום מאות, ומיועד למכשירים עם 10 KB RAM וסוללה. אפליקציית מובייל המתקשרת ישירות עם מכשירים כאלה או דרך proxy של CoAP היא תרחיש נישתי אך הולך וגדל: רשתות Thread (Matter), חיישנים תעשייתיים, מכשירים רפואיים לבישים. אינטגרציית CoAP באפליקציות מובייל היא נישה צומחת. תקשורת CoAP IoT אידיאלית למכשירים מוגבלים.
כיצד CoAP פותר אמינות מעל UDP
CoAP מגדיר שני סוגי הודעות:
- CON (Confirmable) – השולח ממתין ל-ACK. במקרה של timeout, backoff אקספוננציאלי וניסיון חוזר (ברירת מחדל: 2 ניסיונות, מרווח של 2–32 שניות). מקביל להבטחות TCP.
- NON (Non-confirmable) – fire and forget. לטלמטריה בתדירות גבוהה.
כל הודעת CON נושאת מזהה הודעה (2 בתים) למניעת כפילויות — המקלט שומר את המזהים האחרונים שטופלו ומתעלם מכפילויות. זמן החיים של המטמון הוא EXCHANGE_LIFETIME (247 שניות לפי RFC). בעבודה דרך NAT מהמובייל לרשת IoT, שימו לב שהקשרים של NAT גם הם פגים (~30 שניות עבור UDP דרך NAT של ספקים רבים). מנגנון בקרת הגודש של CoAP מיישם backoff אקספוננציאלי עם גורם אקראי, בהתאם לערכים המומלצים ב-RFC 7252.
מה זה Observe ואיך ליישם אותו במובייל?
RFC 7641 מוסיף את אפשרות Observe — אנלוגיה למנוי WebSocket עבור CoAP. הלקוח שולח DtlsConnectorConfig config = new DtlsConnectorConfig.Builder() .setPskStore(new StaticPskStore("device-id", pskBytes)) .build(); DTLSConnector connector = new DTLSConnector(config); CoapEndpoint endpoint = new CoapEndpoint.Builder() .setConnector(connector).build(); CoapClient client = new CoapClient("coaps://192.168.1.100/sensor/temperature"); client.setEndpoint(endpoint); עם Observe: 0 (הרשמה). השרת שולח את הערך הנוכחי ולאחר מכן התראות על כל שינוי. Observe: 1 מבטל את ההרשמה. תכונת ה-Observe של CoAP מאפשרת push מהשרת, ומפחיתה את תעבורת הרשת בעד 90% בהשוואה לבדיקה כל 5 שניות.
זהו מפתח ללקוחות IoT במובייל: במקום לבדוק כל 5 שניות, בקשה אחת בודדת מפעילה push מהשרת. האזהרה: לפי RFC, השרת שומר רשימה של צופים. כאשר כתובת ה-IP של הלקוח משתנה (נתונים סלולריים, Wi-Fi → 4G), השרת אינו מודע לכך — יש לרשום מחדש את ה-Observe מהכתובת החדשה. בפועל, בכל שינוי רשת (שמתגלה דרך ConnectivityManager.NetworkCallback באנדרואיד, NWPathMonitor ב-iOS), אנו שולחים מחדש את כל בקשות ה-Observe הפעילות.
DTLS: אבטחה מעל UDP
CoAP ללא הצפנה אינו בטוח לשימוש בייצור. DTLS (Datagram TLS, RFC 6347) הוא האנלוגיה ל-TLS עבור UDP. ה-handshake כבד יותר מאשר TCP TLS (4–6 RTT לעומת 1–2 עבור TLS 1.3), מה שקריטי למכשירים עם מעבדים איטיים. אבטחת DTLS CoAP חיונית לייצור.
פרופילי אבטחה של CoAP:
- NoSec – ללא הצפנה. רק לרשתות מבודדות.
- PreSharedKey (PSK) – מפתח סימטרי המוטמע במכשיר במפעל. הנפוץ ביותר בתרחישים תעשייתיים.
- RawPublicKey – ללא תשתית PKI, אך עם מפתחות ציבוריים.
- Certificate – PKI מלא. נדיר במכשירים מוגבלים.
עבור לקוח מובייל המתחבר למכשירי PSK: שמרו את מפתחות ה-PSK בצורה מאובטחת (Keychain / EncryptedSharedPreferences) ויישמו handshake של DTLS באמצעות ספרייה עם תמיכה ב-PSK.
CoAP לעומת MQTT: מה לבחור ל-IoT?
CoAP מנצח את MQTT בגודל ההודעה (קטן פי 2-3) ואינו דורש broker, אך מפסיד באספקה מובטחת ותמיכה בתורים מורכבים. ספציפית, כותרת CoAP היא רק 4 בתים, שזה קטן פי 8 מכותרת HTTP ופי 3 מכותרת המינימום של MQTT. עבור תרחישי "sensor-app" עם בקשות לא תכופות, CoAP יעיל יותר; עבור זרמי נתונים קבועים עם נקודות קצה רבות, MQTT עדיף.
ספריות לקוח לפלטפורמות מובייל
ספריות CoAP למובייל הן משמעותית פחות מ-MQTT. אפשרויות אמיתיות:
| פלטפורמה | ספרייה | DTLS | Observe |
|---|---|---|---|
| אנדרואיד | Californium (Eclipse) | + (דרך Scandium) | + |
| iOS | libcoap (C, דרך FFI) | + | + |
| Flutter | coap (pub.dev) | חלקי | + |
| React Native | אין מוכן | — | — |
עבור React Native, הדרך היחידה האפשרית היא מודול native (Californium באנדרואיד, libcoap ב-iOS דרך גשר Objective-C) או proxy של CoAP ל-HTTP בקצה האחורי.
Californium (org.eclipse.californium:californium-core) הוא היישום הבוגר ביותר. ספריית ה-CoAP הבוגרת ביותר לאנדרואיד היא Californium. Observe דרך CoapClient.observe() עם CoapHandler. DTLS דרך הארטיפקט הנפרד Scandium. דוגמה לאתחול חיבור PSK:
DtlsConnectorConfig config = new DtlsConnectorConfig.Builder()
.setPskStore(new StaticPskStore("device-id", pskBytes))
.build();
DTLSConnector connector = new DTLSConnector(config);
CoapEndpoint endpoint = new CoapEndpoint.Builder()
.setConnector(connector)
.build();
CoapClient client = new CoapClient("coaps://192.168.1.100/sensor/temperature");
client.setEndpoint(endpoint);עבור iOS, libcoap מורכב דרך CocoaPods עם podspec מותאם או דרך SPM כיעד בינארי (דורש בנייה מחדש עבור arm64/x86_64). עבור אינטגרציית CoAP ב-iOS, אנו משתמשים ב-libcoap דרך FFI. זו לא משימה של 15 דקות.
CoAP דרך proxy: כשהתקשורת הישירה אינה נדרשת
אם המכשירים נמצאים ברשת IoT מבודדת והלקוח הנייד חייב לתקשר דרך האינטרנט, proxy של CoAP ל-HTTP (או proxy של CoAP ל-MQTT) מסיר את המורכבות מהצד הנייד. Eclipse Hono, AWS IoT Core עם נקודת קצה CoAP, או proxy של Californium באירוח עצמי. הלקוח הנייד עובד דרך HTTPS/WebSocket רגיל, וה-proxy מתרגם ל-CoAP. אנו מאבדים Observe ישיר (נדרשת אמולציה דרך SSE או WebSocket ברמת ה-proxy) אך מרוויחים פשטות ואמינות TCP בצד הלקוח.
פרטי יישום של handshake DTLS
בשימוש ב-PSK, ה-handshake מורכב מ-4 שלבים: ClientHello, ServerHello (עם זהות PSK), ChangeCipherSpec, Finished. במכשירים מוגבלים, זה יכול לקחת עד 2 שניות. אנו ממליצים על שמירת סשן DTLS במטמון (מזהה סשן או כרטיס סשן) לחיבורים חוזרים.מה כלול בעבודה שלנו
- פיתוח פרוטוקול החילופין (מודל משאבים, פורמטים של payload).
- יישום Observe בצד הנייד עם טיפול בשינויי רשת.
- הגדרת DTLS (PSK או אישורים) ואינטגרציה עם Keychain/EncryptedSharedPreferences.
- בדיקות על מכשירים אמיתיים ואמולטורי רשת.
- תיעוד אינטגרציה (דיאגרמות, דוגמאות בקשות).
- ייעוץ לגבי בחירות תשתית (proxy או ללא proxy).
- עלות פרויקט טיפוסית נעה בין $15,000 ל-$30,000 בהתאם למורכבות ולכיסוי הפלטפורמות.
אנו צוות של מפתחי מובייל עם ניסיון של 10+ שנים ו-40+ פרויקטים ב-IoT. אם יש לכם משימה דומה, צרו קשר — נבחן את המורכבות ונציע ארכיטקטורה לתרחיש שלכם.
הערכה ולוחות זמנים
אינטגרציית CoAP היא משימה לא סטנדרטית. לוחות הזמנים תלויים בתרחיש: אם דרך proxy — 2–3 שבועות. CoAP ישיר עם DTLS בפלטפורמות native — 4–8 שבועות, כולל הגדרת Californium/libcoap, handshake של DTLS ו-Observe. אנו תמיד בודקים את פרופיל האבטחה של המכשיר ואת תשתית הרשת הזמינה לפני הערכה.







