ערכת לימוד: לוחמת סייבר )(Cyberwarefare מדריך לתלמיד מאיר סלע 2לוחמה-קיברנטית :מדריך לתלמיד ערכת לימוד :לוחמת סייבר )(Cyberwarfare מדריך לתלמיד מאיר סלע מהדורה ראשונה 2012 הדפסה 1 כל הזכויות שמורות עיטם רובוטיקה אתר אינטרנטwww.eytam.com : פניות בדואר אלקטרוניhttp://www.eytam.com/contact : אין להעתיק ,לשכפל או לצלם ספר זה או קטעים ממנו ,בשום צורה ובשום אמצעי אלקטרוני ,אופטי או מכני לכל מטרה שהיא ,ללא אישור בכתב מההוצאה לאור. עיטם רובוטיקה http://www.eytam.com פרק :1מבוא ללוחמת סייבר 3 תוכן עניינים .1מבוא ללוחמת סייבר 5 .2מושגי יסוד ברשתות 7 7 עקרונות האינטרנט 8 9 10 10 11 13 מבנה טופולוגי של האינטרנט ניתוב ומערכות אוטונומיות מבנה הפרוטוקולים באינטרנט -מודל השכבות תקשורת שרת-לקוח באמצעות Ports תקשורת טורית בין שני מחשבים .3ערכת הסייבר הלימודית 15 .4תקשורת לבקר הסייבר 17 פרוטוקול התקשורת לבקר הסייבר 17 .5תקשורת לבקר הסייבר מJava - 19 19 תכנית דוגמאHelloCyber : הרצה הסבר 21 21 קריאת קלט מהערוץ הטורי תכנית דוגמא כוללת 25 26 .6תקשורת לבקר הסייבר מ#C - תכנית דוגמאHelloCyber : הרצה הסבר עיטם רובוטיקה 31 31 32 32 http://www.eytam.com 4לוחמה-קיברנטית :מדריך לתלמיד קריאת קלט מהערוץ הטורי תכנית דוגמא כוללת .7נספח :תכנות בקר הסייבר 35 38 43 סביבת הפיתוח ++Mambo 43 מבנה בקר הCyber - 45 47 דוגמא :תכנות הבקר עיטם רובוטיקה http://www.eytam.com פרק :1מבוא ללוחמת סייבר 5 .1מבוא ללוחמת סייבר יותר ויותר אנו נחשפים בתקופה האחרונה לידיעות בתחום פגיעה בתשתיות מחשוב מעל גבי האינטרנט ,כאשר זהות המפגע אינה לגמרי ברורה .לעיתים הידיעה היא על פגיעה בתשתית תקשוב של מדינה ,כאשר החשד נופל על מדינה אחרת או על ארגון עוין .במקרים אחרים שומעים על חדירה של האקרים לאתרי אינטרנט ולמאגרי מידע רגישים של מדינות או חברות .כל המקרים מאופיינים בחשאיות ובחוסר הנראות של הגורם הפוגע ,הפגיעה עצמה והציוד או הנתונים שנפגעו. הטבלה הבאה מציגה אפשרויות ומאפיינים של לוחמה קיברנטית: גורם פוגע גורם נפגע סוג הפגיעה תחום מדינה מדינה ריגול צבאי ארגון/חברה ארגון/חברה חבלה אזרחי האקר/פרט פרט של מידע לוחמת היא קיברנטית הגדרה :לוחמה מדינות/ארגונים/פרטים במדינות/ארגונים/פרטים אחרים ,המבוצעת מעל גבי תשתיות תקשוב ,תוך מטרה לרגל ו/או לחבל בתשתיות אלו. התגברות אירועי הפגיעה בתשתיות התקשוב הובילו להגברת התודעה לסיכונים הקיימים במרחב האינטרנט ולצורך בהבנת תחום אבטחת המידע ,שיטות עיטם רובוטיקה http://www.eytam.com 6לוחמה-קיברנטית :מדריך לתלמיד תקיפה ושיטות הגנה .השם הכולל שניתן לתחום זה הינו לוחמה קיברנטית, כאשר קיברנטיקה ) (Cyberneticsהיא שם כולל למערכות ותהליכי תקשורת בכלל ולאינטרנט בפרט. מטרת ספר זה ,יחד עם ערכת הסייבר המצורפת ,היא להקנות לתלמידים כלים וידע בסיסיים בתחום הלוחמה הקיברנטית .באמצעות הערכה המצורפת יוכלו התלמידים להרכיב מערכת הכוללת ציוד אלקטרוני ומערכת בקרה ,וכן לדמות גורם עוין המתחבר למערכת זו ומבצע תקיפה .לימוד והתנסות מעשית בלוחמה קיברנטית ימחיש לתלמידים את הצורך בהבנה מלאה של תהליכי התקשרות, ויעלה בתודעתם את הצורך בשיטות הגנה וניטור ובמנגנוני אבטחה. עיטם רובוטיקה http://www.eytam.com פרק :2מושגי יסוד ברשתות 7 .2מושגי יסוד ברשתות בפרק זה נסקור את המושגים היסודיים ברשתות מחשבים. מהי רשת מחשבים? כשמה ,רשת מחשבים בנויה ממספר מחשבים יחידים ,והיא יכולה בעצמה לכלול עוד רשתות ,כלומר ,תתי רשתות. • מחשב אישי -מחשב יחיד ,עצמאי שנועד לשימוש אישי של משתמש יחיד ,או מספר חשבונות עבור מספר משתמשים )שלא עובדים עליו בו זמנית(. עקרונות האינטרנט האינטרנט הוא אוסף מחשבים בכל העולם ,המתקשרים ביניהם על ידי העברת חבילות נתונים על אוסף קוי רשת ,בפרוטוקול תקני הנקרא TCP/IP ) .(Transmission Control Protocol / Internet Protocolלכל מחשב כתובת המזהה אותו ברשת :כתובת זו נקראת כתובת (Internet Protocol) IPוהיא כוללת 32סיביות .לכן ייתכנו 232=4Gכתובות שונות באינטרנט .כתובת זו מייוצגת על ידי 4 Bytesמופרדים על ידי נקודה ,לדוגמא.224.12.4.1 : עיטם רובוטיקה http://www.eytam.com 8לוחמה-קיברנטית :מדריך לתלמיד מכיוון שקשה לזכור את מספרי הכתובות ,מוצמד להן בדרך כלל שם מתאים הנקרא גם - domainלדוגמא - www.company.com ,שמות אלו מסופקים על ידי גופים ריכוזיים באינטרנט כגון .InterNicמנגנון תרגום השמות לכתובות נקרא .(DNS) Domain Name Systemשרתי DNSמחזיקים טבלאות תרגום של שמות לכתובות ואחראים לתרגום השמות לכתובות .IP מחשבים שונים מתקשרים ביניהם ישירות או דרך מחשבים מתווכים .בכדי שמחשב המקבל חבילה יידע לאן להמשיך לנתב אותה ,קיימים פרוטוקולי ניתוב ) (Routingתקניים. מבנה טופולוגי של האינטרנט מבחינה טופולוגית ,רשת האינטרנט בנויה מקבוצות של רשתות מחשבים ,כך שכל אחת מהקבוצות היא בעלת פרוטוקולי ניתוב ומדיניות עצמאיים: IBM Compatible IBM Compatible IBM Compatible IBM Compatible IBM Compatible IBM Compatible IBM Compatible IBM Compatible IBM Compatible IBM Compatible אפיון של רשתות בגדלים שונים: • ) - Local Are Network (LANרשת מקומית שבה מחשבים הנמצאים בתוך מתחם בעל שטח מוגבל -בבית ,במשרד ,בבי"ס וכו'. • ) - Metropolitan Area Network (MANרשת הפרושה על פני מרחב גדול כגון עיר או קמפוס ,ועשויה להכיל מספר .LANs עיטם רובוטיקה http://www.eytam.com פרק :2מושגי יסוד ברשתות 9 • - Wide Area Networkרשת היכולה להיות פרושה על פני מספר יבשות. כמו כן ,ישנן רשתות המאופיינות על פי תפקידן: • ) - Virtual Private Network (VPNרשת לוגית של מחשבים ,המחוברים באמצעות רשתות פיזיות הנ"ל ,כגון ,WAN ,LANאינטרנט וכו' .לרוב רשת זו כוללת מנגנוני אבטחה המאפשרים למשתמשי הקצה תקשורת פרטית ,על אף שהתשתית עליה "רוכבת" ה VPNהיא ציבורית -וזאת באמצעות מנגנוני הצפנה ופענוח. • ) - Home Area Network (HANרשת ביתית מעל LANהמאפשרת תקשורת של מכשירים אלקטרוניים בבית ,ומבוססת על שיתוף גישה ושיתוף נתונים. ניתוב ומערכות אוטונומיות פרוטוקולי הניתוב בין מחשבים ברשתות השונות בתוך מערכת אוטונומית נקראים .(Internal Gateway Protocol) IGPדוגמאות לפרוטוקולי ניתוב תקניים .OSPF ,RIP :פרוטוקולי ניתוב בין מערכות אוטונומיות נקראים פרוטוקולי .(Border Gateway Protocol) BGP עיטם רובוטיקה http://www.eytam.com 10לוחמה-קיברנטית :מדריך לתלמיד מבנה הפרוטוקולים באינטרנט -מודל השכבות מודל השכבות (Open Systems Interconnection) OSIקובע שהמידע ברשת עובר מספר שכבות לוגיות ,כאשר לכל אחת תפקיד במשלוח המידע: יישום יישום תצוגה תצוגה IP שיחה IP שיחה תעבורה תעבורה רשת רשת קו קו פיזית פיזית הערה :ישנו מודל שכבות אחר )מודל (TCPשבו רק 5שכבות -יישום ,העברה ,IP ,רשת ופיזית. • שכבת היישום ) - (Applicationהשכבה העליונה :תכניות המעבירות ביניהן נתונים .דוגמאות: - (File Transfer Protocol) FTPפרוטוקול להעברת קבצים - Telnetפרוטוקול להתקשרות לקוח לשרת במוד טקסט - (Hyper Text Transfer Protocol) HTTPפרוטוקול הWEB - • שכבת התצוגה ) - (Presentationדחיסה/שחזור ,הצפנה/פיענוח ,המרה בין ייצוגי מספרים שונים במחשבים שונים. • שכבת השיחה ) - (Sessionניהול השיחה בין יישומים ,כלומר שמירת מידע הקשר ) (contextשל שיחה. • שכבת ההעברה ) - (Transportבקרה של זרימת המידע ואספקת העברת עיטם רובוטיקה http://www.eytam.com פרק :2מושגי יסוד ברשתות 11 נתונים אמינה לשכבות שמעל ,בקרת שגיאות. • שכבת הרשת ) - (Networkשכבת הרשת הכוללת את מודל הכתובות ואת פרוטוקולי הניתוב. • שכבת הקו ) (Data Linkשכבה זו אחראית לקישור בין מחשבים ברשת המקומית :היא כוללת את בקרת הערוץ (MAC - Medium Access ) Controlשדרכו עובר המידע .דוגמאות: - Ethernetרשת בטופולוגיית אפיק קוי בעלת גישה אקראית ,עם גילוי התנגשויות. - Token Ringרשת מעגלית :המידע עובר במעגל סביב כל התחנות. • שכבה פיזית ) - (Physicalכוללת את מאפייני שידור הנתונים הפיזי במדייה של הרשת כגון :מתחים וזרמים חשמליים של האותות ,סוג הכבל או תדר אות אלחוטי. הערה :נהוג לכנות את שכבות הפרוטוקולים גם מחסנית הפרוטוקולים ) (Protocol Sackעקב כוון זרימת חבילות המידע -מטה בצד אחד ,ומעלה בצד השני. תקשורת שרת-לקוח באמצעות Ports יישום שרת נרשם על ידי מערכת ההפעלה שעל השרת ומזוהה על ידה באמצעות מספר . portהלקוח פונה לכתובת השרת )כתובת ( IPומספר ה port -ואם הפעולה מצליחה נוצר קשר: עיטם רובוטיקה http://www.eytam.com 12לוחמה-קיברנטית :מדריך לתלמיד שרת לקוח מערכת ההפעלה מערכת ההפעלה socket socket port = 83 ? = port IP=132.68.190.1 במחשב מארח ) (Hostסטנדרטי רצות בדרך כלל מספר תכניות שרת המזוהות על ידי מספרי portשונים .קיימים מספרי portתקניים עבור תכניות שרת שכיחות כגון.(23) Telnet ,(80) HTTP ,(21) FTP : עיטם רובוטיקה http://www.eytam.com פרק :2מושגי יסוד ברשתות 13 מחשב מארח Socketsבמערכת ההפעלה Whois server (TCP) port 43 HTTP server (TCP) port 80 news server (TCP) port 144 My server (TCP) port 1300 FTP server (TCP) port 21 telnet server (TCP) port 23 domain name server (TCP) port 53 talk server (UDP) port 517 HTTP Client HTTP Client My Client FTP Client My Client My Client בדוגמא רואים מחשב מארח יחיד המכיל תכניות שרת ומספר מחשבי/תכניות לקוח מסוגים שונים :קיימים שרתים ולקוחות תקניים כגון FTP, HTTPוכן שרת ולקוח לא תקניים ).(My server, My client גם מחשב הלקוח יכול להריץ תכניות לקוח מרובות הנבדלות על ידי מספר ה- portשפותחת עבורן מערכת ההפעלה .מספר זה משמש לקבלת מידע המוחזר מהשרת. תקשורת טורית בין שני מחשבים שני מחשבים יכולים לתקשר ביניהם באמצעות תקשורת טורית .ישנם עיטם רובוטיקה http://www.eytam.com 14לוחמה-קיברנטית :מדריך לתלמיד פרוטוקולים תקניים לתקשורת טורית ,להלן השכיחים שבהם: • • • • • • - RS-422 ,RS232פרוטוקולי תקשורת טורית הממומשים ע"י -portים טוריים. - I2Cמיועד לחיבור רכיבים פריפריאליים בעלי מהירות נמוכה ללוחות אם או לכרטיסים אחרים. - SPIתקשורת master/slaveטורית בין שני התקנים - USBפרוטוקול טורי מהיר הכולל גם אותו מתח ואדמה ,שמטרתו להיות תחליף אחיד ותקני לפרוטוקולי תקשורת טורית מסורתיים - FireWireתקן לממשק busמהיר בין התקנים - Eheternetפרוטוקול תקני לרשתות מקומיות בפרוטוקולים הטוריים נשלח המידע מצד אחד לשני בית אחד בכל פעם )בניגוד לפרוטוקולי תקשורת מקבילית(. עיטם רובוטיקה http://www.eytam.com פרק :3ערכת הסייבר הלימודית 15 .3ערכת הסייבר הלימודית ערכת הסייבר הלימודית המצורפת כוללת את המרכיבים הבאים: • • • • • • • • מצלמת סייבר +מנוע סרוו ומתקן סיבוב בקר מיתכנת רב ערוצי עם מסך משולב חיישן טמפרטורה חיישן מגע חיישן נורית לד אדום 4כבלים לחיישנים כבל חיבור למחשב USB סייבר -ספר הדרכה )ספר זה( עיטם רובוטיקה http://www.eytam.com 16לוחמה-קיברנטית :מדריך לתלמיד עיטם רובוטיקה http://www.eytam.com פרק :4תקשורת לבקר הסייבר 17 .4תקשורת לבקר הסייבר פרוטוקול התקשורת לבקר הסייבר התקשורת לבקר מהמחשב האישי מתבצעת באמצעות כבל USBהמחבר בין השניים ,תוך שימוש בערוץ טורי .SerialPort -באמצעות ערוץ זה ,אנו מעבירים לבקר פקודות לביצוע .הפקודות הזמינות הן: • > - lcd <lineNum> <stringהדפסת המחרוזת stringלמסך הבקר בשורה .LineNumהערכים האפשריים ל lineNum -הם ) 0שורה ראשונה( או 1 )שורה שנייה( .למחיקת תוכן שורה יש להדפיס שורת רווחים .הערה :המסך הנו בן שתי שורות ו 8עמודות ,לכן בהדפסת מחרוזת ארוכה מ 8תווים יוצגו רק 8התווים הראשונים. • > - out <channel> <valueכתיבת הערך valueלערוץ channelשל הבקר. הערכים האפשריים הם 0או .1לדוגמא: - out 3 1יכתוב את הערך 1לערוץ .3 • > - inD <channelקריאת קלט דיגיטלי ) 0או (1מערוץ .channelהערכים האפשריים הם 0או .1לדוגמא: - inD 2קריאת קלט דיגיטלי מערוץ .2 • > - inA <channelקריאת ערך אנלוגי מהערוץ הנתון .הערכים האפשריים הם בין 0ל .1023 עיטם רובוטיקה http://www.eytam.com 18לוחמה-קיברנטית :מדריך לתלמיד - InA 4קריאת קלט אנלוגי מערוץ .4 • > - servo <degreeסיבוב מנוע הסרוו שאליו מחוברת המצלמה לזווית הנתונה .הערכים האפשריים הם בין 0ל .180לדוגמא: - servo 180יסובב את המנוע לזווית 180 - servo 0יסובב את המנוע לזווית 0 • > - buzzer <freqהפעלת הזמזם שעל הבקר בתדר freq פקודות נוספות לרכיבים אופציונליים בערכת הסייבר: • > - ultrasonic <channelקריאת ערך מהחיישן האולטרסוני .הערכים האפשריים הם בין 0ל .1023 • > - motor <i> <valueמתן ערך ) valueערכים בין -100ל (100למנוע DC מס) i .ערכים 1או .(2לדוגמא: motor 1 100 motor 2 -50 עיטם רובוטיקה http://www.eytam.com פרק :5תקשורת לבקר הסייבר מJava - 19 .5תקשורת לבקר הסייבר מJava - סביבת העבודה המומלצת ב Java -הינה - Eclipseזוהי תוכנה בקוד פתוח הניתנת להורדה חופשית מאתר האינטרנט .www.eclipse.orgלאחר התקנת התוכנה ,יש ליצור פרוייקט חדש. לצורך עבודה עם הערוץ הטורי ,יש לעשות שימוש בספריה ) RxTxניתן להורידה מהאינטרנט או לעשות שימוש בקבצי התכניות המצורפים לספר זה( .יש לקשר לפרוייקט את הקובץ ,RXTXcomm.jarוכן יש לוודא שבספריה בה מורצת התכנית נמצא קובץ זמן הריצה .rxtxSerial.dll תכנית דוגמאHelloCyber : נתחיל עם תכנית דוגמא בסיסית המדפיסה למסך הבקר את המחרוזת ”!.“hello ;*import java.io. ;*import java.util. ;*import gnu.io. { public class HelloCyber ;static Enumeration portList ;static CommPortIdentifier portId עיטם רובוטיקה http://www.eytam.com מדריך לתלמיד:קיברנטית- לוחמה20 static SerialPort serialPort; static OutputStream outputStream; static boolean openSerial() { String portName = "COM"; System.out.print("Enter Cyber Controller port number:"); Scanner scanner = new Scanner(System.in); int portNum = scanner.nextInt(); portName += portNum; portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getName().equals(portName)) { try { serialPort = (SerialPort) portId.open("HelloCyber", 2000); return true; } catch (Exception e) { e.printStackTrace(); return false; } } } return false; } public static void main(String[] args) { if (openSerial()) { try { outputStream = serialPort.getOutputStream(); serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); serialPort.setDTR(true); System.out.println("Initializing.."); Thread.sleep(2000); System.out.println("Writing to serial port!"); http://www.eytam.com עיטם רובוטיקה Java - תקשורת לבקר הסייבר מ:5 פרק 21 outputStream.write(new String("lcd 0 hello! \n").getBytes()); // done System.out.println("Done!"); System.out.flush(); outputStream.close(); System.exit(0); } catch (Exception e) { e.printStackTrace(); } } } } הרצה :בהרצת התכנית מודפס למסך הבקר hello! הסבר :הסבר התכנית : כוללת את ספרית הערוץ הטוריgnu.io.* - ייבוא ספריות− import java.io.*; import java.util.*; import gnu.io.*; :הגדרות משתנים במחלקה : מחלקת התכנית− public class HelloCyber { http://www.eytam.com עיטם רובוטיקה מדריך לתלמיד:קיברנטית- לוחמה22 :ים-port רשימה של− static Enumeration portList; : מזהה ערוץ טורי− static CommPortIdentifier portId; : עצם ערוץ טורי− static SerialPort serialPort; : הגדרת עצם זרם הפלט של הערוץ הטורי שישמש לכתיבה אליו− static OutputStream outputStream; : המתודה הבאה מבצעת פתיחה ואתחול של הערוץ הטורי− static boolean openSerial() { כאשר,COM<portNo> שמו יהיה תמיד מהצורה- הגדרת שם הערוץ− : של הערוץ הטורי במחשבport הוא מספר הportNo String portName = "COM"; System.out.print("Enter Cyber Controller port number:"); Scanner scanner = new Scanner(System.in); int portNum = scanner.nextInt(); portName += portNum; <= My Computer ע"י הסתכלות בport ניתן למצוא את מספר ה ושם,Ports <= Device Manager <= Hardware <= Properties port - מספר ה- “USB Serial Port" יש לחפש רכיב ששמו הוא .המופיע לצדו הוא המבוקש שבמחשב ומחפשים את זהports - כעת עוברים בלולאה על רשימת ה− :בעל השם שמצאנו לעיל portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); הואportId - ו,getPortIdentifiers() מתקבל ע"י קריאה לportList . הנוכחי בחיפושport המזהה של ה http://www.eytam.com עיטם רובוטיקה פרק :5תקשורת לבקר הסייבר מJava - 23 −אם נמצא ה portהמתאים עפ"י השם, { ))if (portId.getName().equals(portName { try −מבצעים פתיחה של ה ) portשני הפרמטרים אינם חשובים ,נדרשת מחרוזת כלשהי ומספר כלשהו לזיהוי חד ערכי( ע"י קריאה למתודה openשל :portId serialPort = (SerialPort) portId.open("HelloCyber", ;)2000 ;return true { )} catch (Exception e ;)(e.printStackTrace ;return false } } } ;return false } המתודה מחזירה trueאם הפתיחה הצליחה ו falseאחרת. −המתודה הראשית: { )public static void main(String[] args −פתיחת הערוץ הטורי: { ))(if (openSerial { try −כעת יש לקבל את זרם הפלט של הערוץ הטורי ע"י קריאה למתודה )( getOutputStreamשלו: ;)(outputStream = serialPort.getOutputStream −אתחול עצם הערוץ הטורי לקצב המתאים לזה שבבקר )(9600 ופרמטרים נוספים: עיטם רובוטיקה http://www.eytam.com מדריך לתלמיד:קיברנטית- לוחמה24 serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); : אפשור הערוץ הטורי− serialPort.setDTR(true); : שניות לסיום האתחול2 המתנה כ− System.out.println("Initializing.."); Thread.sleep(2000); של זרםwrite() תוך שימוש במתודה, כעת מבוצעת הכתיבה לערוץ− :הפלט שהוגדר על הערוץ outputStream.write(new String("lcd 0 hello! \n").getBytes()); הוספת תו סוף השורה הכרחי מכיוון שבבקר מבוצעת קריאה עד לסוף .השורה : מדפיסים הודעת סיום וסוגרים את זרם הפלט, לאחר שסיימנו− // done System.out.println("Done!"); System.out.flush(); outputStream.close(); System.exit(0); } catch (Exception e) { e.printStackTrace(); } } } } http://www.eytam.com עיטם רובוטיקה פרק :5תקשורת לבקר הסייבר מJava - 25 קריאת קלט מהערוץ הטורי על מנת לקרוא קלט מהערוץ הטורי ,נצטרך לעבוד עם זרם הקלט של הערוץ הטורי ,בדומה לעבודה עם זרם הפלט שלו. ראשית נגדיר במחלקה משתנה מסוג זרם קלט: ;static InputStream inputStream משתנה זה יקבל את זרם הקלט של הערוץ הטורי )לאחר פתיחתו(: ;)(inputStream = serialPort.getInputStream וכעת ,באפשרותנו לקרוא מהערוץ מה שכתב הבקר -נבצע קריאת קלט במתודה נפרדת: { static void readInput() throws InterruptedException, IOException ;)Thread.sleep(1000 ;]byte[] buf = new byte[100 ;int len { )if((len = inputStream.read(buf))>-1 ;)String s = new String(buf, 0, len ;)(s = s.trim ;)System.out.println(s } } כפי שניתן לראות ,המתודה )( readשל זרם הקלט קוראת את הבתים הזמינים בערוץ הטורי ,ואלו מומרים למחרוזת )תוך שימוש ב constructorמתאים של .(Stringרווחים מיותרים מוסרים מהמחרוזת והיא מודפסת לפלט התקני. וכעת ,ניתן לקרוא למתודה הזו לקריאה של מידע שכתב הבקר ,לדוגמא: ;)"System.out.println("Read button - input digital channel 2 עיטם רובוטיקה http://www.eytam.com 26לוחמה-קיברנטית :מדריך לתלמיד ;))(outputStream.write(new String("inD 2").getBytes ;)(outputStream.flush ;)Thread.sleep(1000 ;)(readInput ;)Thread.sleep(3000 בדוגמא זו ניתנת הוראה לבקר הסייבר לקרוא את הערך הדיגיטלי מערוץ ,2 ולאחר המתנה קצרה )על מנת לוודא שהבקר סיים לכתוב( הערך נקרא ע"י קריאה למתודה )( readInputשכתבנו לעיל. תכנית דוגמא כוללת תכנית הדוגמא הבאה מתייחסת למעגל הבא: • • • • חיישן לד מחובר לערוץ 1של הבקר חיישן מגע מחבור לערוץ 2של הבקר חיישן טמפרטורה מחובר לערוץ 3של הבקר מנוע הסרוו של המצלמה מחובר לערוץ "נוסף" של הבקר התכנית מבצעת את ההוראות הבאות )תוך ביצוע המתנה של מספר שניות בין הוראה להוראה(: • • • • • • • ביצוע הוראות הדפסה למסך הדלקת הלד שבערוץ 1 כיבוי הלד שבערוץ 1 קריאת ערך חיישן המגע שבערוץ - 2קריאה דיגיטלית קריאת ערך חיישן הטמפרטורה שבערוץ - 3קריאה אנלוגית סיבוב מנוע הסרוו לזווית 180מעלות סיבוב מנוע הסרוו לזווית 0מעלות קוד התכנית :JavaCyber עיטם רובוטיקה http://www.eytam.com 27 Java - תקשורת לבקר הסייבר מ:5 פרק import gnu.io.CommPortIdentifier; import gnu.io.SerialPort; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import java.util.Scanner; public class JavaCyber { static Enumeration portList; static CommPortIdentifier portId; static SerialPort serialPort; static OutputStream outputStream; static InputStream inputStream; static boolean openSerial() { String portName = "COM"; System.out.print("Enter Cyber Controller port number:"); Scanner scanner = new Scanner(System.in); int portNum = scanner.nextInt(); portName += portNum; portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getName().equals(portName)) { try { serialPort = (SerialPort) portId.open("JavaCyber", 2000); serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); serialPort.setDTR(true); System.out.println("Initializing.."); Thread.sleep(2000); return true; } catch (Exception e) { http://www.eytam.com עיטם רובוטיקה מדריך לתלמיד:קיברנטית- לוחמה28 e.printStackTrace(); return false; } } } return false; } static void readInput() throws InterruptedException, IOException { Thread.sleep(1000); byte[] buf = new byte[100]; int len; if((len = inputStream.read(buf))>-1) { String s = new String(buf, 0, len); s = s.trim(); System.out.println(s); } } public static void main(String[] args) { if (openSerial()) { try { outputStream = serialPort.getOutputStream(); inputStream = serialPort.getInputStream(); System.out.println("LCD screen commands"); outputStream.write(new String("lcd 0 \n").getBytes()); outputStream.write(new String("lcd 1 \n").getBytes()); Thread.sleep(1000); outputStream.write(new String("lcd 0 LCD\n").getBytes()); outputStream.write(new String("lcd 1 Test\n").getBytes()); Thread.sleep(3000); System.out.println("Sending led ON command - led is on channel 1"); outputStream.write(new String("out 1 1").getBytes()); Thread.sleep(3000); http://www.eytam.com עיטם רובוטיקה 29 Java - תקשורת לבקר הסייבר מ:5 פרק System.out.println("Sending led OFF command - led is on channel 1"); outputStream.write(new String("out 1 0").getBytes()); Thread.sleep(3000); System.out.println("Read button - input digital channel 2"); outputStream.write(new String("inD 2").getBytes()); outputStream.flush(); Thread.sleep(1000); readInput(); Thread.sleep(3000); System.out.println("Read temperature - input analog channel 3"); outputStream.write(new String("inA 3").getBytes()); Thread.sleep(1000); readInput(); Thread.sleep(3000); System.out.println("Buzzer test"); outputStream.write(new String("buzzer 1200 ").getBytes()); Thread.sleep(3000); outputStream.write(new String("buzzer 0 ").getBytes()); Thread.sleep(3000); System.out.println("Sending Servo open 180 deg command (pwm)"); outputStream.write(new String("servo 180 ").getBytes()); Thread.sleep(5000); System.out.println("Sending Servo close (0 deg) command (pwm)"); outputStream.write(new String("servo 0 ").getBytes()); Thread.sleep(5000); ////////////////////////////////////////////////////////////////////////////// // Optional components http://www.eytam.com עיטם רובוטיקה מדריך לתלמיד:קיברנטית- לוחמה30 /////////////////////////////////////////////////////////////////////////////// // Ultrasonic Sensor on channel 4 System.out.println("Read ultrasonic - channel 4"); outputStream.write(new String("ultrasonic 4").getBytes()); Thread.sleep(1000); readInput(); Thread.sleep(3000); // DC motors System.out.println("Set Motor values"); outputStream.write(new String("motor 1 100").getBytes()); outputStream.write(new String("motor 2 100").getBytes()); Thread.sleep(3000); outputStream.write(new String("motor 1 -100").getBytes()); outputStream.write(new String("motor 2 -100").getBytes()); Thread.sleep(3000); outputStream.write(new String("motor 1 0").getBytes()); outputStream.write(new String("motor 2 0").getBytes()); // done System.out.println("Done!"); System.out.flush(); outputStream.close(); System.exit(0); } catch (Exception e) { e.printStackTrace(); } } } } http://www.eytam.com עיטם רובוטיקה 31 #C - תקשורת לבקר הסייבר מ:6 פרק תקשורת לבקר.6 C# -הסייבר מ שגירסה חופשית שלה,Microsoft Visual C# הינהC# סביבת העבודה ב לאחר התקנת התוכנה.ניתנת להורדה מאתר האינטרנט של חברת מיקרוסופט כעת יש ליצור פרוייקט מסוג.( )מרחב עבודהSolution יש ליצור,והרצתה .Console Application HelloCyber :תכנית דוגמא .“hello!” נתחיל עם תכנית דוגמא בסיסית המדפיסה למסך הבקר את המחרוזת using System; using System.IO.Ports; namespace HelloCyber { class Program { private static System.IO.Ports.SerialPort serialPort1; static void Main(string[] args) { System.ComponentModel.IContainer components = new System.ComponentModel.Container(); http://www.eytam.com עיטם רובוטיקה מדריך לתלמיד:קיברנטית- לוחמה32 serialPort1 = new System.IO.Ports.SerialPort(components); serialPort1.BaudRate = 9600; Console.WriteLine("Enter Cyber Controller port number:"); String portNum = Console.ReadLine(); serialPort1.PortName = "COM" + portNum; serialPort1.Open(); if (!serialPort1.IsOpen) { Console.WriteLine("Error - couldn't open port, please check port number and run again."); return; } // this turns on serial! serialPort1.DtrEnable = true; Console.WriteLine("Initializing .."); System.Threading.Thread.Sleep(2000); using (serialPort1) { serialPort1.WriteLine("lcd 0 hello! "); } } } } הרצה :בהרצת התכנית מודפס למסך הבקר hello! הסבר :הסבר התכנית http://www.eytam.com עיטם רובוטיקה 33 #C - תקשורת לבקר הסייבר מ:6 פרק בכדיIO.Ports וכן לספריהSystem מבצעים ייבוא לספריה, ראשית− :שנוכל לעשות שימוש בערוץ הטורי using System; using System.IO.Ports; שישמש לתקשורת בערוץ,SerialPort כעת מגדירים עצם מהמחלקה− :הטורי לבקר private static System.IO.Ports.SerialPort serialPort1; : הגדרת הפונקציה הראשית− static void Main(string[] args) { המקבל כפרמטר את רכיביconstructor ע"יSerialPort יצירת עצם ה− :המערכת System.ComponentModel.IContainer components = new System.ComponentModel.Container(); serialPort1 = new System.IO.Ports.SerialPort(components); : בהתאמה לקצב המוגדר בבקר- 9600 קביעת קצב הערוץ הטורי ל− serialPort1.BaudRate = 9600; במחשב אליו מחוברport - כעת התכנית מבקשת להכניס את מספר ה− :הבקר Console.WriteLine("Enter Cyber Controller port number:"); String portNum = Console.ReadLine(); <= My Computer ע"י הסתכלות בport ניתן למצוא את מספר ה ושם,Ports <= Device Manager <= Hardware <= Properties port - מספר ה- “USB Serial Port" יש לחפש רכיב ששמו הוא .המופיע לצדו הוא המבוקש כאשר,COM<portNum> - כport - בשלב הבא בונים את שם ה− : שנמצאport - הוא מספר הportNum serialPort1.PortName = "COM" + portNum; http://www.eytam.com עיטם רובוטיקה מדריך לתלמיד:קיברנטית- לוחמה34 : ובדיקת הצלחהport - פתיחת ה− serialPort1.Open(); if (!serialPort1.IsOpen) { Console.WriteLine("Error - couldn't open port, please check port number and run again."); return; } true צריך להיות בעל ערךSerialPort שבמחלקהDtrEnable השדה− : יהיה פעילport -בכדי שה // this turns on serial! serialPort1.DtrEnable = true; : הדפסת הודעת אתחול− Console.WriteLine("Initializing .."); :port שניות לאתחול ה2 המתנה של כ− System.Threading.Thread.Sleep(2000); serialPort1 אפשר לעשות שימוש בעצםusing בתוך בלוק, כעת− using (serialPort1) { serialPort1.WriteLine("lcd 0 hello! "); } “hello!” את המחרוזתlcd במקרה זה הדפסנו באמצעות הפקודה הוספת שני התווים לאחר המחרוזת נועדה לוודא.לשורה הראשונה ניתן למחוק, לחלופין.שאם היה קודם טקסט על המסך הוא יימחק :את השורה ואז להדפיס את ההודעה כך serialPort1.WriteLine("lcd 0 "); serialPort1.WriteLine("lcd 0 hello!"); http://www.eytam.com עיטם רובוטיקה 35 #C - תקשורת לבקר הסייבר מ:6 פרק קריאת קלט מהערוץ הטורי של המחלקהReadExisting() קריאה מהערוץ הטורי מתבצעת ע"י המתודה ? מתי נדע שיש קלט ממתין בערוץ הטורי, השאלה הנשאלת היא.SerialPort ? כיצד נסנכרן את פעולת הקריאה עם פעולת הכתיבה של הבקר,כלומר על מנת לקרוא: ניתן לקרוא מהערוץ הטורי תוך שימוש במודל האירועיםC# -ב אנו צריכים לטפל באירוע,קלט מהערוץ הטורי לאחר שהבקר כתב אליו התכנית הבאה קוראת את, לדוגמא.SerialPort שבמחלקהDataRecieved של הבקר על ידי הגדרת מתודת תגובה לאירוע2 הערך הדיגיטלי שבערוץ :DataRecieved using System; using System.IO.Ports; namespace SerialEventHandling { class Program { private static System.IO.Ports.SerialPort serialPort1; static void Main(string[] args) { System.ComponentModel.IContainer components = new System.ComponentModel.Container(); serialPort1 = new System.IO.Ports.SerialPort(components); serialPort1.BaudRate = 9600; Console.WriteLine("Enter Cyber Controller port number:"); String portNum = Console.ReadLine(); serialPort1.PortName = "COM" + portNum; serialPort1.Open(); if (!serialPort1.IsOpen) { Console.WriteLine("Error - couldn't open port, please check port number and run again."); http://www.eytam.com עיטם רובוטיקה מדריך לתלמיד:קיברנטית- לוחמה36 return; } // this turns on serial! serialPort1.DtrEnable = true; // callback for text coming back from the arduino serialPort1.DataReceived += OnReceived; Console.WriteLine("Initializing .."); System.Threading.Thread.Sleep(2000); using (serialPort1) { Console.WriteLine("Input digital channel 2"); serialPort1.WriteLine("inD 2"); System.Threading.Thread.Sleep(3000); } } private static void OnReceived(object sender, SerialDataReceivedEventArgs c) { int ch; try { // write out text coming back from the controller Console.Write(serialPort1.ReadExisting()); } catch (Exception exc) { } } } } רק שהפעם הוגדרה, כפי שניתן לראות התכנית דומה לקודמתה− :מתודת תגובה לאירוע קבלת נתונים בערוץ הטורי serialPort1.DataReceived += OnReceived; http://www.eytam.com עיטם רובוטיקה פרק :6תקשורת לבקר הסייבר מ#C - 37 −בתוך בלוק העבודה עם הערוץ הטורי אנו כותבים לבקר הוראה לקריאת ערך דיגיטלי מערוץ :2 )using (serialPort1 { ;)"Console.WriteLine("Input digital channel 2 ;)"serialPort1.WriteLine("inD 2 ;)System.Threading.Thread.Sleep(3000 } ההמתנה לאחר ההוראה חשובה בכדי להמתין לבקר לסיים את הקריאה ולשלוח את המידע בחזרה אלינו. −כעת ,בתוך מתודת התגובה לאירוע אנחנו מבצעים קריאה של הנתונים שכתב הבקר: private static void OnReceived(object sender, )SerialDataReceivedEventArgs c { try { // write out text coming back from the controller ;))(Console.Write(serialPort1.ReadExisting } } { )catch (Exception exc } } הפרמטרים למתודה הם עצם המייצג את השולח )עצם הSerialPort - עצמו( ועצם פרמטרים. פונקציות נוספות שימושיות לקריאה מהערוץ הטורי: • • • • )( - ReadLineקוראת שורה שלמה מהערוץ ,עד לתו שורה חדשה )( - ReadByteקריאת בייט אחד )( -ReadCharקריאת תו אחד ) - Read(byte[] buffer, int offset, int countקריאה מהערוץ של count בתים לתוך החוצץ הנתון ,בהזחה של offset עיטם רובוטיקה http://www.eytam.com 38לוחמה-קיברנטית :מדריך לתלמיד תכנית דוגמא כוללת תכנית הדוגמא הבאה מתייחסת למעגל הבא: • • • • חיישן לד מחובר לערוץ 1של הבקר חיישן מגע מחבור לערוץ 2של הבקר חיישן טמפרטורה מחובר לערוץ 3של הבקר מנוע הסרוו של המצלמה מחובר לערוץ "נוסף" של הבקר התכנית מבצעת את ההוראות הבאות )תוך ביצוע המתנה של מספר שניות בין הוראה להוראה(: • • • • • • • ביצוע הוראות הדפסה למסך הדלקת הלד שבערוץ 1 כיבוי הלד שבערוץ 1 קריאת ערך חיישן המגע שבערוץ - 2קריאה דיגיטלית קריאת ערך חיישן הטמפרטורה שבערוץ - 3קריאה אנלוגית סיבוב מנוע הסרוו לזווית 180מעלות סיבוב מנוע הסרוו לזווית 0מעלות קוד התכנית: ;using System ;using System.IO.Ports namespace CSharpCyber { class Program { ;private static System.IO.Ports.SerialPort serialPort1 { )static void Main(string[] args System.ComponentModel.IContainer components = new ;)(System.ComponentModel.Container ;)serialPort1 = new System.IO.Ports.SerialPort(components ;serialPort1.BaudRate = 9600 עיטם רובוטיקה http://www.eytam.com 39 #C - תקשורת לבקר הסייבר מ:6 פרק Console.WriteLine("Enter Cyber Controller port number:"); String portNum = Console.ReadLine(); serialPort1.PortName = "COM" + portNum; serialPort1.Open(); if (!serialPort1.IsOpen) { Console.WriteLine("Error - couldn't open port, please check port number and run again."); return; } // this turns on serial! serialPort1.DtrEnable = true; // callback for text coming back from the controller serialPort1.DataReceived += OnReceived; Console.WriteLine("Initializing .."); System.Threading.Thread.Sleep(2000); using (serialPort1) { Console.WriteLine("LCD screen commands"); serialPort1.WriteLine("lcd 0 "); // clear line 0 serialPort1.WriteLine("lcd 1 "); // clear line 1 System.Threading.Thread.Sleep(1000); serialPort1.WriteLine("lcd 0 LCD"); serialPort1.WriteLine("lcd 1 Test"); System.Threading.Thread.Sleep(3000); Console.WriteLine("Sending led ON command - led is on channel 1"); serialPort1.WriteLine("out 1 1"); System.Threading.Thread.Sleep(3000); Console.WriteLine("Sending led OFF command - led is on channel 1"); serialPort1.WriteLine("out 1 0"); http://www.eytam.com עיטם רובוטיקה מדריך לתלמיד:קיברנטית- לוחמה40 System.Threading.Thread.Sleep(3000); Console.WriteLine("Read button - input digital channel 2"); serialPort1.WriteLine("inD 2"); System.Threading.Thread.Sleep(3000); Console.WriteLine("Read temperature - input analog channel 3"); serialPort1.WriteLine("inA 2"); System.Threading.Thread.Sleep(3000); Console.WriteLine("Buzzer test"); serialPort1.WriteLine("buzzer 1200"); System.Threading.Thread.Sleep(3000); serialPort1.WriteLine("buzzer 0"); System.Threading.Thread.Sleep(3000); Console.WriteLine("Sending Servo open 180 deg command (pwm)"); serialPort1.WriteLine("servo 180"); System.Threading.Thread.Sleep(5000); Console.WriteLine("Sending Servo close (0 deg) command (pwm)"); serialPort1.WriteLine("servo 0"); System.Threading.Thread.Sleep(5000); ////////////////////////////////////////////////////////////////////////// // Optional components /////////////////////////////////////////////////////////////////////////// // Ultrasonic Sensor on channel 4 Console.WriteLine("Read ultrasonic - channel 4"); serialPort1.WriteLine("ultrasonic 4"); System.Threading.Thread.Sleep(3000); // DC motors Console.WriteLine("Set Motor values"); http://www.eytam.com עיטם רובוטיקה #C - תקשורת לבקר הסייבר מ:6 פרק 41 serialPort1.WriteLine("motor 1 100"); serialPort1.WriteLine("motor 2 100"); System.Threading.Thread.Sleep(3000); serialPort1.WriteLine("motor 1 -100"); serialPort1.WriteLine("motor 2 -100"); System.Threading.Thread.Sleep(3000); serialPort1.WriteLine("motor 1 0"); serialPort1.WriteLine("motor 2 0"); Console.WriteLine("Done"); } } private static void OnReceived(object sender, SerialDataReceivedEventArgs c) { try { // write out text coming back from the controller Console.Write(serialPort1.ReadExisting()); } catch (Exception exc) { } } } } http://www.eytam.com עיטם רובוטיקה 42לוחמה-קיברנטית :מדריך לתלמיד עיטם רובוטיקה http://www.eytam.com פרק :7נספח :תכנות בקר הסייבר 43 .7נספח :תכנות בקר הסייבר סביבת הפיתוח Mambo++ סביבת הפיתוח Mambo++מאפשרת לתכנת את כרטיס הבקר בשפת .C++ סביבת הפיתוח Mambo++בנויה מעל – Arduinoסביבת קוד פתוח למערכות חומרה ותוכנה .הסביבה כוללת מפרט של שפת תכנות ,הוראות חומרה ייעודיות, טיפוסי נתונים ,קבועים ,ספריות וכלים נוספים לתכנות בקרים תואמי .Arduino עיטם רובוטיקה http://www.eytam.com 44לוחמה-קיברנטית :מדריך לתלמיד חלון סביבת הפיתוח: תכנית משתמש נקראת בסביבת הפיתוח .sketchכל sketchצריך לכלול את שתי הפונקציות הבאות: • )( – void setupבפונקציה זו מאתחלים את נתוני היישום • )( – void loopבפונקציה זו מתבצע קטע התכנית באופן איטרטיבי. הפונקציה נקראה על ידי המערכת באופן מחזורי. לאחר כתיבת התכנית ניתן להעלותה לבקר באמצעות בחירה בתפריט ) File/Uploadאו ע"י הקלקה על הסימן Vבסרגל הכלים( .ההעלאה נמשכת מספר שניות ,ובסיום תוצג ההודעה בשורת הסטטוס " ."Done Uploadingאם יש שגיאות בתכנית ,הן תוצגנה בחלון הפלט שלמטה )עם רקע השחור(. עיטם רובוטיקה http://www.eytam.com פרק :7נספח :תכנות בקר הסייבר 45 מבנה בקר הCyber - הבקר כולל: • • • • • • • • • 4ערוצי קלט/פלט 3ערוצי מנועים )שניים למנועי ,DCאחד למנוע סרוו( מסך 2 LCDשורות על 8עמודות כפתור אתחול )אדום( ,כפתור משתמש )שחור( נורית )(led זמזם )(buzzer מחבר USB מחבר סוללה כפתור בורר – USBסוללה את הבקר מתכנתים באמצעות כבל USBהמחובר למחשב בו מותקנת סביבת התוכנה .Mambo++ עיטם רובוטיקה http://www.eytam.com 46לוחמה-קיברנטית :מדריך לתלמיד מפרט הפינים של הבקר: פונקציות חומרה שימושיות: • )> - pinMode(<pin>,<modeקובעת האם הפין המצויין ישמש כקלט או כפלט .דוגמאות: - pinMode(2, INPUT) −פין 2הוא קלט - pinMode(10, OUTPUT) −פין 10הוא פלט עיטם רובוטיקה http://www.eytam.com פרק :7נספח :תכנות בקר הסייבר • • • • 47 )> - digitalRead(<pinקריאת ערך ספרתי מהפין הנתון – 0או 1 )> - digitalWrite(<pin>, <valueכתיבת ערך ספרתי לפין הנתון.0/1 , )> - analogRead(<pinקריאת ערך אנלוגי מפין נתון .הערך הוא בן 10 סיביות ,כלומר בין 0ל .1023 )> - analogWrite(<pin>, <valueכתיבת ערך אנלוגי לפין)(PWM דוגמא :תכנות הבקר תכנית הדוגמא הבאה גורמת להבהוב של הנורית שעל הבקר: { )(void setup ;)pinMode(1, OUTPUT } // set the LED on // wait for a second // set the LED off // wait for a second { )(void loop ;)digitalWrite(1, HIGH ;)delay(1000 ;)digitalWrite(1, LOW ;)delay(1000 } התכנית כוללת שתי פונקציות :C • בפונקצית האתחול )( setupקובעים את הפין עליו ממופה הלד )פין (1להיות פלט. • בפונקצית הלולאה )( loopכותבים לפין פעם את הערך (LOW) 0ופעם את הערך (HIGH) 1 −בין ההוראות מבוצעת המתנה של 1שניה ע"י הפונקציה delay )שהפרמטר שלה הוא במילישניות( .ההמתנה הכרחית בכדי שקצב השינוי של הנורית יהיה מספיק איטי כדי שנוכל להבחין בו. עיטם רובוטיקה http://www.eytam.com 48לוחמה-קיברנטית :מדריך לתלמיד עיטם רובוטיקה http://www.eytam.com