tag:blogger.com,1999:blog-42290286394982691142024-02-19T02:09:16.551-08:00פיתוח תוכנהבלוג למפתחי תוכנה עם טיפים מקצועיים ומאמרים.Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.comBlogger125125tag:blogger.com,1999:blog-4229028639498269114.post-52894258301774457162015-07-26T14:19:00.000-07:002015-07-26T14:22:41.183-07:00Java Native Interface<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjezxxr_avNEREFqh8sHzgdqo3thPg018f4R0P5G1tGJEPRGRip7vGzkEmINc8Ww-6nzwq8PaxM8fuVqzWj7OoOJW6SwtAdZsINWMOU85TKI5NnujW4QtMZDXJkEg9SNegBdBB_xWINEI_c/s1600/untitled.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjezxxr_avNEREFqh8sHzgdqo3thPg018f4R0P5G1tGJEPRGRip7vGzkEmINc8Ww-6nzwq8PaxM8fuVqzWj7OoOJW6SwtAdZsINWMOU85TKI5NnujW4QtMZDXJkEg9SNegBdBB_xWINEI_c/s1600/untitled.bmp" /></a></div>
<br />
רוב האפליקציות ב Android משתמשות בספריות Java תחת ה JVM (ליתר דיוק <a href="https://en.wikipedia.org/wiki/Dalvik_(software)">Dalvik</a>) ללא צרכים מיוחדים אבל בחלק מהמקרים זה לא מספיק ונדרשת התערבות עמוקה יותר, בדומה לאחד המאמרים בו הצגתי את <a href="http://proxytype.blogspot.co.il/2014/05/webview-interfaces.html">JavaScript Interface</a> גם פה מדובר בממשק שהמערכת נותנת שמאפשר לנו להתחבר לעולם ה Native במכשיר ולהפעיל דרכו ספריות בעזרת שפת C.<br />
<br />
<span style="color: red;"><b>שימו לב!</b></span><br />
<br />
<ul style="text-align: right;">
<li>המאמר נכתב על Android Studio 1.0.1</li>
<li>מערכת הפעלה Windows 7 64 Bit</li>
</ul>
<br />
<br />
אם לרגע חשבתם שמעכשיו תכתבו אפליקציות ב C אז כדאי שתעצרו (למרות שזה אפשרי אבל לא חבל..), לא בשביל זה יש את ה NDK אלא עבור מקרים מאוד מיוחדים כמו למשל מוגבלויות ה API של Java או יצירת ממשק עבור חומרה חדשה, יש שימוש רחב ב NDK בתעשיית המשחקים בגלל ממשק ל OpenGL רחב יותר, <br />
<br />
<span style="color: #3d85c6;"><b>דרישות</b></span><br />
<ul style="text-align: right;">
<li>Native Development Kit - NDK</li>
<li>+Java Development Kit - JDK 1.8</li>
<li>+Gradle 2.2</li>
</ul>
<br />
יש להוריד ולפרוס את ה NDK היכן שתרצו (מומלץ לשמור איפה שתיקיית ה SDK), כדאי מאוד לוודא שיש לכם את גרסת Java אחרונה, גרסאות ישנות מידי עלולות לגרום לבעיות שלא נעים להתעסק בהן, לאחר מכן יש להוסיף את הנתיבים לתיקיית ה Java וה NDK למשתנה ה Path הכללי של המערכת שניתן להגיע אליו דרך Environment Variables שנמצא ב Advanced במסך של ה System Properties.<br />
<br />
ניצור פרויקט חדש, נגדיר פונקצית Native שאת המימוש שלה נעשה ב C:<br />
<br />
<div dir="ltr" style="text-align: left;">
public native String getStringFromNative();</div>
<br />
<br />
לאחר מכן נפתח Terminal ב Android Studio ,צריך לוודא שאתם בתיקיית Main של הפרויקט ולהריץ את הפקודה הבא:<br />
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
E:\NDKtest3\app\src\main>javah -d jni -classpath E:\Users\proxytype\AppData\Local\Android\sdk\platforms</div>
<div dir="ltr" style="text-align: left;">
\android-14\android.jar;..\..\build\intermediates\classes\debug legend.proxytype.ndktest3.MainActivity</div>
<br />
הפקודה תיצור תיקייה בפרויקט בשם JNI בתוכה קובץ Header שמכיל את החתימה לפונקציה, ניצור בה 2 קבצים חדשים, הראשון נקרא Application.mk שמכיל את הקוד הבא:<br />
<br />
<div dir="ltr" style="text-align: left;">
APP_ABI := all</div>
<div dir="ltr" style="text-align: left;">
APP_PLATFORM := android-14</div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
השורה הראשונה מגדירה לאיזו ארכיטקטורת מעבד תתואם הספריה החיצונית (ה NDK מגיע עם כל סוגי ה Tool Chain) במקרה של ALL תיווצר ספריה עבור כל ארכטיקטורה, השורה השנייה עבור סוג הפלטפורמה של ה Android.</div>
<br />
הקובץ השני נקרא Android.mk שמכיל את ההגדרות של הספריה בדומה ל <a href="https://en.wikipedia.org/wiki/Makefile">Makefile</a> סטנדרטי:<br />
<br />
<div dir="ltr" style="text-align: left;">
LOCAL_PATH := $(call my-dir)</div>
<div dir="ltr" style="text-align: left;">
include $(CLEAR_VARS)</div>
<div dir="ltr" style="text-align: left;">
LOCAL_MODULE := <b>MyLib</b></div>
<div dir="ltr" style="text-align: left;">
LOCAL_SRC_FILES := <b>main.c</b></div>
<div dir="ltr" style="text-align: left;">
include $(BUILD_SHARED_LIBRARY) </div>
<br />
חשוב לזכור להמשך את 2 הפרמטרים הבאים, הראשון ה LOCAL_MODULE שהוא שם הספריה שנשתמש בו ב Java כפי שנראה בהמשך, ו <span style="text-align: left;">LOCAL_SRC_FILES</span><span style="text-align: left;"> שמצביע לקובץ</span> ה main.c שמכיל את המימוש לפונקציות בקובץ ה Header שנוצר בתחילת התהליך.<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>C</b></span></div>
<br />
התוכנית תכיל פונקציה שתחזיר מחרוזת מספריית ה Native שנכתבה ב C לאפליקציה עצמה שנכתבה ב Java, יש ליצור קובץ main.c ולרשום בו את הקוד הבא:<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//our generated header file</span></div>
<div dir="ltr" style="text-align: left;">
#include "legend_proxytype_ndktest3_MainActivity.h"</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
JNIEXPORT jstring JNICALL </div>
<div dir="ltr" style="text-align: left;">
Java_legend_proxytype_ndktest3_MainActivity_getStringFromNative(JNIEnv * env, jobject obj)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
return (*env)->NewStringUTF(env,"Hello From JNI!");</div>
<div dir="ltr" style="text-align: left;">
}</div>
הקוד מאוד פשוט וניתן לראות את החשיפה של הפונקציה עבור מנגנון ה JNI והאפשרות לקרוא לה מבחוץ, קיים באג ב Android Studio שמחייב ליצור קובץ נוסף ריק על מנת שנוכל לבנות את הספריה.<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>Java</b></span></div>
<div dir="ltr" style="text-align: left;">
<br />
<div dir="rtl" style="text-align: right;">
בשביל להפעיל את הפונקציה יש לטעון את הספריה באפליקציה עם השם שנתנו ב Android.mk, אח"כ נקרא לה ונקבל ממנה מחרוזת:</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
package legend.proxytype.ndktest3;<br />
<br />
import android.app.Activity;<br />
import android.os.Bundle;<br />
import android.widget.TextView;<br />
<br />
public class MainActivity extends Activity {<br />
<br />
<span style="color: lime;"> //loading the library with the name from android.mk</span><br />
static<br />
{<br />
System.loadLibrary("MyLib");<br />
}<br />
<br />
@Override<br />
protected void onCreate(Bundle savedInstanceState) {<br />
super.onCreate(savedInstanceState);<br />
setContentView(R.layout.activity_main);<br />
<br />
TextView lbl_jni = (TextView)findViewById(R.id.lbl_jni);<br />
<span style="color: lime;"> //make the call to function</span><br />
lbl_jni.setText(getStringFromNative());<br />
<br />
}<br />
<br />
public native String getStringFromNative();<br />
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>Gradle</b></span></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
אם חשבתם שסיימנו אז עוד קצת וזה נגמר, יש לערוך את קובץ build.gradle על מנת שיבנה את הספריה באופן אוטומטי בכל בנייה מחדש של האפליקציה, יש לקרוא ל Module עם אותו שם של הספריה, ולהגדיר Task שיקרא ל Shell שיפעיל את ה NDK:<br />
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
import org.apache.tools.ant.taskdefs.condition.Os</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
apply plugin: 'com.android.application'</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
android {</div>
<div dir="ltr" style="text-align: left;">
compileSdkVersion 22</div>
<div dir="ltr" style="text-align: left;">
buildToolsVersion "22.0.1"</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
defaultConfig {</div>
<div dir="ltr" style="text-align: left;">
applicationId "legend.proxytype.ndktest3"</div>
<div dir="ltr" style="text-align: left;">
minSdkVersion 14</div>
<div dir="ltr" style="text-align: left;">
targetSdkVersion 22</div>
<div dir="ltr" style="text-align: left;">
versionCode 1</div>
<div dir="ltr" style="text-align: left;">
versionName "1.0"</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
ndk</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //same as the name in android.mk</span></div>
<div dir="ltr" style="text-align: left;">
moduleName "MyLib"</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
sourceSets.main {</div>
<div dir="ltr" style="text-align: left;">
jniLibs.srcDir 'src/main/libs'</div>
<div dir="ltr" style="text-align: left;">
jni.srcDirs = [] </div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //set task for the compilation of the library</span></div>
<div dir="ltr" style="text-align: left;">
task ndkBuild(type: Exec) {</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//hadling different host machine</span></div>
<div dir="ltr" style="text-align: left;">
if (Os.isFamily(Os.FAMILY_WINDOWS)) {</div>
<div dir="ltr" style="text-align: left;">
commandLine('ndk-build.cmd', '-C' , file('src/main').absolutePath)</div>
<div dir="ltr" style="text-align: left;">
} else {</div>
<div dir="ltr" style="text-align: left;">
commandLine 'ndk-build', '-C', file('src/main').absolutePath</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //the build of the application depend on the success of the JNI</span></div>
<div dir="ltr" style="text-align: left;">
tasks.withType(JavaCompile) {</div>
<div dir="ltr" style="text-align: left;">
compileTask -> compileTask.dependsOn ndkBuild</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
buildTypes {</div>
<div dir="ltr" style="text-align: left;">
release {</div>
<div dir="ltr" style="text-align: left;">
minifyEnabled false</div>
<div dir="ltr" style="text-align: left;">
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
dependencies {</div>
<div dir="ltr" style="text-align: left;">
compile fileTree(dir: 'libs', include: ['*.jar'])</div>
<div dir="ltr" style="text-align: left;">
compile 'com.android.support:appcompat-v7:22.2.0'</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div>
<br /></div>
<div>
דבר אחרון לפני סיום הוא לוודא שתיקיית ה NDK מוגדרת ב Local.Properties של Gradle:</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
ndk.dir=E\:\\Users\\proxytype\\AppData\\Local\\Android\\ndk</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5qbKxxke4tmWvhTEKbzzVAeVj6tskgsclvp5RtZvnzwkmfwt2i2cTpG224fY7EIrd4iN6KhbGYoxeY46CzskwYD91bTHeFGutGbW1d5phcWHnI3CVsD2ijWwTwAjaRyKkvgZ2wJm46VHm/s1600/ndk1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5qbKxxke4tmWvhTEKbzzVAeVj6tskgsclvp5RtZvnzwkmfwt2i2cTpG224fY7EIrd4iN6KhbGYoxeY46CzskwYD91bTHeFGutGbW1d5phcWHnI3CVsD2ijWwTwAjaRyKkvgZ2wJm46VHm/s1600/ndk1.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">מבנה האפליקציה אחרי כל הבלאגן</td></tr>
</tbody></table>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: right;">
<b><span style="color: #3d85c6;">סיכום</span></b></div>
<br />
הכנת סביבה לתמיכה ב NDK זה עסק לא פשוט, למרות שיש דיבורים להפוך אותו לחלק בלתי נפרד בגרסאות הבאות של Android Studio, מי יודע מתי זה יקרה, אבל האפשרויות שהוא נותן שווים את המאמץ ויש דברים שאפשר לעשות רק איתו כפי שנראה עוד בהמשך.<br />
<br />
100% טבעי...</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com1tag:blogger.com,1999:blog-4229028639498269114.post-86317891639158097602015-07-13T15:00:00.001-07:002015-07-13T15:04:48.368-07:00MySql Proxy<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYVTt8kERjSgRbSqeQFtoO7F0nanG-nc99SMEW3hvjPrOfj-2DHLNCpLDsyRXGbXM20c8p82cj3kralPKj8ewff-rzXsbuFx489W8Nts7_rp7_5UKvkIKDRIyfqKb6qPHSpjjZ3JWstaT7/s1600/mysql_logo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYVTt8kERjSgRbSqeQFtoO7F0nanG-nc99SMEW3hvjPrOfj-2DHLNCpLDsyRXGbXM20c8p82cj3kralPKj8ewff-rzXsbuFx489W8Nts7_rp7_5UKvkIKDRIyfqKb6qPHSpjjZ3JWstaT7/s320/mysql_logo.jpg" width="320" /></a></div>
<br />
<br />
מסדי נתונים חשופים להמון סוגים של התקפות וזליגת מידע, דרך לטפל בבעיה היא בעזרת Proxy שיושב בין מי שמבקש ולמסד עצמו ומאפשר לנתח את הבקשות והתשובות לפני שהן חוזרות בחזרה ללקוח, נניח שמשהו הצליח לבצע הזרקה של קוד זדוני שמחזיר את כל כרטיסי האשראי בטבלה, הפרוקסי יכול לתפוס את הבקשה ולהפיל אותה, או לעשות מיסוך על כרטיסי האשראי בצורה שלא יהיה ניתן לעשות איתם שימוש.<br />
<br />
<span style="color: #3d85c6;"><b>דרישות:</b></span><br />
<br />
<ul style="text-align: right;">
<li><a href="https://dev.mysql.com/downloads/mysql/">MySql Server</a></li>
<li><a href="https://dev.mysql.com/downloads/mysql-proxy/">MySql Proxy</a></li>
<li><a href="http://luabinaries.sourceforge.net/download.html">Lua</a></li>
</ul>
<div>
<b><span style="color: red;">שימו לב!</span></b></div>
<div>
<ul style="text-align: right;">
<li>המאמר נכתב על Windows 7 64 Bit</li>
</ul>
<div>
לפני שנתחיל לצלול פנימה יש להוריד את ולפרוס את קבצי MySql Proxy באיזה מקום שתרצו על השרת, לאחר מכן יש להוריד ולהתקין את Lua, שפת סקריפטים מאוד מהירה, היא פופלרית בעיקר ב Embedded ומשחקי מחשב, היה בה שימוש רחב ב World Of Warcraft.</div>
</div>
<div>
<br />
לצורך הדוגמה ניצור טבלה שתכיל מספרי אשראי ונעמיס עליה נתונים,נבצע שאילתה פשוטה:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKwQSCBXj8DdJ4pjjF89_TgskTX6FbRXWw1B-1HNzoMF0irG7lfrwJlEWACo16fYdx3voOO5eGZzm3Vgw2C3Zik_tH_WtWUGGT_VRPYhZJ-32ruw92Yx7GtWqR3ca8-iJpdsrzSMxrv_ZM/s1600/proxy1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKwQSCBXj8DdJ4pjjF89_TgskTX6FbRXWw1B-1HNzoMF0irG7lfrwJlEWACo16fYdx3voOO5eGZzm3Vgw2C3Zik_tH_WtWUGGT_VRPYhZJ-32ruw92Yx7GtWqR3ca8-iJpdsrzSMxrv_ZM/s320/proxy1.png" width="307" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">בקשה ישירה למסד הנתונים</td></tr>
</tbody></table>
<br />
התוצאות מכילות כרטיסי אשראי שניתן לראות אותם בבירור בתשובה שחוזרת, כמובן שהדרך המסורתית היא להצפין את המידע אבל הכלים שה Proxy נותן מאפשרים לך שליטה על כל נקודה מרגע ההתממשקות עד להחזרת התוצאות ללקוח כפי שנראה בהמשך.<br />
<br />
<div dir="ltr" style="text-align: left;">
<b><span style="color: #3d85c6;">Proxy</span></b></div>
<br />
פעולת ה Proxy היא ברורה מאוד וכבר הספקתי לכתוב עליה <a href="http://proxytype.blogspot.co.il/2013/02/proxy-server-guide.html">בעבר</a>, אבל במבט מהיר אפשר לראות שהמשתמשים לא באמת מגיעים למסד נתונים אלא לתחנת בניים שתחליט מה לעשות עם הבקשה והתשובה שחוזרת, בשונה מ Proxy "רגיל" שמעביר דרכו בקשות ומשנה אותם באופן בסיסי, ה MySql Proxy מאפשר לנתח את <a href="https://dev.mysql.com/doc/internals/en/client-server-protocol.html">הפרוטוקול</a> ולשנות אותו באופן פשוט למדי.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2GccihsqsfCtpSJrsSesMRWoOyNEUbMhcCvSalNaqDAcSgQ5EiLF1WdHbxgXwrY5i2EEponnGUPZOwzCjRDST8MdUpuk-nmw-rxM_T5gVG9yD07VVsVbwxPj8a9PDt1dj05AOYB56RXMg/s1600/proxy2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2GccihsqsfCtpSJrsSesMRWoOyNEUbMhcCvSalNaqDAcSgQ5EiLF1WdHbxgXwrY5i2EEponnGUPZOwzCjRDST8MdUpuk-nmw-rxM_T5gVG9yD07VVsVbwxPj8a9PDt1dj05AOYB56RXMg/s1600/proxy2.png" /></a></div>
<br />
על מנת להפעיל את ה Proxy יש לכתוב את הפקודה הבאה:<br />
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
C:\mySqlProxy\bin>mysql-proxy.exe --proxy-backend-addresses=127.0.0.1:3306 --proxy-address=127.0.0.1:4040 --proxy-lua-script=all-hooks.lua</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: right;">
הפקודה מחברת את שרת ה Proxy למסד הנתונים ובנוסף מוסיפים קריאה לקובץ סקריפט של Lua, מאותו רגע כל בקשה שתגיע לפורט 4040 תפעיל מספר פונקציות ונוכל לדוג אותן, לדוגמה ברגע שיבצעו שיאלתא, הפונקציה <span style="text-align: left;">read_query תרוץ ונוכל להחליט אם להעביר את השאילתא או לא ובמקרה של תשובה מהשרת הפונקציה </span><span style="text-align: left;">read_query_result</span><span style="text-align: left;"> תרוץ ובה נוכל לשנות את המידע שחוזר.</span></div>
<div style="text-align: right;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>Hooks</b></span></div>
<br />
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">-- all-hooks.lua</span></div>
<div dir="ltr" style="text-align: left;">
local access_ndx = 0</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">-- fired when client connect to server</span></div>
<div dir="ltr" style="text-align: left;">
function connect_server()</div>
<div dir="ltr" style="text-align: left;">
print_access ('inside connect_server')</div>
<div dir="ltr" style="text-align: left;">
end</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">-- fired when starting the handshake</span></div>
<div dir="ltr" style="text-align: left;">
function read_handshake( auth )</div>
<div dir="ltr" style="text-align: left;">
print_access ('inside read_handshake' )</div>
<div dir="ltr" style="text-align: left;">
end</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">-- fired when starting the authentication</span></div>
<div dir="ltr" style="text-align: left;">
function read_auth( auth )</div>
<div dir="ltr" style="text-align: left;">
print_access ('inside read_auth ')</div>
<div dir="ltr" style="text-align: left;">
end</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">--fired when authentication finished</span></div>
<div dir="ltr" style="text-align: left;">
function read_auth_result( auth )</div>
<div dir="ltr" style="text-align: left;">
print_access ('inside read_auth_result')</div>
<div dir="ltr" style="text-align: left;">
end</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">--fired when client disconnected</span></div>
<div dir="ltr" style="text-align: left;">
function disconnect_client()</div>
<div dir="ltr" style="text-align: left;">
print_access('inside disconnect_client')</div>
<div dir="ltr" style="text-align: left;">
end</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">--fired when query requested</span></div>
<div dir="ltr" style="text-align: left;">
function read_query (packet)</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span>proxy.queries:append(1, packet,{ resultset_is_needed = true })</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return proxy.PROXY_SEND_QUERY</div>
<div dir="ltr" style="text-align: left;">
end</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">--fired when query result</span></div>
<div dir="ltr" style="text-align: left;">
function read_query_result (inj)</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">--create result set containes columns and rows</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>proxy.response.resultset = {fields = {}, rows = {}}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">--checking if the query holding creditcard table name</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if(string.match(inj.query,"creditcard")) then</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>for n = 1, #inj.resultset.fields do</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">-- insert column to table</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>table.insert(proxy.response.resultset.fields, {type</div>
<div dir="ltr" style="text-align: left;">
=inj.resultset.fields[n].type,name = inj.resultset.fields[n].name})</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>end</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>for row in inj.resultset.rows do</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if(row ~= nil) then</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> for i,v in pairs(row) do</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">--looking for creditcard pattern</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if string.match(v,'%d%d%d%d%-%d%d%d%d%</div>
<div dir="ltr" style="text-align: left;">
-%d%d%d%d%-%d%d%d%d') then</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>print_access("found visa - column position: " .. i </div>
<div dir="ltr" style="text-align: left;">
.. " column value: " .. v)</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>row[i] = "mask credit card"</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>end</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> end</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>table.insert(proxy.response.resultset.rows, row)</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>end</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>end</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">--overwrite results</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>proxy.response.type = proxy.MYSQLD_PACKET_OK</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return proxy.PROXY_SEND_RESULT</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>end</div>
<div dir="ltr" style="text-align: left;">
end<br />
<br />
<span style="color: lime;">-- simple print message</span><br />
function print_access(msg)<br />
access_ndx = access_ndx + 1<br />
print( string.format('%3d %-30s',access_ndx,msg))<br />
end</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
<br />
מייצרים טבלה ריקה, עוברים על הטבלה שחזרה מהמסד נתונים ושופכים אותה לטבלה שיצרנו, לפני שמכניסים שורה חדשה מחפשים אם יש ערך שתואם למבנה כרטיס אשראי ודורסים אותו.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCaGTJJHTTygtl9_OvhO-hTrJqf-oFWLoOIEN1PVCo_-zs0ndoyo1ZQAREDldAut_w84bVDeZ8AFKDWmQA_TwegpQRphfTTlsqAAXpMrcUUZJUxT0BH1r0dcr7x_xZd0Un_HvbmKxsxCb-/s1600/proxy3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCaGTJJHTTygtl9_OvhO-hTrJqf-oFWLoOIEN1PVCo_-zs0ndoyo1ZQAREDldAut_w84bVDeZ8AFKDWmQA_TwegpQRphfTTlsqAAXpMrcUUZJUxT0BH1r0dcr7x_xZd0Un_HvbmKxsxCb-/s1600/proxy3.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">התוצאות שחוזרות מה Proxy</td></tr>
</tbody></table>
<br />
<br />
<b><span style="color: #3d85c6;">סיכום</span></b><br />
<br />
ראינו רק דרך פעולה אחת עם ה Proxy ש MySql אבל אפשר להשתמש בו בתחומים נוספים כמו ניהול עומסים, שרידות ובקרה, בעזרתו ניתן להגדיל את הזמינות ואמינות המידע ולהדק את חגורת האבטחה סביב המידע שרגיש לכולנו.<br />
<br />
לא תשתמש בו?<br />
<br /></div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-55142427634070073732015-03-07T10:32:00.000-08:002015-03-07T11:50:31.989-08:00Android Music Player<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjezxxr_avNEREFqh8sHzgdqo3thPg018f4R0P5G1tGJEPRGRip7vGzkEmINc8Ww-6nzwq8PaxM8fuVqzWj7OoOJW6SwtAdZsINWMOU85TKI5NnujW4QtMZDXJkEg9SNegBdBB_xWINEI_c/s1600/untitled.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjezxxr_avNEREFqh8sHzgdqo3thPg018f4R0P5G1tGJEPRGRip7vGzkEmINc8Ww-6nzwq8PaxM8fuVqzWj7OoOJW6SwtAdZsINWMOU85TKI5NnujW4QtMZDXJkEg9SNegBdBB_xWINEI_c/s1600/untitled.bmp" /></a></div>
<br />
<br />
אחרי חופשה של מספר חודשים אפשר להתחיל את השנה החדשה עם מאמר שבו אלמד כיצד לבנות נגן MP3 בסביבת Android, הרעיון מאוד פשוט, האפליקציה תסרוק את המכשיר עבור קבצי מוזיקה ותנגן אותם אחד אחרי השני עם פונקציות שליטה בסיסיות.<br />
<br />
<b><span style="color: red;">שימו לב!</span></b><br />
<br />
<ul style="text-align: right;">
<li>המחלקה נכתבה על Android Studio.</li>
<li>המחלקה תואמת ל Api 14.</li>
</ul>
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>Music Search</b></span></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: right;">
נקודת ההתחלה עבור האפליקציה היא קודם כל לחפש את כל קבצי המוזיקה שעל המכשיר אבל לפני שנתחיל נגדיר מחלקה פשוטה שתאחסן בשבילנו את הנתונים:</div>
<div style="text-align: right;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<div dir="ltr">
private class SongDetails {</div>
<div dir="ltr">
String songTitle = "";</div>
<div dir="ltr">
String songArtist = "";</div>
<div dir="ltr">
<span style="color: lime;"> //song location on the device</span></div>
<div dir="ltr">
String songData = "";</div>
<div dir="ltr">
}</div>
<div dir="ltr">
<br /></div>
</div>
<div style="text-align: right;">
לאחר מכן נפעיל את הפונקציה שתתחבר למסד הנתונים במכשיר ותבקש את כל הקבצי מדיה שמוגדרים כמוזיקה (מתעלמים לחלוטין מוידאו), התוצאה תהיה טבלה שתכיל עמודות לפי מה שביקשנו בשאילתא:</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
private void getAllSongs()</div>
<div dir="ltr" style="text-align: left;">
<div dir="ltr">
{</div>
<div dir="ltr">
<span style="color: lime;">//creating selection for the database</span></div>
<div dir="ltr">
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";</div>
<div dir="ltr">
final String[] projection = new String[] {</div>
<div dir="ltr">
MediaStore.Audio.Media.DISPLAY_NAME,</div>
<div dir="ltr">
MediaStore.Audio.Media.ARTIST,</div>
<div dir="ltr">
MediaStore.Audio.Media.DATA};</div>
<div dir="ltr">
</div>
<div dir="ltr">
<span style="color: lime;"> //creating sort by for database</span></div>
<div dir="ltr">
final String sortOrder = MediaStore.Audio.AudioColumns.TITLE</div>
<div dir="ltr">
+ " COLLATE LOCALIZED ASC";</div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
<span style="color: lime;">//stating pointer</span></div>
<div dir="ltr">
Cursor cursor = null;</div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
try {</div>
<div dir="ltr">
<span style="color: lime;"> //the table for query</span></div>
<div dir="ltr">
Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;</div>
<div dir="ltr">
<span style="color: lime;"> // query the db</span></div>
<div dir="ltr">
cursor = getBaseContext().getContentResolver().query(uri,</div>
<div dir="ltr">
projection, selection, null, sortOrder);</div>
<div dir="ltr">
if (cursor != null) {</div>
<div dir="ltr">
</div>
<div dir="ltr">
<span style="color: lime;"> //create array for incoming songs</span></div>
<div dir="ltr">
songs = new ArrayList<SongDetails>(cursor.getCount());</div>
<div dir="ltr">
</div>
<div dir="ltr">
<span style="color: lime;"> //go to the first row</span></div>
<div dir="ltr">
cursor.moveToFirst();</div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
SongDetails details;</div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
while (!cursor.isAfterLast()) {</div>
<div dir="ltr">
<span style="color: lime;"> //collecting song information and store in array,</span></div>
<div dir="ltr">
<span style="color: lime;"> //moving to the next row</span></div>
<div dir="ltr">
details = new SongDetails();</div>
<div dir="ltr">
details.songTitle = cursor.getString(0);</div>
<div dir="ltr">
details.songArtist = cursor.getString(1);</div>
<div dir="ltr">
details.songData = cursor.getString(2);</div>
<div dir="ltr">
songs.add(details);</div>
<div dir="ltr">
cursor.moveToNext();</div>
<div dir="ltr">
</div>
<div dir="ltr">
}</div>
<div dir="ltr">
}</div>
<div dir="ltr">
} catch (Exception ex) {</div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
} finally {</div>
<div dir="ltr">
if (cursor != null) {</div>
<div dir="ltr">
cursor.close();</div>
<div dir="ltr">
}</div>
<div dir="ltr">
}</div>
<div dir="ltr">
}</div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
<b><span style="color: #3d85c6;">Simple Player</span></b></div>
<div dir="ltr">
<br /></div>
<div dir="rtl" style="text-align: right;">
עד עכשיו היה החלק הטכני שבו אנחנו מקבלים את חומרי הגלם ועכשיו אפשר להתחיל לעבוד איתם בעזרת מחלקה מאוד פשוטה שעושה פעולות (Stop, Play, Pause, Forward, Backward, Seek) כמו כל נגן סטנדרטי , על מנת לעדכן את ה Gui נעזר ב Interface משותף כפי שניתן לראות בדוגמה:</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div style="text-align: left;">
<div>
public interface OnPlayerEventListener {</div>
<div>
void onPlayerComplete();</div>
<div>
void onPlayerStart(String Title,int songDuration,int songPosition);</div>
<div>
}</div>
</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
המחלקה מקבלת את המופע של ה Activity שמפעיל אותה, מאתחלים אותה עם רשימת השרים ששלפנו מה Database ומחכים לפקודות מה Gui.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div style="text-align: left;">
<div>
public class simplePlayer</div>
<div>
{</div>
<div>
OnPlayerEventListener mListener;</div>
<div>
Activity mActivity;</div>
<div>
<br /></div>
<div>
<span style="color: lime;">//give access to the gui</span></div>
<div>
public ArrayList<songDetails> songs = null;</div>
<div>
public boolean isPaused = false;</div>
<div>
public int currentPosition = 0;</div>
<div>
public int currentDuration = 0;</div>
<div>
<br /></div>
<div>
<span style="color: lime;"> //single instance</span></div>
<div>
public static MediaPlayer player;</div>
<div>
<br /></div>
<div>
<span style="color: lime;"> //getting gui player interface</span></div>
<div>
public simplePlayer(Activity ma)</div>
<div>
{</div>
<div>
mActivity = ma;</div>
<div>
mListener = (OnPlayerEventListener) mActivity;</div>
<div>
}</div>
<div>
<br /></div>
<div>
<span style="color: lime;">//initialize the player</span></div>
<div>
public void init(ArrayList<songDetails>_songs)</div>
<div>
{</div>
<div>
songs = _songs;</div>
<div>
currentPosition = 0;</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
if(player == null)</div>
<div>
{</div>
<div>
player = new MediaPlayer();</div>
<div>
player.setAudioStreamType(AudioManager.STREAM_MUSIC);</div>
<div>
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {</div>
<div>
@Override</div>
<div>
public void onCompletion(MediaPlayer mp) {</div>
<div>
<br /></div>
<div>
player.stop();</div>
<div>
player.reset();</div>
<div>
<br /></div>
<div>
nextSong();</div>
<div>
mListener.onPlayerSongComplete();</div>
<div>
<br /></div>
<div>
}</div>
<div>
});</div>
<div>
}</div>
<div>
}</div>
<div>
<br /></div>
<div>
<span style="color: lime;"> //stop the current song</span></div>
<div>
public void stop()</div>
<div>
{</div>
<div>
if(player != null)</div>
<div>
{</div>
<div>
if(player.isPlaying())</div>
<div>
<span style="color: lime;"> //stop music</span></div>
<div>
player.stop();</div>
<div>
<br /></div>
<div>
<span style="color: lime;"> //reset pointer</span></div>
<div>
player.reset();</div>
<div>
}</div>
<div>
}</div>
<div>
<br /></div>
<div>
<span style="color: lime;">//pause the current song</span></div>
<div>
public void pause()</div>
<div>
{</div>
<div>
if(!isPaused && player != null)</div>
<div>
{</div>
<div>
player.pause();</div>
<div>
isPaused = true;</div>
<div>
}</div>
<div>
}</div>
<div>
<br /></div>
<div>
<span style="color: lime;"> //playing the current song</span></div>
<div>
public void play()</div>
<div>
{</div>
<div>
if(player != null)</div>
<div>
{</div>
<div>
if(!isPaused && !player.isPlaying())</div>
<div>
{</div>
<div>
if(songs != null)</div>
<div>
{</div>
<div>
if(songs.size() > 0)</div>
<div>
{</div>
<div>
try {</div>
<div>
//getting file path from data</div>
<div>
Uri u = Uri.fromFile(new File(songs.get(currentPosition).songData));</div>
<div>
<br /></div>
<div>
<span style="color: lime;"> //set player file</span></div>
<div>
player.setDataSource(mActivity,u);</div>
<div>
<span style="color: lime;">//loading the file</span></div>
<div>
player.prepare();</div>
<div>
<span style="color: lime;">//getting song total time in milliseconds</span></div>
<div>
currentDuration = player.getDuration();</div>
<div>
</div>
<div>
<span style="color: lime;">//start playing music!</span></div>
<div>
player.start();</div>
<div>
mListener.onPlayerSongStart("Now Playing: "</div>
<div>
+ songs.get(currentPosition).songArtist</div>
<div>
+ " - "+ songs.get(currentPosition).songTitle</div>
<div>
,currentDuration,currentPosition);</div>
<div>
}</div>
<div>
catch (Exception ex)</div>
<div>
{</div>
<div>
ex.printStackTrace();</div>
<div>
}</div>
<div>
}</div>
<div>
}</div>
<div>
else</div>
<div>
{</div>
<div>
//continue playing, reset the flag</div>
<div>
player.start();</div>
<div>
isPaused = false;</div>
<div>
}</div>
<div>
}</div>
<div>
}</div>
<div>
}</div>
<div>
<br /></div>
<div>
<span style="color: lime;">//playing the next song in the array</span></div>
<div>
public void nextSong()</div>
<div>
{</div>
<div>
if(player != null)</div>
<div>
{</div>
<div>
if(isPaused)</div>
<div>
isPaused = false;</div>
<div>
<br /></div>
<div>
if(player.isPlaying())</div>
<div>
player.stop();</div>
<div>
<br /></div>
<div>
player.reset();</div>
<div>
<br /></div>
<div>
if((currentPosition + 1) == songs.size())</div>
<div>
currentPosition = 0;</div>
<div>
else</div>
<div>
currentPosition = currentPosition + 1;</div>
<div>
<br /></div>
<div>
play();</div>
<div>
}</div>
<div>
}</div>
<div>
<br /></div>
<div>
<span style="color: lime;">//playing the previous song in the array</span></div>
<div>
public void previousSong()</div>
<div>
{</div>
<div>
if(player != null)</div>
<div>
{</div>
<div>
if(isPaused)</div>
<div>
isPaused = false;</div>
<div>
<br /></div>
<div>
if(player.isPlaying())</div>
<div>
player.stop();</div>
<div>
<br /></div>
<div>
player.reset();</div>
<div>
<br /></div>
<div>
if(currentPosition - 1 < 0)</div>
<div>
currentPosition = songs.size();</div>
<div>
else</div>
<div>
currentPosition = currentPosition -1;</div>
<div>
<br /></div>
<div>
play();</div>
<div>
}</div>
<div>
}</div>
<div>
<br /></div>
<div>
<span style="color: lime;"> //getting new position for playing by the gui seek bar</span></div>
<div>
public void setSeekPosition(int msec)</div>
<div>
{</div>
<div>
if(player != null)</div>
<div>
player.seekTo(msec);</div>
<div>
}</div>
<div>
<br /></div>
<div>
<span style="color: lime;"> //getting the current duration of music</span></div>
<div>
public int getSeekPosition()</div>
<div>
{</div>
<div>
if(player != null)</div>
<div>
return player.getDuration();</div>
<div>
else</div>
<div>
return -1;</div>
<div>
}</div>
<div>
}</div>
<div>
<br /></div>
<div dir="rtl" style="text-align: right;">
ה Activity ממש את ה Interface, ומחפש שירים על המכשיר ומכניס אותם למערך שנשלח למחלקה, ניתן ליצור כפתורים ולשלוט במחלקה בעזרת Gui:</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div style="text-align: left;">
<div>
public class MainActivity extends ActionBarActivity </div>
<div>
implements OnPlayerEventListener {</div>
<div>
<br /></div>
<div>
simplePlayer player;</div>
<div>
<br /></div>
<div>
@Override</div>
<div>
protected void onCreate(Bundle savedInstanceState) {</div>
<div>
super.onCreate(savedInstanceState);</div>
<div>
setContentView(R.layout.activity_main);</div>
<div>
<br /></div>
<div>
<span style="color: lime;">//getting all songs in the device</span></div>
<div>
getAllSongs();</div>
<div>
<br /></div>
<div>
if (player == null) {</div>
<div>
<span style="color: lime;"> //create new instance and send the listener</span></div>
<div>
player = new simplePlayer(this);</div>
<div>
<span style="color: lime;">//initialize the simplePlayer</span></div>
<div>
player.init(songs);</div>
<div>
<span style="color: lime;"> //start playing the first song</span></div>
<div>
player.play();</div>
<div>
<br /></div>
<div>
seekBar.setMax(player.currentDuration);</div>
<div>
}</div>
<div>
}</div>
<div>
<br /></div>
<div>
@Override</div>
<div>
public void onPlayerSongComplete() {</div>
<div>
<br /></div>
<div>
}</div>
<div>
<br /></div>
<div>
@Override</div>
<div>
public void onPlayerSongStart(String Title, int songDuration, int songPosition) {</div>
<div>
this.setTitle(Title);</div>
<div>
seekBar.setMax(songDuration);</div>
<div>
seekBar.setProgress(0);</div>
<div>
}</div>
<div>
}</div>
<div>
<br /></div>
<div dir="rtl" style="text-align: right;">
<b><span style="color: #3d85c6;">סיכום:</span></b></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
דרך פשוטה מאוד שבעזרת ניתן לנגן מוזיקה במכשיר וזה רק חלק קטן מכלי המדיה המגוונים ש Android נותן, על הדרך ראינו כיצד לממש ממשק בין ה GUI למחלקה שיגרום לאירוע כאשר שיר נגמר ומתחיל.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
אל תפריעו לשכנים...</div>
</div>
</div>
</div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-61072671370422587022014-12-20T11:34:00.000-08:002014-12-20T11:36:47.320-08:00Teensy 3.1 - Comparison<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYmbL9pRlsiiA0fzu3N-O5j6dR5Sf388rL8in-muLPzNRm3BVByjh0s6piJMOYvk_WyHfoTWNEYqVj7bXjya9tJ1zMn6TBVR5z6N9NZWIKxvP1NAFjHL0eyi1kyhil5ded6MAs_QF3A8EZ/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYmbL9pRlsiiA0fzu3N-O5j6dR5Sf388rL8in-muLPzNRm3BVByjh0s6piJMOYvk_WyHfoTWNEYqVj7bXjya9tJ1zMn6TBVR5z6N9NZWIKxvP1NAFjHL0eyi1kyhil5ded6MAs_QF3A8EZ/s1600/3.png" height="84" width="320" /></a></div>
<br />
<br />
<br />
אחת המגבלות ב Arduino היא המעבד שלו, הוא איטי ויחסית פרימטיבי אבל זול ועונה על חלק מהצרכים אבל כאשר רוצים משהו מתוחכם יותר ניתן להשתמש בגרסת Arduino Due המסיבית עם מעבד 84 Mhz או בגרסת ה YUN עם מעבד 400MHZ ומערכת הפעלה מורכבת שלפעמים זה יותר מידי, בסה"כ רצית שהיה קטן ומהיר יותר מאשר ה 16 MHZ הקלאסי שבגרסת ה Nano.<br />
<br />
<div dir="ltr" style="text-align: left;">
<b><span style="color: #3d85c6;">Teensy 3.1</span></b></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
נחלצת לעזרתנו חברה יחסית אנונימית שלא עושה יותר מידי רעש, לחברה קוראים <a href="https://www.pjrc.com/teensy/teensy31.html">PJRC</a> ויש לה סדרת לוחות תואמי Arduino, הדגם האחרון בסדרה מבוסס על מעבד Arm Cortex M-4 שיכול להגיע למהירות של 96 MHZ ועם כל מיני תוספות:</div>
<div dir="ltr" style="text-align: left;">
</div>
<ul dir="ltr" style="text-align: left;">
<li>CPU: Cortex M-4 72/(o.c)96 Mhz </li>
<li>Flash Memory:256KB</li>
<li>RAM: 64 kb</li>
<li>Memory Access Chanel:16</li>
<li>Digital I/O: 34, 3.3v,5V Tolerant</li>
<li>Analog Inputs: 21</li>
<li>Interfaces: USB x 1, SPI x 1, CAN x 1,UART x 3,I2S x 2</li>
</ul>
<div dir="ltr" style="text-align: left;">
</div>
<div dir="ltr" style="text-align: left;">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMAkQjT7SxCNe0pvUiWa-BnFr1bvin5KaVUkoYqDRfk4LhukFb3i9DiTPJKFjyI9X8wgBLRtP7lYr1mSaTidchDhBtRkap7y4O5qlUFOCxnja_DkQsraFV_BISpT3fOQQ7gxajd4KiUj5e/s1600/teensy31_front_pinout.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMAkQjT7SxCNe0pvUiWa-BnFr1bvin5KaVUkoYqDRfk4LhukFb3i9DiTPJKFjyI9X8wgBLRtP7lYr1mSaTidchDhBtRkap7y4O5qlUFOCxnja_DkQsraFV_BISpT3fOQQ7gxajd4KiUj5e/s1600/teensy31_front_pinout.png" height="320" width="275" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">https://www.pjrc.com/teensy/teensy31.html</td></tr>
</tbody></table>
<br />
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: right;">
כל העסק קטן יותר מ Arduino Nano, וגם מחיר לא רע של 20 דולר ליחידה שאפשר לרכוש ב <a href="https://www.sparkfun.com/categories/267">SparkFun</a>, בנוסף הוא יכול לחקות התקני HID כמו עכבר ומקלדת, חשוב להוריד את התוסף של הלוח לסביבת Arduino <a href="https://www.pjrc.com/teensy/teensyduino.html">מאתר היצרן</a>.<br />
<br />
<b><span style="color: red;">שימו לב!</span></b><br />
<ul>
<li>התוסף ירוץ רק על הגרסה 1.0.5 של ה Arduino IDE.</li>
<li>אין לחבר מתח מעל 5.5v.</li>
</ul>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghG9jlBGhly6GRC0y1y2Gde8CEeMi4gCnyhi_kIYp0lOwV1G42GiNx1CVJKcdjAtWQdzqRbLt47KjnahTFl2U4DbHnJIJZtNSFbZHfXfDFL3fr4dOrAu1ZJPdK0OrigN_EZFDmpK9iW8Jz/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghG9jlBGhly6GRC0y1y2Gde8CEeMi4gCnyhi_kIYp0lOwV1G42GiNx1CVJKcdjAtWQdzqRbLt47KjnahTFl2U4DbHnJIJZtNSFbZHfXfDFL3fr4dOrAu1ZJPdK0OrigN_EZFDmpK9iW8Jz/s1600/2.png" height="320" width="310" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">הגודל כן קובע</td></tr>
</tbody></table>
<br />
<br />
הלוח תומך בספריות הרגילות של Arduino ככה שלא צריך להסתבך יותר מידי, לצורך ההשוואה אני הולך לחבר מסך TFT בדומה <a href="http://proxytype.blogspot.co.il/2014/09/arduino-and-tft-screen.html">למאמר האחרון</a>, ולהדגים את הבדלי הביצועים בניהם, נשתמש בספריית UTFT ונפתח את הדוגמה עבור המסך UTFT_Demo_320x240_Serial תחת הספרייה Arduino (ARM) + Teensy.<br />
<br />
<div dir="ltr" style="text-align: left;">
<b><span style="color: #3d85c6;">Teeny 3.1 Pinouts</span></b></div>
<div>
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//11-> SDI</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//13 ->SCK</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//10 -> CS</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//8 -> RST</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//9 ->DC</span></div>
<div dir="ltr" style="text-align: left;">
UTFT myGLCD(TFT01_22SP,11,13,10,8,9);<br />
<br /></div>
</div>
<div align="center">
<iframe allowfullscreen="" frameborder="0" height="360" src="//www.youtube.com/embed/rSf6aCVPcF8" width="500"></iframe><br /></div>
<br />
<div>
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>Results</b></span></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<b>Arduino Nano 16 Mhz full animation</b></div>
<div dir="ltr" style="text-align: left;">
2.39 min</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<b>Teensy 3.1 96 Mhz full animation</b></div>
<div dir="ltr" style="text-align: left;">
37 sec</div>
<br />
<span style="color: #3d85c6;"><b>סיכום</b></span><br />
<br />
לוח קטן, זול ואלטרנטיבה נוחה ל Arduino למי שצריך מהירות מבלי לשנות את הקוד או את סביבת העבודה, אומנם מדובר בלוח יחסית אנונימי ביחס ל Arduino אבל אם מחפשים טוב אפשר למצוא מוצרים שמבוססים עליו כמו <a href="http://mechanicalkeyboards.com/shop/index.php?l=product_detail&p=536">Phantom Keyboard Kit</a> ועוד המון <a href="https://www.pjrc.com/teensy/projects.html">פרוייקטים נוספים</a>.</div>
<div>
<br />
<br />
Arduino Killer?</div>
</div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-66779244970377667692014-11-01T02:33:00.000-07:002014-11-01T02:39:15.564-07:00Deep Packet Inspection With C<div dir="rtl" style="text-align: right;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA3JeALLUr6O1qQwJ2LjJEDZF3dcRUVksuTD5BJJ11sHyXGQu8fdjssmmS7sJNVgM87zIg1R1otLTYs4N_6W2uJswUsKNXhjzgavq-PAqgrm9ZbU9zzbkwGNbI_b8II2wgifYchiR-lcVA/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA3JeALLUr6O1qQwJ2LjJEDZF3dcRUVksuTD5BJJ11sHyXGQu8fdjssmmS7sJNVgM87zIg1R1otLTYs4N_6W2uJswUsKNXhjzgavq-PAqgrm9ZbU9zzbkwGNbI_b8II2wgifYchiR-lcVA/s1600/1.png" /></a></div>
<br />
מערכות FireWall בדר"כ בוחנות את החבילות שעוברות דרכן רק על ידי אימות של כתובות ופורטים מול רשימת חוקים, אבל עם הזמן הבינו שזה לא מספיק טוב ויש לנתח את המידע עצמו שעובר בחבילה על מנת לזהות התקפות שמשפיעות על השירות עצמו, נדרשה חשיבה חדשה ועם הזמן צצו מערכות IDS \ IPS שבעזרתם ניתן לבצע בדיקות שמבוססות על תבניות ולחפש קוד זדוני בתוך החבילה, פרוייקט מאוד מפורסם ונמצא בשימוש רחב במערכות כאלו נקרא <a href="https://www.snort.org/">Snort</a> שמכיל המון תבניות להתקפות מוכרות.<br />
<br />
<b><span style="color: red;">שימו לב!</span></b><br />
<ul style="text-align: right;">
<li>המאמר נכתב על Fedora 13.</li>
<li>הקוד נערך ב Eclipse.</li>
</ul>
כל חבילה שמגיעה למכונה עוברת בדיקה מול החוקים שהוגדרו ב iptables שעובד מול ה NetFilter שיושב ב Kernel, אם החוקים מאפשרים להעביר את החבילה ליעד ה Netfilter יאשר את החבילה (NF_ACCEPT) אבל במקרה שהחוקים חוסמים אותה הוא יפיל את החבילה (NF_DROP), אלה 2 הפעולות הבסיסיות שנמצאות בכל Firewall אבל זה לא מספיק וצריך לחפור יותר פנימה, ניתן לרשום חוק שמפנה את המידע (NF_QUEUE) למחסנית שמאפשרת גישה לתוכניות מעולם ה UserSpace לנתח את החבילות ולחרוץ את גורלם.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1Z42AwohYInJHz7fyGPsdEmjktBddEqaJvkInxDbZ-xxx4y4VYxp90M9FhgyUJOx9b4ZLEAFz4Dy9ujZeceVWkA6yNIaciSn_WSC57LERsMMrE7voLke66eW0V3dQAFG9qpyv2tXntNut/s1600/1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1Z42AwohYInJHz7fyGPsdEmjktBddEqaJvkInxDbZ-xxx4y4VYxp90M9FhgyUJOx9b4ZLEAFz4Dy9ujZeceVWkA6yNIaciSn_WSC57LERsMMrE7voLke66eW0V3dQAFG9qpyv2tXntNut/s1600/1.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">התוכנית קובעת את גורל החבילה</td></tr>
</tbody></table>
<br />
לצורך הדוגמה החוק הבא מכניס את כל המידע שמגיע למחסנית במיקום 0 אבל במקרה של עבודה אינטנסיבית המחסנית תתמלא עוד לפני שנספיק לנקות אותה ולכן החוק הזה לא כלכך יעיל:<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="text-align: right;"><b>#: iptables -A INPUT -j NFQUEUE --queue-num 0 --queue-balance</b></span></div>
<br />
עבור ניתוח יעיל יותר צריכים לעבוד במקביל, ניתן לפצל חוק בין מספר מחסניות שונות כפי שניתן לראות בדוגמה:<br />
<br />
<div dir="ltr" style="text-align: left;">
<b>#: <span style="text-align: right;">iptables -A INPUT -j NFQUEUE --queue-balance 0:3</span></b></div>
<div dir="ltr" style="text-align: left;">
<b>#: <span style="text-align: right;">iptables -A OUTPUT -j NFQUEUE --queue-balance 4:8</span></b></div>
<div style="text-align: right;">
<span style="text-align: right;"><br /></span></div>
<br />
<div dir="ltr" style="text-align: left;">
<b><span style="color: #3d85c6;">Libnetfilter_queue Library</span></b></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: right;">
ספריה רשמית שמאפשרת לנהל את החבילות שנמצאות במחסניות בעזרת עבודה מול Netlink דרך Unix Domain Socket, היא מחליפה ספרייה ישנה יותר שנקראת ip_queue והיא נמצאת כמעט בכל Distribution של Linux, אבל בשביל לעבוד איתה יש להוריד את ה Headers ולהכין את ה Eclipse:<br />
<br />
<div dir="ltr" style="text-align: left;">
#: yum install libnetfilter_queue</div>
<div dir="ltr" style="text-align: left;">
#: yum install libnetfilter_queue-devel</div>
<br />
<br />
נשלב את הספריות המתאימות ב Linker:</div>
<div style="text-align: right;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: right;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyj-KwJJ53r4y3P6J9OM_fXeHxiAy7GplFaA8z8OMd6hXg96vtI36aQxlX6ETOHNnIiixteuoIv44qGH5WC7YlRh7cPt-FWjhjiR2uJHgkIuBwSzUmp6Ft7zKy2P0hgnKMi5ujF_c9irpU/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyj-KwJJ53r4y3P6J9OM_fXeHxiAy7GplFaA8z8OMd6hXg96vtI36aQxlX6ETOHNnIiixteuoIv44qGH5WC7YlRh7cPt-FWjhjiR2uJHgkIuBwSzUmp6Ft7zKy2P0hgnKMi5ujF_c9irpU/s1600/3.png" height="260" width="400" /></a></div>
<br /></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<br />
<br />
<span style="color: #3d85c6;"><b>קוד</b></span><br />
<br />
פונקצית Main מייצרת מערך של Threads שכל אחד מהם מתחבר ל Queue אחר, כאשר תגיע חבילה לאחת מהמחסניות, פונקציית <span style="text-align: left;">packetHandler תרוץ ודרכה ננתח את המידע,</span><span style="text-align: left;"> לצורך הדוגמה כאשר נזהה את המילה facebook בתוכן החבילה נפיל אותה ונחסום את הגישה.</span><br />
<br />
<div dir="ltr" style="text-align: left;">
filterQueue.c</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
#include <stdio.h></div>
<div dir="ltr" style="text-align: left;">
#include <stdlib.h></div>
<div dir="ltr" style="text-align: left;">
#include <unistd.h></div>
<div dir="ltr" style="text-align: left;">
#include <netinet/in.h></div>
<div dir="ltr" style="text-align: left;">
#include <linux/types.h></div>
<div dir="ltr" style="text-align: left;">
#include <string.h></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">/* for ethernet header */</span></div>
<div dir="ltr" style="text-align: left;">
#include<net/ethernet.h></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">/* for UDP header */</span></div>
<div dir="ltr" style="text-align: left;">
#include<linux/udp.h></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">/* for TCP header */</span></div>
<div dir="ltr" style="text-align: left;">
#include<linux/tcp.h></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">/* for IP header */</span></div>
<div dir="ltr" style="text-align: left;">
#include<linux/ip.h></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">/* -20 (maximum priority) */</span></div>
<div dir="ltr" style="text-align: left;">
#include <sys/time.h></div>
<div dir="ltr" style="text-align: left;">
#include <sys/resource.h></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">/* for NF_ACCEPT */</span></div>
<div dir="ltr" style="text-align: left;">
#include <linux/netfilter.h></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">/* for Threads */</span></div>
<div dir="ltr" style="text-align: left;">
#include <pthread.h></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">/* for Queue */</span></div>
<div dir="ltr" style="text-align: left;">
#include <libnetfilter_queue/libnetfilter_queue.h></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: orange;">#define NUM_THREADS 15</span></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
pthread_t threads[NUM_THREADS];</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
void printTCP(unsigned char *buffer) {</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>unsigned short iphdrlen;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct iphdr *iph = (struct iphdr *) (buffer + sizeof(struct ethhdr));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>iphdrlen = iph->ihl * 4;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct tcphdr *tcph = (struct tcphdr *) (buffer + iphdrlen</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>+ sizeof(struct ethhdr));</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>int header_size = sizeof(struct ethhdr) + iphdrlen + tcph->doff * 4;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("| Packet Type: TCP \n");</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Source Port : %u\n", ntohs(tcph->source));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Destination Port : %u\n", ntohs(tcph->dest));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Sequence Number : %u\n", ntohl(tcph->seq));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Acknowledge Number : %u\n", ntohl(tcph->ack_seq));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Header Length : %d DWORDS or %d BYTES\n",</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>(unsigned int) tcph->doff, (unsigned int) tcph->doff * 4);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-CWR Flag : %d\n", (unsigned int) tcph->cwr);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-ECN Flag : %d\n", (unsigned int) tcph->ece);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Urgent Flag : %d\n", (unsigned int) tcph->urg);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Acknowledgement Flag : %d\n", (unsigned int) tcph->ack);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Push Flag : %d\n", (unsigned int) tcph->psh);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Reset Flag : %d\n", (unsigned int) tcph->rst);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Synchronise Flag : %d\n", (unsigned int) tcph->syn);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Finish Flag : %d\n", (unsigned int) tcph->fin);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Window : %d\n", ntohs(tcph->window));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Checksum : %d\n", ntohs(tcph->check));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Urgent Pointer : %d\n", tcph->urg_ptr);</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
void printUDP(unsigned char *buffer) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>unsigned short iphdrlen;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct iphdr *iph = (struct iphdr *) (buffer + sizeof(struct ethhdr));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>iphdrlen = iph->ihl * 4;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct udphdr *udph = (struct udphdr*) (buffer + iphdrlen</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>+ sizeof(struct ethhdr));</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>int header_size = sizeof(struct ethhdr) + iphdrlen + sizeof udph;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("| Packet Type: UDP \n");</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Source Port : %u\n", ntohs(udph->source));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Destination Port : %u\n", ntohs(udph->dest));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-UDP Length : %u\n", ntohs(udph->len));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-UDP Checksum : %u\n", ntohs(udph->check));</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
char * getText(unsigned char * data, char Size) {</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>char * text = malloc(Size);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>int i = 0;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>for (i = 0; i < Size; i++) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (data[i] >= 32 && data[i] <= 128)</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>text[i] = (unsigned char) data[i];</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>else</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>text[i] = '.';</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return text;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
u_int32_t analyzePacket(struct nfq_data *tb, int *blockFlag) {</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//packet id in the queue</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>int id = 0;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//the queue header</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct nfqnl_msg_packet_hdr *ph;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//the packet</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>char *data;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//packet size</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>int ret;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//extracting the queue header</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>ph = nfq_get_msg_packet_hdr(tb);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//getting the id of the packet in the queue</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (ph)</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>id = ntohl(ph->packet_id);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//getting the length and the payload of the packet</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>ret = nfq_get_payload(tb, &data);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (ret >= 0) {</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("Packet Received: %d \n", ret);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">/* extracting the ipheader from packet */</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct sockaddr_in source, dest;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>unsigned short iphdrlen;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct iphdr *iph = ((struct iphdr *) data);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>iphdrlen = iph->ihl * 4;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>memset(&source, 0, sizeof(source));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>source.sin_addr.s_addr = iph->saddr;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>memset(&dest, 0, sizeof(dest));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>dest.sin_addr.s_addr = iph->daddr;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Source IP: %s\n", inet_ntoa(source.sin_addr));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Destination IP: %s\n", inet_ntoa(dest.sin_addr));</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Checking for Protocol: \n");</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (iph->protocol == 6) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printTCP(data);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>} else if (iph->protocol == 17) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printUDP(data);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("|-Extracting Payload: \n");</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>char * text = getText(data, ret);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//filtering requests for facebook</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (text && text[0] != '\0') {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("\n %s \n", text);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>ret = strstr(text, "facebook");</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (ret == 0)</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//not found in string</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>*blockFlag = 0;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>else</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//found in string</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>*blockFlag = 1;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//release the packet</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>free(text);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//return the queue id</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return id;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
int packetHandler(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, struct nfq_data *nfa,</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>void *data) {</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("entering callback \n");</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//when to drop</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>int blockFlag = 0;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//analyze the packet and return the packet id in the queue</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>u_int32_t id = analyzePacket(nfa, &blockFlag);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//this is the point where we decide the destiny of the packet</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (blockFlag == 0)</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>else</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return nfq_set_verdict(qh, id, NF_DROP, 0, NULL);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
void *QueueThread(void *threadid) {</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//thread id</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>long tid;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>tid = (long) threadid;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct nfq_handle *h;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct nfq_q_handle *qh;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>char buf[128000] __attribute__ ((aligned));</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//pointers and descriptors</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>int fd;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>int rv;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>int ql;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("open handle to the netfilter_queue - > Thread: %d \n", tid);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>h = nfq_open();</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (!h) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>fprintf(stderr, "cannot open nfq_open()\n");</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return NULL;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>//unbinding previous procfs</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (nfq_unbind_pf(h, AF_INET) < 0) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>fprintf(stderr, "error during nfq_unbind_pf()\n");</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return NULL;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//binding the netlink procfs</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (nfq_bind_pf(h, AF_INET) < 0) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>fprintf(stderr, "error during nfq_bind_pf()\n");</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return NULL;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//connet the thread for specific socket</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("binding this socket to queue '%d'\n", tid);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>qh = nfq_create_queue(h, tid, &packetHandler, NULL);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (!qh) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>fprintf(stderr, "error during nfq_create_queue()\n");</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return NULL;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//set queue length before start dropping packages</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>ql = nfq_set_queue_maxlen(qh, 100000);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//set the queue for copy mode</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff) < 0) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>fprintf(stderr, "can't set packet_copy mode\n");</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return NULL;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//getting the file descriptor</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>fd = nfq_fd(h);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>while ((rv = recv(fd, buf, sizeof(buf), 0)) && rv >= 0) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("pkt received in Thread: %d \n", tid);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>nfq_handle_packet(h, buf, rv);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("unbinding from queue Thread: %d \n", tid);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>nfq_destroy_queue(qh);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("closing library handle\n");</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>nfq_close(h);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return NULL;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
int main(int argc, char *argv[]) {</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//set process priority</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>setpriority(PRIO_PROCESS, 0, -20);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>int rc;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>long balancerSocket;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>for (balancerSocket = 0; balancerSocket < NUM_THREADS; balancerSocket++) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("In main: creating thread %ld\n", balancerSocket);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//send the balancer socket for the queue</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>rc = pthread_create(&threads[balancerSocket], NULL, QueueThread,</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>(void *) balancerSocket);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (rc) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("ERROR; return code from pthread_create() is %d\n", rc);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>exit(-1);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>while (1) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>sleep(10);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//destroy all threads</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>pthread_exit(NULL);</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<span style="color: #3d85c6;"><b>טיפ קטן</b></span></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
אם רוצים לעקוב אחרי העומסים במחסניות ניתן לקרוא את הקובץ nfnetlink_queue:</div>
<div style="text-align: right;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvJ2KtHIcKxzerKA9kZr5ZgGQW-CdhYhZDQpgg54tYQiQLxGBU8CQeJALTaleDURox6iAt5NPU-MONyou_hetnR-8JTNLLxXmJYPo8PZp5L5L7x1Zrjog6BoXUmcWsXIf2N-_ZbxNpSQvP/s1600/4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvJ2KtHIcKxzerKA9kZr5ZgGQW-CdhYhZDQpgg54tYQiQLxGBU8CQeJALTaleDURox6iAt5NPU-MONyou_hetnR-8JTNLLxXmJYPo8PZp5L5L7x1Zrjog6BoXUmcWsXIf2N-_ZbxNpSQvP/s1600/4.png" height="221" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">/proc/net/netfilter</td></tr>
</tbody></table>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<br /></div>
</div>
<span style="color: #3d85c6;"><b>סיכום</b></span><br />
<br />
ניתוח המידע הוא הכרחי מאוד לאור כל הסיכונים שקיימים היום, היכולת לחרוץ את גורל החבילה מחוץ ל Kernel חוסך התעסקות מיותרת והופך את העסק לפשוט יותר, על הטריק הזה ניתן לבסס מוצרי רשת שונים כמו IDS,IPS,WAF ועוד.<br />
<br />
<span style="color: #3d85c6;"><b>הורדת התוכנית</b></span><br />
<br />
<div dir="ltr" style="text-align: left;">
<a href="https://sourceforge.net/projects/libnetfilterqueuethreads/">https://sourceforge.net/projects/libnetfilterqueuethreads/</a></div>
<br />
<b><span style="color: #3d85c6;">מקורות</span></b><br />
<br />
<div dir="ltr" style="text-align: left;">
<a href="http://netfilter.org/projects/libnetfilter_queue/doxygen/index.html">http://netfilter.org/projects/libnetfilter_queue/doxygen/index.html</a></div>
<br />
<br /></div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-13901759088794307972014-09-23T12:14:00.000-07:002014-09-23T12:14:42.313-07:00Arduino And TFT Screen<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXksylgxG0p7sOtFx3D0nYybwR9_t9HYeIg4pL3lnCgI-_QOk3ZICPHaFhQZ2V96kiaMHco522NK880xzgXCUJILYHA0zK5EDwrgDjUdwrdpYuaJKhFY-XkgcTdfS-cwd2ASMncDSZj8t7/s1600/logo_arduino.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXksylgxG0p7sOtFx3D0nYybwR9_t9HYeIg4pL3lnCgI-_QOk3ZICPHaFhQZ2V96kiaMHco522NK880xzgXCUJILYHA0zK5EDwrgDjUdwrdpYuaJKhFY-XkgcTdfS-cwd2ASMncDSZj8t7/s1600/logo_arduino.jpg" height="139" width="320" /></a></div>
<br />
לאחרונה רכשתי עבור אחד מהפרוייקטים שלי מסך TFT בגודל 320X240 פיקסלים מ <a href="http://www.dx.com/p/elecfreaks-tft01-2-2sp-2-2-spi-240-x-320-tft-lcd-module-for-arduino-red-black-236037#.VCHA7fmSyYU">DX</a> תמורת 13 דולר, ההתקנה לא היתה פשוטה ולקח לי זמן עד שהצלחתי להפעיל אותו, זה מבאס שיצרנים ובמיוחד סינים לא מקפידים לתת את המידע הדרוש למוצר וגם כאשר הם מנסים הוא לא תמיד מדוייק. <br />
<br />
<br />
<span style="color: red;"><b>שימו לב!</b></span><br />
<br />
<ul style="text-align: right;">
<li>רוב המסכים דורשים 3.3V, בדקו היטב לפני שאתם מחברים.</li>
<li>הפינים לממשק ה SPI עלולים להשתנות מלוח ללוח.</li>
</ul>
<br />
<br />
<span style="color: #3d85c6;"><b>דרישות</b></span><br />
<br />
<ul style="text-align: right;">
<li>(Arduino (any kind will do the job</li>
<li>TFT Display</li>
<li>5 47K Ressistor</li>
<li>10K Potentiometer </li>
<li>Wires</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfXsp5akH3khrE0CfkvtNeT3dan7vAwp75RrBkWr3knJA3mSh57cRxDTHvZ20QP4zlPNLU3ozDBIYczVMAcoe3kO_iVrxZMUx5OIcoFtCQdxlPFmqhSfXZp0zsmuP6MoG-vAPgJV6sfNkb/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfXsp5akH3khrE0CfkvtNeT3dan7vAwp75RrBkWr3knJA3mSh57cRxDTHvZ20QP4zlPNLU3ozDBIYczVMAcoe3kO_iVrxZMUx5OIcoFtCQdxlPFmqhSfXZp0zsmuP6MoG-vAPgJV6sfNkb/s1600/4.png" height="250" width="320" /></a></div>
<div>
<br /></div>
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>TFT-LCD (Thin Film Transistor-Liquid Crystal Display)</b></span></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
מסכי TFT לוקחים את התצוגה קדימה, הם חדים וצבעוניים בניגוד למסכי ה LCD הקלאסים שהצגתי בעבר, אבל מורכבים יותר כך שה Arduino עצמו לא יכול לנהל אותם כי אין לו מספיק זיכרון להכיל את המידע עבור כל פיקסל וזה גם לא ממש העבודה שלו, בדר"כ הם מנוהלים בעצמם בעזרת IC ייעודי שמאפשר לגשת אליו בעזרת ממשק SPI,</div>
<div style="text-align: right;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZolHeUdsWTfzIx1q5hVvHWc9gdDkP97mCvt7aSR4bjDWcLhpPjmT7d-usjLw-onGTMuBmXykI0MTjiKnM_PmXg6blehx7BCGGuI5c74VCILwQ9NZtBiMFQQg-OKUYohhNcpMiWjiE5Zu3/s1600/1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZolHeUdsWTfzIx1q5hVvHWc9gdDkP97mCvt7aSR4bjDWcLhpPjmT7d-usjLw-onGTMuBmXykI0MTjiKnM_PmXg6blehx7BCGGuI5c74VCILwQ9NZtBiMFQQg-OKUYohhNcpMiWjiE5Zu3/s1600/1.png" height="226" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">קטן ומגניב</td></tr>
</tbody></table>
<div dir="ltr" style="text-align: left;">
<span style="background-color: white; font-family: 'Helvetica Neue', Helvetica, Arial, san-serif; font-size: 13px; line-height: 16.25px;"><br />
</span></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: right;">
<b><span style="color: #3d85c6;">הכנה מקדימה</span></b></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
דבר ראשון חשוב להוריד ספריה שמתאימה למסך, יש המון סוגים של ספריות שתומכות במסכים שונים, הספריה הפופלרית ביותר נקראת <a href="http://henningkarlsen.com/electronics/library.php?id=52">UTFT</a> שמכסה המון סוגים של מסכים, לאחר מכן פותחים את קובץ ה Zip ושופכים אותו לתיקיית Libraries שב Arduino IDE,עורכים את הקובץ memorysaver.h ומורידים את ההערות למעט (במקרה שלי) מהשורה:<br />
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: orange;"> //#define DISABLE_ILI9341_S5P</span></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
לא נוכל להכיל את כל הספריה בתוכנית כי היא גדולה יותר משטח הזיכרון שעל ה Arduino לכן חשוב לבחור את הלוח המתאים ולנטרל את האחרים על מנת להקטין את נפח, לאחר שהגדרנו את הספריה למסך השלב הבא הוא לחבר את המסך ל Arduino לפי הדוגמה הבאה:</div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLDlrdfme7X5o_SKt7ljEGlfYfSf2ikXmb1lLBMN-oAG43jgjPbMUk9nRTypTV1bF2YQ5SAQZlGa7LORHOfIPVma2GH4WWqdmp6kcO_gprox0BJnJEjrqyP2BcBOrd4JSHnM5FUzbrsLDe/s1600/3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLDlrdfme7X5o_SKt7ljEGlfYfSf2ikXmb1lLBMN-oAG43jgjPbMUk9nRTypTV1bF2YQ5SAQZlGa7LORHOfIPVma2GH4WWqdmp6kcO_gprox0BJnJEjrqyP2BcBOrd4JSHnM5FUzbrsLDe/s1600/3.png" height="400" width="337" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">לאט אבל בטוח</td></tr>
</tbody></table>
<br /></div>
<div style="text-align: right;">
<br />
זהו, בגדול סיימנו, עכשיו ניתן להפעיל את אחת מהדוגמאות שבאות עם UTFT, הן מחולקות לפי רזולוציית מסך במקרה שלי השתמשתי בדוגמה UTFT_Demo_320X240_Serial.ino רק חשוב להגדיר את הפינים לספרייה:<br />
<br />
<div dir="ltr" style="text-align: left;">
<b>UTFT myGLCD(TFT01_22SP,11,13,10,9,8);</b> </div>
<br />
<br /></div>
<div style="text-align: right;">
<span style="color: #3d85c6;"><b>מבנה סופי</b></span></div>
<div style="text-align: right;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgv2jfE6UmvL_r2NqAS-3kI5Ju1Eh2ZNF-st40q_u6f-WAOE_GsBTVGDFyvAlbINoQHq5JlTTF-VotsZan4zRXEuo5alZfc_KWc-xd7i9UZNbEuJaY9gA4ksmKLAmyPwT2logR6RcljLH_/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgv2jfE6UmvL_r2NqAS-3kI5Ju1Eh2ZNF-st40q_u6f-WAOE_GsBTVGDFyvAlbINoQHq5JlTTF-VotsZan4zRXEuo5alZfc_KWc-xd7i9UZNbEuJaY9gA4ksmKLAmyPwT2logR6RcljLH_/s1600/2.png" height="210" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ואו...</td></tr>
</tbody></table>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<span style="color: #3d85c6;"><b>סרט הדגמה</b></span><br />
<span style="color: #3d85c6;"><b><br />
</b></span></div>
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="360" src="//www.youtube.com/embed/5cMQDmg3uS4" width="500"></iframe><br /></div>
<div style="text-align: right;">
<br />
<br /></div>
<div style="text-align: right;">
<span style="color: #3d85c6;"><b>סיכום</b></span></div>
<br />
המסך מגיע עם אפשרות לחבר לו SDCard וניתן לעבוד איתו כפי שכבר הסברתי <a href="http://proxytype.blogspot.co.il/2013/09/arduino-microsd.html">בעבר</a>, לאורך הבלוג עברתי על מספר סוגי תצוגות עם יכולות מוגבלות, עכשיו בעזרת TFT אפשר לקחת את ה Arduino עוד יותר רחוק בעזרת ממשק SPI פשוט, יחד עם צבעים וחדות מעולה.<br />
<br />
שנה טובה!</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-31831573768558852062014-09-06T04:44:00.000-07:002014-09-07T01:01:00.171-07:00Arduino Yun - CGI and Python<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA9mBxDU-p2I6QILLLVE0uH39SdM3yjF12G1FlJ2FY9JAIr9kUXsiQJvGSuo4h-3amp6FMij67QzNFiM0gE2TELkwL2pvnH2mlLRolzTFyEiO9_EM1m42D6rKcQ3QM_dmWozltdm5FaRCd/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA9mBxDU-p2I6QILLLVE0uH39SdM3yjF12G1FlJ2FY9JAIr9kUXsiQJvGSuo4h-3amp6FMij67QzNFiM0gE2TELkwL2pvnH2mlLRolzTFyEiO9_EM1m42D6rKcQ3QM_dmWozltdm5FaRCd/s1600/1.png" /></a></div>
<br />
<div>
<br /></div>
<div>
אחרי הכרות קצרה עם Arduino Yun הגיע השלב להעמיק פנימה, המאמר מתמקד על בניית ממשק Web מתקדם בניגוד למה שהדגמתי <a href="http://proxytype.blogspot.co.il/2013/01/arduino-ethernet-honeypot.html">בעבר</a> שהיה יחסית מוגבל הפעם נעזר ב <a href="http://en.wikipedia.org/wiki/Common_Gateway_Interface">CGI</a> ובשפת Python על מנת להשלים את המשימה בצורה פשוטה והמהירה ביותר, אבל לפני שנתחיל כדאי להצטייד במספר כלים.</div>
<div>
<ul style="text-align: right;">
<li><a href="http://notepad-plus-plus.org/">NotePad++</a> - כתיבת קוד והמרות קבצים בין Windows ל Linux.</li>
<li><a href="http://winscp.net/eng/download.php">WinScp</a> - העברת קבצים בין ה Yun למחשב האישי.</li>
<li><a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">Putty</a> - התממשקות ב SSH ל Yun.</li>
</ul>
<div>
<br /></div>
</div>
<div>
<b><span style="color: #3d85c6;">הגדרה ראשונית</span></b></div>
<div>
<div>
<span style="color: red;"><b><br /></b></span></div>
<div>
<span style="color: red;"><b>שימו לב!</b></span></div>
<div>
<ul>
<li>יש לגבות את קבצי המערכת לפני התחלת העבודה!</li>
<li>יש לגבות את ספריית www.</li>
</ul>
</div>
</div>
<div>
מערכת ההפעלה OpenWrt מגיעה עם שרת Web שנקרא <a href="http://wiki.openwrt.org/doc/uci/uhttpd">uhttpd</a> שדרכו ניגשים לממשק של ה Yun, נוכל להעזר בו בשביל האתר שלנו, כל מה שצריך לעשות הוא להוריד את קובץ ההגדרות (uhttpd) שנמצא בתיקייה /etc/config/ בעזרת WinSCP ולהוסיף שורה שמייצגת את ה <span style="text-align: left;">interpreter </span>של Python כפי שניתן לראות בדוגמה:</div>
<div>
<br /></div>
<div dir="ltr" style="text-align: left;">
<div dir="ltr">
<span style="color: lime;"># List of extension->interpreter mappings.</span></div>
<div dir="ltr">
<span style="color: lime;"># Files with an associated interpreter can</span></div>
<div dir="ltr">
<span style="color: lime;"># be called outside of the CGI prefix and do</span></div>
<div dir="ltr">
<span style="color: lime;"># not need to be executable.</span></div>
<div dir="ltr">
<span style="color: lime;">#<span class="Apple-tab-span" style="white-space: pre;"> </span>list interpreter<span class="Apple-tab-span" style="white-space: pre;"> </span>".php=/usr/bin/php-cgi"</span></div>
<div dir="ltr">
<span style="color: lime;">#<span class="Apple-tab-span" style="white-space: pre;"> </span>list interpreter<span class="Apple-tab-span" style="white-space: pre;"> </span>".cgi=/usr/bin/perl"</span></div>
<div dir="ltr">
<span class="Apple-tab-span" style="white-space: pre;"> </span><b>list interpreter <span class="Apple-tab-span" style="white-space: pre;"> </span>".py=/usr/bin/python"</b></div>
<div>
<br /></div>
</div>
<div>
<br /></div>
<div>
<span style="color: #3d85c6;"><b>קוד</b></span></div>
<div>
<br /></div>
<div>
הדוגמה קצת יותר מורכבת מ Hello World פשוט ומכילה 2 דפים, הדף הראשון הוא ה Login שבעזרתו נקבל קלט מהמשתמש ונעביר אותו ב Get לדף השני, במקרה שעשינו טעות בשם המשתמש או הסיסמא השרת יזריק קוד של Javascript שיחזיר את הלקוח ל Login,<br />
<br />
על מנת לא לפגוע באתר המקומי של ה Yun נוסיף תיקייה חדשה ב www/cgi-bin בה נאכסן את קבצי ה Python אבל לא נוכל להכניס בה את קבצי ה JS או ה CSS כי השרת יחשוב שהוא צריך להריץ אותם ויחפש את <span style="text-align: left;">interpreter המתאים, לכן יש לאכסן את שאר הקבצים מחוץ לתייקית cgi-bin.</span></div>
<div>
<br /></div>
<div dir="ltr" style="text-align: left;">
<b>login.py</b></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
#!/usr/bin/env python<br />
import os<br />
<br />
<span style="color: lime;">#set http header, leave double space</span><br />
print "Content-type: text/html"<br />
print<br />
<br />
<span style="color: lime;">#print html content</span><br />
print <span style="color: orange;">"""</span><br />
<span style="color: orange;"> <html></span><br />
<span style="color: orange;"> <head></span><br />
<span style="color: orange;"> <title>Login</title></span><br />
<span style="color: orange;"> </span><br />
<span style="color: orange;"> <meta name="viewport" </span><br />
<span style="color: orange;"> content="width=device-width,initial-scale=1,maximum-scale=1" /></span><br />
<span style="color: orange;"> </span><br />
<span style="color: orange;"> <link href="/../example/css/jquery.mobile-1.4.3.min.css" rel="stylesheet" type="text/css" /></span><br />
<span style="color: orange;"> <script src="/../example/js/jquery-2.1.1.min.js" type="text/javascript"></script></span><br />
<span style="color: orange;"> <script src="/../example/js/jquery.mobile-1.4.3.min.js" type="text/javascript"></script></span><br />
<span style="color: orange;"> <script src="/../example/js/jquery.validate.min.js" type="text/javascript"></script></span><br />
<span style="color: orange;"> </head></span><br />
<span style="color: orange;"> </span><br />
<span style="color: orange;"> <body></span><br />
<span style="color: orange;"> <form action="/cgi-bin/example/welcome.py" method="get"></span><br />
<span style="color: orange;"> <div style="margin-top:5%;margin-left:5%;margin-right:5%"></span><br />
<span style="color: orange;"> Name: <input type="text" name="txb_name"> <br /></span><br />
<span style="color: orange;"> </div></span><br />
<span style="color: orange;"> <div style="margin-top:5%;margin-left:5%;margin-right:5%"></span><br />
<span style="color: orange;"> Password: <input type="password" name="txb_password" /></span><br />
<span style="color: orange;"> </div></span><br />
<span style="color: orange;"><br /></span>
<span style="color: orange;"> <div style="margin-top:5%;margin-left:5%;margin-right:5%"></span><br />
<span style="color: orange;"> <input type="submit" value="Submit" /></span><br />
<span style="color: orange;"> </div></span><br />
<span style="color: orange;"> </form></span><br />
<span style="color: orange;"><br /></span>
<span style="color: orange;"> </body></span><br />
<span style="color: orange;"> </html></span><br />
<span style="color: orange;"> """</span><br />
<br /></div>
<div dir="ltr" style="text-align: left;">
<b>welcome.py</b></div>
<div dir="ltr" style="text-align: left;">
<br />
#!/usr/bin/env python<br />
import os<br />
import cgi<br />
<br />
form = cgi.FieldStorage()<br />
<br />
<span style="color: lime;"># get date from post/get</span><br />
name = form.getvalue('txb_name')<br />
password = form.getvalue('txb_password')<br />
<br />
<span style="color: lime;"># set http header, leave double space</span><br />
print "Content-type: text/html"<br />
print<br />
<br />
<span style="color: lime;"># write head</span><br />
print <span style="color: orange;">"""</span><br />
<span style="color: orange;"> <html></span><br />
<span style="color: orange;"> <head></span><br />
<span style="color: orange;"> <title>Welcome</title></span><br />
<span style="color: orange;"><br /></span>
<span style="color: orange;"> <meta name="viewport"</span><br />
<span style="color: orange;"> content="width=device-width,initial-scale=1,maximum-scale=1" /></span><br />
<span style="color: orange;"> </span><br />
<span style="color: orange;"> <link href="/../example/css/jquery.mobile-1.4.3.min.css" rel="stylesheet" type="text/css" /></span><br />
<span style="color: orange;"> <script src="/../example/js/jquery-2.1.1.min.js" type="text/javascript"></script></span><br />
<span style="color: orange;"> <script src="/../example/js/jquery.mobile-1.4.3.min.js" type="text/javascript"></script></span><br />
<span style="color: orange;"> </head>"""</span><br />
<span style="color: orange;"><br /></span>
<span style="color: orange;"># change body depend on the request</span><br />
<span style="color: orange;">if password != "12345" and name != "proxytype":</span><br />
<span style="color: orange;"> print """</span><br />
<span style="color: orange;"> <body></span><br />
<span style="color: orange;"> <script type="text/javascript"></span><br />
<span style="color: orange;"> window.location.href = 'login.py';</span><br />
<span style="color: orange;"> </script></span><br />
<span style="color: orange;"> Redirecting...</span><br />
<span style="color: orange;"> </body></span><br />
<span style="color: orange;"> </html>"""</span><br />
<span style="color: orange;">else:</span><br />
<span style="color: orange;"> print """</span><br />
<span style="color: orange;"> </head></span><br />
<span style="color: orange;"> <body></span><br />
<span style="color: orange;"> <h1 style="margin-top:5%%;margin-left:5%%">Welcome, %s !</h1></span><br />
<span style="color: orange;"> </body></span><br />
<span style="color: orange;"> """</span> % (name)<br />
<span style="color: lime;"># % is symbol for string formatting for return it in string enter double '%%'</span><br />
<span style="color: lime;"># printing close tag</span><br />
print <span style="color: orange;">"</html>"</span></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<b><span style="color: #3d85c6;">נקודות נוספות</span></b></div>
<div>
<br /></div>
<div>
CGI רגיש מאוד ולפעמים עלולים לקבל שגיאות שלא תמיד ניתן להבין מה בדיוק הבעיה, רכזתי מספר טיפים שיפתרו את רוב התקלות:</div>
<div>
<ul style="text-align: right;">
<li><b>Permissions </b>- יש לוודא שהסקריפטים של ה Python נמצאים בתיקיית cgi-bin ושיש שלהם הרשאות גבוהות ניתן להעזר בפקודה ב chmod a+x, זה יעשה את העבודה.</li>
<li><b>(End Of Line (EOL</b> - יש הבדל באיך מערכות ההפעלה מתייחסות לסוף השורה, ב Windows בכל סוף שורה יש את התווים <b>r\n\</b> ולעומת זאת במערכות Unix רק את התו <b>n\</b> לכן במקרה שכותבים ב Windows יש לשמור את הקבצים בהגדרת Unix בעזרת Notepad++:</li>
</ul>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimNr84HbXDC1yfayxiL87V1KXLmKb6lfr1H5qrg5zGixH7-9jA2EnjuiAsdnhSi_hgabizlBrzSUs7b5QLEZ7LM9sof_RWOU5BPTPUUWMELs2lZwqdpvUHoRkhf8b-WsYcqm6znMVJWnDJ/s1600/1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimNr84HbXDC1yfayxiL87V1KXLmKb6lfr1H5qrg5zGixH7-9jA2EnjuiAsdnhSi_hgabizlBrzSUs7b5QLEZ7LM9sof_RWOU5BPTPUUWMELs2lZwqdpvUHoRkhf8b-WsYcqm6znMVJWnDJ/s1600/1.png" height="282" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">זה הכרחי?!</td></tr>
</tbody></table>
<div>
<br /></div>
</div>
<div>
<ul style="text-align: right;">
<li><b>(Bytes Order Mark (BOM</b> - תו Unicode שמוכנס לתחילת הקובץ מאפשר להקל על צורת הקידוד במקרה של Unicode, UTF-16 ו UTF-32 במקרה שלנו נשתמש ב UTF-8 ככה שאין לו משמעות וצריכים להוריד אותו בעזרת Notepad++: </li>
</ul>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNkNnsrYJrYs5PLeaXtUyXZc8HdDpg8tc_VRUJelHqpBehlAug_MBW9DjQMxztZXyjTmHx_uZc3JQkGJJ41kuX4g_cGyN8OJK05zXNc4fm6v8NrWo24QnoIx3Jt0D7JdxE2oUlyFr1zZa0/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNkNnsrYJrYs5PLeaXtUyXZc8HdDpg8tc_VRUJelHqpBehlAug_MBW9DjQMxztZXyjTmHx_uZc3JQkGJJ41kuX4g_cGyN8OJK05zXNc4fm6v8NrWo24QnoIx3Jt0D7JdxE2oUlyFr1zZa0/s1600/2.png" height="281" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">קידוד עולם אכזר!</td></tr>
</tbody></table>
<div>
<br /></div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<span style="color: #3d85c6;"><b>תוצאה סופית</b></span></div>
<div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHaGjmi6TcfQ2CJDy_VURab8hSskor8P_Uw9POws2bNXBD6qjw3aoWBHue4aAvzRaF1ls52v-edISLcjKZCc61Q4kblsQqKR4yODh8qUylkagQKUaPHCYFcp5PX2EvBFWZ9-gR1L337yBE/s1600/3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHaGjmi6TcfQ2CJDy_VURab8hSskor8P_Uw9POws2bNXBD6qjw3aoWBHue4aAvzRaF1ls52v-edISLcjKZCc61Q4kblsQqKR4yODh8qUylkagQKUaPHCYFcp5PX2EvBFWZ9-gR1L337yBE/s1600/3.png" height="320" width="242" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
<br /></div>
<div>
<span style="color: #3d85c6;"><b>סיכום</b></span><br />
<br />
בעזרת Python בשילוב JavaScript ו Css נוכל לבנות ממשקי ניהול מורכבים, וזה בזכות ה Linux שמאפשר לנו לעבוד עם שירותים מתקדמים יותר ונפח זיכרון גדול לקבצים , אומנם הדגמתי על Python אבל אפשר לעבוד גם עם PHP רק שהוא לא מגיע באופן טבעי עם הלוח ויש להוריד אותו בנפרד.<br />
<br />
ללא גבולות...</div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-63796140499954165152014-08-23T09:36:00.000-07:002014-08-24T08:43:55.773-07:00Arduino Yun - Starting Guide<div dir="rtl" style="text-align: right;" trbidi="on">
<div dir="rtl" style="text-align: right;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFitUNl5iM74PbHZBjjnx1rmjnCzfsFMexnxJbXi70mIzA_ltjvX6GVKOaku7g8yhLi-LIsAYbo_SFipnSVHaM5fdzw6sPwAYGYsLi_qQIB9rWKe0WVxyHvrZpzl5h_E3D8lSVpcZiHaBG/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFitUNl5iM74PbHZBjjnx1rmjnCzfsFMexnxJbXi70mIzA_ltjvX6GVKOaku7g8yhLi-LIsAYbo_SFipnSVHaM5fdzw6sPwAYGYsLi_qQIB9rWKe0WVxyHvrZpzl5h_E3D8lSVpcZiHaBG/s1600/1.png" /></a></div>
<br />
<br />
עד עכשיו ראינו 2 סוגים של לוחות פיתוח, הראשון היה Arduino שמבוסס על מעבד פשוט ללא מערכת הפעלה, לעומתו ראינו את <a href="http://proxytype.blogspot.co.il/2013/05/beaglebone-developing-environment.html">BeagleBone</a> ואת <a href="http://proxytype.blogspot.co.il/2014/08/raspberry-pi-starting-guide.html">Raspberry PI</a> שמבוססים על מעבדים יותר מתוחכמים שמריצים Linux, מפתחי Arduino לא יכלו להיות אדישים והוציאו דגם חדש שמשלב בתוכו את 2 העולמות.<br />
<br />
הוא מכיל 2 מעבדים, הראשון והמוכר ATmega 328u4 במהירות 16MHZ ו 32KB של זיכרון ,הוא אחראי על העבודה מול החיבורים הדיגטליים והאנלוגים המקוריים שיש בגרסת ה Uno הותיקה, המעבד השני הוא Atheros AR 9331 שמבוסס על ארכיטקטורת <a href="http://en.wikipedia.org/wiki/MIPS_instruction_set">MIPS</a> במהירות 400Mhz עם 64MB של זיכרון, הוא אחראי על שאר ה Peripherals כמו הרשת הקווית ,האלחוטית ,כרטיס הזיכרון וה USB ,הלוח מריץ מערכת <a href="https://openwrt.org/">OpenWRT</a> שכתבתי עליה <a href="http://proxytype.blogspot.co.il/2013/09/openwrt-custom-router-guide.html">בעבר</a>.<br />
<br />
<b><span style="color: #3d85c6;">דרישות</span></b><br />
<br />
<ul style="text-align: right;">
<li>Arduino Yun</li>
<li>Led</li>
<li>330ohm Resistor</li>
<li>Wires</li>
</ul>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0-pGEVNzibjqY_h3K0fUNaLIoLV3XFvXyn-xcbHKKQJ-3AfbdXX3j1JX5Nkhnx-ygmdUPhkqe6MhoAr-vUzswetptHGcxRxDLsy9CraxDSyw2Z43bCWycbB992sxHN7Nr5AcYO6GULvJd/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0-pGEVNzibjqY_h3K0fUNaLIoLV3XFvXyn-xcbHKKQJ-3AfbdXX3j1JX5Nkhnx-ygmdUPhkqe6MhoAr-vUzswetptHGcxRxDLsy9CraxDSyw2Z43bCWycbB992sxHN7Nr5AcYO6GULvJd/s1600/2.png" height="221" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">בגודל של Uno</td></tr>
</tbody></table>
<br />
<b><span style="color: #3d85c6;">הפעלה ראשונית</span></b><br />
<br />
הלוח מגיע מוכן, מה שנשאר לעשות הוא לחבר אליו חשמל ולהתחבר ל Access Point שהוא יוצר אוטומטית, נפתח את הדפדפן ונכניס את הכתובת של ה Default Gateway שקיבלנו (במקרה שלי 192.168.201.223), דרכה נגיע לממשק הניהול.<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjend_3wuPRt1ZBOdN6mDNRPqwiEyANL0-v9Jds8yTX3Abzf7RJ5UpO4pkQZ9JZJgHhVSXcDGA-ifh9PqXvliEWg0DPyCmrJxUiA3IvSWS_mOq2EdUdBx96cYxuY1aLeEiWuTmFPg9OAfxo/s1600/3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjend_3wuPRt1ZBOdN6mDNRPqwiEyANL0-v9Jds8yTX3Abzf7RJ5UpO4pkQZ9JZJgHhVSXcDGA-ifh9PqXvliEWg0DPyCmrJxUiA3IvSWS_mOq2EdUdBx96cYxuY1aLeEiWuTmFPg9OAfxo/s1600/3.png" height="226" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">הסיסמא ההתחלתית היא arduino</td></tr>
</tbody></table>
<br />
הממשק עצמו מאוד פשוט, דרכו ניתן להגדיר את התקשורת WIFI, אבל יש בו אפשרות נוספת שכדאי להכיר שנקראת Rest API , זה המנגנון דרכו נדבר עם המעבד ATmega דרך שרת Http ששולט על הפינים כפי שנראה בהמשך.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRuxGkEWdQoJUlFLD8XKFXxGwBMxH_fw4ZqfaHE_oc9GLtH9FgmtFPO1NR4q9j142gI8IYtUJ8HBI6vxMfgHBSInAT0u6Xf03cT4uwDSPcKMxjJSTQjtEr1okyP0AkWT5FOCQMPc6iKEOk/s1600/4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRuxGkEWdQoJUlFLD8XKFXxGwBMxH_fw4ZqfaHE_oc9GLtH9FgmtFPO1NR4q9j142gI8IYtUJ8HBI6vxMfgHBSInAT0u6Xf03cT4uwDSPcKMxjJSTQjtEr1okyP0AkWT5FOCQMPc6iKEOk/s1600/4.png" height="320" width="295" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">חלק קטן מ OpenWRT</td></tr>
</tbody></table>
<br />
<br />
הממשק הבסיסי מאוד פשוט ועונה על הצרכים למתחילים, אבל למי שרוצה להעמיק ניתן להתחבר לממשק המקורי של OpenWRT שמזכיר מאוד נתב סטנדרטי על ידי לחיצה על הקישור Advanced Configure Panel.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBh6XUtX1RWqp9e_GVVkzQ1G4ciaxCb1ojkZeGpg2F2yu5EZSjn5Ha2jyHWYNaf0c9a6msbwRr_xRZRyUesA1Ky7FEUTls5S5SPYqA3pEto8Vgipub_dwygaJ4bXsr6cupsvxKEo6oPjVt/s1600/5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBh6XUtX1RWqp9e_GVVkzQ1G4ciaxCb1ojkZeGpg2F2yu5EZSjn5Ha2jyHWYNaf0c9a6msbwRr_xRZRyUesA1Ky7FEUTls5S5SPYqA3pEto8Vgipub_dwygaJ4bXsr6cupsvxKEo6oPjVt/s1600/5.png" height="225" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">טירוף...</td></tr>
</tbody></table>
<br />
<br />
<div dir="ltr" style="text-align: left;">
<b><span style="color: #3d85c6;">Bridge</span></b></div>
<br />
לפני שנתחיל לכתוב את התוכנית המגשרת בין 2 המעבדים, תחילה יש להשתמש בסביבת <a href="http://arduino.cc/en/Main/Software">Arduino</a> מעודכנת מעל 1.5 שמכילה את הספריות של Yun ו Driver חדש יותר שתומך בלוח,את התוכנית צורבים על הזיכרון של המעבד ATmega בצורה סטנדרטית כמו שעושים לשאר הלוחות של Arduino, רק חשוב לבחור את הלוח המתאים ברשימה, קיימת דוגמה מוכנה שמגיעה עם הגרסה המעודכנת ולמי שחסר ניתן להוריד אותה <a href="http://arduino.cc/en/Tutorial/Bridge">מכאן</a> כך שלא צריך להתאמץ יותר מידי.<br />
<br />
בעזרת פרטוקול Http ושרת Web, נוכל לשלוט על הפינים בעזרת מבנה Url, לדוגמה נניח שנרצה להפוך את Pin 13 ל OutPut נקרא לכתובת במבנה מסויים שברגע שתגיע לשרת הוא יחתוך אותה ויפעל בהתאם כפי שניתן לראות בדוגמאות הבאות:<br />
<br />
הגדרת הרגל כ Input / Output:<br />
<div dir="ltr" style="text-align: left;">
<b>http://arduino.local/arduino/mode/13/output</b></div>
כתיבת ערך לרגל דיגיטלית:<br />
<div dir="ltr" style="text-align: left;">
<b>http://arduino.local/arduino/digital/13/1</b></div>
קריאת ערך מרגל דיגיטלית:<br />
<div dir="ltr" style="text-align: left;">
<b>http://arduino.local/arduino/digital/13</b></div>
כתיבה ערך לרגל אנלוגית:<br />
<div dir="ltr" style="text-align: left;">
<b>http://arduino.local/arduino/analog/2/128</b></div>
קריאת ערך מרגל אנלוגית:<br />
<div dir="ltr" style="text-align: left;">
<span style="text-align: left;"><b>http://arduino.local/arduino/analog/2</b></span></div>
<div dir="ltr" style="text-align: left;">
<span style="text-align: left;"><br />
</span></div>
<br />
אחרי שצרבנו את התוכנית, אפשר לעבור לתוכנית השניה שנכתוב Python שתדבר עם ה Bridge ותשלוט ברגליים על פי הצורך, במקרה הזה נתחבר בצורה מקומית, זה יתרון אדיר שמאפשר לנו לשלב את המעבדים בצורה פשוטה ולהנות מכל העולמות בו זמנית, נשתמש במספר כלים שיעזרו לנו בעבודה:<br />
<div style="text-align: right;">
</div>
<ul style="text-align: right;">
<li><a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">Putty</a> - נתחבר ל Arduino Yun בעזרת SSH.</li>
<li><a href="http://winscp.net/eng/download.php">WinSCP</a> - העברת קבצים בין המחשב האישי ל Arduino Yun.</li>
</ul>
<div>
נפתח Notepad ונרשום את הקוד הבא:</div>
<div>
<br /></div>
<div dir="ltr" style="text-align: left;">
<div>
<span style="color: lime;">#Arduino Yun blink example using Bridge with Python</span></div>
<div>
<span style="color: lime;">#proxytype.blogspot.com</span></div>
<div>
<span style="color: lime;">#getting Thread function from Thread class</span></div>
<div>
from threading import Thread</div>
<div>
<br /></div>
<div>
<span style="color: lime;">#add Libraries</span></div>
<div>
import urllib2</div>
<div>
import time</div>
<div>
<br /></div>
<div>
<span style="color: lime;">#selected Pins</span></div>
<div>
PIN = 7</div>
<div>
<br /></div>
<div>
<span style="color: lime;">#set pins output/input</span></div>
<div>
response = urllib2.urlopen('http://localhost/arduino/mode/' + str(PIN) + '/output')</div>
<div>
print response.read()</div>
<div>
<br /></div>
<div>
def main(n):</div>
<div>
<span style="color: lime;">#flag</span></div>
<div>
Status = False</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div>
while True:</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>if Status == False:</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>Status = True</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>response = urllib2.urlopen('http://localhost/arduino/digital/' + str(PIN) + '/1')</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>print response.read()</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>else:</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>Status = False</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>response = urllib2.urlopen('http://localhost/arduino/digital/' + str(PIN) + '/0')</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>print response.read()</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>time.sleep(n)</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div>
<span style="color: lime;">#start in new thread, send second to sleep</span></div>
<div>
t = Thread(target=main, args=(1,))</div>
<div>
t.start()</div>
</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<br />
<br />
נשמור את הקובץ ונעביר אותו ל Yun בעזרת WinSCP, ואח"כ נתחבר ל Terminal בעזרת SSH ונריץ את התוכנית:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNrM8v7RiyAkckGzGaxsZ0HFB3Xef61ckoRN2IGOBfP562J6VZeUT3HpxA8lwOo5pfuWvDWWJMylrOhyFuWyTQIBLv4nlpSCov6-LdMoa5tm33tcr-D1x7djzdigHQmM3P-B7AkaXaX0xx/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNrM8v7RiyAkckGzGaxsZ0HFB3Xef61ckoRN2IGOBfP562J6VZeUT3HpxA8lwOo5pfuWvDWWJMylrOhyFuWyTQIBLv4nlpSCov6-LdMoa5tm33tcr-D1x7djzdigHQmM3P-B7AkaXaX0xx/s1600/6.png" height="201" width="320" /></a></div>
<br />
<br />
<span style="color: #3d85c6;"><b>סרט לדוגמה</b></span><br />
<br />
<div align="center">
<iframe allowfullscreen="" frameborder="0" height="360" src="//www.youtube.com/embed/5902resmVc0" width="500"></iframe><br /></div>
<br />
<b><span style="color: #3d85c6;">סיכום</span></b><br />
<br />
הלוח הזה לוקח את כל העסק צעד אחד קדימה במחיר יחסית שפוי של 60$, ומאפשר לנו לכתוב פרוייקטים יותר מורכבים ועדיין להישאר באותה מסגרת נוחה של Arduino, בהמשך נראה כיצד להשתמש בספריות היעודיות של ה Yun שמאפשרות לגשת למשאבי ה Linux מבלי לעזוב את ה IDE.<br />
<br />
יותר שכל באותו מקום...<br />
<br /></div>
<br /></div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-32627182450574742302014-08-16T08:44:00.000-07:002014-08-16T09:31:17.070-07:00Raspberry Pi - Starting Guide<div dir="rtl" style="text-align: right;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY9LLgTaV_23FlBLUw7349OxbbG0ZO40L3l78FdfiZuoLwCBz2y5GneJug2vDiLntVmc5XhKxFgCnN9_RGLTvzoKILPA207pBmydRJAQYfxUleikv1pgonJ1-iblqi0PnsZ-hLiU7-YShk/s1600/Raspberry-Pi-logo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY9LLgTaV_23FlBLUw7349OxbbG0ZO40L3l78FdfiZuoLwCBz2y5GneJug2vDiLntVmc5XhKxFgCnN9_RGLTvzoKILPA207pBmydRJAQYfxUleikv1pgonJ1-iblqi0PnsZ-hLiU7-YShk/s320/Raspberry-Pi-logo.jpg" height="285" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
אם חשבתם ש Raspberry PI יעבור לידי ואני לא אתייחס אליו אז טעיתם, הלוח הזה שינה את כללי המשחק בכל הקשור למערכות Embedded ו SOC, הוא זול ,פשוט ומגיע עם מגוון רחב של חיבורים, אין משהו שלא עשו איתו ממערכות פשוטות למחשבי על, הוא תוכנן ע"י ארגון צדקה בשם <a href="http://en.wikipedia.org/wiki/Raspberry_Pi_Foundation">Raspberry Pi Foundation</a> שמטרתו ללמד מדעי המחשב באופן חופשי בעולם.<br />
<br />
הסדרה מכילה 3 דגמים עם את אותו מעבד ARM 700MHZ (בנתיים) וההבדלים העיקריים הם בציוד היקפי (Peripherals) שמשתנים מדגם לדגם ומשפיעים על המחיר.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEill8Jy2kz8P1jIEQclcli_R9e5n6Ha-9kBUZWOQXRHpM4YEH6r6ib2Azp8HUEq7uRwHvDURyvoJczRVDEj-BgK7tlNt4UCQObahZt6DoKeKyPTa0nZg2pleQu5GJ8EXYk6es15_HbDDQ0u/s1600/1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEill8Jy2kz8P1jIEQclcli_R9e5n6Ha-9kBUZWOQXRHpM4YEH6r6ib2Azp8HUEq7uRwHvDURyvoJczRVDEj-BgK7tlNt4UCQObahZt6DoKeKyPTa0nZg2pleQu5GJ8EXYk6es15_HbDDQ0u/s1600/1.png" height="640" width="202" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">www.sparkfun.com</td></tr>
</tbody></table>
<br />
<br />
<br />
<b><span style="color: #3d85c6;">דרישות</span></b><br />
<br />
<ul style="text-align: right;">
<li>Raspberry PI Model B</li>
<li>SDCard 8 GB</li>
<li>TFT Monitor</li>
<li>Keyboard + Mouse</li>
<li>LED</li>
<li>330ohm Resistor</li>
<li>Breadboard</li>
<li>Wires</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq3J_npkyyg7A7pEIRrFgiikO1rkfBDDGPXEPppJdo14UTqv-5jPxxeSXpElr3C0caUhIjFkqrLojSIMSRHd82uvO2AGu4F3O_1oYf3cGYQ_rnuFKLT88w7YJdjMn0khPh0gLilyILfEqL/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq3J_npkyyg7A7pEIRrFgiikO1rkfBDDGPXEPppJdo14UTqv-5jPxxeSXpElr3C0caUhIjFkqrLojSIMSRHd82uvO2AGu4F3O_1oYf3cGYQ_rnuFKLT88w7YJdjMn0khPh0gLilyILfEqL/s1600/6.png" height="237" width="320" /></a></div>
<br />
<br />
<br />
<span style="color: red;"><b>שימו לב!</b></span><br />
<ul style="text-align: right;">
<li>יש לחבר לספק 5V בלבד!</li>
<li>חשוב לזכור שהפינים של ה 5V מוגבלים עד 300ma וה 3.3V עד 50ma.</li>
</ul>
<br />
<b><span style="color: #3d85c6;">התקנה</span></b><br />
<br />
יש להוריד את קבצי ההתקנה של מערכת ההפעלה <a href="http://www.raspberrypi.org/">מהאתר הרשמי</a>, קיימות גרסאות שונות של Linux שניתן להתקין, יש גרסת Noobs למשתמשים חדשים שמאפשרת התקנה מהירה ונוחה.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV9cWvXpcjzzUXSUh5c1cAFyG6Iu4FWP4ABWqZoiGOtfIj8S_zfNlGuF1qNujxa31fqiZFqFVHx6VdBV4pLXUc9LCPQaGUNltwFWApMR5dUACC5rzDu3HCZaIEiITdyiE0gsyEK0dQ5mBH/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV9cWvXpcjzzUXSUh5c1cAFyG6Iu4FWP4ABWqZoiGOtfIj8S_zfNlGuF1qNujxa31fqiZFqFVHx6VdBV4pLXUc9LCPQaGUNltwFWApMR5dUACC5rzDu3HCZaIEiITdyiE0gsyEK0dQ5mBH/s1600/2.png" height="225" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">http://www.raspberrypi.org/downloads/</td></tr>
</tbody></table>
<br />
<br />
לפני ההתקנה של מערכת ההפעלה יש לוודא שהכרטיס ה SD עבר פורמט, ניתן לבצע זאת בעזרת SD Formatter שבהורדה חינם מהאתר של <a href="https://www.sdcard.org/home/">SDCard</a>, או באמצעות הפורמט של Windows אבל בחלק מהכרטיסים זה עלול לגרום לאיטיות ולבעיות.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVc2lBzIUbj0ZWjmCL8LkDdti3hwnySMApTbizmE3xlNMV-JIGqbTNZEw6710CiWauJ0uGM-QszeTw8lcwjKdSj9py2EBu-oNJ71NnHrmpyxjjSIGbz8S7XX6w3qeNGMdYBuuyFEpBhv00/s1600/4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVc2lBzIUbj0ZWjmCL8LkDdti3hwnySMApTbizmE3xlNMV-JIGqbTNZEw6710CiWauJ0uGM-QszeTw8lcwjKdSj9py2EBu-oNJ71NnHrmpyxjjSIGbz8S7XX6w3qeNGMdYBuuyFEpBhv00/s1600/4.png" height="273" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">https://www.sdcard.org/downloads/formatter_4/</td></tr>
</tbody></table>
<br />
לאחר סיום הפורמט נפתח את קובץ ה Zip ונעתיק את התוכן שלו ל SDcard, נחבר מקלדת ומסך ואפשר לומר שסיימנו, הלוח מגיע עם כניסת HDMI שניתן לחבר לכל טלויזיה או מסך וחיבור S-Video סטנדרטי למסכים קצת יותר פרימיטביים לצורך הדוגמה אני משתמש במסך בגודל 5 אינץ שמתאים בעיקר לרכב שרכשתי מ <a href="http://www.dx.com/">DX</a> תמורת 40$ היתרון שלו על פני שאר המסכים שניתן גם לחבר VGA, בדר"כ המסכים האלה מגיעים ללא ספק כוח ודורשים 12V אבל הצלחתי להפעיל אותו ב 9V ואני מאמין שאפשר גם בפחות.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4qRZQiGO4j-guP850b1RMq7G6sv0Cm5WMaM8xtHHRMKfFdKpqMZo7F3lfsTn1Euh7AirtqN_719cBMyWjIxYEh65EnIeRCuaFN2GKUWR5eoeOvhk17tcivj9O7Jt2NLEukbac_tgTxh_X/s1600/4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4qRZQiGO4j-guP850b1RMq7G6sv0Cm5WMaM8xtHHRMKfFdKpqMZo7F3lfsTn1Euh7AirtqN_719cBMyWjIxYEh65EnIeRCuaFN2GKUWR5eoeOvhk17tcivj9O7Jt2NLEukbac_tgTxh_X/s1600/4.png" height="155" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">סיני זול שעושה את עבודה.</td></tr>
</tbody></table>
<br />
<br />
במהלך ה Boot של הלוח ניתן ללחוץ Shift 3 על מנת להעביר את התצוגה ל S-Video ב PAL ומשם להמשיך בהתקנה, קובץ ההתקנה מכיל מספר distributions של Linux מותאמות ל Raspberry Pi, אבל מומלץ להשתמש ב Raspbian שהיא הפופלרית ביותר.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYF_3U_jKAgwzQBemzPfgdNGg6zPZ3ruefrxCEIA-8Yz8u02zpP_bHxBUSEMjCrFImlqc601kUD5wGJ1jC67qJA1pZ5rPApavnOIubrqkFGAdHebsz-w77tRNzr1pWH0dzQ9UVUvfUKjqj/s1600/20140816_022624.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYF_3U_jKAgwzQBemzPfgdNGg6zPZ3ruefrxCEIA-8Yz8u02zpP_bHxBUSEMjCrFImlqc601kUD5wGJ1jC67qJA1pZ5rPApavnOIubrqkFGAdHebsz-w77tRNzr1pWH0dzQ9UVUvfUKjqj/s1600/20140816_022624.jpg" height="240" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">שתו קפה יש זמן...</td></tr>
</tbody></table>
<br />
בסיום ההתקנה הלוח יעשה Boot ויעלה מסך הגדרות הם מספר אפשרויות, קודם כל מומלץ להחליף את סיסמאת ה Default שהיא raspberry עבור משתמש PI, ניתן להגדיר Overclock ועוד כל מיני דברים, תמיד אפשר לחזור למסך הזה ע"י הפקודה raspi-config עם Sudo.<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi00DZRStAqB4Tt4E3sTwJs2bk5CdO3sqjbHgwHMomoxUbkLGdoKqUQFGFhChdcxvj9MG-uc8gwl-xdVmLPnGWRElrYYElOnEawPEHTpahEH3EFC_ZQbrsLQ3XfGkii0eHLaudmVTUOuQsE/s1600/20140816_023717.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi00DZRStAqB4Tt4E3sTwJs2bk5CdO3sqjbHgwHMomoxUbkLGdoKqUQFGFhChdcxvj9MG-uc8gwl-xdVmLPnGWRElrYYElOnEawPEHTpahEH3EFC_ZQbrsLQ3XfGkii0eHLaudmVTUOuQsE/s1600/20140816_023717.jpg" height="240" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Overclock - נחמד!</td></tr>
</tbody></table>
<br />
בסיום יעלה לנו הטרמינל הרגיל של Linux, בעזרת הפקודה startx נעבור לממשק חלונאי:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGwvtbxSxRasAFeP1mtyhgsq1kp5Nw-LHgjVnT7jxwb4OQ9tQOWcDqUV58-JdXxJ3df-Kf-PI3eqqjh60DseMTUoqVzoSJzwakjpI26i27hTlneiPgEa8alV2nKh0xqElIneds3krpez2K/s1600/3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGwvtbxSxRasAFeP1mtyhgsq1kp5Nw-LHgjVnT7jxwb4OQ9tQOWcDqUV58-JdXxJ3df-Kf-PI3eqqjh60DseMTUoqVzoSJzwakjpI26i27hTlneiPgEa8alV2nKh0xqElIneds3krpez2K/s1600/3.png" height="240" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ואוו...</td></tr>
</tbody></table>
<br />
<span style="color: #3d85c6;"><b>קוד</b></span><br />
<br />
המערכת מוכנה ואפשר להתחיל לכתוב את הקוד הראשון, בעבר הדגמתי כיצד לתכנת פינים ב <a href="http://proxytype.blogspot.co.il/2013/05/beaglebone-and-arduino.html">BeagleBone</a> וזה לא כלכך שונה מה PI, כי נחזור על אותה קלישאה ישנה שהכל ב Linux זה קובץ וכל מה שנשאר זה לפתוח אותו ולכתוב בו ערך באיזה שפה שנרצה, במקרה של ה PI שפת ה Python מגיעה כחלק מהמערכת אבל לפני הקוד חשוב להכיר את הפינים עצמם.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsxuFRNR9G38caBOJ-hJGSQvL2FNXT79AZRtleFc3VtKtsiwsF4w5gct50Aupm-D4ZoJ_SmtU8vcLimc6QjLtazlz9_BMHZNS3uyZEiPAhaPndmLklERymdDRpLBqBp9BvQd0UHYEQVbla/s1600/5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsxuFRNR9G38caBOJ-hJGSQvL2FNXT79AZRtleFc3VtKtsiwsF4w5gct50Aupm-D4ZoJ_SmtU8vcLimc6QjLtazlz9_BMHZNS3uyZEiPAhaPndmLklERymdDRpLBqBp9BvQd0UHYEQVbla/s1600/5.png" height="380" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">26 פינים שחלקם עם שימוש נוסף</td></tr>
</tbody></table>
<br />
26 פינים שבחלקם ניתן לעשות יותר משימוש אחד, ניתן לעבוד עם מספר ממשקים שונים (UART,SPI,I2C), במערכת מגיעה סביבת פיתוח פשוטה של Python שנקרא <a href="http://en.wikipedia.org/wiki/IDLE_(Python)">IDLE</a> שבעזרתו נכתוב את הקוד, אם לא בא לכם לעבוד ישירות על הלוח ניתן להתחבר אליו בעזרת SSH.<br />
<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">#add Libraries</span></div>
<div dir="ltr" style="text-align: left;">
import RPi.GPIO as GPIO</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">#use board pins</span></div>
<div dir="ltr" style="text-align: left;">
GPIO.setmode(GPIO.BOARD)</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">#selected pin</span></div>
<div dir="ltr" style="text-align: left;">
pin = 7</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">#set GPIO as output</span></div>
<div dir="ltr" style="text-align: left;">
GPIO.setup(pin, GPIO.OUT)</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">#set flag false</span></div>
<div dir="ltr" style="text-align: left;">
status = False</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
while True:</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if status == False:</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>GPIO.output(pin,GPIO.LOW)</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>status = True</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>else:</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>GPIO.output(pin,GPIO.HIGH)</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>status = False</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>x = raw_input('Press Key!')</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<br />
<br />
<br />
<br />
<span style="color: #3d85c6;"><b>מבנה סופי</b></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2j2o01Nq_YQo3ZoPHHVvSgTD_p6idNNHwIIOhYkP5nipxQXdsJmUu8Sz9AClIAlDaait_wsCxt5We-XXVTG-MvbRDD1PhT1t9qE_uETs9u-Mgn8InqyOZOcikAGClr8OT6jNK6wc8MNsI/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2j2o01Nq_YQo3ZoPHHVvSgTD_p6idNNHwIIOhYkP5nipxQXdsJmUu8Sz9AClIAlDaait_wsCxt5We-XXVTG-MvbRDD1PhT1t9qE_uETs9u-Mgn8InqyOZOcikAGClr8OT6jNK6wc8MNsI/s1600/7.png" height="224" width="320" /></a></div>
<br />
<br />
<span style="color: #3d85c6;"><b>סרט הדגמה</b></span><br />
<br />
<div align="center">
<iframe allowfullscreen="" frameborder="0" height="360" src="//www.youtube.com/embed/JwH9jSahhRs" width="500"></iframe><br /></div>
<br />
<br />
<span style="color: #3d85c6;"><b>סיכום</b></span><br />
<br />
הלוח הזה פשוט מדהים, אפשר לעשות איתו הכל ויש סביבו קהילה ענקית של מפתחים ,כל יום נולד בעזרתו פרוייקט חדש, הוא גרם לירידת מחירים רצינית בתחום וקבע רף חדש של 40$ ללוח, בקיצור מדובר על מחשב קטן שמתאים לצרכים בסיסיים ואפילו מעבר לכך.<br />
<br />
יש פטל?<br />
<br />
<br />
<br />
<br />
<div dir="ltr" style="text-align: left;">
<br /></div>
<br />
<br /></div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com2tag:blogger.com,1999:blog-4229028639498269114.post-49868840020166202342014-07-14T09:28:00.000-07:002014-07-14T09:28:45.066-07:00GPS with Arduino<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXksylgxG0p7sOtFx3D0nYybwR9_t9HYeIg4pL3lnCgI-_QOk3ZICPHaFhQZ2V96kiaMHco522NK880xzgXCUJILYHA0zK5EDwrgDjUdwrdpYuaJKhFY-XkgcTdfS-cwd2ASMncDSZj8t7/s1600/logo_arduino.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXksylgxG0p7sOtFx3D0nYybwR9_t9HYeIg4pL3lnCgI-_QOk3ZICPHaFhQZ2V96kiaMHco522NK880xzgXCUJILYHA0zK5EDwrgDjUdwrdpYuaJKhFY-XkgcTdfS-cwd2ASMncDSZj8t7/s1600/logo_arduino.jpg" height="139" width="320" /></a></div>
<br />
פעם הכל היה מסובך על מנת להגיע למקום מסויים ההית צריך לשבת על המפה לחשב את המסלול ולשאול אנשים בדרך במקרה שטעית, היום הכל פשוט יותר בעזרת GPS כבר אי אפשר ללכת לאיבוד, התכנולגיה נכנסה לתודעה בעיקר במערכות הניווט לרכב ועם הזמן נכנסה לכל מכשיר נייד. <br />
<br />
<span style="color: #3d85c6;"><b>דרישות</b></span><br />
<br />
<ul style="text-align: right;">
<li>(Arduino (any kind will do the job</li>
<li>GPS Module + Antenna</li>
<li>Breadboard</li>
<li>Wires</li>
</ul>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiJZCC7-os-QvNlCAfgNDs5bGWvKNBIJPQhGZoBWnSbdfJssr20wTKPAWnJ-XyR6iMFVXDjiny6l8Y8Pjd7F7vIZam0C7ml3OOJqPIO5T4jtasdpgoArvvZsKD2dASHizmfzwN5fZJPHmp/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiJZCC7-os-QvNlCAfgNDs5bGWvKNBIJPQhGZoBWnSbdfJssr20wTKPAWnJ-XyR6iMFVXDjiny6l8Y8Pjd7F7vIZam0C7ml3OOJqPIO5T4jtasdpgoArvvZsKD2dASHizmfzwN5fZJPHmp/s1600/2.png" height="217" width="320" /></a></div>
<br />
<br />
<br />
<div dir="ltr" style="text-align: left;">
<b><span style="color: #3d85c6;">Global Positioning System</span></b></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: right;">
מערכת לוויינים שמקיפה את כדור הארץ ושולחת אותות לרחבי העולם, מקלט <a href="http://en.wikipedia.org/wiki/Global_Positioning_System">GPS</a> מקבל מספר אותות מלוויינים שונים ומחשב את מיקומו ביחס אליהם, את המקלט שלי רכשתי ב <a href="http://www.dx.com/p/gy-gps6mv1-gps-apm2-5-module-w-antenna-deep-blue-3-5v-306823#.U7-8l_mSyYV">DX</a> במחיר של 21 דולר, הוא מבוסס על ממשק סיראלי שהופך את העסק להרבה יותר פשוט.</div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6S-ad4_CZtZUR4kOaGzEP5_LxUVic6g4GA8uCeKPTiv3UctITJHpVR0Lf2m-zJc4nRTiNqZb_n93wJOzu8xcySErsOM9HZob60V72k_yPhKlrN5J2K896x0DKMwy2dIi7bLnjfIju4Qdv/s1600/1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6S-ad4_CZtZUR4kOaGzEP5_LxUVic6g4GA8uCeKPTiv3UctITJHpVR0Lf2m-zJc4nRTiNqZb_n93wJOzu8xcySErsOM9HZob60V72k_yPhKlrN5J2K896x0DKMwy2dIi7bLnjfIju4Qdv/s1600/1.png" height="169" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">GY-GPS6MV1</td></tr>
</tbody></table>
<br /></div>
<div style="text-align: right;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: right;">
<b><span style="color: #3d85c6;">קוד</span></b><br />
<b><span style="color: #3d85c6;"><br /></span></b></div>
<div dir="ltr" style="text-align: left;">
#include <SoftwareSerial.h><br />
#include <TinyGPS.h><br />
<br />
TinyGPS tGps;<br />
SoftwareSerial gpsSerial(5, 6);<br />
<br />
void setup() {<br />
<br />
<span style="color: lime;"> //arduino serial - 115200</span><br />
Serial.begin(115200);<br />
<span style="color: lime;"> //gps serial - 9600</span><br />
gpsSerial.begin(9600);<br />
<br />
}<br />
<br />
void loop() {<br />
<br />
while (gpsSerial.available())<br />
{<br />
<span style="color: lime;"> //add char to buffer inside TinyGps</span><br />
char c = gpsSerial.read();<br />
tGps.encode(c);<br />
}<br />
<br />
float latitude, longitude;<br />
<br />
<span style="color: lime;"> //get results as float</span><br />
tGps.f_get_position(&latitude, &longitude, NULL);<br />
<br />
Serial.print("Latitude: ");<br />
Serial.println(latitude,6);<br />
Serial.print("Longitude: ");<br />
Serial.println(longitude,6);<br />
<br />
delay(100);<br />
<br />
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<div dir="rtl" style="text-align: right;">
סה"כ מגדירים פינים עבור ה Rx וה Tx של המקלט, ויוצרים חיבור סיראלי בעזרת הספריה NewSoftSerial, על מנת לנתח את המידע של ה Gps נעזרים בספריה <a href="https://github.com/mikalhart/TinyGPS">TinyGps</a> שחוסכת לנו זמן בחיתוך המחרוזות ושליפת פרמטרים.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
</div>
<div style="text-align: right;">
<b><span style="color: #3d85c6;">מבנה סופי</span></b><br />
<b><span style="color: #3d85c6;"><br /></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqOuqYNGXY6yVTE3EoUifhk2PbS_FigF7Avv_aSEoTgf_k6GJFxT6O_J8bVIJiRh4kIgHu5ErHczJIdZAphIy6npCS-YuuYZcTFpJpWvtWhDH6m7OamMoF8YWsKW3G9oCaVzQn6JpC4Vn6/s1600/20140711_145056.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqOuqYNGXY6yVTE3EoUifhk2PbS_FigF7Avv_aSEoTgf_k6GJFxT6O_J8bVIJiRh4kIgHu5ErHczJIdZAphIy6npCS-YuuYZcTFpJpWvtWhDH6m7OamMoF8YWsKW3G9oCaVzQn6JpC4Vn6/s1600/20140711_145056.png" height="212" width="320" /></a></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: right;">
<span style="color: #3d85c6;"><b>סיכום</b></span></div>
<div style="text-align: right;">
<br />
מעבר לניווט הסטנדרטי ניתן להשתמש ב GPS בפרוייקטים למעקב בדומה לאיתורן במקרה של גניבת רכב או בטייסים אוטומטים לטיסנים ורחפנים, בעזרת לוח GSM ניתן לשדר את מידע לתחנה מרוחקת ו להעזר ב Google Maps על מנת להציג את הקואורדינטות על המפה.<br />
<br />
איפה אני?!</div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-89532038589413787232014-07-04T12:40:00.001-07:002014-07-04T12:40:38.467-07:003D Printing<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2KHLoiLbptk3tQBTBFViLjBjPMast_GGRVMywPv1crTA88k7AW89zY7wjHxrEFFE7UtPIpCNTOlOWME1F6LNXX_JI0aiyvRqofcEexmE30YVEsp41kyCH0IxH-rl_H36suAeClgB7LTJk/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2KHLoiLbptk3tQBTBFViLjBjPMast_GGRVMywPv1crTA88k7AW89zY7wjHxrEFFE7UtPIpCNTOlOWME1F6LNXX_JI0aiyvRqofcEexmE30YVEsp41kyCH0IxH-rl_H36suAeClgB7LTJk/s1600/10.png" height="238" width="320" /></a></div>
<br />
<br />
תחום שמתחיל לתפוס תאוצה עצבנית בזמן האחרון הוא הדפסת תלת מימד, אי אפשר כבר להיות אדישים למה שקורה בתעשיה שהולכת ומתפתחת בצורה בלתי רגילה במיוחד בשנתיים האחרונות, החל ממדפסות מורכבות ויקרות מאוד למדפסות פשוטות במחירים שפויים של 300 דולר, יש ברשותי מדפסת כבר קרוב לשנה והחלטתי לשתף אותכם בנסיון שהצטבר לי עם הזמן, לכן החלטתי לכתוב סדרת מאמרים קצרה על הנושא למרות שאין לזה קשר ישיר לפיתוח תוכנה.<br />
<br />
<b><span style="color: #3d85c6;">יצרנים:</span></b><br />
<br />
התעשיה התפתחה מאוד בשנים האחרונות, יש המון יצרנים והמון טכנולוגיות להדפסת תלת מימד על מנת לעשות סדר רכזתי קבוצה של יצרנים שאני חושב שהם מובילי הדגל בתעשיה למרות שקיימים עשרות יצרנים נוספים.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKzYwm0bXOZA773M5dsumdodgOwbDLVqbNWmDiYraaTwZA3-yiwmjCoYsfvct1LmLN2UMmOixpMgTj-R_EE8aoHHVumrts6InHU17mG-4K8SK-Kc0EDKyaIqzViZO5RezhrS83DmveePKf/s1600/Objet-Logo.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKzYwm0bXOZA773M5dsumdodgOwbDLVqbNWmDiYraaTwZA3-yiwmjCoYsfvct1LmLN2UMmOixpMgTj-R_EE8aoHHVumrts6InHU17mG-4K8SK-Kc0EDKyaIqzViZO5RezhrS83DmveePKf/s1600/Objet-Logo.png" height="128" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">גאווה ישראלית</td></tr>
</tbody></table>
<ul style="text-align: right;">
<li><b><span style="color: #3d85c6;">Objet </span></b>- השחקנית הותיקה בתחום, אפשר להגיד החלוצה בעולם הדפסת התלת מימד, זו חברה ישראלית שממוקמת ברחובות ולא מזמן חתמה הסכם עם חברה אמריקאית במליוני דולרים.</li>
</ul>
<div>
<b>איכות</b>: הטובה ביותר שיש בשוק 25 מיקרון.</div>
<div>
<b>מחיר</b>: יקרה מאוד, רק למביני עניין.</div>
<div>
<b>חומרים</b>: פולימר רגיש לאור,קיימים סוגים שונים של חומרים לכל מטרה.</div>
<div>
<b>תחזוקה</b>: מתוחזקת ע"י אנשי מקצוע.<br />
<b>אתר היצרן</b>: <a href="http://www.stratasys.com/">stratasys.com</a></div>
<div>
<br /></div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKpKkfglYJPGEg12pIns_MFlO-uwGB3mn0HFmW9khngD4u7mrCdEizYjbZYsw3HnNxOInVpx8TERe1OyW2qujcVGrfcCTQk2yEIG6az9HfPlH9dDomTzarU81D2w1pHCbrKK6W05ZEJfZw/s1600/download.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKpKkfglYJPGEg12pIns_MFlO-uwGB3mn0HFmW9khngD4u7mrCdEizYjbZYsw3HnNxOInVpx8TERe1OyW2qujcVGrfcCTQk2yEIG6az9HfPlH9dDomTzarU81D2w1pHCbrKK6W05ZEJfZw/s1600/download.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">כל הסוגים וכל החומרים במקום אחד</td></tr>
</tbody></table>
<div>
<ul style="text-align: right;">
<li><b><span style="color: #3d85c6;">3DSYSTEM</span></b> - חברה אמריקאית שמחזיקה מספר סוגים של מדפסות, היא רכשה את חברת Zcrop שהחזיקה בסדרה האיכותית של מדפסות שנקראו Zprinter שמאפשרות להזריק צבע רגיל של מדפסת ביתית לאובייקט תוך כדי ההדפסה.</li>
</ul>
<div>
<b>איכות</b>: איכותית מאוד, 80 מיקרון.</div>
</div>
<div>
<b>מחיר</b>: יקרה מאוד, רק למביני עניין.</div>
<div>
<b>חומרים</b>: פולימר אבקתי בשילוב דבק עם צבע.</div>
<div>
<b>תחזוקה</b>: מתוחזקת ע"י אנשי מקצוע.<br />
<b>אתר היצרן</b>: <a href="http://www.3dsystems.com/">3dsystems.com</a></div>
<div>
<br />
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4VwUfh-XHijHQxTFz0xPT-IdyySJW0nO-IGhZ5ekfxIehlswaTQIKxhR7zGh_FhHPppKQLIGQdyc0UIKQUiHIF6x7o4xrv4_OwfkGi4nj2SXFeVp-D5VKGo6KE0vDdRYr_VYU03FBAGc5/s1600/MakerBot_logo_300x300.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4VwUfh-XHijHQxTFz0xPT-IdyySJW0nO-IGhZ5ekfxIehlswaTQIKxhR7zGh_FhHPppKQLIGQdyc0UIKQUiHIF6x7o4xrv4_OwfkGi4nj2SXFeVp-D5VKGo6KE0vDdRYr_VYU03FBAGc5/s1600/MakerBot_logo_300x300.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">הפכו למוצר מסחרי</td></tr>
</tbody></table>
<ul style="text-align: right;">
<li><b><span style="color: #3d85c6;">Makerbot </span></b>- בין החברות הראשונות שלקחו את רעיון ה OpenSource של מדפסת ה <a href="http://en.wikipedia.org/wiki/RepRap_Project">Reprap</a> והפכו אותו למסחרי, היא מייצרת סדרת מדפסות בגדלים שונים המובססות על טכנולוגיה <a href="http://en.wikipedia.org/wiki/Fused_deposition_modeling">FDM</a>, על אחת המדפסות ארחיב בהמשך.</li>
</ul>
<div>
<b>איכות</b>: איכות מקסימלית עד 100 מיקרון.</div>
<div>
<b>מחיר</b>: מעל 1000 דולר.</div>
<div>
<b>חומרים</b>: <a href="http://en.wikipedia.org/wiki/Acrylonitrile_butadiene_styrene">ABS</a>, <a href="http://en.wikipedia.org/wiki/Polylactic_acid">PLA</a> בצבעים שונים.</div>
<div>
<b>תחזוקה</b>: באופן עצמאי.<br />
<b>אתר היצרן</b>: <a href="http://www.makerbot.com/">makerbot.com</a></div>
<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM-VJ54cKqMeBcTaMS1c6RkJP7ijhryz5r2q2DN6F1ulVkwD9RVecB01l29d6Jl8JYKm6zUm_3XpnKhzglFI_GCOLIZjpQaOF82mOLkmAEBRUQKqfF5XUz3JI_XZWQkFbzaEebL_Nu4-X-/s1600/1328822733Formlabslogo.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM-VJ54cKqMeBcTaMS1c6RkJP7ijhryz5r2q2DN6F1ulVkwD9RVecB01l29d6Jl8JYKm6zUm_3XpnKhzglFI_GCOLIZjpQaOF82mOLkmAEBRUQKqfF5XUz3JI_XZWQkFbzaEebL_Nu4-X-/s1600/1328822733Formlabslogo.png" height="320" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">איכות כמו של הגדולים</td></tr>
</tbody></table>
<ul style="text-align: right;">
<li><b><span style="color: #3d85c6;">FormLabs </span></b>- פרויקט שיצא מ KickStarter , מדובר על מדפסת ביתית ב High Definition שמבוססת על הטכנולוגיה <a href="http://en.wikipedia.org/wiki/Stereolithography">SLA</a>, איכות הדפסה כמו של Objet אבל ניתן להשתמש בחומר אחד.</li>
</ul>
<div>
<b>איכות</b>: הטובה ביותר שיש בשוק כרגע, 25 מיקרון.</div>
<div>
<b>מחיר</b>: מעל 3000 דולר.</div>
<div>
<b>חומרים</b>: <a href="http://en.wikipedia.org/wiki/Synthetic_resin">Resin</a>.</div>
<div>
<b>תחזוקה</b>: באופן עצמאי.<br />
<b> אתר היצרן</b>: <a href="http://formlabs.com/">formlabs.com</a></div>
<div>
<br /></div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiIpxNNTE9HrbDqhl3jQuBQ5lYnh06Z6E_XuVQP5nAnOapIUkiGVFM4noAvDs5Q858OQTNnIZorwxg6Y9aBkUO8jWMcxsg3T5gFqPag-NyO39WL9RU2Bu9lx8ekZBPWimS1UgcKH7xMsZ_/s1600/download+(1).jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiIpxNNTE9HrbDqhl3jQuBQ5lYnh06Z6E_XuVQP5nAnOapIUkiGVFM4noAvDs5Q858OQTNnIZorwxg6Y9aBkUO8jWMcxsg3T5gFqPag-NyO39WL9RU2Bu9lx8ekZBPWimS1UgcKH7xMsZ_/s1600/download+(1).jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">נכנסת לכל בית</td></tr>
</tbody></table>
<div>
<br /></div>
<div>
<ul style="text-align: right;">
<li><b><span style="color: #3d85c6;">Printrbot </span></b>- בן אדם אחד קם בבוקר והחליט לקחת את העסק בידיים ולבנות בעצמו סדרה של מדפסות שגם מבוססות על Reprap במחיר שווה לכל נפש.</li>
</ul>
<div>
<b>איכות</b>: איכות מקסימלית עד 100 מיקרון.</div>
<div>
<b>מחיר</b>: מ 300 דולר ומעלה.</div>
<div>
<b>חומרים</b>: <a href="http://en.wikipedia.org/wiki/Acrylonitrile_butadiene_styrene">ABS</a>, <a href="http://en.wikipedia.org/wiki/Polylactic_acid">PLA</a> בצבעים שונים.</div>
<div>
<b>תחזוקה</b>: באופן עצמאי.<br />
<b>אתר היצרן</b>: <a href="http://printrbot.com/">printrbot.com</a><br />
<br />
<br />
<b><span style="color: #3d85c6;">המדפסת</span></b><br />
<br />
המדפסת שברשותי היא Makerbot Replicator 2x, יש לה 2 ראשי חימום נפרדים שניתן להזין בכל אחד חומר שונה, פלטת חימום גדולה (24.6X15.2X15.15) שגורמת לאובייקט להדבק למשטח, איכות הדפסה מירבית עד 100 מיקרון.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7P8FfO6Rof6RPLzMBXPYdBCeMtyl2GsF9lGC-j8Dut7IXrLRdmV3gelIoTofWLxToNQJzJHvgeoqa3AZqpy9XpitwZEMpO4lgynoKglE1KFU2i27dR97vBjn-QoQUovAlmO4-JngqfAYb/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7P8FfO6Rof6RPLzMBXPYdBCeMtyl2GsF9lGC-j8Dut7IXrLRdmV3gelIoTofWLxToNQJzJHvgeoqa3AZqpy9XpitwZEMpO4lgynoKglE1KFU2i27dR97vBjn-QoQUovAlmO4-JngqfAYb/s1600/1.png" height="320" width="276" /></a></div>
<br />
<br />
<b><span style="color: #3d85c6;">הכנת אובייקט להדפסה</span></b><br />
<br />
לפני שנקפוץ להדפסה קודם כל צריך למצוא או לבנות אובייקט שרוצים להדפיס, קיימת קהילה ענקית של אנשים שמשתפים אובייקטים תלת מימדים שכל אחד יכול להדפיס במדפסת שלו, היא נקראת <a href="http://www.thingiverse.com/">thingiverse</a> שם מצאתי את המודל של ה Drone מהסרט Oblivion (<a href="http://www.imdb.com/title/tt1483013/">למי שלא זוכר</a>...) שנעשה ע"י <a href="http://www.thingiverse.com/BrandonW6/designs">BrandonW6</a> והחלטתי להדפיס אותו בעצמי ולשתף אותכם בתהליך.<br />
<br />
<b>מושגי בסיס</b><br />
<br />
<ul style="text-align: right;">
<li><b>Infill </b>- ניתן להגדיר כמה האובייקט יהיה מוצק באיזורים שלא נראים בעין וכך לחסוך חומר, המדפסת מייצרת כוורת של עמודים תומכים בין הדפנות באובייקט.</li>
<li><b>Support </b>- עמודי תמיכה לאיזורים באובייקט שאינם באים במגע ישיר עם המשטח או שבזווית שמצריכה תמיכה נוספת.</li>
<li><b>Raft </b>- אם פני השטח של האובייקט קטן ניתן להעזר במשטח שהמדפסת בונה מתחת לאובייקט ולהגדיל את פני השטח.</li>
<li><b>Shell </b>- דחיסות השכבה.</li>
</ul>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsNgoELOT4sDifhSM4ki8aa4s67roh5QxLHVQaxHzTrD6LWNxJ03vBDZN9AhUAsk7T72SolIFM7ScpTuOUxGu3UZzdnY6AAVezDGOLCLtYOjhXavr_vivvT6NQOrWSl-BIVGUOyw6QDQkX/s1600/8.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsNgoELOT4sDifhSM4ki8aa4s67roh5QxLHVQaxHzTrD6LWNxJ03vBDZN9AhUAsk7T72SolIFM7ScpTuOUxGu3UZzdnY6AAVezDGOLCLtYOjhXavr_vivvT6NQOrWSl-BIVGUOyw6QDQkX/s1600/8.png" height="320" width="313" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">הגדרות שאיתן הדפסתי את המודל</td></tr>
</tbody></table>
<div>
<br /></div>
<div>
<br /></div>
<div>
<b>חומרים</b></div>
<div>
<br /></div>
<div>
עבור המודל השתמשתי בפלסטיק מסוג ABS בצבעים שונים, מחיר לקילו ABS נע בין 30 ל 70 דולר תלוי באיכות, הוא מגיע בגליל שמתחבר מאחורי המכונה ומוזן לגוף החימום בעזרת מנוע צעד, עבודה עם ABS דורשת יותר חום מגופי החימום והטמפרטורה המומלצת היא 230 מעלות.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIhbIQvM0FBJt76ZAOLQbDYxvEzfPtH8s_9aiuhQS2tJOcGNHT6zBZYUVfH4cegqidm8mW1K3QHtoXh6rj8lrSDEznVVYyBshSZ-SkaKhvfIhBOhhYO_I0ouYnfiZQwfdOe621gKQJIO-z/s1600/9.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIhbIQvM0FBJt76ZAOLQbDYxvEzfPtH8s_9aiuhQS2tJOcGNHT6zBZYUVfH4cegqidm8mW1K3QHtoXh6rj8lrSDEznVVYyBshSZ-SkaKhvfIhBOhhYO_I0ouYnfiZQwfdOe621gKQJIO-z/s1600/9.png" height="194" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">מלא צבעים!</td></tr>
</tbody></table>
<br />
<br /></div>
<div>
<br /></div>
<div>
<b>תוכנות</b></div>
<div>
<ul style="text-align: right;">
<li>Makerware - תוכנה שדרכה מנהלים את המדפסת ומגדירים את מיקום האובייקט על המשטח ואת ראשי החימום.</li>
</ul>
<div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4sb05aPFUQfgSY_RdrjHWx61H1n6gt5Eo6YZf16ETxBp6a-LO4vd6JFOFTD5EMpuJKOyenWdxkmWqFjPL9LTMoDz2202xAeQuInavFv0eaIVZTxMo_mM_TfugpvTQU9WBb_zcDptmRfxL/s1600/7.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4sb05aPFUQfgSY_RdrjHWx61H1n6gt5Eo6YZf16ETxBp6a-LO4vd6JFOFTD5EMpuJKOyenWdxkmWqFjPL9LTMoDz2202xAeQuInavFv0eaIVZTxMo_mM_TfugpvTQU9WBb_zcDptmRfxL/s1600/7.png" height="222" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">http://www.makerbot.com/makerware</td></tr>
</tbody></table>
<br /></div>
<ul style="text-align: right;">
<li>NetFabb - תוכנה לתיקון אובייקטים, מומלץ להעביר כל אובייקט דרכה לפני ההדפסה, קיימת גרסה חינמית שפותרת את רוב התקלות כך שנוכל להדפיס בשקט. </li>
</ul>
</div>
<div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHTSOmn_T0ZA3vGcH1gk8ElUQuAYyF8etCVtxYlqO_Lxo6uW6st8mH-blhiHWhFy7JP5ND09Jb7mkBQSoZVblPvfkWiEz8DYAC1HhAdhrpt2I6DMyE2n8KWIsqlRcBFcHTH__vQyfp70rz/s1600/3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHTSOmn_T0ZA3vGcH1gk8ElUQuAYyF8etCVtxYlqO_Lxo6uW6st8mH-blhiHWhFy7JP5ND09Jb7mkBQSoZVblPvfkWiEz8DYAC1HhAdhrpt2I6DMyE2n8KWIsqlRcBFcHTH__vQyfp70rz/s1600/3.png" height="232" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">http://www.netfabb.com/</td></tr>
</tbody></table>
</div>
<div>
<br /></div>
<br />
<br />
<span style="color: #3d85c6;"><b>תהליך ההדפסה</b></span><br />
<br />
ההדפסה תבוצע עבור כל חלק בנפרד לפי קבוצות צבע שהוגדרו מראש, לצורך העניין שילוב של צבעים שחור, לבן ואפור, התהליך עצמו לוקח זמן, סה"כ הדפסת החלקים לקחה לי 16 שעות עבודה של מדפסת ו300 גרם של חומר.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_IUAHU3AHkEgjdx9p4d5qDN1YxpJ8o6vp2czU4ObNiU5pwj_i04rJAt_YrsFhVmsftJurIdm6AkIjo0oQOelSnIWo99y1sOQuehwpOmq81s1AIRKfust1JbcIji84yq7udlQGtTvdiPsl/s1600/4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_IUAHU3AHkEgjdx9p4d5qDN1YxpJ8o6vp2czU4ObNiU5pwj_i04rJAt_YrsFhVmsftJurIdm6AkIjo0oQOelSnIWo99y1sOQuehwpOmq81s1AIRKfust1JbcIji84yq7udlQGtTvdiPsl/s1600/4.png" height="240" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">זמן ההדפסה הארוך ביותר 4 שעות לכל צד</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0n4eSm3Mk0MJm9Fn47ayrowYy050jsTNr-Nlypkc1Par45xsGBpev8tflFG6dCCB7ZGcZoFGXBencQ8ECTUF_yTq9NbhwQKb0WyczWn3dXWP9ImVMVy85lQYrTTsoMv6M9BJdABrtfFhR/s1600/6.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0n4eSm3Mk0MJm9Fn47ayrowYy050jsTNr-Nlypkc1Par45xsGBpev8tflFG6dCCB7ZGcZoFGXBencQ8ECTUF_yTq9NbhwQKb0WyczWn3dXWP9ImVMVy85lQYrTTsoMv6M9BJdABrtfFhR/s1600/6.png" height="240" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">כל שאר החלקים בין שעה לשעתיים הדפסה</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzvXt5F2zE83TXlVShsEYvrnHX68PKSOjNqO0H30pLbEAB1qFXBBpx-xAINS2MlSmje-h-A9BDg3XKstc-YkT9gSsMqe6AEqHUOXgTHHrGuVneR_CPbUKm1plInS9PGRW72Sq94P_l9XK5/s1600/5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzvXt5F2zE83TXlVShsEYvrnHX68PKSOjNqO0H30pLbEAB1qFXBBpx-xAINS2MlSmje-h-A9BDg3XKstc-YkT9gSsMqe6AEqHUOXgTHHrGuVneR_CPbUKm1plInS9PGRW72Sq94P_l9XK5/s1600/5.png" height="240" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">תוספת למודל שנוצרה על ידי משהו אחר<br />
http://www.thingiverse.com/thing:169622</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj__Qzd1WBndJvkQKHjKiOaF53zcURdvjSxzuALZqMg7tTD4PXAAzoloXbX64D00TxlHl71gpu9AsAT1sG3kVrWSHQptKlywCnxfKzWa4fZxq4pf-yei8_h8b6KEnd4OdL6tSRegZ_73A7-/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj__Qzd1WBndJvkQKHjKiOaF53zcURdvjSxzuALZqMg7tTD4PXAAzoloXbX64D00TxlHl71gpu9AsAT1sG3kVrWSHQptKlywCnxfKzWa4fZxq4pf-yei8_h8b6KEnd4OdL6tSRegZ_73A7-/s1600/2.png" height="269" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">כל החלקים ממתינים להדבקה</td></tr>
</tbody></table>
<br />
<b>גימורים</b><br />
<ul style="text-align: right;">
<li>נייר זכוכית עדין - החלקת האובייקט.</li>
<li>אציטון - האדים אוכלים את הפלסטיק וגורמים לו להיות מבריק.</li>
<li>Dremel - להורדת סימני הדפסה ו Support.</li>
</ul>
<br />
<br />
<span style="color: #3d85c6;"><b>הדבקה</b></span><br />
<br />
בסופו של דבר מדובר בפלסטיק, לכן הוא מגיב טוב לדבקים, מומלץ להשתמש בסופרגלו או בדבק אפוקסי.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPrW7qs8JAJrx3c1U-hHAU7Zepmkp8RtevjIHD5WwtuRRb0MQcTjIXqvQ6ux4cGVQ1NOufQ5jJHe4fulLj4VBWmlAeEPwpYBfU4MFG149JCQgqQ6pBZxIFEBuJ_xZP-q-9mxu9gkt2lG0I/s1600/20140628_170154.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPrW7qs8JAJrx3c1U-hHAU7Zepmkp8RtevjIHD5WwtuRRb0MQcTjIXqvQ6ux4cGVQ1NOufQ5jJHe4fulLj4VBWmlAeEPwpYBfU4MFG149JCQgqQ6pBZxIFEBuJ_xZP-q-9mxu9gkt2lG0I/s1600/20140628_170154.jpg" height="240" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">המודל מדוייק ולא נדרשת עבודת תיאום נוספת בין החלקים</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLWAOMUKBsceEXvAugjQEqEQ1l_9tO8tQUAJjCVPQS_iZ0tyFtp6kXG8GmAl0Fk8Rljld1HRH4stU6VEiP2rpvq6yABprZ0KeeunUAJrvMEwFtj4XWKPy6pPUgAxQEy1OeUygVccjUgtJE/s1600/20140628_172440.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLWAOMUKBsceEXvAugjQEqEQ1l_9tO8tQUAJjCVPQS_iZ0tyFtp6kXG8GmAl0Fk8Rljld1HRH4stU6VEiP2rpvq6yABprZ0KeeunUAJrvMEwFtj4XWKPy6pPUgAxQEy1OeUygVccjUgtJE/s1600/20140628_172440.jpg" height="240" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">צריכים לתת לזה זמן להתייבש.</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWsx-ZUKjLxU5aZ-gkC7hxF08YX8Q8T-jh5YT8QFaLq3LyJO8T6NujIL7YkMYxi6bJ9LCScqsPa-qJHcFiP0KiyCDhIms97FkASYHWsgNpPGDsVzUQxqu-MX_QmtKQKiDwJLEEdunO2Snf/s1600/20140628_172128.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWsx-ZUKjLxU5aZ-gkC7hxF08YX8Q8T-jh5YT8QFaLq3LyJO8T6NujIL7YkMYxi6bJ9LCScqsPa-qJHcFiP0KiyCDhIms97FkASYHWsgNpPGDsVzUQxqu-MX_QmtKQKiDwJLEEdunO2Snf/s1600/20140628_172128.jpg" height="240" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">מתחיל לקבל צורה...</td></tr>
</tbody></table>
<br />
<br />
<span style="color: #3d85c6;"><b>מבנה סופי</b></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQUIZvTcqsknQxVaqcLH2fogASXu_ZA9JC0QGE76_9UFBFLKTIow6oSvFFQbl-ah_Agwtn1uzfeY7gaFnSXVMN6ocJjb_P6IpRnyCc4QH-3FyyXhd_6Jg3OxDkKKNLDxDFOe1dvr4zmpok/s1600/20140628_200111.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQUIZvTcqsknQxVaqcLH2fogASXu_ZA9JC0QGE76_9UFBFLKTIow6oSvFFQbl-ah_Agwtn1uzfeY7gaFnSXVMN6ocJjb_P6IpRnyCc4QH-3FyyXhd_6Jg3OxDkKKNLDxDFOe1dvr4zmpok/s1600/20140628_200111.jpg" height="240" width="320" /></a></div>
<br />
<br />
<br />
<br />
<b><span style="color: #3d85c6;">סיכום</span></b><br />
<br />
מדפסות תלת מימד הופכות להיות חלק מהחיים שלנו כמו שמדפסות הדיו היו בעבר, נעשה בהן שימוש בתחומים רבים כמו בנייה, תעשיה, עיצוב ויש כאלה שלוקחים את זה רחוק יותר לעולם התרופות והשתלות אברים, נתחיל לראות אותן יותר ויותר מסביבנו והעתיד כבר לא יהיה ביצור המוני אלא ביצור פרטני לדרישות הלקוח ,נשלם על העיצוב, החומרים עלינו.<br />
<br />
אב טיפוסי!<br />
<br /></div>
</div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-34501670977688213552014-06-21T04:30:00.000-07:002014-06-21T09:00:25.947-07:00Seven Segment Display Guide<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXksylgxG0p7sOtFx3D0nYybwR9_t9HYeIg4pL3lnCgI-_QOk3ZICPHaFhQZ2V96kiaMHco522NK880xzgXCUJILYHA0zK5EDwrgDjUdwrdpYuaJKhFY-XkgcTdfS-cwd2ASMncDSZj8t7/s1600/logo_arduino.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXksylgxG0p7sOtFx3D0nYybwR9_t9HYeIg4pL3lnCgI-_QOk3ZICPHaFhQZ2V96kiaMHco522NK880xzgXCUJILYHA0zK5EDwrgDjUdwrdpYuaJKhFY-XkgcTdfS-cwd2ASMncDSZj8t7/s1600/logo_arduino.jpg" height="139" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
במהלך הסדרה עברתי על המון רכיבים שניתן לחבר ל Arduino ושכחתי מתצוגת ה <a href="http://en.wikipedia.org/wiki/Seven-segment_display">7 Segment</a> הותיקה שנתקלתי בה כלכך הרבה פעמים בעבר שזה יהיה עוול לא לכתוב עליה משהו בקצרה, היא מאוד פרימיטיבית אבל שימושית בפרוייקטים שצריכים תצוגה מינימלית, היא זולה, פשוטה ואמינה, ניתן לרכוש אותה ב <a href="http://www.dx.com/s/7+segment">DX</a> בשקלים בודדים.<br />
<br />
<b><span style="color: #3d85c6;">דרישות</span></b><br />
<br />
<ul style="text-align: right;">
<li>(Arduino (any kind will do the job</li>
<li>7 Segments </li>
<li>Ohm Resistor 330</li>
<li>Breadboard</li>
<li>Wires</li>
</ul>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFP18T99D0d0jU6oemKGYLHO89B6t8MCLjlfwhbGb1_1oyRhU5CQ57ccfxr43V1ll_gIbYXllWwP4y6GrPN_0lK31GI46hoBesVTzzaIyZxzm2Fxn9AII5jcdiULlfQYBayy9pRjH4oQDq/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFP18T99D0d0jU6oemKGYLHO89B6t8MCLjlfwhbGb1_1oyRhU5CQ57ccfxr43V1ll_gIbYXllWwP4y6GrPN_0lK31GI46hoBesVTzzaIyZxzm2Fxn9AII5jcdiULlfQYBayy9pRjH4oQDq/s1600/7.png" height="317" width="320" /></a></div>
<br /></div>
<div>
<br /></div>
<div>
צורת העבודה מאוד בזבזנית ונאלץ להיפרד מ 8 חיבורים דיגיטליים ב Arduino על מנת שנוכל להשתמש בה כהלכה, כל רגל מייצגת Segment בודד וניתן לשלוט עליו בנפרד, על מנת לצמצם את כמות הרגליים מומלץ להשתמש ב <a href="http://proxytype.blogspot.co.il/2012/07/arduino-shift-register-guide.html">Shift Register</a>.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCrL1b40Cg-t7FPvwA5zlFHJguVFXH_dTio_90dnS1TYUHg5oA2vZxs5lJQpjuLYFCNBcgeq648SWyciKns5Gxjp3cZgt4UgtF_QPtfz-BuxatS9fNPNJG1ocIRXQJLzizd_KO7bi-Md4e/s1600/6.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCrL1b40Cg-t7FPvwA5zlFHJguVFXH_dTio_90dnS1TYUHg5oA2vZxs5lJQpjuLYFCNBcgeq648SWyciKns5Gxjp3cZgt4UgtF_QPtfz-BuxatS9fNPNJG1ocIRXQJLzizd_KO7bi-Md4e/s1600/6.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">הרגל ה 8 היא עבור הנקודה שלא חלק מה Segments</td></tr>
</tbody></table>
<div>
<br /></div>
<div>
<span style="color: #3d85c6;"><b>קוד</b></span></div>
<div>
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//array of numbers, each number contain</span><br />
<span style="color: lime;">//array of the 7 segment pins status, </span><br />
<span style="color: lime;">//0 for low , 1 for high</span><br />
byte numbers[12][8] ={<br />
{1,0,0,0,0,1,0,0},//0<br />
{1,0,1,1,1,1,1,0},//1<br />
{1,1,0,0,1,0,0,0},//2<br />
{1,0,0,1,1,0,0,0},//3<br />
{1,0,1,1,0,0,1,0},//4<br />
{1,0,0,1,0,0,0,1},//5<br />
{1,0,0,0,0,0,0,1},//6<br />
{1,0,1,1,1,1,0,0},//7<br />
{1,0,0,0,0,0,0,0},//8<br />
{1,0,0,1,0,0,0,0}, //9<br />
{0,1,1,1,1,1,1,1} ,//.<br />
{1,1,1,1,1,1,1,1} //clear<br />
} ;<br />
<br />
<span style="color: lime;">//set pins as outputs</span><br />
void setup() { <br />
pinMode(2, OUTPUT); <br />
pinMode(3, OUTPUT);<br />
pinMode(4, OUTPUT);<br />
pinMode(5, OUTPUT);<br />
pinMode(6, OUTPUT);<br />
pinMode(7, OUTPUT);<br />
pinMode(8, OUTPUT);<br />
pinMode(9, OUTPUT);<br />
<br />
Serial.begin(9600);<br />
}<br />
<br />
<span style="color: lime;">//change the segments by number</span><br />
void draw(byte num)<br />
{<br />
<span style="color: lime;"> //starting pin</span><br />
byte pin = 2;<br />
for(byte seg = 0; seg < 8; ++seg)<br />
{<br />
<span style="color: lime;">//write the segment status</span><br />
digitalWrite(pin,numbers[num][seg]);<br />
<span style="color: lime;"> //go to the next pin</span><br />
++pin;<br />
}<br />
}<br />
<br />
void loop() {<br />
<br />
int counter = 0;<br />
<br />
while(counter < 11)<br />
{<br />
delay(500);<br />
draw(counter);<br />
counter = counter + 1;<br />
}<br />
<br />
draw(10);<br />
delay(500);<br />
draw(11);<br />
delay(100);<br />
draw(10);<br />
delay(500);<br />
<br />
while(counter >= -1)<br />
{<br />
delay(500);<br />
draw(counter);<br />
counter = counter - 1;<br />
}<br />
<br />
draw(10);<br />
delay(500);<br />
draw(11);<br />
delay(100);<br />
draw(10);<br />
delay(500);<br />
<br />
}</div>
<br />
<div>
<br /></div>
<div>
קיים מערך שמכיל בתוכו 10 מערכים נוספים שבכל אחד מהם יש ערך עבור כל Segment, לצורך הדוגמה המערך <span style="text-align: left;"><b>{1,0,0,0,0,0,0,0}</b> מייצג את הספירה 8 כי כל ה Segments דולקים למעט ה Segment הנוסף של הנקודה בצד.</span> </div>
<div>
<br /></div>
<br />
<b><span style="color: #3d85c6;">מבנה סופי</span></b><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWsGzPo0_H9nlxxNHywnJAmFmHZEFdSV4HY1-t6PM2AAISbvIxR5FJ602h1Mj3FQdQwjsDE_-qUmPGuxvnPRdPModHS9r6ZXFKO6kLXB9fxRG1YITSYie_I3Lf2jTYkMAZG_rF0W_OQwRh/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWsGzPo0_H9nlxxNHywnJAmFmHZEFdSV4HY1-t6PM2AAISbvIxR5FJ602h1Mj3FQdQwjsDE_-qUmPGuxvnPRdPModHS9r6ZXFKO6kLXB9fxRG1YITSYie_I3Lf2jTYkMAZG_rF0W_OQwRh/s1600/2.png" height="233" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">מספר הולך, מספר בא.</td></tr>
</tbody></table>
<span style="color: #3d85c6;"><b><br />
</b></span> <span style="color: #3d85c6;"><b>סרטון הדגמה</b></span><br />
<br />
<div align="center">
<iframe allowfullscreen="" frameborder="0" height="360" src="//www.youtube.com/embed/it7xgU4Ntw0" width="500"></iframe><br /></div>
<br />
<br />
<br />
<b><span style="color: #3d85c6;">סיכום</span></b><br />
<b><span style="color: #3d85c6;"><br /></span></b>
היו זמנים שהיא היתה נחשבת לפורצת דרך אבל עם הזמן השימוש בה ירד לטובת תצוגות הרבה יותר מתוחכמות (וטוב שכך!) אבל עדיין ניתן למצוא אותה במוצרים שונים ולא נראה שהיא הולכת להעלם בקרוב.<br />
<br />
תצוגה בגרוש.<br />
<br />
<br />
<br />
<br />
<br />
<br /></div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-68781330558176184182014-06-02T10:45:00.000-07:002014-06-03T12:12:18.930-07:00Remote Control Application - ScreenShot<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZJ-KRtYbMLOidqE-7hSKOCS4vAJBsgEVYbojXXmtgzYGe6wWdYH9CbSGFGFyrcqrn8YgYvK9q_ZieXLtSTTp5NhnVp_5-vkgpyVzugdHmEn41eEKmz30lvDTc0U24TO_q9mzmNG6smtrN/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZJ-KRtYbMLOidqE-7hSKOCS4vAJBsgEVYbojXXmtgzYGe6wWdYH9CbSGFGFyrcqrn8YgYvK9q_ZieXLtSTTp5NhnVp_5-vkgpyVzugdHmEn41eEKmz30lvDTc0U24TO_q9mzmNG6smtrN/s1600/1.png" /></a></div>
<br />
<br />
<br />
עד עכשיו נגעתי בסדרה בכלי שליטה מתוכנתים בצד הלקוח, השלב הבא הוא לכידת התמונה בצד השרת באמצעות הספריה הקלאסית <a href="http://en.wikipedia.org/wiki/Graphics_Device_Interface">GDI</a>, זה לא המנגנון היעיל ביותר אבל מספיק מתאים בשביל המשימה, לכידת המסך צריכה לעמוד בזמנים יחסית טובים על מנת לשמור על חווית משתמש, לא פחות חשוב שניהול הזיכרון צריך להיות מתוחזק כמו שצריך למרות שמדובר ב .Net על מנת למנוע זליגת זיכרון.<br />
<br />
בנוסף לקובץ user32.dll שהשתמשנו בעבר נעבוד עם קובץ נוסף GDI.dll שמאפשר לנו לגשת למשאבים הגרפיים במחשב ע"י מספר פונקציות תחילה מקבלים את המצביע עבור הרכיב הפיזי בעזרת הפונקציה <b>CreateDC</b> לאחר מכן יוצרים Buffer משותף עם הפונקציה <b>CreateCompatibleDC</b>, השלב הבא להצהיר על Pointer ל Bitmap של Win32Api עם הפונקציה <b>CreateCompatibleBitmap</b> , מחברים בין ה Bitmap ל Buffer וקוראים לפונקציה BitBlt שאוספת את הפריים מהרכיב הפיזי ומעתיקה אותו ל Buffer ומשם ממשיכים הלאה.<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>captureControl.cs</b></span></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //global stream</span><br />
MemoryStream stream;<br />
<br />
<span style="color: lime;"> //isRunning flag</span><br />
public bool isRunning = false;<br />
<br />
int width = 0;<br />
int height = 0;<br />
<br />
<span style="color: lime;"> //capture signature</span><br />
[DllImport("GDI32.dll")]<br />
public static extern bool BitBlt(<br />
int hdcDest, int nXDest, int nYDest,<br />
int nWidth, int nHeight, int hdcSrc,<br />
int nXSrc, int nYSrc, int dwRop);<br />
<br />
<span style="color: lime;"> //create compatible bitmap for device context</span><br />
[DllImport("GDI32.dll")]<br />
public static extern int CreateCompatibleBitmap<br />
(int hdc, int nWidth, int nHeight);<br />
<br />
<span style="color: lime;"> //create compatible device context for the device</span><br />
[DllImport("GDI32.dll")]<br />
public static extern int CreateCompatibleDC(int hdc);<br />
<br />
<span style="color: lime;"> //delete driver context</span><br />
[DllImport("GDI32.dll")]<br />
public static extern bool DeleteDC(int hdc);<br />
<br />
<span style="color: lime;"> //delete native bitmap type</span><br />
[DllImport("GDI32.dll")]<br />
public static extern bool DeleteObject(int hObject);<br />
<br />
<span style="color: lime;"> //create device context</span><br />
[DllImport("gdi32.dll")]<br />
static extern int CreateDC(string lpszDriver,<br />
string lpszDevice,string lpszOutput,<br />
IntPtr lpInitData);<br />
<br />
<span style="color: lime;"> //get device information</span><br />
[DllImport("GDI32.dll")]<br />
public static extern int GetDeviceCaps(int hdc, int nIndex);<br />
<br />
<span style="color: lime;">//add object to the device context</span><br />
[DllImport("GDI32.dll")]<br />
public static extern int SelectObject(int hdc, int hgdiobj);<br />
<br />
<span style="color: lime;">//cursor object win32 api structure</span><br />
[StructLayout(LayoutKind.Sequential)]<br />
private struct CURSORINFO<br />
{<br />
public Int32 cbSize;<br />
public Int32 flags;<br />
public IntPtr hCursor;<br />
public POINTAPI ptScreenPos;<br />
}<br />
<br />
<span style="color: lime;">//point type win32 structure</span><br />
[StructLayout(LayoutKind.Sequential)]<br />
private struct POINTAPI<br />
{<br />
public int x;<br />
public int y;<br />
}<br />
<br />
[StructLayout(LayoutKind.Sequential)]<br />
public struct ICONINFO<br />
{<br />
public bool fIcon;<br />
public Int32 xHotspot;<br />
public Int32 yHotspot;<br />
public IntPtr hbmMask;<br />
public IntPtr hbmColor;<br />
}<br />
<br />
<span style="color: lime;"> ////for more information visit</span><br />
<span style="color: lime;"> ////http://msdn.microsoft.com/en-us/library/windows/desktop/dd145130(v=vs.85).aspx</span><br />
public enum TernaryRasterOperations : uint<br />
{<br />
<span style="color: lime;"> /// <summary>dest = source</summary></span><br />
SRCCOPY = 0x00CC0020,<br />
<span style="color: lime;"> /// <summary>dest = source OR dest</summary></span><br />
SRCPAINT = 0x00EE0086,<br />
<span style="color: lime;"> /// <summary>dest = source AND dest</summary></span><br />
SRCAND = 0x008800C6,<br />
<span style="color: lime;"> /// <summary>dest = source XOR dest</summary></span><br />
SRCINVERT = 0x00660046,<br />
<span style="color: lime;"> /// <summary>dest = source AND (NOT dest)</summary></span><br />
SRCERASE = 0x00440328,<br />
<span style="color: lime;"> /// <summary>dest = (NOT source)</summary></span><br />
NOTSRCCOPY = 0x00330008,<br />
<span style="color: lime;"> /// <summary>dest = (NOT src) AND (NOT dest)</summary></span><br />
NOTSRCERASE = 0x001100A6,<br />
<span style="color: lime;"> /// <summary>dest = (source AND pattern)</summary></span><br />
MERGECOPY = 0x00C000CA,<br />
<span style="color: lime;"> /// <summary>dest = (NOT source) OR dest</summary></span><br />
MERGEPAINT = 0x00BB0226,<br />
<span style="color: lime;"> /// <summary>dest = pattern</summary></span><br />
PATCOPY = 0x00F00021,<br />
<span style="color: lime;"> /// <summary>dest = DPSnoo</summary></span><br />
PATPAINT = 0x00FB0A09,<br />
<span style="color: lime;">/// <summary>dest = pattern XOR dest</summary></span><br />
PATINVERT = 0x005A0049,<br />
<span style="color: lime;"> /// <summary>dest = (NOT dest)</summary></span><br />
DSTINVERT = 0x00550009,<br />
<span style="color: lime;"> /// <summary>dest = BLACK</summary></span><br />
BLACKNESS = 0x00000042,<br />
<span style="color: lime;"> /// <summary>dest = WHITE</summary></span><br />
WHITENESS = 0x00FF0062<br />
}<br />
<br />
<br />
<span style="color: lime;"> //for more info visit</span><br />
<span style="color: lime;"> //http://msdn.microsoft.com/en-us/library/windows/desktop/ms648381(v=vs.85).aspx</span><br />
private const Int32 CURSOR_SHOWING = 0x1;<br />
private const Int32 CURSOR_SUPPRESSED = 0x2;<br />
<br />
<span style="color: lime;"> //getting cursor info signature</span><br />
[DllImport("user32.dll")]<br />
private static extern bool GetCursorInfo(out CURSORINFO pci);<br />
<br />
<span style="color: lime;"> //getting cursor info signature</span><br />
[DllImport("user32.dll", EntryPoint = "GetIconInfo")]<br />
public static extern bool GetIconInfo(IntPtr hIcon, out ICONINFO piconinfo);<br />
<br />
<span style="color: lime;"> //getting icon buffer signature</span><br />
[DllImport("user32.dll", EntryPoint = "CopyIcon")]<br />
public static extern IntPtr CopyIcon(IntPtr hIcon);<br />
<br />
<span style="color: lime;">//return handle to the desktop window</span><br />
[DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]<br />
public static extern IntPtr GetDesktopWindow();<br />
<br />
<span style="color: lime;"> //getting device context</span><br />
[DllImport("user32.dll", EntryPoint = "GetDC")]<br />
public static extern IntPtr GetDC(IntPtr ptr);<br />
<br />
<br />
<span style="color: lime;"> /// <summary></span><br />
<span style="color: lime;"> /// initialize settings </span><br />
<span style="color: lime;"> /// </summary></span><br />
<span style="color: lime;"> /// <param name="captureWidth">the width to capture</param></span><br />
<span style="color: lime;"> /// <param name="captureHeight">the height to cature</param></span><br />
public captureControl(int captureWidth, int captureHeight)<br />
{<br />
width = captureWidth;<br />
height = captureHeight;<br />
}<br />
<br />
<span style="color: lime;"> /// <summary></span><br />
<span style="color: lime;"> /// capture screen shot</span><br />
<span style="color: lime;"> /// </summary></span><br />
<span style="color: lime;"> /// <returns>return stream</returns></span><br />
public MemoryStream makeScreenShot()<br />
{<br />
<span style="color: lime;"> //process flag to true</span><br />
isRunning = true;<br />
<br />
<span style="color: lime;"> //create stream for return</span><br />
stream = new MemoryStream();<br />
<br />
<span style="color: lime;">//X draw position - cursor</span><br />
int x = 0;<br />
<span style="color: lime;"> //Y draw position - cursor</span><br />
int y = 0;<br />
<br />
<span style="color: lime;"> //create device context for Display device</span><br />
int hdcSrc = CreateDC("Display", null, null, IntPtr.Zero);<br />
<br />
<span style="color: lime;"> //make it compatible.</span><br />
int hdcDest = CreateCompatibleDC(hdcSrc);<br />
int hBitmap = CreateCompatibleBitmap(hdcSrc,<br />
Screen.PrimaryScreen.Bounds.Width,<br />
Screen.PrimaryScreen.Bounds.Height);<br />
<br />
<span style="color: lime;"> //add object to device context</span><br />
SelectObject(hdcDest, hBitmap);<br />
<br />
//make bit transfer from device<br />
BitBlt(hdcDest, 0, 0, Screen.PrimaryScreen.Bounds.Width,<br />
Screen.PrimaryScreen.Bounds.Height, hdcSrc, 0, 0,<br />
(int)TernaryRasterOperations.SRCCOPY);<br />
<br />
<span style="color: lime;"> //get image from native bitmap pointer</span><br />
Image imf = Image.FromHbitmap(new IntPtr(hBitmap));<br />
<br />
<span style="color: lime;">//start graphics from image</span><br />
Graphics g = Graphics.FromImage(imf);<br />
<br />
<span style="color: lime;"> //get cursor bitmap and position</span><br />
Bitmap f = getCursorIcon(out x, out y);<br />
<br />
<span style="color: lime;"> //draw the cursor the image by position</span><br />
if (f != null)<br />
g.DrawImage(f, x, y);<br />
<br />
<span style="color: lime;"> //encoding parameters</span><br />
EncoderParameters encoderParameters = new EncoderParameters(1);<br />
encoderParameters.Param[0] =<br />
new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 70L);<br />
<br />
<span style="color: lime;">//save image as stream</span><br />
imf.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters);<br />
<br />
<span style="color: lime;">//remove device context</span><br />
DeleteDC(hdcSrc);<br />
<span style="color: lime;"> //remove device context</span><br />
DeleteDC(hdcDest);<br />
<span style="color: lime;"> //remove native bitmap</span><br />
DeleteObject(hBitmap);<br />
<br />
<span style="color: lime;"> //resize the image</span><br />
stream = resizeImage(Image.FromStream(stream), new Size(width, height));<br />
<br />
<span style="color: lime;">//process flag to false</span><br />
isRunning = false;<br />
<br />
return stream;<br />
}<br />
<br />
<span style="color: lime;"> /// <summary></span><br />
<span style="color: lime;"> /// getting the cursor image</span><br />
<span style="color: lime;"> /// </summary></span><br />
<span style="color: lime;"> /// <param name="x">cursor x position</param></span><br />
<span style="color: lime;"> /// <param name="y">cursor y poistion</param></span><br />
<span style="color: lime;"> /// <returns>the cursor bitmap</returns></span><br />
private Bitmap getCursorIcon(out int x, out int y)<br />
{<br />
Rectangle bounds = Screen.PrimaryScreen.Bounds;<br />
CURSORINFO pci;<br />
pci.cbSize = Marshal.SizeOf(typeof(CURSORINFO));<br />
<br />
x = 0;<br />
y = 0;<br />
<br />
<br />
if (GetCursorInfo(out pci))<br />
{<br />
x = pci.ptScreenPos.x - bounds.X;<br />
y = pci.ptScreenPos.y - bounds.Y;<br />
<br />
IntPtr hicon = CopyIcon(pci.hCursor);<br />
<br />
ICONINFO iconInfo;<br />
GetIconInfo(hicon, out iconInfo);<br />
<br />
Bitmap maskCursor = Bitmap.FromHbitmap(iconInfo.hbmMask);<br />
<br />
<span style="color: lime;"> // if the size of the icon is double</span><br />
<span style="color: lime;"> //so is in inverted mode</span><br />
if (maskCursor.Height == maskCursor.Width * 2)<br />
{<br />
x = pci.ptScreenPos.x - bounds.X;<br />
y = pci.ptScreenPos.y - bounds.Y - 8;<br />
<br />
<span style="color: lime;">//create new bitmap for cursor</span><br />
Bitmap resultBitmap = new Bitmap(maskCursor.Width, maskCursor.Height);<br />
<br />
<span style="color: lime;"> //get the desktop</span><br />
Graphics desktopGraphics = Graphics.FromHwnd(GetDesktopWindow());<br />
<span style="color: lime;"> //get it's device context</span><br />
IntPtr desktopHdc = desktopGraphics.GetHdc();<br />
<br />
<span style="color: lime;"> //make it compatible</span><br />
int maskHdc = CreateCompatibleDC(desktopHdc.ToInt32());<br />
<br />
<span style="color: lime;"> //set object between context and the cursor</span><br />
int oldPtr = SelectObject(maskHdc, (int)maskCursor.GetHbitmap());<br />
<br />
<span style="color: lime;">//start graphics from image</span><br />
Graphics resultGraphics = Graphics.FromImage(resultBitmap);<br />
<br />
<span style="color: lime;"> //get device context</span><br />
IntPtr resultHdc = resultGraphics.GetHdc();<br />
<br />
<span style="color: lime;"> //combines image bit depends the Ternary Raster Operations</span><br />
<span style="color: lime;"> //first (0 - 32) pixels draw normaly, (32 - 64) as inverted</span><br />
BitBlt(resultHdc.ToInt32(), 0, 0, 32, 32, maskHdc,<br />
0, 32, (int)TernaryRasterOperations.SRCCOPY);<br />
<br />
BitBlt(resultHdc.ToInt32(), 0, 0, 32, 32, maskHdc,<br />
0, 0, (int)TernaryRasterOperations.SRCINVERT);<br />
<br />
<span style="color: lime;"> //release device context</span><br />
resultGraphics.ReleaseHdc(resultHdc);<br />
<span style="color: lime;"> //dispose grahics</span><br />
resultGraphics.Dispose();<br />
<br />
<span style="color: lime;">//make white pixels transparent</span><br />
resultBitmap.MakeTransparent(Color.White);<br />
<br />
return resultBitmap;<br />
<br />
}<br />
else<br />
{<br />
<span style="color: lime;"> //get bitmap from pointer</span><br />
Bitmap colorCursor = Bitmap.FromHbitmap(iconInfo.hbmColor);<br />
<br />
<span style="color: lime;"> //make black pixels transparent</span><br />
colorCursor.MakeTransparent(Color.Black);<br />
<br />
return colorCursor;<br />
}<br />
<br />
}<br />
<br />
return null;<br />
}<br />
<br />
<span style="color: lime;"> /// <summary></span><br />
<span style="color: lime;"> /// resize the capture image</span><br />
<span style="color: lime;"> /// </summary></span><br />
<span style="color: lime;"> /// <param name="imgToResize">instance of the image</param></span><br />
<span style="color: lime;"> /// <param name="size">the new size</param></span><br />
<span style="color: lime;"> /// <returns>new image stream</returns></span><br />
private MemoryStream resizeImage(Image imgToResize, Size size)<br />
{<br />
MemoryStream resizeStream = new MemoryStream();<br />
int sourceWidth = imgToResize.Width;<br />
int sourceHeight = imgToResize.Height;<br />
<br />
float nPercent = 0;<br />
float nPercentW = 0;<br />
float nPercentH = 0;<br />
<br />
nPercentW = ((float)size.Width / (float)sourceWidth);<br />
nPercentH = ((float)size.Height / (float)sourceHeight);<br />
<br />
if (nPercentH < nPercentW)<br />
nPercent = nPercentH;<br />
else<br />
nPercent = nPercentW;<br />
<br />
int destWidth = (int)(sourceWidth * nPercent);<br />
int destHeight = (int)(sourceHeight * nPercent);<br />
<br />
resizeStream = new MemoryStream();<br />
<br />
Bitmap b = new Bitmap(destWidth, destHeight);<br />
Graphics g = Graphics.FromImage((Image)b);<br />
g.InterpolationMode = InterpolationMode.HighQualityBicubic;<br />
<br />
g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);<br />
g.Dispose();<br />
<br />
b.Save(resizeStream, ImageFormat.Jpeg);<br />
<br />
<br />
return resizeStream;<br />
}<br />
<br />
<span style="color: lime;"> /// <summary></span><br />
<span style="color: lime;"> /// get the jpg codec</span><br />
<span style="color: lime;"> /// </summary></span><br />
<span style="color: lime;"> /// <param name="format">by Imageformat</param></span><br />
<span style="color: lime;"> /// <returns></returns></span><br />
private ImageCodecInfo GetEncoder(ImageFormat format)<br />
{<br />
<br />
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();<br />
<br />
foreach (ImageCodecInfo codec in codecs)<br />
{<br />
if (codec.FormatID == format.Guid)<br />
{<br />
return codec;<br />
}<br />
}<br />
return null;<br />
}<br />
}</div>
<div style="text-align: right;">
<br />
<br />
ברגע הקריאה לפונקציה <b>makeScreenShot</b> מתחילה שרשרת של תהליכים, תחילה לוכדים את התמונה כפי שהסברתי בהתחלה, אבל לכידת המסך לא אוספת את סמן העכבר ולכן יש לקרוא למספר פונקציות נוספות על מנת למצוא אותו ולצייר אותו ידנית אבל גם זה לא פשוט כמו שזה נשמע, למצביעים בעכבר (Cursor) יש 2 מצבים הגודל שלהם בדר"כ הוא 32 פיקסלים אבל לפעמים הוא משתנה ל 64 פיקסלים בגלל הרקע שמתחת, נעזר במספר פונקציות ומבנים מ user32.dll על מנת לטפל במצבים השונים, בסיום התהליך לוקחים את הפריים, מורידים לו את האיכות ,מקטינים ומחזרים אותו להמשך טיפול.<br />
<br />
בדומה לשאר המאמרים גם כאן נבנה תוכנית שנועדה לבדיקת התהליך, התוכנית מפעילה את הפונקציה makeScreenShot בעזרת שעון שדוגם (<b>אם אין תהליך דגימה שכבר רץ</b>) כל 10 ms, שומרים את הפריים כ Jpg על מנת להקטין נפחים וטוענים את ה Stream ל PictureBox שמדמה את הלקוח המרוחק.</div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI7SNGI659QR9FSkpgviLpYn7YFoID3tlSQVP5tSRUKA_6k8PO2yEeg-qxFnccj22wYsIeIWLP_xg0NdV-Z5lMXGe3q6o0RDqbV3dLvKX1MIYFs3sJjVxP1En4SatEFXLHpllOm_HAoEU9/s1600/4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI7SNGI659QR9FSkpgviLpYn7YFoID3tlSQVP5tSRUKA_6k8PO2yEeg-qxFnccj22wYsIeIWLP_xg0NdV-Z5lMXGe3q6o0RDqbV3dLvKX1MIYFs3sJjVxP1En4SatEFXLHpllOm_HAoEU9/s1600/4.png" height="276" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">מסך בתוך מסך בתוך מסך...</td></tr>
</tbody></table>
<div style="text-align: right;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>captureForm.cs</b></span></div>
<div dir="ltr" style="text-align: left;">
<br />
captureControl c;<br />
int frameCounter = 0;<br />
<br />
public captureForm()<br />
{<br />
InitializeComponent();<br />
}<br />
<br />
private void captureForm_Load(object sender, EventArgs e)<br />
{<br />
<span style="color: lime;"> //create new instance for capture control</span><br />
c = new captureControl(1200, 600);<br />
<span style="color: lime;"> //fit image to picturebox</span><br />
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;<br />
}<br />
<br />
<span style="color: lime;"> /// <summary></span><br />
<span style="color: lime;"> /// running every 10ms</span><br />
<span style="color: lime;"> /// </summary></span><br />
private void timer1_Tick(object sender, EventArgs e)<br />
{<br />
<span style="color: lime;"> //getting screenshot as stream</span><br />
if (c.isRunning)<br />
return;<br />
<br />
try<br />
{<br />
<span style="color: lime;"> //watch for checking performance</span><br />
Stopwatch watch = new Stopwatch();<br />
<br />
watch.Start();<br />
MemoryStream st = c.makeScreenShot();<br />
watch.Stop();<br />
<br />
<span style="color: lime;">//loaded to the pictureBox</span><br />
pictureBox1.Image = Image.FromStream(st);<br />
<br />
<span style="color: lime;"> //change title and calculate the frame size</span><br />
frameCounter = frameCounter + 1;<br />
this.Text = "captureScreen Frame Counter "<br />
+ frameCounter.ToString() + " Frame Size: "<br />
+ (st.Length / 1024).ToString() + " KB width:"<br />
+ pictureBox1.Image.Size.Width.ToString() + " px Height: "<br />
+ pictureBox1.Image.Size.Height.ToString() +<br />
" px Capture Time: " + watch.ElapsedMilliseconds + " ms";<br />
<br />
<span style="color: lime;"> //dispose the stream, avoid memory leak</span><br />
st.Dispose();<br />
<span style="color: lime;">//call the garbage collector</span><br />
GC.Collect();<br />
<br />
}<br />
catch (Exception ex)<br />
{<br />
c.isRunning = false;<br />
}<br />
}<br />
}</div>
<div style="text-align: right;">
<span style="color: #3d85c6;"><b>ביצועים</b></span><br />
<br />
לכידת התמונה יחד עם ציור סמן העכבר לוקחת בסביבות 150 ms ברזולוציה 1920X1080 עם מעבד 7 Icore (יחסית ישן) מה שנותן בין 6 ל 7 פריימים בשניה, זה לא הכי אידיאלי אבל אם מורידים את הרזולוציה משפרים את המהירות בצורה משמעותית, מבדיקה נוספת שביצעתי על מחשב נייד עם Icore 7 (גם הוא יחסית ישן) לכידת תמונה ברזולוציה 1366X768 לוקחת בסביבות 110 ms.<br />
<br /></div>
<div style="text-align: right;">
<b><span style="color: #3d85c6;">סיכום</span></b></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
לכידת מסך היא הרכיב האחרון בפאזל לפני שמתחילים לחבר את הכל, אבל חשוב לי להוסיף שקיימות עוד דרכים שאיתן ניתן לבצע את המשימה כמו:<br />
<br />
<li>DirectX - לכידת מסך גם מחוץ ל Desktop לדוגמה במשחקים.</li>
<li>Windows Media Encoder - מתאים בעיקר ללכידת מסך כוידאו.</li>
<li><a href="http://en.wikipedia.org/wiki/Mirror_driver">Mirror Display Driver</a> - הדרך הטובה ביותר אבל מאוד מסובכת, נמצאת בשימוש ב UltraVnc, לכל מי שרוצה לדעת עוד יש דוגמה טובה ב Wdk גרסת 7.600 אולי עוד אחזור לזה בהמשך.</li>
</div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
עוד תמונה ועוד תמונה...</div>
<div style="text-align: right;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br />
<br /></div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-68773479124387710472014-05-24T10:35:00.000-07:002014-05-24T15:45:47.885-07:00Remote Control Application - Keyboard<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-K8seigeTBkI2pI2yTKvLw7QfYjRyaoqqVGkDgQjBttNtClcuO6n0jHEram61t4j_fX3AR7WM2fTRyXLfFv-t4htyWG2HuXrVS3qCKZAxt1Jt8WvsdDxJZ1WApvRhEH8tgwFSqhovWccI/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-K8seigeTBkI2pI2yTKvLw7QfYjRyaoqqVGkDgQjBttNtClcuO6n0jHEram61t4j_fX3AR7WM2fTRyXLfFv-t4htyWG2HuXrVS3qCKZAxt1Jt8WvsdDxJZ1WApvRhEH8tgwFSqhovWccI/s1600/1.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<a href="http://proxytype.blogspot.co.il/2014/05/remote-control-application-mouse.html">במאמר הראשון</a> ראינו כיצד ניתן לדמות תנועה של עכבר בעזרת תוכנה בלבד, השלב הבא הוא להשתלט על המקלדת וכך להשלים את מנגנוני השליטה של הלקוח על השרת, נבנה מחלקה יעודית שדרכה נזריק את המידע כאירועים של לחיצה במקלדת,נתחבר לפונקציה חיצונית נוספת בקובץ user32.dll ונעביר בה את המצבים של המקשים.<br />
<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>keyboardControl.cs</b></span></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
public class keyboardControl</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //key event signature</span></div>
<div dir="ltr" style="text-align: left;">
[DllImport("user32.dll")]</div>
<div dir="ltr" style="text-align: left;">
public static extern void keybd_event(byte bVk, byte bScan,</div>
<div dir="ltr" style="text-align: left;">
uint dwFlags, uint dwExtraInfo);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //keys:up, down, left, right</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //for more keys visit</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //http://msdn.microsoft.com/en-us/library/dd375731%28v=vs.85%29.aspx</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //const int VK_UP = 0x26; </span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //const int VK_DOWN = 0x28;</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //const int VK_LEFT = 0x25;</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //const int VK_RIGHT = 0x27;</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //...</span></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //set key status</span></div>
<div dir="ltr" style="text-align: left;">
const uint KEYEVENTF_KEYUP = 0x0002;</div>
<div dir="ltr" style="text-align: left;">
const uint KEYEVENTF_EXTENDEDKEY = 0x0001;</div>
<div dir="ltr" style="text-align: left;">
</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// <summary></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// set the key as press</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// </summary></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// <param name="key">the number as ascii</param></span></div>
<div dir="ltr" style="text-align: left;">
public void press(int key)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //make key press</span></div>
<div dir="ltr" style="text-align: left;">
keybd_event((byte)key, 0, </div>
<div dir="ltr" style="text-align: left;">
KEYEVENTF_EXTENDEDKEY | 0, 0);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">/// <summary></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// release the press key</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// </summary></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// <param name="key">the number as ascii</param></span></div>
<div dir="ltr" style="text-align: left;">
public void release(int key)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//make the key release</span></div>
<div dir="ltr" style="text-align: left;">
keybd_event((byte)key, 0, </div>
<div dir="ltr" style="text-align: left;">
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1QftS6d-CHNVXymWplnDykq6FjqhQL-Mq-hF7LkLt9K8MhKodrPqecpyVbMbLF_F_FmGrpO0pKwdm_mdJP4a1rueopaLAk5gMKMQCEJlXO0vXO42NFsYzhyphenhyphentHpTkDa9sdjmFGAwtdkmuH/s1600/3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1QftS6d-CHNVXymWplnDykq6FjqhQL-Mq-hF7LkLt9K8MhKodrPqecpyVbMbLF_F_FmGrpO0pKwdm_mdJP4a1rueopaLAk5gMKMQCEJlXO0vXO42NFsYzhyphenhyphentHpTkDa9sdjmFGAwtdkmuH/s1600/3.png" height="99" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">תלחצו על Send וישר תעברו ל Notepad</td></tr>
</tbody></table>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: right;">
תוכנית הבדיקה עבור המנגנון מכילה תיבת טקסט וכפתור כאשר נלחץ עליו היו לנו 5 שניות למצוא את הטופס שאליו אנחנו רוצים להזריק את המחרוזת, בדומה לבקשה שמגיעה מהלקוח לשרת, חשוב מאוד להשים לב שאנחנו מחקים את המקלדת לחלוטין כלומר במקרה שנרצה לרשום את האות a נצטרך להעביר את הערך 0x41 שהוא הערך לאות A בטבלת Ascii במקרה שנרצה להעביר את האות A נצטרך ללחוץ על Shift לרשום את הערך 0x41 ואח"כ לשחרר את ה Shift כפי שניתן לראות בדוגמה:</div>
<div style="text-align: right;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>KeyboardForm.cs</b></span></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
public partial class keyboardForm : Form</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
public keyboardForm()</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
InitializeComponent();</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
keyboardControl d;</div>
<div dir="ltr" style="text-align: left;">
private void keyboardForm_Load(object sender, EventArgs e)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
d = new keyboardControl();</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// <summary></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// start inject the message to keyboard</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// </summary></span></div>
<div dir="ltr" style="text-align: left;">
private void btn_send_Click(object sender, EventArgs e)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
if (txb_message.Text != "")</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //wait 5 second this is enougth time to find application and inject it</span></div>
<div dir="ltr" style="text-align: left;">
Thread.Sleep(5000);</div>
<div dir="ltr" style="text-align: left;">
send();</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
txb_message.Text = "";</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// <summary></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// send the message as key press</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// </summary></span></div>
<div dir="ltr" style="text-align: left;">
private void send()</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
string message = txb_message.Text;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
for (int i = 0; i < message.Length; i++)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //set shift key on</span></div>
<div dir="ltr" style="text-align: left;">
if (char.IsUpper(message[i]))</div>
<div dir="ltr" style="text-align: left;">
d.press(0x10);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //set the keys</span></div>
<div dir="ltr" style="text-align: left;">
d.press(char.ToUpper(message[i]));</div>
<div dir="ltr" style="text-align: left;">
d.release(char.ToUpper(message[i]));</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //release shift key</span></div>
<div dir="ltr" style="text-align: left;">
if (char.IsUpper(message[i]))</div>
<div dir="ltr" style="text-align: left;">
d.release(0x10);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div style="text-align: right;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br />
<div dir="rtl" style="text-align: right;">
<span style="color: #3d85c6;"><b>סיכום</b></span></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
עד עכשיו טיפלנו בשליטה של הלקוח על החומרה, השלב הבא הוא לבצע לכידה של המסך בשרת ולהעביר למשתמש מרוחק.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
קצת שליטה לא תזיק...</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
</div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-51879173301166293142014-05-24T04:49:00.000-07:002014-05-24T09:04:22.487-07:00Remote Control Application - Mouse<div dir="rtl" style="text-align: right;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPxz0VdmCBEMesu1T7hMkI852WgaRkpUuL6U7L55ZeLywLu7EBg6UzqTYdCn_0zjT_K5yvMgbB0zh83frf4jaxfaCorh2mPtKeuJwEt3akWzifFoSEbygWN0sUdj6s7r5oHlZyqvTq6HqB/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPxz0VdmCBEMesu1T7hMkI852WgaRkpUuL6U7L55ZeLywLu7EBg6UzqTYdCn_0zjT_K5yvMgbB0zh83frf4jaxfaCorh2mPtKeuJwEt3akWzifFoSEbygWN0sUdj6s7r5oHlZyqvTq6HqB/s1600/1.png" /></a></div>
<br />
<br />
תוכנות לשליטה מרחוק הן כלי חיוני בניהול מחשבים, זה כלי תמיכה מעולה ולגיטמי ברוב המקרים אבל יש מקרים שזה עלול להיות כלי מסוכן שיכול לעלות לנו ביוקר, בסדרת המאמרים הקרובה אתמקד כיצד לבנות תוכנית שתאפשר לנו לשלוט במחשבים מבוססי Windows מרחוק, התוכנית מחולקת ל 2 חלקים כיאה לעבודה עם Sockets אבל לפני שנתחיל לכתוב את צד השרת והלקוח קודם נגדיר על איזה מנגנונים נאפשר שליטה.<br />
<br />
המנגנון הראשון הוא העכבר, אנחנו רוצים להזיז וללחוץ עליו מרחוק, נגדיר מחלקה שדרכה ניגשים למשאבים של העכבר, בעזרת קריאה לפונקציה <span style="text-align: left;">mouse_event נוכל לדמות אירועים של כפתורים, נוסיף פונקציות נוספות שדרכן נזיז את העכבר לנקודה במסך ונקבל את מיקום הסמן.</span><br />
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b> mouseControl.cs</b></span></div>
<br />
<div dir="ltr" style="text-align: left;">
public class mouseControl</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// <summary></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// mouse virtual buttons</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// </summary></span></div>
<div dir="ltr" style="text-align: left;">
public enum mouseButtons</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
LEFT,</div>
<div dir="ltr" style="text-align: left;">
RIGHT</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//mouse event signature</span></div>
<div dir="ltr" style="text-align: left;">
[DllImport("user32.dll", CharSet = CharSet.Auto, </div>
<div dir="ltr" style="text-align: left;">
CallingConvention = CallingConvention.StdCall)]</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
public static extern void mouse_event(long dwFlags, long dx,</div>
<div dir="ltr" style="text-align: left;">
long dy, long cButtons, long dwExtraInfo);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//mouse event types, for more events visit this link</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //http://msdn.microsoft.com/en-us/library/windows/desktop/ms646260(v=vs.85).aspx</span></div>
<div dir="ltr" style="text-align: left;">
private const int MOUSEEVENTF_LEFTDOWN = 0x02;</div>
<div dir="ltr" style="text-align: left;">
private const int MOUSEEVENTF_LEFTUP = 0x04;</div>
<div dir="ltr" style="text-align: left;">
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;</div>
<div dir="ltr" style="text-align: left;">
private const int MOUSEEVENTF_RIGHTUP = 0x10;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// <summary></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// raise mouse click event</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// </summary></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// <param name="btn">left / right buttons</param></span></div>
<div dir="ltr" style="text-align: left;">
public void mouseClick(mouseButtons btn)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
switch (btn)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
case mouseButtons.LEFT:</div>
<div dir="ltr" style="text-align: left;">
mouse_event(MOUSEEVENTF_LEFTDOWN | </div>
<div dir="ltr" style="text-align: left;">
MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);</div>
<div dir="ltr" style="text-align: left;">
break;</div>
<div dir="ltr" style="text-align: left;">
case mouseButtons.RIGHT:</div>
<div dir="ltr" style="text-align: left;">
mouse_event(MOUSEEVENTF_RIGHTDOWN |</div>
<div dir="ltr" style="text-align: left;">
MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);</div>
<div dir="ltr" style="text-align: left;">
break;</div>
<div dir="ltr" style="text-align: left;">
default:</div>
<div dir="ltr" style="text-align: left;">
break;</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// <summary></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// move the mouse to new location</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// </summary></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// <param name="x">x position</param></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// <param name="y">y position</param></span></div>
<div dir="ltr" style="text-align: left;">
public void mouseMove(int x, int y)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
Cursor.Position = new Point(x, y); </div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">/// <summary></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// get the cursor location on screen</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// </summary></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> /// <returns>cursor location</returns></span></div>
<div dir="ltr" style="text-align: left;">
public Point screenLocation()</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
return Cursor.Position;</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br />
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
על מנת שנוכל לבדוק את המחלקה נבנה תוכנית מאוד פשוטה, מדובר על טופס שמכיל מספר כפתורים ושדות שדרכם נשלוט בעכבר, בנוסף נגדיר שעון שדוגם כל 100ms את המיקום הנוכחי של העכבר ע"ג המסך, המטרה של התוכנית היא קודם כל לבדוק את הקוד מקומית ואח"כ מרחוק כפי שנראה במאמרים הבאים.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT1ZgCq7KjPzBULfBwZYJTWtCdlh9ypSI78eqi6uIxZOQHT3E1Y0sDmci-PlGtb06FmAqyGDGK2Mz9uETrGMV9s9EY2GVclv-aK8QW0xkqtLlafTGz3xQzL4WvQZkNwNNRveiCz6DftFRc/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT1ZgCq7KjPzBULfBwZYJTWtCdlh9ypSI78eqi6uIxZOQHT3E1Y0sDmci-PlGtb06FmAqyGDGK2Mz9uETrGMV9s9EY2GVclv-aK8QW0xkqtLlafTGz3xQzL4WvQZkNwNNRveiCz6DftFRc/s1600/2.png" /></a></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div style="text-align: left;">
<span style="color: #3d85c6;"><b>mouseForm.cs</b></span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
public partial class mouseForm : Form</div>
<div style="text-align: left;">
{</div>
<div style="text-align: left;">
mouseControl c;</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
public mouseForm()</div>
<div style="text-align: left;">
{</div>
<div style="text-align: left;">
InitializeComponent();</div>
<div style="text-align: left;">
}</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
private void mouseForm_Load(object sender, EventArgs e)</div>
<div style="text-align: left;">
{</div>
<div style="text-align: left;">
txb_x.Text = "0";</div>
<div style="text-align: left;">
txb_y.Text = "0";</div>
<div style="text-align: left;">
c = new mouseControl();</div>
<div style="text-align: left;">
}</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="color: lime;">/// <summary></span></div>
<div style="text-align: left;">
<span style="color: lime;"> /// timer for polling the location every 100ms</span></div>
<div style="text-align: left;">
<span style="color: lime;"> /// </summary></span></div>
<div style="text-align: left;">
private void timer1_Tick(object sender, EventArgs e)</div>
<div style="text-align: left;">
{</div>
<div style="text-align: left;">
Point p = c.screenLocation();</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
lbl_x.Text = "X:" + p.X.ToString();</div>
<div style="text-align: left;">
lbl_y.Text = "Y:" + p.Y.ToString();</div>
<div style="text-align: left;">
}</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="color: lime;"> /// <summary></span></div>
<div style="text-align: left;">
<span style="color: lime;"> /// getting the location of the cursor</span></div>
<div style="text-align: left;">
<span style="color: lime;"> /// </summary></span></div>
<div style="text-align: left;">
private void setLocation()</div>
<div style="text-align: left;">
{</div>
<div style="text-align: left;">
int x = 0, y = 0;</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
int.TryParse(txb_x.Text, out x);</div>
<div style="text-align: left;">
int.TryParse(txb_y.Text, out y);</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
c.mouseMove(x, y);</div>
<div style="text-align: left;">
}</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="color: lime;">/// <summary></span></div>
<div style="text-align: left;">
<span style="color: lime;"> /// move the cursor by x and y</span></div>
<div style="text-align: left;">
<span style="color: lime;"> /// </summary></span></div>
<div style="text-align: left;">
private void btn_move_Click(object sender, EventArgs e)</div>
<div style="text-align: left;">
{</div>
<div style="text-align: left;">
//set the cursor location</div>
<div style="text-align: left;">
setLocation();</div>
<div style="text-align: left;">
}</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="color: lime;"> /// <summary></span></div>
<div style="text-align: left;">
<span style="color: lime;"> /// move the cursor and make double click on the left button</span></div>
<div style="text-align: left;">
<span style="color: lime;"> /// </summary></span></div>
<div style="text-align: left;">
private void btn_left_Click(object sender, EventArgs e)</div>
<div style="text-align: left;">
{</div>
<div style="text-align: left;">
<span style="color: lime;">//set the cursor location</span></div>
<div style="text-align: left;">
setLocation();</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="color: lime;">//single click</span></div>
<div style="text-align: left;">
c.mouseClick(mouseControl.mouseButtons.LEFT);</div>
<div style="text-align: left;">
<span style="color: lime;"> //add other request for double click</span></div>
<div style="text-align: left;">
c.mouseClick(mouseControl.mouseButtons.LEFT);</div>
<div style="text-align: left;">
}</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="color: lime;"> /// <summary></span></div>
<div style="text-align: left;">
<span style="color: lime;"> /// move the cursor and make double click on right button</span></div>
<div style="text-align: left;">
<span style="color: lime;"> /// </summary></span></div>
<div style="text-align: left;">
private void btn_right_Click(object sender, EventArgs e)</div>
<div style="text-align: left;">
{</div>
<div style="text-align: left;">
<span style="color: #3d85c6;"> </span><span style="color: lime;">//set the cursor location</span></div>
<div style="text-align: left;">
setLocation();</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="color: lime;"> //single click</span></div>
<div style="text-align: left;">
c.mouseClick(mouseControl.mouseButtons.RIGHT);</div>
<div style="text-align: left;">
<span style="color: lime;">//add other request for double click</span></div>
<div style="text-align: left;">
c.mouseClick(mouseControl.mouseButtons.RIGHT);</div>
<div style="text-align: left;">
}</div>
<div style="text-align: left;">
}</div>
<div style="text-align: left;">
<br /></div>
</div>
<div dir="ltr" style="text-align: left;">
<br />
<div dir="rtl" style="text-align: right;">
<span style="color: #3d85c6;"><b>סיכום</b></span></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
אז אחרי שיש שליטה על העכבר נעבור למנגנונים נוספים כמו המקלדת ולכידת מסך אח"כ נכתוב את צד השרת ואת צד הלקוח ונשלב בהם את המחלקות שבנינו יחד עם אובייקט מרכזי שיעבור בניהם.<br />
<br />
תחילת של דלת סתרים....</div>
</div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-20247446531509343852014-05-10T02:59:00.000-07:002014-05-10T03:19:15.864-07:00WebView Interfaces<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjezxxr_avNEREFqh8sHzgdqo3thPg018f4R0P5G1tGJEPRGRip7vGzkEmINc8Ww-6nzwq8PaxM8fuVqzWj7OoOJW6SwtAdZsINWMOU85TKI5NnujW4QtMZDXJkEg9SNegBdBB_xWINEI_c/s1600/untitled.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjezxxr_avNEREFqh8sHzgdqo3thPg018f4R0P5G1tGJEPRGRip7vGzkEmINc8Ww-6nzwq8PaxM8fuVqzWj7OoOJW6SwtAdZsINWMOU85TKI5NnujW4QtMZDXJkEg9SNegBdBB_xWINEI_c/s1600/untitled.bmp" /></a></div>
<br />
<br />
<br />
כשניגשים לפתח אפליקציה נשאלת השאלה <span style="color: yellow;">מה הפלטפורמה המתאימה ביותר?</span>, חלק יגידו שכתיבה מסורתית בקוד Native היא הפתרון המתאים ויש כאלה שחולקים על זה ומעדיפים לכתוב ב HTML 5 במעטפת Webkit ותוספות נוספות כמו <a href="http://en.wikipedia.org/wiki/PhoneGap">PhoneGap</a>, האמת שככל שעובר זמן יש יתרון בולט ל Html 5 כי אינו מצריך התייחסות מיוחדת כלפי מערכת ההפעלה והופך את האפליקציה ל Cross Platform אבל ברגע שצריכים לבצע פעולות מיוחדות בחומרה כל העסק מתחיל להתפרק כמו מגדל קלפים ברוח.<br />
<br />
אופי האפליקציה חשוב מאוד לבחירת הפלטפורמה למשל אם זו תוכנית לתצוגת נתונים מ Database שמזכירה בהתנהגות שלה אתר אינטרנט מומלץ להשתמש ב Html 5, זו הדרך הפשוטה והמהירה ביותר, אבל אם רוצים להשתמש במצלמה או בכל רכיב חומרתי אחר Native Code חזק יותר אז מה עושים עם <span style="color: yellow;">אפליקציות שקשה להגדיר?</span> נקודת המוצא היא להשתמש ב Native אבל אם ניתן להגדיר תחומי אחריות ברורים ניתן לשלב גם Html וכך להקטין את התלות במערכות ההפעלה.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSnZVK2XJWVJ5aYEIK_Aj9iiY_KrTPNvf1Cg7aj9QW792bz0rODEczMUspHtrjLHnGtE-juljs4VMCUtKVTvLN7Js5rT_uWz8KfrNURpfA4qGHZO1MSaPfcrt1AYWOi5P8P7nJVyFW6QiF/s1600/1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSnZVK2XJWVJ5aYEIK_Aj9iiY_KrTPNvf1Cg7aj9QW792bz0rODEczMUspHtrjLHnGtE-juljs4VMCUtKVTvLN7Js5rT_uWz8KfrNURpfA4qGHZO1MSaPfcrt1AYWOi5P8P7nJVyFW6QiF/s1600/1.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">סביבות משולבות</td></tr>
</tbody></table>
<br />
ההתממשקות הראשונה היא בסיסית ביותר ונעשת בעזרת האזנה מאחורי הקלעים ל Redirects שקורים ב WebKit ומאפשרת לשנות את ההתנהגות של האפליקציה, הדוגמה מתחילה מ Activity שמכיל בתוכו כפתור, לחיצה עליו מעבירה ל Activity אחר עם Webview שטוען דף Html עם מספר קישורים שמובילים לאיזורים שונים באפליקציה:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIaRP62dgvtMKu2J1YwlEkFKJMQrG8sGfOjEtlDdqzOae7YuOs5WWlepX70AtGepZ08vEO5WMtnaG1w4LA3BcX85rKRRGZLR-qHKDbpJBF6ndkfBicGztXTVXlWTF5ThsmGD2QwiqgBf_H/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIaRP62dgvtMKu2J1YwlEkFKJMQrG8sGfOjEtlDdqzOae7YuOs5WWlepX70AtGepZ08vEO5WMtnaG1w4LA3BcX85rKRRGZLR-qHKDbpJBF6ndkfBicGztXTVXlWTF5ThsmGD2QwiqgBf_H/s1600/2.png" height="231" width="400" /></a></div>
<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>BrowserActivity</b></span></div>
<br />
כשמתמקדים בקוד של ה Activity ניתן לראות כיצד אפשר לדרוס את הפונקציה המקורית של ה WebKit בפונקציה חדשה דרכה ניתן לנתח את הבקשות של המשתמש.<br />
<br />
<div dir="ltr" style="text-align: left;">
import android.os.Bundle;</div>
<div dir="ltr" style="text-align: left;">
import android.app.Activity;</div>
<div dir="ltr" style="text-align: left;">
import android.content.Intent;</div>
<div dir="ltr" style="text-align: left;">
import android.webkit.WebView;</div>
<div dir="ltr" style="text-align: left;">
import android.webkit.WebViewClient;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
public class BrowserActivity extends Activity {</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Override</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>protected void onCreate(Bundle savedInstanceState) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>super.onCreate(savedInstanceState);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>setContentView(R.layout.activity_browser);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>WebView _view = (WebView)findViewById(R.id.webView1);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>class MainScreenActivity extends WebViewClient {</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//every redirect active this function</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Override</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>public boolean shouldOverrideUrlLoading(WebView view, String url) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//checking the url and change behavior</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if(url.toLowerCase().contains("back:mainactivity"))</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>{</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>finish();</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return true;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>else if(url.toLowerCase().contains("goto:otheractivity"))</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>{</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>Intent intent = new Intent(BrowserActivity.this,OtherActivity.class);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>startActivity(intent);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return true;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>else</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>{</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//send back to the original call</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return super.shouldOverrideUrlLoading(view, url);<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//overwrite the WebViewClient class with new implementation </span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>_view.setWebViewClient(new MainScreenActivity());</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//make the first call</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>_view.loadUrl("file:///android_asset/www/index.html"); </div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
}</div>
<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>JavaScript Interface</b></span></div>
<div dir="ltr" style="text-align: left;">
<br />
<div dir="rtl" style="text-align: right;">
ההתממשקות הבאה יותר מורכבת ומאפשרת לקרוא לפונקציות Native בעזרת פונקציות JavaScript , יוצרים מחלקה ייעודית שדרכה נוצר גשר שמחבר בין 2 הפלטפורמות.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
import android.os.Bundle;</div>
<div style="text-align: left;">
import android.app.Activity;</div>
<div style="text-align: left;">
import android.content.Context;</div>
<div style="text-align: left;">
import android.webkit.WebView;</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
public class BrowserActivity extends Activity {</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Override</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>protected void onCreate(Bundle savedInstanceState) {</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>super.onCreate(savedInstanceState);</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>setContentView(R.layout.activity_browser);</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>WebView _view = (WebView)findViewById(R.id.webView1);</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//add javascript support to webview</span></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>_view.getSettings().setJavaScriptEnabled(true);</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//interface implementation</span></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> class jsInterface{</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> Context mContext;</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> String mMsg;</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> <br />
public jsInterface(Context m) {</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> mContext = m;</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> }</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> <span style="color: lime;">//@JavascriptInterface</span></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> <span style="color: lime;">//add in higher sdk version </span><span style="color: lime;"> </span><span style="color: lime;">4.0.1 +</span></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> public void SetInterface(String Msg)</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> {</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> mMsg = Msg;</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> }</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<div>
<span style="color: lime;">//@JavascriptInterface</span></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> <span style="color: lime;">//add in higher sdk version </span><span style="color: lime;"> </span><span style="color: lime;">4.0.1 +</span></div>
</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> public String GetInterface()</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> {</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> return mMsg;</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span> }</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span> <span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//add interface to webview, with bridge name</span></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>_view.addJavascriptInterface(new jsInterface(this), "Android");</div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//make the first call</span></div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>_view.loadUrl("file:///android_asset/www/index.html"); </div>
<div style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
}</div>
<div style="text-align: left;">
<br /></div>
<div dir="rtl" style="text-align: right;">
קובץ ה JavaScript קורא לפונקציות החשופות בעזרת השם של הממשק:</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div style="text-align: left;">
<div>
function setMessage()</div>
<div>
{</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><b>Android</b>.SetInterface(document.getElementById('txt_msg').value);</div>
<div>
}</div>
<div>
<br /></div>
<div>
function getMessage()</div>
<div>
{</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>document.getElementById('lbl_msg').innerHTML = <b>Android</b>.GetInterface();</div>
<div>
}</div>
<div>
<br /></div>
</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
<span style="color: #3d85c6;"><b>סיכום</b></span></div>
<div dir="rtl" style="text-align: right;">
<br />
אני לא יודע מה יקרה בעתיד אבל הדילמה אם להשתמש ב Native או ב Html 5 עדיין קיימת ומצריכה חשיבה מחוץ לקופסה,המון חברות לקחו את הרעיון של ה HTML5 ויצרו סביבות פיתוח שלמות שמבוססות על הרעיון, אם זו השיטה הטובה ביותר, לא תמיד ולפעמים אין ברירה ולדבר עם המכשיר בשפה שהוא מכיר.<br />
<br /></div>
<div dir="rtl" style="text-align: right;">
<b><span style="color: #3d85c6;">קוד מקור</span></b><br />
<div dir="ltr" style="text-align: left;">
<a href="https://sourceforge.net/projects/webviewinterface/files/webview.rar/download">https://sourceforge.net/projects/webviewinterface/files/webview.rar/download</a></div>
<br /></div>
<div dir="rtl" style="text-align: right;">
<span style="color: #3d85c6;"><b>מידע נוסף</b></span></div>
<div style="text-align: left;">
<a href="http://developer.android.com/guide/webapps/webview.html#BindingJavaScript">http://developer.android.com/guide/webapps/webview.html#BindingJavaScript</a></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
בהצלחה...</div>
</div>
<div style="text-align: right;">
<br /></div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-24569519010811856632014-04-26T08:45:00.000-07:002014-04-26T08:45:58.009-07:00Linked List Linux Kernel<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA3JeALLUr6O1qQwJ2LjJEDZF3dcRUVksuTD5BJJ11sHyXGQu8fdjssmmS7sJNVgM87zIg1R1otLTYs4N_6W2uJswUsKNXhjzgavq-PAqgrm9ZbU9zzbkwGNbI_b8II2wgifYchiR-lcVA/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA3JeALLUr6O1qQwJ2LjJEDZF3dcRUVksuTD5BJJ11sHyXGQu8fdjssmmS7sJNVgM87zIg1R1otLTYs4N_6W2uJswUsKNXhjzgavq-PAqgrm9ZbU9zzbkwGNbI_b8II2wgifYchiR-lcVA/s1600/1.png" /></a></div>
<br />
בהמשך למסע ב Kernel החלטתי להתמקד בקצרה על רשימות מקושרות, למי שלא מכיר או שהספיק לשכוח מדובר על דרך לחבר בין אובייקטים בעזרת מצביעים לאובייקטים אחרים בזיכרון, לכל אובייקט יש מצביע לאובייקט שלפניו ומצביע לאובייקט שאחריו כפי שניתן לראות בתמונה:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAPj322IbKkEcuOBxkbN2ZTv3OwdESzrYq4A0mRmlU_-4uFZliY6J9vy5PomqXgGe86b8Em6iHRh5haC6w0Pbir4clojUn8j_AU4V5a5j6MCf6yQovYZ5A9jIXxzfhrCpndDJDtn8Dfo_3/s1600/linkedlist.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAPj322IbKkEcuOBxkbN2ZTv3OwdESzrYq4A0mRmlU_-4uFZliY6J9vy5PomqXgGe86b8Em6iHRh5haC6w0Pbir4clojUn8j_AU4V5a5j6MCf6yQovYZ5A9jIXxzfhrCpndDJDtn8Dfo_3/s1600/linkedlist.png" /></a></div>
<br />
<br />
<span style="color: red;"><b>שימו לב!</b></span><br />
<br />
<ul style="text-align: right;">
<li>עבודה מול ה Kernel עלולה להזיק למחשב שלך, מומלץ לעבוד על תחנה וירטואלית.</li>
<li>המאמר נכתב על Fedora 14.</li>
</ul>
<br />
מערכת ההפעלה נותנת כלים פנימיים שעוזרים לנהל את הרשימות במקום שנהל בעצמנו, קובץ list.h חושף מספר פונקציות ו Macros כפי שניתן לראות בדוגמה:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>myList.c</b></span></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//define module</span></div>
<div dir="ltr" style="text-align: left;">
#include <linux/module.h></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//we are in the kerenl</span></div>
<div dir="ltr" style="text-align: left;">
#include <linux/kernel.h></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//linked list header</span></div>
<div dir="ltr" style="text-align: left;">
#include <linux/list.h></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//example struct to be linked</span></div>
<div dir="ltr" style="text-align: left;">
struct element {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>int id;<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>char name[15];</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>char description[50];</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//creating header, next and previous pointers</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct list_head list;</div>
<div dir="ltr" style="text-align: left;">
};</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//the list!</span></div>
<div dir="ltr" style="text-align: left;">
struct element elementsList;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
void addElements(void)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct element *tmp;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>int listMax = 20;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>int i = 0;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>for(i = 0; i < listMax; i++)</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>{</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//getting memory for the struct<span class="Apple-tab-span" style="white-space: pre;"> </span></span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>tmp = kmalloc(sizeof(*tmp),GFP_KERNEL);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>tmp->id = i;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>strcpy(tmp->name, "Element");</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>strcpy(tmp->description, "just simple element inside the list");</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//initializes pointers</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>INIT_LIST_HEAD(&tmp->list);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//add the element at the end of the list</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>list_add_tail(&(tmp->list), &(elementsList.list));</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printk(KERN_INFO "load complete\n");</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
void deleteElements(void)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct element *tmp, *node;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //if deleting elements better using this function,</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //it preserve the pointer to the next element,preventing holes inside the list. </span></div>
<div dir="ltr" style="text-align: left;">
list_for_each_entry_safe(node, tmp, &elementsList.list, list){</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//remove from the list</span></div>
<div dir="ltr" style="text-align: left;">
list_del(&node->list);</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//release the memory</span></div>
<div dir="ltr" style="text-align: left;">
kfree(node);</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
void viewElements(void)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct element *tmp;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//running through all elements</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>list_for_each_entry(tmp, &elementsList.list, list) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printk(KERN_INFO "Element\n ID: %d; Name: %s; </div>
<div dir="ltr" style="text-align: left;">
Description: %s\n", tmp->id, tmp->name, tmp->description);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
int c_module() {</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//initializes the list</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>INIT_LIST_HEAD(&elementsList.list);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printk(KERN_INFO "initialize list complete\n");</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>addElements();</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>viewElements();</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return 0;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
void r_module()</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printk(KERN_INFO "delete list\n");</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>deleteElements();</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printk(KERN_INFO "remove module complete\n");</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
module_init(c_module);</div>
<div dir="ltr" style="text-align: left;">
module_exit(r_module);</div>
<br />
<br />
<br />
מגדירים מבנה עם אובייקט מיוחד מסוג <span style="text-align: left;">list_head</span><span style="text-align: left;"> שמכיל בתוכו את המצביעים, מייצרים מופע כללי של המבנה שמייצג את ראש הרשימה, בשלב טעינת ה Module נטענת הפונקציה addElements שמכניסה 20 אובייקטים לרשימה, היא מאפסת את המצביעים ושולחת כל מבנה לפונקציה (</span><span style="text-align: left;">list_add_tail) שמוסיפה אותו לסוף הרשימה.</span><br />
<span style="text-align: left;"><br /></span>
<span style="text-align: left;">לסיום רצה הפונקציה viewElements שמציגה את הרשימה בעזרת המאקרו </span><span style="text-align: left;">list_for_each_entry שדרכו ניתן לעבור על האלמנטים, </span><span style="text-align: left;">בהסרת ה Module רצה הפונקציה deleteElements שמפעילה את המאקרו</span><span style="text-align: left;"> list_for_each_entry_safe שדואג להסרה בטוחה של אובייקטים מבלי שהיו חורים ברשימה.</span><br />
<br />
<span style="color: #3d85c6;"><b>סיכום</b></span><br />
<br />
מדובר בכלי חזק אבל קצת מסורבל שעלול לגרום לכאב ראש לא קטן אם ננסה לממש אותו בעצמנו, Linux חוסכת את כל ההתעסקות הכואבת במצביעים ונותנת תשתית נוחה לבניה ולניהול רשימות מקושרות.<br />
<br />
<span style="color: #3d85c6;"><b>מידע נוסף</b></span><br />
<br />
<div dir="ltr" style="text-align: left;">
<a href="http://lxr.free-electrons.com/source/scripts/kconfig/list.h#L48">http://lxr.free-electrons.com/source/scripts/kconfig/list.h#L48</a></div>
<br />
רשמת?<br />
<br />
<br />
<br />
<br /></div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-47792634777573506152014-04-12T13:56:00.000-07:002014-04-12T13:56:27.620-07:00Procsfs Linux Kernel<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0snjwsrWOFgq8SBVSA0pg53peGbIleyri4nkR9BV-sSOCFTPZ37lz7XO1Fss7zHGBVRzG9fmYsX9Stj-L03EDRbaED6E0MXD_39MxgoPlwZmurZuYluTg3aUp-fXXBFjRab4Q-Niaf1SO/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0snjwsrWOFgq8SBVSA0pg53peGbIleyri4nkR9BV-sSOCFTPZ37lz7XO1Fss7zHGBVRzG9fmYsX9Stj-L03EDRbaED6E0MXD_39MxgoPlwZmurZuYluTg3aUp-fXXBFjRab4Q-Niaf1SO/s1600/1.png" /></a></div>
<br />
<br />
מערכת Linux נותנת מספר דרכים להעברת מידע בין ה User Space ל Kernel, אחת הדרכים הצגתי <a href="http://proxytype.blogspot.co.il/2013/11/linux-kernel-guide.html">במאמר הפתיחה</a> בעזרת Character Device שיוצר קובץ בתיקיית ה Dev דרכו מדברים עם ה Module, השיטה הנוספת שהחלטתי להתמקד עליה היא Procs File System שמאוד דומה רק שהקובץ ממוקם בספריית ה Proc ללא צורך רישום כ Device.<br />
<br />
הקובץ פותח שער שדרכו כותבים וקוראים מה Module בדומה לעבודה על קבצים (פתיחה,כתיבה,קריאה וסגירה) וכך נוצר ממשק אחיד, פשוט ונוח, לצורך הדוגמה כשנריץ את הפקודה Cat על הקובץ cpuinfo בתקיית proc נקבל את הפלט הבא:<br />
<br />
<div dir="ltr" style="text-align: left;">
[root@localhost proc]# cat cpuinfo </div>
<div dir="ltr" style="text-align: left;">
processor<span class="Apple-tab-span" style="white-space: pre;"> </span>: 0</div>
<div dir="ltr" style="text-align: left;">
vendor_id<span class="Apple-tab-span" style="white-space: pre;"> </span>: GenuineIntel</div>
<div dir="ltr" style="text-align: left;">
cpu family<span class="Apple-tab-span" style="white-space: pre;"> </span>: 6</div>
<div dir="ltr" style="text-align: left;">
model<span class="Apple-tab-span" style="white-space: pre;"> </span>: 26</div>
<div dir="ltr" style="text-align: left;">
model name<span class="Apple-tab-span" style="white-space: pre;"> </span>: Intel(R) Core(TM) i7 CPU 950 @ 3.07GHz</div>
<div dir="ltr" style="text-align: left;">
stepping<span class="Apple-tab-span" style="white-space: pre;"> </span>: 5</div>
<div dir="ltr" style="text-align: left;">
cpu MHz<span class="Apple-tab-span" style="white-space: pre;"> </span>: 3158.658</div>
<div dir="ltr" style="text-align: left;">
cache size<span class="Apple-tab-span" style="white-space: pre;"> </span>: 6144 KB</div>
<div dir="ltr" style="text-align: left;">
fdiv_bug<span class="Apple-tab-span" style="white-space: pre;"> </span>: no</div>
<div dir="ltr" style="text-align: left;">
hlt_bug<span class="Apple-tab-span" style="white-space: pre;"> </span>: no</div>
<div dir="ltr" style="text-align: left;">
f00f_bug<span class="Apple-tab-span" style="white-space: pre;"> </span>: no</div>
<div dir="ltr" style="text-align: left;">
coma_bug<span class="Apple-tab-span" style="white-space: pre;"> </span>: no</div>
<div dir="ltr" style="text-align: left;">
fpu<span class="Apple-tab-span" style="white-space: pre;"> </span>: yes</div>
<div dir="ltr" style="text-align: left;">
fpu_exception<span class="Apple-tab-span" style="white-space: pre;"> </span>: yes</div>
<div dir="ltr" style="text-align: left;">
cpuid level<span class="Apple-tab-span" style="white-space: pre;"> </span>: 5</div>
<div dir="ltr" style="text-align: left;">
wp<span class="Apple-tab-span" style="white-space: pre;"> </span>: yes</div>
<div dir="ltr" style="text-align: left;">
flags<span class="Apple-tab-span" style="white-space: pre;"> </span>: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm constant_tsc up pni monitor ssse3 lahf_lm</div>
<div dir="ltr" style="text-align: left;">
bogomips<span class="Apple-tab-span" style="white-space: pre;"> </span>: 6317.31</div>
<div dir="ltr" style="text-align: left;">
clflush size<span class="Apple-tab-span" style="white-space: pre;"> </span>: 64</div>
<div dir="ltr" style="text-align: left;">
cache_alignment<span class="Apple-tab-span" style="white-space: pre;"> </span>: 64</div>
<div dir="ltr" style="text-align: left;">
address sizes<span class="Apple-tab-span" style="white-space: pre;"> </span>: 36 bits physical, 48 bits virtual</div>
<div dir="ltr" style="text-align: left;">
power management:</div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<span style="color: red;"><b>שימו לב!</b></span></div>
<div style="text-align: right;">
<ul style="text-align: right;">
<li>עבודה מול ה Kernel עלולה להזיק למחשב שלך ממולץ לעבוד על תחנה וירטואלית.</li>
<li>המאמר נכתב על Fedora 14.</li>
</ul>
<div>
<br /></div>
</div>
<div style="text-align: right;">
מייצרים אובייקט מסוג proc_dir_entry שמייצג את הקובץ בתיקיית ה Proc, לאחר מכן דורסים את הפונקציות Read ו Write של הקובץ לפונקציות פנימיות ב Module, מגדירים Buffer עבור המידע שיעבור ואפשר להגיד שסיימנו.</div>
<div style="text-align: right;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>procModule.c</b></span></div>
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//define module.</span></div>
<div dir="ltr" style="text-align: left;">
#include <linux/module.h></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//we are in the kernel.</span></div>
<div dir="ltr" style="text-align: left;">
#include <linux/kernel.h></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//proc header.</span></div>
<div dir="ltr" style="text-align: left;">
#include <linux/proc_fs.h></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//copy from user.</span></div>
<div dir="ltr" style="text-align: left;">
#include <asm/uaccess.h></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: orange;">#define PROCMAXSIZE 4096</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: orange;">#define PROC_NAME "Bridge"</span></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//pointer to the proc file.</span></div>
<div dir="ltr" style="text-align: left;">
static struct proc_dir_entry *procfile;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//buffer of the proc file.</span></div>
<div dir="ltr" style="text-align: left;">
static char procbuffer[PROCMAXSIZE];</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//buffer size.</span></div>
<div dir="ltr" style="text-align: left;">
static unsigned long buffersize = 0;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//proc file new read function will overwrite the old one.</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//buffer: the kernel buffer pointer.</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//buffer_location: the starting point of reading</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//offset:the offset from the beginning of the file.</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//buffer_length: the number of chars to read.</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//eof: end of file pointer if there is more to read.</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//data: private data.</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//return the read length value.</span></div>
<div dir="ltr" style="text-align: left;">
int procfile_read(char *buffer, char **buffer_location,off_t offset, int buffer_length, int *eof, void *data)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>int length;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (offset > 0) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//nothing to read reset length read value.</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>length = 0;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>} else {</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//copy data from kernel space to user space.</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>memcpy(buffer, procbuffer, buffersize);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printk(KERN_INFO "Read: %s \n", procbuffer);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//set the length read value.</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>length = buffersize;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return length;</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//proc file new write function will overwrite the old one.</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//file: open file structure.</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//buffer: user space buffer.</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//count: the number of chars been writes.</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//data: private data.</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//return the read length value.</span></div>
<div dir="ltr" style="text-align: left;">
int procfile_write(struct file *file, const char *buffer, unsigned long count, void *data)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//getting buffer size.</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>buffersize = count;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//check for overflow.</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (buffersize > PROCMAXSIZE ) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>buffersize = PROCMAXSIZE;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//copy data from user space buffer to kernel space buffer.</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if ( copy_from_user(procbuffer, buffer, buffersize) ) {</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//return error if unable.</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return -EFAULT;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printk(KERN_INFO "Write: %s \n", procbuffer);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//return the size of writing.</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return buffersize;</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
int c_module()</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"><span class="Apple-tab-span" style="white-space: pre;"> </span>//create the proc file on module creation,</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"><span class="Apple-tab-span" style="white-space: pre;"> </span>//give name and permissions.</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>procfile = create_proc_entry(PROC_NAME, 0644, NULL);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//if null return error handling.</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (procfile == NULL) {</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>remove_proc_entry(PROC_NAME, NULL);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printk(KERN_ALERT "Cannot create Proc: %s\n",PROC_NAME);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//maybe cause by out of memory.</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return -ENOMEM;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//overwrite the original read and write functions of the file.</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>procfile->read_proc = procfile_read;</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>procfile->write_proc = procfile_write;</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printk(KERN_INFO "%s created\n", PROC_NAME);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//operation complete.</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>return 0;</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
void r_module()</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//remove proc file entry from folder.</span></div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>remove_proc_entry(PROC_NAME, NULL);</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>printk(KERN_INFO "/proc/%s removed\n", PROC_NAME);</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
module_init(c_module);</div>
<div dir="ltr" style="text-align: left;">
module_exit(r_module);</div>
<br />
<br />
נעשה Compile בעזרת Makefile ונטען את ה Module לזיכרון עם הפקודה insmod, נבדוק בתיקיית ה proc שנוצר הקובץ בשם Bridge ונתחיל לדבר איתו בעזרת פקודות מה Command Line כפי שניתן לראות בדוגמה:<br />
<br />
<div dir="ltr" style="text-align: left;">
[root@localhost proc]# echo "send data to module" >> /proc/Bridge </div>
<div dir="ltr" style="text-align: left;">
[root@localhost proc]# cat Bridge </div>
<div dir="ltr" style="text-align: left;">
send data to module</div>
<div style="text-align: left;">
<br /></div>
<br />
<span style="color: #3d85c6;"><b>סיכום</b></span><br />
<br />
ראינו מספר דרכים לדבר עם ה Kernel בעזרת קבצים, הם מחולקים לתיקיות במערכת כמו Proc עבור ה Processes או Dev עבור Devices, יש דרכים נוספות כמו <a href="http://en.wikipedia.org/wiki/Sysfs">Sysfs</a>, <a href="http://en.wikipedia.org/wiki/Debugfs">Debugfs</a> ו <a href="http://en.wikipedia.org/wiki/Configfs">Configfs</a> שקצת יותר מורכבות אבל עובדות על אותו עיקרון במטרה לתת תשתית להצגה והעברת מידע נוחה ללא צורך בבנייה של ממשקים מורכבים.<br />
<br />
בהצלחה...<br />
<br />
<br /></div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-74000061292061330472014-03-29T11:23:00.000-07:002014-03-29T11:23:52.702-07:00Chrome Extensions Guide<div dir="rtl" style="text-align: right;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHvHvu4g_Z92NlW_orWfHbOXqyN46PEVBi9JSH1WvNjZLhEarTD92CFujCVmuiHU0KfNXXx6sIStYezsf6va6B9VPVf9SzKqud1wJLJcGtVFFr3VYioqWAf1iKYIN_-q86Ts7M3glkjXoU/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHvHvu4g_Z92NlW_orWfHbOXqyN46PEVBi9JSH1WvNjZLhEarTD92CFujCVmuiHU0KfNXXx6sIStYezsf6va6B9VPVf9SzKqud1wJLJcGtVFFr3VYioqWAf1iKYIN_-q86Ts7M3glkjXoU/s1600/1.png" height="320" width="273" /></a></div>
<br />
<br />
אין ספק שגוגל היא חממת הפיתוח המעניינת ביותר בתעשיה, אחד הפרוייקטים המרשימים ביותר שלה לטעמי הוא Chrome שהכניס בעיטה רצינית לתחום הדפדפנים שנשלט בעיקר ע"י Internet Explorer ו Firefox, אז חוץ מהעובדה שזו תוכנה נפלאה שתומכות ב HTML 5 בצורתו המלאה, ניתן להוסיף Extensions בצורה פשוטה שהופכת את הגלישה להרבה יותר מעניינת.<br />
<br />
פיתוח Extension ב Chrome נעשה עם שפות לכתיבת אתרים כמו Html, JavaScript ו Css ולא נדרשת למידה של שפה חדשה בניגוד לשאר השחקנים שנעזרים בשפות כמו Bash ב Firefox או #C ב Internet Explorer, לא פחות חשוב שה Extension הוא Cross Platform כך שמערכת ההפעלה לא באמת לוקחת תפקיד, הפיתוח אפשרי בכל IDE לכתיבת אתרים וה Debug מתבצעת ע"ג הדפדפן עצמו.<br />
<br />
<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>Manifest File</b></span></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
בדומה לפיתוח ב Android גם פה יש קובץ הגדרות כללי שבו מצהירים על התוכן וההרשאות, המבנה בצורת JSON והוא הקובץ הראשון שנטען ע"י הדפדפן.</div>
<div style="text-align: right;">
<br /></div>
<div dir="ltr" style="text-align: left;">
manifest.json</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
"name": "Extenstion Example",</div>
<div dir="ltr" style="text-align: left;">
"description": "Chrome Extenstion Example",</div>
<div dir="ltr" style="text-align: left;">
"manifest_version": 2,</div>
<div dir="ltr" style="text-align: left;">
"version": "1.0",</div>
<div dir="ltr" style="text-align: left;">
</div>
<div dir="ltr" style="text-align: left;">
"<b>permissions</b>": [...],</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
"<b>browser_action</b>": {...},</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
"<b>background</b>": {...},</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
"<b>content_scripts</b>": [{...}]</div>
<div dir="ltr" style="text-align: left;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>Page Action\Browser Action</b></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b><br /></b></span></div>
<div style="text-align: right;">
ניתן להגדיר את ה Extension ברמת דף ספציפי כלומר כאשר הדפדפן יכנס לאתר מסויים רק אז יטען ויופיע כחלק מה ה Address Bar או כאשר הדפדפן עצמו יטען ה Extension יעלה אוטומטית ויופעל על כל האתרים, לא ניתן לשלב בין 2 המצבים ולכן כדי להחליט כבר בהתחלה מה המצב המתאים ביותר ל Extension. </div>
<div dir="ltr" style="text-align: left;">
<br />
<b><span style="color: #3d85c6;">Page Action</span></b><br />
<br />
manifest.json<br />
<br />
{<br />
"name": "Extenstion Example",<br />
"description": "Chrome Extenstion Example",<br />
"manifest_version": 2,<br />
"version": "1.0",<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"permissions": [<br />
"tabs"<br />
],<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><b>"page_action"</b>:{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"default_title": "This is Proxytype Blog!",<br />
"default_icon": "fishluck.png"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>},<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"background":{"scripts":["background.js"]},<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"icons":{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"48":"fishluck.png",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"128":"fishluck.png"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
}<br />
<br />
background.js<br />
<br />
chrome.tabs.onUpdated.addListener(function (tabid, data, tab) {<br />
if (tab.url.indexOf('proxytype.blogspot') > -1) {<br />
chrome.pageAction.show(tabid);<br />
}<br />
});<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKuIo1FBAu7FS_VOC7zdgVwC1qyTxZxKSc6dg0SQPCZHBJtmBdpWk13J11G-h9mU4RbkNaM_hXWXCPiy9mWx0U807lKmZU0LN82v19nA1GQqeDQTX8OQGu5zAXsRQPLgoF2Jj4mTsLn1Q3/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKuIo1FBAu7FS_VOC7zdgVwC1qyTxZxKSc6dg0SQPCZHBJtmBdpWk13J11G-h9mU4RbkNaM_hXWXCPiy9mWx0U807lKmZU0LN82v19nA1GQqeDQTX8OQGu5zAXsRQPLgoF2Jj4mTsLn1Q3/s1600/2.png" /></a></div>
<br />
<div dir="rtl" style="text-align: right;">
ה Extension יופיע כחלק מה Address Bar.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div style="text-align: left;">
<span style="color: #3d85c6;"><b>Browser Action</b></span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
manifest.json</div>
<div style="text-align: left;">
<br /></div>
{<br />
"name": "Extenstion Example",<br />
"description": "Chrome Extenstion Example",<br />
"manifest_version": 2,<br />
"version": "1.0",<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"permissions": [<br />
"tabs"<br />
],<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><b>"browser_action"</b>:{<br />
"default_title": "This is Proxytype Blog!",<br />
"default_icon": "fishluck.png"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>},<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"icons":{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"48":"fishluck.png",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"128":"fishluck.png"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
}<br />
<br />
<br />
<div dir="rtl" style="text-align: right;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsEn84jGSSEOo5LUAmTuH5O8MJI71S7VIP6LNP_mjafQstTnWVdlafpNCwyYoCBTOVJJX9QolA7WANHhrk5d8aDO-ehERxBe1zMcTlUm0TSguErY_DhFmyNRllSPNaIQyoFHTgCEeRmQUT/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsEn84jGSSEOo5LUAmTuH5O8MJI71S7VIP6LNP_mjafQstTnWVdlafpNCwyYoCBTOVJJX9QolA7WANHhrk5d8aDO-ehERxBe1zMcTlUm0TSguErY_DhFmyNRllSPNaIQyoFHTgCEeRmQUT/s1600/3.png" /></a></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
ה Extension יופיע מימין ל Address Bar ויהיה תקף לכל האתרים.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<br />
<span style="color: #3d85c6;"><b>Popup</b></span><br />
<br />
<div dir="rtl" style="text-align: right;">
דף להצגת תוכן כאשר לוחצים על ה Extension.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div style="text-align: left;">
manifest.json</div>
<div style="text-align: left;">
<br /></div>
{<br />
"name": "Extenstion Example",<br />
"description": "Chrome Extenstion Example",<br />
"manifest_version": 2,<br />
"version": "1.0",<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"permissions": [<br />
"tabs"<br />
],<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"browser_action":{<br />
"default_title": "This is Proxytype Blog!",<br />
"default_icon": "fishluck.png",<br />
<b> "default_popup": "popup.html"</b><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>},<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"icons":{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"48":"fishluck.png",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"128":"fishluck.png"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
}<br />
<br />
popup.html<br />
<br />
<html><br />
<head></head><br />
<body><br />
<div style="width:300px;height:200px;background-color:black"><br />
<p style="font-family:Arial; font-size:14px; font-weight:bold;color:White;padding-top:10px; padding-left:10px">This is Example Popup</p><br />
<div style="text-align:center"><br />
<img src="fishluck.png" width="100" height="100"/><br />
</div><br />
</div><br />
</body><br />
</html><br />
<div dir="rtl" style="text-align: right;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuIlP2tGgNdGubTO6Vz4cXZA_UvvJ1IORrfImrf0Kz3EI4jmpFpA_kNv0W4qkI4uIXO_e5rB0Vg7kb5DfDVMUmiCZQbPBYhzf4kidt0OZUpvoX2iZ2ktieXr8BpkS_BElXK2__s6PTaxgd/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuIlP2tGgNdGubTO6Vz4cXZA_UvvJ1IORrfImrf0Kz3EI4jmpFpA_kNv0W4qkI4uIXO_e5rB0Vg7kb5DfDVMUmiCZQbPBYhzf4kidt0OZUpvoX2iZ2ktieXr8BpkS_BElXK2__s6PTaxgd/s1600/4.png" height="238" width="320" /></a></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<br />
<br />
<b><span style="color: #3d85c6;">Options</span></b><br />
<br />
<div dir="rtl" style="text-align: right;">
דף שמכיל את האפשרויות של ה Extension.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div style="text-align: left;">
manifest.json</div>
<div style="text-align: left;">
<br /></div>
{<br />
"name": "Extenstion Example",<br />
"description": "Chrome Extenstion Example",<br />
"manifest_version": 2,<br />
"version": "1.0",<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"permissions": [<br />
"tabs"<br />
],<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><b>"options_page": "options.html",</b><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"browser_action":{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> "default_title": "This is Proxytype Blog!",<br />
"default_icon": "fishluck.png",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> "default_popup": "popup.html"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>},<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"icons":{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"48":"fishluck.png",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"128":"fishluck.png"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
}<br />
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgthpMdx-GL4JeEmAeEAv2LTrIsL0MYf_S7gL6DvF9ALkDqEDN0dqTKhxZGFJh4zYvb9VoKjoqC0DnWdouol0EjCDdXLhIm1_5yxW7ackpP_F0Ztj6BO1JnBVQDNfQqwYn0DDDRXcnv8PGW/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgthpMdx-GL4JeEmAeEAv2LTrIsL0MYf_S7gL6DvF9ALkDqEDN0dqTKhxZGFJh4zYvb9VoKjoqC0DnWdouol0EjCDdXLhIm1_5yxW7ackpP_F0Ztj6BO1JnBVQDNfQqwYn0DDDRXcnv8PGW/s1600/5.png" /></a></div>
<br />
<br />
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>Background Script/Content Script</b></span></div>
<div dir="ltr" style="text-align: left;">
<br />
<div dir="rtl" style="text-align: right;">
אפשר להגיד שהגענו לדבר האמיתי, הקוד של ה Javascript עושה את כל הקסם, וגם בו יש 2 מצבים אבל הפעם ניתן לשלב בניהם, Background Script נטען ללא דף Html ורץ ברקע של ה Extension ו Content Script רץ במקביל לדף ומאפשר לשנות את התוכן לאחר טעינה.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div style="text-align: left;">
<span style="color: #3d85c6;"><b>Background Script</b></span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
manifest.json</div>
<div style="text-align: left;">
<br /></div>
{<br />
"name": "Extenstion Example",<br />
"description": "Chrome Extenstion Example",<br />
"manifest_version": 2,<br />
"version": "1.0",<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"permissions": [<br />
"tabs"<br />
],<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"options_page": "options.html",<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"browser_action":{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"default_title": "This is Proxytype Blog!",<br />
"default_icon": "fishluck.png",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"default_popup": "popup.html"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>},<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"<b>background</b>": {<br />
"scripts": ["jquery.js","json.js","background.js"]<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>},<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"icons":{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"48":"fishluck.png",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"128":"fishluck.png"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
}<br />
<br />
<br />
background.js<br />
<br />
chrome.tabs.onUpdated.addListener(function (tabid, data, tab) {<br />
console.log("this is a background script");<br />
});<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaZVKILXN2xE7IgWBBrQBQijuaBIVBUFBP_Ij-axQFTerpqpBhGpTgZimDcpkp9DaGniQKZWGqAlApoeyFvgyebuIYPm-WJ3xe87ADnn7YWKHIqcEnTmAJeF36zFKvrnRMY7hXiTwjPNwM/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaZVKILXN2xE7IgWBBrQBQijuaBIVBUFBP_Ij-axQFTerpqpBhGpTgZimDcpkp9DaGniQKZWGqAlApoeyFvgyebuIYPm-WJ3xe87ADnn7YWKHIqcEnTmAJeF36zFKvrnRMY7hXiTwjPNwM/s1600/6.png" /></a></div>
<br />
<br />
<span style="color: #3d85c6;"><b>Content Script</b></span><br />
<br />
mainfest.json<br />
<br />
{<br />
"name": "Extenstion Example",<br />
"description": "Chrome Extenstion Example",<br />
"manifest_version": 2,<br />
"version": "1.0",<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"permissions": [<br />
"tabs",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> "activeTab",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> "http://*/*",<br />
"https://*/*"<br />
],<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"options_page": "options.html",<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"browser_action":{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"default_title": "This is Proxytype Blog!",<br />
"default_icon": "fishluck.png",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"default_popup": "popup.html"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>},<br />
<br />
<br />
<b> "content_scripts"</b>: [{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> "matches": ["<all_urls>"],<br />
"js": ["jquery.js","json.js","script.js"]<br />
}],<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"icons":{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"48":"fishluck.png",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"128":"fishluck.png"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
}<br />
<br />
script.js<br />
<br />
$(document).ready(function () {<br />
document.title = "Proxytype Take Over!";<br />
document.body.innerHTML = "<html><head></head><body><span style="text-align: right;">Extension </span>Denial Of Service For Fun!</body>";<br />
});<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-K4uktusEIfaciC3RW8bYJNICdSgBFjSfutCCOJ1F5AiWA5vEPaqzNAjftADln6txCE9geYBVvOFNdgCiFblyY9f3JnlnB_73b8YWEOoHbN2T6Og63N81U720wiA_0Hb5WONXGPpijJO7/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-K4uktusEIfaciC3RW8bYJNICdSgBFjSfutCCOJ1F5AiWA5vEPaqzNAjftADln6txCE9geYBVvOFNdgCiFblyY9f3JnlnB_73b8YWEOoHbN2T6Og63N81U720wiA_0Hb5WONXGPpijJO7/s1600/7.png" height="59" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<span style="color: #3d85c6;"><b>Messages</b></span><br />
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
קיימת חלוקה ברורה בין הקוד שמריץ הדף בדפדפן לבין הקוד שרץ לצורך הדוגמה ב Popup, ניתן להעביר מידע מתוכן הדף ל Extension בעזרת Messages, לדוגמה כל עוד ה Popup פתוח ישלח אליו כותרת העמוד.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div style="text-align: left;">
manifest.json</div>
<div style="text-align: left;">
<br /></div>
{<br />
"name": "Extenstion Example",<br />
"description": "Chrome Extenstion Example",<br />
"manifest_version": 2,<br />
"version": "1.0",<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"permissions": [<br />
"tabs",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> "activeTab",<br />
"storage"<br />
],<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"options_page": "options.html",<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"browser_action":{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"default_title": "This is Proxytype Blog!",<br />
"default_icon": "fishluck.png",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"default_popup": "popup.html"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>},<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> "content_scripts": [{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> "matches": ["<all_urls>"],<br />
"js": ["jquery.js","json.js","script.js"]<br />
}],<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"icons":{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"48":"fishluck.png",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"128":"fishluck.png"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
}<br />
<br />
popup.js<br />
<br />
$(document).ready(function () {<br />
var message = document.querySelector('#message');<br />
chrome.runtime.onMessage.addListener(function (request, sender) {<br />
if (request.action == "sendMessage") {<br />
message.innerHTML = request.source;<br />
}<br />
});<br />
});<br />
<br />
script.js<br />
<br />
function sendMessage() {<br />
return document.title;<br />
}<br />
<br />
chrome.runtime.sendMessage({<br />
action: "sendMessage",<br />
source: sendMessage()<br />
});<br />
<div dir="rtl" style="text-align: right;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCjgLLZnjMBmeuD_WqvOVrJ4pcG0-0zTcfWoPRa4rNGx04MOhk6KdwVUMxXbPvMnq356yblxEiBHScVz0qRtJFYgxmyRDYjjfsl628-RPz-FjwhAua7CmmpbD_8QH0Kbeqic9Q0lS0hjml/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCjgLLZnjMBmeuD_WqvOVrJ4pcG0-0zTcfWoPRa4rNGx04MOhk6KdwVUMxXbPvMnq356yblxEiBHScVz0qRtJFYgxmyRDYjjfsl628-RPz-FjwhAua7CmmpbD_8QH0Kbeqic9Q0lS0hjml/s1600/9.png" height="234" width="320" /></a></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
ניתן לחסוך המון כאבי ראש אם פשוט משתמשים ב Local Storage כ Shared Memory וכך ניתן לגשת ישירות למידע.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
chrome.storage.local.get('sharedMemory', function (result) {<br />
try {<br />
<br />
list = JSON.parse(result.sharedMemory);<br />
<br />
} catch (e) {<br />
console.log(e);<br />
}<br />
});<br />
<br />
chrome.storage.local.set({ 'sharedMemory': json_data });<br />
<br />
<br />
<br />
<span style="color: #3d85c6;"><b>Packaging</b></span><br />
<br />
<div dir="rtl" style="text-align: right;">
על מנת להתחיל פרויקט יש ליצור תיקייה ולהכניס לתוכה את הקבצים הדרושים, ללחוץ על תגית Extension ב Tools <span style="text-align: left;">ולעבור למצב Developer, לצורך בדיקות ניתן לטעון את התיקייה ישירות:</span></div>
<div dir="rtl" style="text-align: right;">
<span style="text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3Gcd1SkWWujG39TB5kQNwNDYH2j0sPR4T9Fs5r7Wfn0cnmZnbS0ecImFY7aoBkelHMWmWJ5mCeLozfWnbm6uC5qzAraO5AUca-vYYJ825FwqQnEeBkNhnCM1HiNHGnzSCYp1bzbZyqzuO/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3Gcd1SkWWujG39TB5kQNwNDYH2j0sPR4T9Fs5r7Wfn0cnmZnbS0ecImFY7aoBkelHMWmWJ5mCeLozfWnbm6uC5qzAraO5AUca-vYYJ825FwqQnEeBkNhnCM1HiNHGnzSCYp1bzbZyqzuO/s1600/10.png" height="320" width="231" /></a></div>
<div dir="rtl" style="text-align: right;">
<span style="text-align: left;"><br /></span></div>
<br />
<div dir="rtl" style="text-align: right;">
בסיום הפיתוח ניתן לייצר חבילה שהיא קובץ Zip שמכיל את כל הקבצים בסיומת Crx, וקובץ Pem שהוא המפתח של Extension ששומרים בצד לצורך עדכונים עתידיים.</div>
</div>
<div style="text-align: right;">
<br />
<span style="color: #3d85c6;"><b>סיכום</b></span><br />
<br />
עם היכולות של Html 5 אפשר לבצע כמעט כל פעולה במקרים נדירים נרצה להוסיף קבצי Native Code על מנת לקחת את ה Extension לקצה אבל את זה אני אשמור למאמר אחר בנושא, אין ספק ש Chrome הוא הדפדפן המתקדם ביותר כרגע בשוק, פשוט תענוג לעבוד איתו.<br />
<br />
למידע נוסף:<br />
<br />
<div dir="ltr" style="text-align: left;">
<a href="http://developer.chrome.com/extensions/index">http://developer.chrome.com/extensions/index</a></div>
<br />
תוספת משהו?...</div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-4476925876638276272014-03-08T03:15:00.001-08:002014-03-08T03:54:20.387-08:00Tamiya GearBox Kit<div dir="rtl" style="text-align: right;" trbidi="on">
<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw0QTogYESdSvb9NQl8V0FelrjSIHZFPOBaUlgi2Ur6hM4_hafVKv23BZxIQsQbcCTSVieNbtQuP3Zgu2tUhzU1RCkBoQb5Z3V0I9_94PY4i0aTzDVDh1fGdoIltwUDOEVZEvUFrHZrWqL/s1600/TAMIYA+Logo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw0QTogYESdSvb9NQl8V0FelrjSIHZFPOBaUlgi2Ur6hM4_hafVKv23BZxIQsQbcCTSVieNbtQuP3Zgu2tUhzU1RCkBoQb5Z3V0I9_94PY4i0aTzDVDh1fGdoIltwUDOEVZEvUFrHZrWqL/s1600/TAMIYA+Logo.jpg" height="215" width="320" /></a></div>
<br />
<br />
רובטיקה תמיד סקרנה אותי, אז אחרי הדרך הארוכה שעברתי עם Arduino החלטתי שהגיע הזמן לבנות את הרובוט הראשון של הבלוג, הנקודה הראשונה שהתרכזתי בה היא מערכת ההנעה והתחלתי לחפש באינטרנט, רציתי משהו זול שאפשר ללמוד ממנו ונזכרתי בחברת <a href="http://www.tamiya.com/">Tamiya</a> היפנית שמאוד ותיקה בתחום המודלים ומכוניות על שלט רחוק האמת שבהתחלה לא חשבתי שאמצא אבל לאחר שוטטות בקטלוג שלהם הופתעתי לגלות מגוון רחב של ערכות שמתאימות לכל משימה.<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrXizdePs6YvJsJf69vVMZfA9sNPk7n31leFJy-Da9B4NAlDFSSVGh3opWUEtVr6dnguBjoTR25WCSEUUHAAxp8m01Hc1RL08uVXJDWMAcS-tKaiRA_7rgYpNW7rlI5pGnHXoYosgSnkem/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrXizdePs6YvJsJf69vVMZfA9sNPk7n31leFJy-Da9B4NAlDFSSVGh3opWUEtVr6dnguBjoTR25WCSEUUHAAxp8m01Hc1RL08uVXJDWMAcS-tKaiRA_7rgYpNW7rlI5pGnHXoYosgSnkem/s1600/2.png" height="290" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">לכל משימה!</td></tr>
</tbody></table>
<br />
<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>Twin Motor GearBox</b></span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b><br /></b></span></div>
הערכה הפופלרית ביותר, עם 2 מנועים ומערכות גירים נפרדות, היא מאוד אוניברסלית וקיימים בה מספר מצבים לסוגי הנעה שונים, המערכת מורכבת מ 2 סטים של גלגלי שיניים שמגבירים את הכוח והמהירות לפלטפורמה וניתן להפעיל אותה עם בטריה 9 V.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLRUgWmZ4mUoaN0VHmDNLcaG1ymrXAd0wJk8bc0keuphqHiwd0aOpm6rLSvz2u12OFoEIS1NGrmXudB_-ztGZCw5qj8Jihaw3iTTM0eLGKPtmcOkgcfvDDxNG_YnO-piWNubw43IRftXlx/s1600/3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLRUgWmZ4mUoaN0VHmDNLcaG1ymrXAd0wJk8bc0keuphqHiwd0aOpm6rLSvz2u12OFoEIS1NGrmXudB_-ztGZCw5qj8Jihaw3iTTM0eLGKPtmcOkgcfvDDxNG_YnO-piWNubw43IRftXlx/s1600/3.png" height="242" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">בסביבות 10$ לערכה</td></tr>
</tbody></table>
<br />
קיימים 2 מצבים דומים כאשר ההבדל בניהם זה המיקום של הצירים, המצבים האלה מתאימים בעיקר להנעה קדמית \ אחורית במהירות גבוהה.<br />
<div>
</div>
<br />
<div align="center">
<iframe allowfullscreen="" frameborder="0" height="360" src="//www.youtube.com/embed/8helHdNAiZA" width="500"></iframe><br /></div>
<br />
<div>
</div>
<br />
מצב מיוחד שמאפשר לשלוט על כל מערכת גירים בנפרד מוסיף כוח אבל פוגע במהירות.<br />
<br />
<div align="center">
<iframe allowfullscreen="" frameborder="0" height="360" src="//www.youtube.com/embed/zJU2KLxqIiI" width="500"></iframe><br /></div>
<br />
<br />
<div>
</div>
<span style="color: #3d85c6;"><b>סיכום</b></span><br />
<br />
הערכות מאוד שימושיות וניתן ללמוד מהן המון, אני ממליץ לכל מי שרוצה לקופץ למים בעולם הרובוטיקה לרכוש ערכה כזאת ולהתחיל לשחק איתה, במהלך המאמרים הבאים נוסיף את הפלטפורמה, נבנה לוח שליטה יחד עם Arduino ,נשלב חיישנים ותקשורות ונצא לטייל במרחב.<br />
<br />
בהצלחה...</div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-88590103638547661712014-03-01T12:16:00.000-08:002014-03-01T12:16:09.957-08:00Merge Power Supplies<div dir="rtl" style="text-align: right;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUZXNDMPueeS99cjSnFc5F0HKlvsBebCYqIpCaIrN4EDLrDWxIMG4hhuuelPZvVvxrdSekt5X2FfuVjgrnxwkXZjkwVOA27zghjIz8ji6xbghT0e9UJMlkiyiFRCFfAzvLP-XVuVxQyDW6/s1600/0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUZXNDMPueeS99cjSnFc5F0HKlvsBebCYqIpCaIrN4EDLrDWxIMG4hhuuelPZvVvxrdSekt5X2FfuVjgrnxwkXZjkwVOA27zghjIz8ji6xbghT0e9UJMlkiyiFRCFfAzvLP-XVuVxQyDW6/s1600/0.png" /></a></div>
<br />
<br />
במקרה שרוצים לבנות מחשב מעבר לשימוש הסטנדרטי לדוגמא מחשב של גיימרים עם מספר כרטיסי מסך צריכים למצוא ספק מספיק חזק שיספק זרם עבור כל הכרטיסים וכאן המחיר מטפס (גם חשבון החשמל),ניתן לחבר מספר ספקים ביחד ולפצל אותם בין הרכיבים השונים כפי שנראה בהמשך,יש פה עניין חשוב של כסף, ספק 1000 W עולה מעל 1000 ש"ח בעוד שספק 600 W עולה בין 250 ל 450 ש"ח תלוי ביצרן.<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>ATX Power Supply Pinouts</b></span></div>
<br />
<span style="color: red;"><b>שימו לב!</b></span><br />
<br />
<span style="color: red;"><b>אזהרת התחשמלות</b></span> - העבודה עם ספק כוח מסוכנת ועלולה לגרום להתחשמלות אני לא אחראי על כל נזק לרכוש או לנפש ראו הוזהרתם!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
אז אחרי ההזהרות אפשר להתחיל, קודם חשוב להכיר את הספק כוח יש המון סוגים אבל הם מגיעים בסטנדרט אחד שנקרא <a href="http://en.wikipedia.org/wiki/ATX">(ATX (Advanced Technology eXtended</a> שהומצא בשנת 1995 ע"י אינטל אבל גם זה כנראה הולך לעבור שינוי בקרוב, בספק יש מספר יציאות חשמל בעוצמות זרם שונות שהן חלק מהתקן ונקראות <a href="http://en.wikipedia.org/wiki/Molex_connector">Molex</a>, היציאה הראשונה היא ATX Connector שמתחברת ללוח אם וגורמת לעסק לעבוד, אפשר להשוות אותה בחשיבותה לאבי העורקים שבגופנו, החיבור עצמו מורכב מ 24 פינים כפי שניתן לראות בתמונה:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0Y8LpwcELkVXWkH4WzZ9CwR0OEmJysYTVBtBPJm8Eom7BuHRtGlkJzPPMpzyugLZMEsiI6A9g-AhtFJksPqswQETFAC7V4UtvcIZg5ZNML7P70wRV27W83kd4QDGlud20GPdD92vI8Ps1/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0Y8LpwcELkVXWkH4WzZ9CwR0OEmJysYTVBtBPJm8Eom7BuHRtGlkJzPPMpzyugLZMEsiI6A9g-AhtFJksPqswQETFAC7V4UtvcIZg5ZNML7P70wRV27W83kd4QDGlud20GPdD92vI8Ps1/s1600/1.png" height="320" width="202" /></a></div>
<br />
<br />
כאשר נחבר בין החיבור PS_ON לאחד ה (COM (GND נוצר קצר שמפעיל את הספק כוח, נוכל לדמות את זה בעזרת כבל נוסף או Relay.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGvpYXFetCYtaDcZwhZ5pIARCBNovpJn7GWv5sNAYRR4xM9jH0sTjHqWHQHT_qq8vFn3fyOZj1UecFlrzrtHsdTt1Bdbj5BNn8dazGVSbIZdXBvOm3c2t1f1fSJkaRVHvJEY1IIQZKvt4t/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGvpYXFetCYtaDcZwhZ5pIARCBNovpJn7GWv5sNAYRR4xM9jH0sTjHqWHQHT_qq8vFn3fyOZj1UecFlrzrtHsdTt1Bdbj5BNn8dazGVSbIZdXBvOm3c2t1f1fSJkaRVHvJEY1IIQZKvt4t/s1600/2.png" height="312" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">זה מסוכן, אמרתי כבר?!</td></tr>
</tbody></table>
<br />
עוצמות הזרם בספק מאוד סטנדרטיות והם מחולקות לצבעים:<br />
<br />
<ul style="text-align: right;">
<li>אדום - 5V</li>
<li>סגול - 5V STAND BY</li>
<li>צהוב - 12V </li>
<li>שחור - GND</li>
<li>ירוק - PS ON</li>
<li>כתום - 3.3V</li>
<li>אפור - POWER GOOD</li>
<li>כחול - 12V-</li>
<li>חום - 3.3V Sensing</li>
</ul>
<br />
Molex 4 pin connector הוא חיבור נפוץ ביותר הוא מורכב מ 4 חוטים:<br />
<br />
<ul style="text-align: right;">
<li>אדום - 5V</li>
<li>צהוב - 12V</li>
<li>שחור - GND</li>
</ul>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUgpRoVxyXT8z0ohztw9VYhdz4NUrYAm6J2h1rfwxz6bJ-W8PAXfTyZTTev5eVWqGOJ-oD8RVhdeSwP1MIwiEwVzbRPCSzZGo4JZI_T5HQ2KxutXcaSJcjY51s0ytAiMUGSDmxFZmBgrNn/s1600/3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUgpRoVxyXT8z0ohztw9VYhdz4NUrYAm6J2h1rfwxz6bJ-W8PAXfTyZTTev5eVWqGOJ-oD8RVhdeSwP1MIwiEwVzbRPCSzZGo4JZI_T5HQ2KxutXcaSJcjY51s0ytAiMUGSDmxFZmBgrNn/s1600/3.png" height="257" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">זכר</td></tr>
</tbody></table>
הדרך הפשוטה ביותר להפעיל ספק כוח בעזרת ספק אחר היא לחתוך את הכבל הירוק וכבל שחור מה Atx Connector ולחבר חיבור Molex עם 4 פינים שמחברים לספק אחר.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPH2CYT9j6HYPa6WY4pldLyHBBLA7VVeI4tSRK7Y_HMZLixMp4dN6l0frQSYjv9s3MxlXKcZKMasYkOcv3tGgSrxwtaOfaZP6Xi7ED-Z2K7ctEK36ufaXliVNqv0NekWEcR2zp1BozgCfa/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPH2CYT9j6HYPa6WY4pldLyHBBLA7VVeI4tSRK7Y_HMZLixMp4dN6l0frQSYjv9s3MxlXKcZKMasYkOcv3tGgSrxwtaOfaZP6Xi7ED-Z2K7ctEK36ufaXliVNqv0NekWEcR2zp1BozgCfa/s1600/4.png" height="185" width="320" /></a></div>
<br />
<br />
<br />
<div dir="ltr" style="text-align: left;">
<b><span style="color: #3d85c6;">Relay</span></b></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: right;">
ממסר זה מתג אנלוגי שבתוכו יושב סליל כשעובר בו זרם נוצר שדה מגנטי שמושך את המתג ומשנה את זרימת החשמל, מאוד דומה למתג של האור בבית רק אוטומטי, זה מנגנון יחסית פרמיטיבי אבל הוא אמין מאוד ושימושי במיוחד, דיברתי עליו בעבר במאמר <a href="http://proxytype.blogspot.co.il/2013/03/arduino-relay-shield-guide.html">Arduino Relay Shield</a>.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIiOVT5Egxtun5i55yQixPtsUTTWqtd4Mag6N6nCnEQWcdK_9mseyNCzOdGpFeF_5PXy2rlTJCb4QfM5bN6yUS6TaoUHlslf17-q-fPmeCeyDd-aUDYNt9cxIMK8sD5_YoraDCzkswfoUJ/s1600/6.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIiOVT5Egxtun5i55yQixPtsUTTWqtd4Mag6N6nCnEQWcdK_9mseyNCzOdGpFeF_5PXy2rlTJCb4QfM5bN6yUS6TaoUHlslf17-q-fPmeCeyDd-aUDYNt9cxIMK8sD5_YoraDCzkswfoUJ/s1600/6.png" height="320" width="302" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">2 $ ליחידה</td></tr>
</tbody></table>
<br />
<br />
מחברים את הספק כוח הראשון לרגליים של ה 5 V ו ה GND ב Relay ומחברים <a href="http://en.wikipedia.org/wiki/Diode">DIODE</a> בניהם, בספק השני מחברים את הרגל PS_ON לרגל NO ורגל GND ל GND, ברגע שנפעיל את הספק הראשון אוטומטי הספק השני ידלק. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNn-ase_OqkUDwztGR7UPlKDJPp96PYk5VUE79SZJyNxFikj43dYDQX3UZFV-PIOhmY3yXXJwapAZlbGMeQYd554E5XY6CoOM7hd18cCjL4Tsxdl2bhhE-wbMgLY_vkSIPsCfTYoWIszRw/s1600/5.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNn-ase_OqkUDwztGR7UPlKDJPp96PYk5VUE79SZJyNxFikj43dYDQX3UZFV-PIOhmY3yXXJwapAZlbGMeQYd554E5XY6CoOM7hd18cCjL4Tsxdl2bhhE-wbMgLY_vkSIPsCfTYoWIszRw/s1600/5.png" height="233" width="320" /></a></div>
<br />
<br />
במקרה שיש לכם לוח ישן שאין בו שימוש אפשר למחזר את ה Atx Connector:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKr4K0wBv-kVkg1C5fN3RFgkDAsVLvaPy8ox8_6LOGVehGe9w7u-cQd8EvVQmvuQMyU1zYPOOxK0H9kLoPzvnW_BtLwS3boD7VROrJbK8-9mSkwH3Yz6PfuWApKSsbI37PhN8LWO9cteRP/s1600/7.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKr4K0wBv-kVkg1C5fN3RFgkDAsVLvaPy8ox8_6LOGVehGe9w7u-cQd8EvVQmvuQMyU1zYPOOxK0H9kLoPzvnW_BtLwS3boD7VROrJbK8-9mSkwH3Yz6PfuWApKSsbI37PhN8LWO9cteRP/s1600/7.png" height="162" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">למחזר זה חשוב!</td></tr>
</tbody></table>
<span style="color: #3d85c6;"><b>סיכום</b></span><br />
<br />
הדגמתי 2 דרכים כיצד להפעיל ספק כוח ע"י ספק כוח אחר וכיצד לחסוך כסף במקרה שבונים מחשב מפלצתי שלא ניתן למצוא ספק מתאים שיזרים מתח לכל הרכיבים, ספקי כוח שימושים מעבר לעבודתם הטבעית במחשב וניתן להשתמש בהם גם בפרויקטים אחרים עם Arduino ו BeagleBone.<br />
<br />
טובים השניים מהאחד...</div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-43942949234352313262014-02-22T10:48:00.000-08:002014-03-08T03:19:24.280-08:00SmoothWall Router Guide<div dir="rtl" style="text-align: right;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg74uHT2oltj1mHMFOFtk1if_QHT1GNHKcwdGtWGvPXcfGLoQAHMKJlACsQNUmD3qepGDmCSYhVH_A57AdhXZ0LXoZs4Ix8MvkuakXjlIgQVoEXvtTC8_5Btk_YlWgwJnhfX8a5LkLkUM8N/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg74uHT2oltj1mHMFOFtk1if_QHT1GNHKcwdGtWGvPXcfGLoQAHMKJlACsQNUmD3qepGDmCSYhVH_A57AdhXZ0LXoZs4Ix8MvkuakXjlIgQVoEXvtTC8_5Btk_YlWgwJnhfX8a5LkLkUM8N/s1600/1.png" /></a></div>
<br />
<br />
זהו, הגעתי למאמר האחרון בסדרה של Cloud Solutions, בסדרה הדגמתי כיצד לבנות ענן בעזרת מערכות Open Source בלבד שנותנות מענה בכל שכבה ,משלב האחסון, הוירטואליזציה ואיזון עומסים, השלב האחרון הוא התקשורת עם העולם החיצון ואבטחת המידע, קיימות המון <a href="http://en.wikipedia.org/wiki/List_of_router_and_firewall_distributions">מערכות הפעלה</a> לניהול ראוטרים עם Firewall מבוססות Linux שמאפשרות לשמור על הסביבה מסכנות מבחוץ.<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>Setup</b></span></div>
<br />
שלב ההתקנה שכרגיל חוזר על עצמו נוריד את ה ISO מהאתר, נצרוב ונתחיל לרוץ...<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuKLadDBzoZcwpqSbdmI3gEgYMZArfw8gQ_amvg5SBK3mBfwhvtxnnqZ5dmP4yWjIVl5xsoS6VRBR7zZx3BdqzUybKIr9f1fORi5XWIac9jzEDxHiFYeLWzLFGNOgOwIt2rAuFIAdKFu7W/s1600/a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuKLadDBzoZcwpqSbdmI3gEgYMZArfw8gQ_amvg5SBK3mBfwhvtxnnqZ5dmP4yWjIVl5xsoS6VRBR7zZx3BdqzUybKIr9f1fORi5XWIac9jzEDxHiFYeLWzLFGNOgOwIt2rAuFIAdKFu7W/s1600/a.png" height="177" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">חלון פתיחה מרשים</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmbY57RvQMvXErxk08O4kWbBEI1zW_ZtPCLOJywEx7-1MY9Kf9_2djSlJpr8pyhpxR1_LxT3F7UyWjA4t-uiow3KgRxCY_YPLr0IkhWRM4ABqpNXlSQ9uyDxLDNyX5HYkSqSOISwLkBi0a/s1600/b.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmbY57RvQMvXErxk08O4kWbBEI1zW_ZtPCLOJywEx7-1MY9Kf9_2djSlJpr8pyhpxR1_LxT3F7UyWjA4t-uiow3KgRxCY_YPLr0IkhWRM4ABqpNXlSQ9uyDxLDNyX5HYkSqSOISwLkBi0a/s1600/b.png" height="178" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">יצירת הדיסק </td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVwthqSuONbxDeiiQkRgS2JD4ke2TY-Y9Vz9j5Nu2lN2B-Oyvl5wfGdZ5b-Py1J5_tB2bSfQkjCDhYArXMspgwWtG0LHGH1Tjyviu9G8ivfekT7Kb5xxe_wlSzyTjafZpbuGct9DjNOWqW/s1600/c.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVwthqSuONbxDeiiQkRgS2JD4ke2TY-Y9Vz9j5Nu2lN2B-Oyvl5wfGdZ5b-Py1J5_tB2bSfQkjCDhYArXMspgwWtG0LHGH1Tjyviu9G8ivfekT7Kb5xxe_wlSzyTjafZpbuGct9DjNOWqW/s1600/c.png" height="178" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">העתקת הקבצים</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikTMeryRo77qs1gVY8REmyL7Snaf0_9Wth-81HBux0qpnGLZE2Ry9EerGtfPppxbaUZSxPSY1Uo0Vgv1Wa57AxTOiUMT1uCfCKZOkuHmUuMyWBCxn5Y53MYx4iG-QFOC9CVPbsBB2OtOfA/s1600/d.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikTMeryRo77qs1gVY8REmyL7Snaf0_9Wth-81HBux0qpnGLZE2Ry9EerGtfPppxbaUZSxPSY1Uo0Vgv1Wa57AxTOiUMT1uCfCKZOkuHmUuMyWBCxn5Y53MYx4iG-QFOC9CVPbsBB2OtOfA/s1600/d.png" height="176" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4WjNs7FXE9btE7zu-s-cwZKZkxNhs8nK427fBsPcZFslQIY84VLwcKsxTnhQJgUcfx3ZxPqRN8yHdjpq3BndYtbV-TJr-nC-RusjrsrrTX7cHJHrDjy4QJkuMjXPhhruuBm6cqzGijT76/s1600/e.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4WjNs7FXE9btE7zu-s-cwZKZkxNhs8nK427fBsPcZFslQIY84VLwcKsxTnhQJgUcfx3ZxPqRN8yHdjpq3BndYtbV-TJr-nC-RusjrsrrTX7cHJHrDjy4QJkuMjXPhhruuBm6cqzGijT76/s1600/e.png" height="176" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">אפשרות לעשות שחזור של המערכת עם הגדרות ישנות</td></tr>
</tbody></table>
<br />
<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>Network Settings</b></span></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: right;">
ניתן שם למכונה ואח"כ נבחר את סוג הפוליסה, יש 3 תבניות מוכנות מראש: </div>
<div style="text-align: right;">
</div>
<ul style="text-align: right;">
<li>Open - כל הבקשות החוצה יוצאות ללא הפרעות.</li>
<li>Half-Open - חלק מהבקשות יוצאות החוצה, בקשות מסוכנות נופלות.</li>
<li>Closed - אף בקשה לא יוצאת החוצה ויש לפתוח ידנית.</li>
</ul>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvYS_hXYnE4_lh_3N8PcvWOL4qVBYc32BfXhNpmvlFLaPvn61bzI3HOWlhiwEtL6L-K0QxaEHnwcKVcJLn77mlvW9q6monEtqQXHZSf_ABFsNK-jx_s2IYfQEF_sTsnbbMVpTSHn9LeLy4/s1600/f.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvYS_hXYnE4_lh_3N8PcvWOL4qVBYc32BfXhNpmvlFLaPvn61bzI3HOWlhiwEtL6L-K0QxaEHnwcKVcJLn77mlvW9q6monEtqQXHZSf_ABFsNK-jx_s2IYfQEF_sTsnbbMVpTSHn9LeLy4/s1600/f.png" height="177" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">שם למכונה</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWVMKe0LpVGeChZZWR5GBEOA6qHCEvStnQ9qv6fNq8PdnV3DrlqwuaVvoS96FCDP86uAQ0v4xepMv6ly_KTYYVJ3tX7MmxgkB2axwI8I9hN1yvVe2DxDY-9cRY_TybsQ7fAxWYijXu4usI/s1600/g.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWVMKe0LpVGeChZZWR5GBEOA6qHCEvStnQ9qv6fNq8PdnV3DrlqwuaVvoS96FCDP86uAQ0v4xepMv6ly_KTYYVJ3tX7MmxgkB2axwI8I9hN1yvVe2DxDY-9cRY_TybsQ7fAxWYijXu4usI/s1600/g.png" height="177" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">סוג הפוליסה</td></tr>
</tbody></table>
<br />
לאחר מכן נפתח תפריט שמגדירים בו את התקשורת, תחילה נבחר ב Network Configuration Type שמאפשר לבחור את התצורה של המערכת, הדגש במקרה הזה הוא כמובן על כמות הממשקים (Interfaces) הפיזיים שיש במכונה למשל נוכל להוסיף Wifi כ Access Point או <a href="http://en.wikipedia.org/wiki/DMZ_(computing)">DMZ</a>.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcvnXNt6K6uJkhFNn3eaSOAOsG8i86NWIhB3S-4hZgv-PsvJaN-2OQqCN5xVxQV17cmVW874WqX1SYpUVOEJcbs-XgSevkV5Ks5DmPTcMat1ljzKxLSgDPboFevmq5HYPZkvPOhVZSAViR/s1600/h.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcvnXNt6K6uJkhFNn3eaSOAOsG8i86NWIhB3S-4hZgv-PsvJaN-2OQqCN5xVxQV17cmVW874WqX1SYpUVOEJcbs-XgSevkV5Ks5DmPTcMat1ljzKxLSgDPboFevmq5HYPZkvPOhVZSAViR/s1600/h.png" height="177" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">תמיד ניתן להיכנס בעזרת הפקודה setup ב Console</td></tr>
</tbody></table>
לצורך הדוגמה יש במכונה 2 כרטיסי רשת שמדמים 2 כניסות, אחת עבור ה WAN והשניה עבור ה LAN, החלוקה לפי צבעים כפי שנראה בהמשך.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR0HZ_H25iehNeSrP837rz0fMIr0WGYrr5rGHkKcsHCNzr3xw0qSyJpKfMDhka2ZEvMvumTIPW7Xzbw0c6dJsfzrQOXlPi3o-cgn64hlzvE0rqbuw8hhV6J_Dc3Ob1_EBP1pF5Su1Vv_ZE/s1600/m.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR0HZ_H25iehNeSrP837rz0fMIr0WGYrr5rGHkKcsHCNzr3xw0qSyJpKfMDhka2ZEvMvumTIPW7Xzbw0c6dJsfzrQOXlPi3o-cgn64hlzvE0rqbuw8hhV6J_Dc3Ob1_EBP1pF5Su1Vv_ZE/s1600/m.png" height="176" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
בסיום נחזור לתפריט הראשי ונבחר באפשרות Card Assignments, נגדיר את החיבור בין ה Interface לכרטיסי רשת.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh17f8VEYHkVIM1y4aAQegLgRZ7gB2ffkXIvnKHofCcCABpSBZaJYo8-Lnm8n0l6zvG3sqTU75fI5u2ivi-ZsDO0l7OFV1HT9ItAMokkp-G1-c4RcV52HG8jq3fdM1DSdHOQdWiFjPwYDbp/s1600/n.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh17f8VEYHkVIM1y4aAQegLgRZ7gB2ffkXIvnKHofCcCABpSBZaJYo8-Lnm8n0l6zvG3sqTU75fI5u2ivi-ZsDO0l7OFV1HT9ItAMokkp-G1-c4RcV52HG8jq3fdM1DSdHOQdWiFjPwYDbp/s1600/n.png" height="177" width="320" /></a></div>
<br />
כפי שניתן לראות קיימים 2 ממשקים שמחולקים לצבעים:<br />
<br />
<ul style="text-align: right;">
<li>Green - הממשק של ה Deep Web מאחורי Smooth Wall.</li>
<li>Red - הממשק החיצוני, לצורך הדוגמה הוא מתחבר לנתב אחר ויוצא ממנו לאינטרנט.</li>
</ul>
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpk3oz0YoFaZS89b8n1vfgDa4zhm0Gjbdl1M_lzFSj2ZZK3iwAO8mTo905zIHzZG5VO3aN8duWadDlBnV24ubev7Ahutw47ZP0BkB3Kq_orXcu56H0cftDmoUWMOjjBodyJd_fkAb3blNo/s1600/l.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpk3oz0YoFaZS89b8n1vfgDa4zhm0Gjbdl1M_lzFSj2ZZK3iwAO8mTo905zIHzZG5VO3aN8duWadDlBnV24ubev7Ahutw47ZP0BkB3Kq_orXcu56H0cftDmoUWMOjjBodyJd_fkAb3blNo/s1600/l.png" height="178" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">חלוקה לצבעים דרך נוחה לזכור...</td></tr>
</tbody></table>
נחזור פעם נוספת לתפריט ונבחר באפשרות Address Settings, נגדיר את הכתובת של ה Default Gateway עבור הממשק הירוק.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVf45PC375GBoBrDeS6x2G4ZKtQqfqSq0zexsB69N_BB6jBsUM959tGa_Gs0Qsz9G7-4Zmj7b-VmwKRGbWkGVQFVwcy3b0oG218xB3ujzV_wtdJuRaGTHXpGOpc1vz43-G1eZidygH4L5W/s1600/m_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVf45PC375GBoBrDeS6x2G4ZKtQqfqSq0zexsB69N_BB6jBsUM959tGa_Gs0Qsz9G7-4Zmj7b-VmwKRGbWkGVQFVwcy3b0oG218xB3ujzV_wtdJuRaGTHXpGOpc1vz43-G1eZidygH4L5W/s1600/m_1.png" height="177" width="320" /></a></div>
<br />
<br />
לאחר מכן נגדיר את ממשק האדום שזו הרגל שמתחברת ל Router חיצוני, ניתן להגדיר אותה כ Static או לקבל כתובת ישירות מהספק או מ DHCP.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib6zlbdWdyNZ4y5wIp9xEKAGC7o1GdhD7n1psbf_t415rUQCJ6I24nfNc7Yho-HGl_2FHa9xRH6Hb1Z_VNEWiN-gLhWXunT8yOsrmWIvEaXVLLZ3K5jq5Wmb9Ni7I2UyY8qnXSqYksA3ih/s1600/m_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib6zlbdWdyNZ4y5wIp9xEKAGC7o1GdhD7n1psbf_t415rUQCJ6I24nfNc7Yho-HGl_2FHa9xRH6Hb1Z_VNEWiN-gLhWXunT8yOsrmWIvEaXVLLZ3K5jq5Wmb9Ni7I2UyY8qnXSqYksA3ih/s1600/m_2.png" height="176" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<span style="color: red;"><b>שימו לב!</b></span> - במקרה שבחרנו להשתמש בכתובת סטטית יש להגדיר Dns / Gateway.<br />
<br />
בסיום נפתח התפריט המרכזי שדרכו מנהלים את ה Router רוב האפשרויות ניתנות לשינוי בסביבת ה Web, הדבר האחרון שנשאר הוא לתת סיסמאת ניהול ולהיכנס לממשק בדפדפן.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXb1hy2s1FugAwhMEHS2n4iUW1qveX4cGbbWht4B00O0FiXLdnWpwOpcaO-oT-G0qZOjFRl8oCdrb48Q7L5AQX8Co_91FpiPE-Shv3i6z7cBIKkaaIez4mwoXpg9ixr4Hc7C2ye5kIw1U1/s1600/r.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXb1hy2s1FugAwhMEHS2n4iUW1qveX4cGbbWht4B00O0FiXLdnWpwOpcaO-oT-G0qZOjFRl8oCdrb48Q7L5AQX8Co_91FpiPE-Shv3i6z7cBIKkaaIez4mwoXpg9ixr4Hc7C2ye5kIw1U1/s1600/r.png" height="177" width="320" /></a></div>
<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>Web Interface</b></span></div>
ניכנס לכתובת של ה Default Gateway בפורט 81 לממשק ניהול.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1h-8BPsO2oiosN31NXNUs5Je9Dop-zCeJftTzt7cWSbu32tyEE4e5s7_OlPROKpmPldpMYRVHvYNiEoqM4Ox09XubkgGW90t4ttLfQD0trOfP1Ta5swPOdTAGvfX3pvbq6kczyOzqxDcX/s1600/s.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1h-8BPsO2oiosN31NXNUs5Je9Dop-zCeJftTzt7cWSbu32tyEE4e5s7_OlPROKpmPldpMYRVHvYNiEoqM4Ox09XubkgGW90t4ttLfQD0trOfP1Ta5swPOdTAGvfX3pvbq6kczyOzqxDcX/s1600/s.png" height="253" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">קצת יותר נוח</td></tr>
</tbody></table>
<br />
<br />
לצורך הדוגמה הפעלתי שרת Fedora עם Apache והגדרתי כתובת סטטית (10.10.10.5) עם Default Gateway לממשק הירוק (10.10.10.254).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3e5AiCQnsdLlYc8fVwTQouYA1JzyPmfpAEDmTW-XCeQL8k010xhYRg1_IiJdSQCOAT2AEVhotyICgr39k2ALtXhdfLGgM_Zp3bUbAxS7QoqNZIIsYig2cAfW8eBJ_UsU-grtW2JKHgfUS/s1600/m_3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3e5AiCQnsdLlYc8fVwTQouYA1JzyPmfpAEDmTW-XCeQL8k010xhYRg1_IiJdSQCOAT2AEVhotyICgr39k2ALtXhdfLGgM_Zp3bUbAxS7QoqNZIIsYig2cAfW8eBJ_UsU-grtW2JKHgfUS/s1600/m_3.png" height="289" width="320" /></a></div>
<br />
<br />
נחזור לממשק ה Web ונלחץ על Networking - Incoming ונגדיר את השירות שברצוננו לחשוף:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoyftuy07BPyuFMNxs44D44tzhA_1csVJeT7XaOCRNjp7iApub_clUmHKH-D1zkplpiPBOVNYCoKS51lKGdruplkEpM4frWBwIoIWaDQGpW5cBaGzCLII8JjAPRzDrdgpvGycM9PT3RQe2/s1600/m_7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoyftuy07BPyuFMNxs44D44tzhA_1csVJeT7XaOCRNjp7iApub_clUmHKH-D1zkplpiPBOVNYCoKS51lKGdruplkEpM4frWBwIoIWaDQGpW5cBaGzCLII8JjAPRzDrdgpvGycM9PT3RQe2/s1600/m_7.png" height="244" width="320" /></a></div>
<br />
<br />
על מנת להגדיר את החוק יש לבחור בכתובת החיצונית שהולכת להתחבר לשרת הפנימי במקרה שלי בחרתי לפתוח את השרות עבור כל Class C אבל ניתן להגדיר כתובת ספציפית , בתגית outgoing ניתן לקבוע את החוקים מה Deep Web החוצה.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT5Ba7KJLlZM69nAVRD_OzuQ8Bu9tPobZ8_Da2UWiZid7nbOXXV0MBCet_rvdpFQVDDdt3231XTDa8rpZqgTsBimZTRu7enjRbi0x-Qy_agTn0Bs8qoQvbL5pcfG2mtrNPVA4kAjdUtJRt/s1600/m_8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT5Ba7KJLlZM69nAVRD_OzuQ8Bu9tPobZ8_Da2UWiZid7nbOXXV0MBCet_rvdpFQVDDdt3231XTDa8rpZqgTsBimZTRu7enjRbi0x-Qy_agTn0Bs8qoQvbL5pcfG2mtrNPVA4kAjdUtJRt/s1600/m_8.png" height="257" width="320" /></a></div>
<br />
<br />
<span style="color: red;"><b> שימו לב!</b></span><br />
<br />
<ul style="text-align: right;">
<li>בגלל שהכתובת של הממשק האדום מוגדרת כ DHCP היא עלולה להשתנות ולהשפיע על החוקים.</li>
<li>הדוגמה מוצגת על שרתים וירטואלים לכן אין חשיבות לכרטיסים, במקרה שהכרטיסים פיזיים יש לוודא שהם מחוברים לממשקים הנכונים בעזרת אימות ה Mac Address.</li>
</ul>
<br />
<br />
<b><span style="color: #3d85c6;">סיכום</span></b><br />
<br />
SmoothWall זה לא ה Firewall הכי מתקדם אבל הוא עושה את העבודה, הוא מגיע בגרסה 64\x86 כך שניתן להתקין אותו על כל מחשב שאין בו שימוש ולהפוך אותו ל Router עצבני, הוא מכיל בתוכו אפשרויות נוספות כמו VPN ו IPS אבל את זה אני משאיר לכם, אפשר לומר שהשלמנו את החוליה האחרונה בענן ולא שלמנו שקל על אף רישיון והכל בזכות Linux ו Open Source. <br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3e-ritm6PeO-NoSLv1A1UOoK9rnAnUDh6bKYyJ8tRsWa1_5k2Nitz-5pe17iXAvOJ8eyc70HlY5dVBVewlRS6k9zMszLlEqaLO3J0LeV-N6g860GPPzoEJdleXNTfG1ZocjEfkdOGODWH/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3e-ritm6PeO-NoSLv1A1UOoK9rnAnUDh6bKYyJ8tRsWa1_5k2Nitz-5pe17iXAvOJ8eyc70HlY5dVBVewlRS6k9zMszLlEqaLO3J0LeV-N6g860GPPzoEJdleXNTfG1ZocjEfkdOGODWH/s1600/2.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">מבנה הענן הסופי</td></tr>
</tbody></table>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div dir="ltr" style="text-align: left;">
<a href="http://www.smoothwall.org/">http://www.smoothwall.org/</a></div>
<br />
מי רצה ענן ולא קיבל?</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-85745338890419501472014-02-12T11:52:00.000-08:002014-02-13T23:37:00.487-08:00Managed / UnManaged Code<div dir="rtl" style="text-align: right;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzohvjdvjN_HWNVqL21GFcE85BmnFcRnfNbLjdCI432yGySe_m5nmOwusl_2Zs9pkaLLEgU-KpMFbQcxWbxLIkNmJXwWymVahuD2MXv4US9ltyj8ozAWIbsZfJqmD3TVwEyOGbMqtQR3Fj/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzohvjdvjN_HWNVqL21GFcE85BmnFcRnfNbLjdCI432yGySe_m5nmOwusl_2Zs9pkaLLEgU-KpMFbQcxWbxLIkNmJXwWymVahuD2MXv4US9ltyj8ozAWIbsZfJqmD3TVwEyOGbMqtQR3Fj/s1600/1.png" /></a></div>
<br />
<br />
לאורך הבלוג נזרק המושג Managed Code מספר פעמים ולא יותר מידי הרחבתי עליו , אבל מסתתר מאחוריו פואנטה שכדאי להכיר ולכן החלטתי לכתוב מאמר קצרצר שיסביר את הנושא למרות שכבר עברתי עליו בצורה כזאת או אחרת בבלוג, החיבור בין 2 שיטות ריצה שונות מאפשר יצירת תוכניות מורכבות שמאפשרות ניצול של 2 פלטפורמות שונות זו מזו, לדוגמה האפשרות לכתוב שכבה שעובדת מול Win32 API שלא ניתן לגשת אליה באופן חופשי מ .Net כפי שכבר הראתי בעבר ב <a href="http://proxytype.blogspot.co.il/2012/05/personal-firewall.html">Personal Firewall</a>.<br />
<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>Managed Code</b></span></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
סביבת .Net מוגדרת כ Manage Code ומזכירה בהתנהגות שלה את Java בכך שב 2 הסביבות נוצר חדר נקי שמאפשר לקוד לרוץ ללא הפרעות, במקרה של .Net אומנם נוצר קובץ EXE בסוף התהליך, אך כאשר מפעילים אותו הוא מפעיל מערכת שלמה מאחורי הקלעים על מנת שיוכל לרוץ, כאשר הקובץ נוצר, הוא נשמר בשפת בניים הנקראת IL ועובר למנגנון CLR ומשם ל JIT כפי שכתבתי במאמר <a href="http://proxytype.blogspot.co.il/2011/01/managed-net-rootkit.html">Managed .Net RootKit</a>, לכן זה לא באמת קוד מכונה, הוא נהפך לקוד מכונה תוך כדי ריצה.<br />
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>UnManaged Code</b></span></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: right;">
זה קוד שנהפך לקוד מכונה ברגע שמבצעים את ה Compile ומאותו רגע הוא יכול לרוץ ולכן מהיר יותר, בדר"כ נכתוב אותו ב ++C/ C ונשתמש ב Compilers <a href="http://en.wikipedia.org/wiki/List_of_compilers">ותיקים בתחום</a>, לא קיים חדר נקי ולכן התוכניות עלולות לגרום נזק למערכת הפעלה ישירות, בדרך כלל נשתמש בו כאשר נרצה לדבר ישירות עם ה <a href="http://en.wikipedia.org/wiki/Windows_API">Win32API</a> או לשפר ביצועים, השפה שנהנת מכל העולמות היא ++C שמאפשרת כתיבת קוד משולב.</div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<b><span style="color: red;">שימו לב!</span></b> - ב Managed Code קיים מנגנון ה <a href="http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)">Garbage Collector</a> שמשחרר זיכרון באופן עצמי גם אם לא שחררתם אותו בעצמכם לעומת זאת ב UnManaged Code הוא לא קיים ואחריות שחרור הזיכרון היא על המפתחים בלבד.<br />
<br />
בדוגמה הבאה אני ידגים כיצד לחבר בין אפליקציית .Net עם פונקציות שנכתבו ב ++C/ C, תחילה נתמקד ב UnManaged Code שאותו אני אכתוב ב ++C בעזרת Visual Studio.<br />
<br />
<div dir="ltr" style="text-align: left;">
<b><span style="color: #3d85c6;">dllctest.h</span></b></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//in C++ we can have functions with the same name,</span><br />
<span style="color: lime;">//the compiler create unique name for each function, </span><br />
<span style="color: lime;">//in C is not possible to have different functions with the same name, </span><br />
<span style="color: lime;">//the extern "C" tell the compiler to keep the name as is like in C</span><br />
<span style="color: lime;">//be aware from functions with the same name!.</span><br />
extern "C" {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: lime;">//exported function signature,</span><br />
<span style="color: lime;"><span class="Apple-tab-span" style="white-space: pre;"> </span>//__declspec tell to compiler to expose the function</span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>__declspec(dllexport) char * getString(void);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>__declspec(dllexport) void setString(char * data);<br />
}<br />
<div>
<br /></div>
<div>
<br /></div>
<div>
<b><span style="color: #3d85c6;">dllctest.cpp</span></b></div>
<div>
<br /></div>
<div>
<div>
//dllctest.cpp : Defines the exported functions for the DLL application.</div>
<div>
<span style="color: orange;">#include "stdafx.h"</span></div>
<div>
<span style="color: orange;">#include "dllctest.h"</span></div>
<div>
<br /></div>
<div>
static char * sdata;</div>
<div>
<br /></div>
<div>
<span style="color: lime;">//tell to compiler someone else going to use this method</span></div>
<div>
extern char * getString(void)</div>
<div>
{</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>return sdata;</div>
<div>
}</div>
<div>
<br /></div>
<div>
<span style="color: lime;">//tell to compiler someone else going to use this method</span></div>
<div>
extern void setString(char * data)</div>
<div>
{</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>sdata = data;</div>
<div>
}</div>
</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
יש מספר מילים שמורות שאומרות ל Compiler שמדובר על פונקציות שמשהו אחר (חיצוני) הולך להשתמש בהם, ומאפשרות לחשוף אותן החוצה, בגלל שהקוד עצמו ב ++C חשוב להגיד ל Compiler שישמור על השמות של הפונקציות כמו שהם בדומה להתנהגות של C כי אחרת הוא ממציא להן שמות בעצמו.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
<span style="color: red;"><b>שימו לב!</b></span> - חשוב מאוד שהשמות של הפונקציות לא יחזרו על עצמן, ב C זה בלתי אפשרי אבל ב ++C זה אפשרי ועלולה להיות התנגשות בין הפונקציות.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div style="text-align: left;">
<span style="color: #3d85c6;"><b>dllctestcs.cs</b></span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<div>
class Program</div>
<div>
{</div>
<div>
<span style="color: lime;"> //call to external function from dll </span></div>
<div>
<span style="color: lime;"> //using the same signature from the dll</span></div>
<div>
[DllImport(@"C:\inetpub\wwwroot\dllctest\Debug\dllctest.dll", CharSet = CharSet.Unicode)]</div>
<div>
extern static void setString(string data);</div>
<div>
<br /></div>
<div>
[DllImport(@"C:\inetpub\wwwroot\dllctest\Debug\dllctest.dll",CharSet=CharSet.Unicode)]</div>
<div>
extern static string getString();</div>
<div>
<br /></div>
<div>
static void Main(string[] args)</div>
<div>
{</div>
<div>
setString("HI");</div>
<div>
<br /></div>
<div>
Console.Write(getString());</div>
<div>
<br /></div>
<div>
Console.ReadLine();</div>
<div>
}</div>
<div>
}</div>
</div>
<div dir="rtl" style="text-align: right;">
על מנת לדבר עם ה DLL שיצרנו נשתמש ב <a href="http://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx">(Platform Invocation Services (PInvoke</a> , מנגנון שמגיע עם .Net שמאפשר לטעון DLL של UnManaged Code תוך כדי ריצה, במקרה שלנו אנחנו מעבירים מחרוזות לכן חשוב להגדיר את סוג הקידוד.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
<span style="color: #3d85c6;"><b>סיכום</b></span></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
תחשבו לכם איזה יתרון אדיר יש בשילוב בין 2 פלטפורמות שונות שמאפשרות לנו לגעת בכל העולמות, לצורך העניין ב .Net יש כלים נהדרים לעבודה על אתרי אינטרנט, בניית ממשקים, DB וכו' ואילו ב C נוכל לשפר ביצועים ולהגיע למקומות ש .Net לא יכול.</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
השילוב הראוי...</div>
<div dir="rtl" style="text-align: right;">
<br /></div>
</div>
</div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-26669134183006265782014-01-27T14:47:00.000-08:002014-01-27T17:25:09.958-08:00C# Reflection Guide<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBrQneROokXUtkZ9mjO3dJCOs-PsOk0fbR-9KThZuuZW3DmLTaz868arz_zhPx5G3980YcaoBelCQuXlmIS9ToUdtjtU3k7GW3U1jilzM-fxAE_ds3iI4XkUuC0375gvts9638OtvGLfz4/s1600/ref.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBrQneROokXUtkZ9mjO3dJCOs-PsOk0fbR-9KThZuuZW3DmLTaz868arz_zhPx5G3980YcaoBelCQuXlmIS9ToUdtjtU3k7GW3U1jilzM-fxAE_ds3iI4XkUuC0375gvts9638OtvGLfz4/s1600/ref.png" /></a></div>
<br />
<br />
אחד התחומים המעניינים בפיתוח, האפשרות לתוכנית ללמוד על עצמה תוך כדי ריצה מאפשרת לפתח תוכניות מיוחדות במיוחד, האמת שנושא ה <a href="http://en.wikipedia.org/wiki/Reflection_(computer_programming)">Reflection</a> ישן והוא קיים עוד מתחילת ה Framework הראשון אבל אף פעם לא התייחסתי אליו כי בדרך כלל אין בו צורך, לרוב אנחנו יודעים מה אנחנו הולכים לפתח אבל קיימים מקרים מסויימים בהם יש חור שחור ואין לנו מספיק מידע ולכן עלינו לשמור על קוד גנרי ככל האפשר.<br />
<br />
<div dir="ltr" style="text-align: left;">
<span style="color: #3d85c6;"><b>Reflection</b></span></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
יכולת של תוכנית לזהות במהלך הריצה את האובייקטים שרצים בה, לנתח אותם ולהפעיל בהם פונקציות באופן דינמי לפי סוג האובייקט או על פי קונבנציה קבועה, במאמר זה אני יעבור על נושא ה Reflection בסביבת .Net אבל היכולת הזאת נתמכת גם בסביבות נוספות כמו JavaScript, C++,Phyton וכו', הרעיון המרכזי הוא להפוך את התוכנית ל"שקופה" ושתוכל להתמודד עם אובייקטים שונים מבלי לעבור Compile כל פעם מחדש.<br />
<br />
לצורך הדוגמה בניתי תוכנית והיא מאפשרת למשתמשים ליצור עבורה Plugins מיוחדים, מהרגע שהכנסתי את התכונה הזאת אני לא יודע מה המשתמש יעשה (האמת שזה לא כלכך צריך לעניין אותי), ואני לא יכול לעשות Compile לתוכנית המקורית כל פעם מחדש כי זה יהיה מגוחך, כאן נכנס ה Reflection לתמונה שבעזרתו אני יכול להגדיר קונבנציה עבור טעינת Plugin כחלק מה SDK של התוכנית, משתמש הקצה מייצר אובייקט שמכיל בתוכו קריאות לפונקציות שנקבעו מראש שמטרתם לחבר בין התוכנית לקוד שהמשתמש יצר, ברגע שמופעלת הפונקציה הקוד של המשתמש רץ מבלי שהיה חלק מהתוכנית עצמה כפי שניתן לראות בקוד הבא:<br />
<br />
<div dir="ltr" style="text-align: left;">
public class example</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //private string</span></div>
<div dir="ltr" style="text-align: left;">
private string msg0 = "this is exmaple of private string!";</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//public string</span></div>
<div dir="ltr" style="text-align: left;">
public string msg1 = "this is exmaple of public string!";</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//constructor</span></div>
<div dir="ltr" style="text-align: left;">
public example()</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //public function for invoke return string</span></div>
<div dir="ltr" style="text-align: left;">
public string returnPrivateMessage()</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
return msg0;</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//public function for invoke getting external </span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //parameter and return string</span></div>
<div dir="ltr" style="text-align: left;">
public string returnEditMessage(string msg)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
return "you write: " + msg;</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<div dir="rtl" style="text-align: right;">
המשתמש עוטף את המחלקה כ DLL ומעתיק אותה לתיקיית Plugin בתוכנית,התוכנית טוענת אותו לזיכרון ומחפשת את הפונקציה שנקבעה מראש על מנת להפעיל אותה ובעצם מעבירה את הריצה ל DLL מבלי לדעת מה בדיוק עומד לקרות שם.</div>
</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
class Program</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
static void Main(string[] args)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//load assmbly dynamically</span></div>
<div dir="ltr" style="text-align: left;">
Assembly assemblyInstance = Assembly.LoadFrom(@"C:\\RefDLL.dll");</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
Type[] types = assemblyInstance.GetTypes();</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
for (int i = 0; i < types.Length; i++)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//search for specific type</span></div>
<div dir="ltr" style="text-align: left;">
if (types[i].Name.ToLower() == "example")</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
MethodInfo[] methods = types[i].GetMethods();</div>
<div dir="ltr" style="text-align: left;">
if (methods != null)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
for (int z = 0; z < methods.Length; z++)</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //search for specific method</span></div>
<div dir="ltr" style="text-align: left;">
if (methods[z].Name == "returnPrivateMessage")</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//create instance for dynamic object</span></div>
<div dir="ltr" style="text-align: left;">
object classInstance = Activator.CreateInstance(types[i], null);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//execute method and gettig string</span></div>
<div dir="ltr" style="text-align: left;">
object res = methods[z].Invoke(classInstance, new object[0]);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
if (methods[z].Name == "returnEditMessage")</div>
<div dir="ltr" style="text-align: left;">
{</div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;">//create parameters array for function,</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //you can get the types of the arguments using</span></div>
<div dir="ltr" style="text-align: left;">
<span style="color: lime;"> //ParameterInfo[] parameters = methods[z].GetParameters();</span></div>
<div dir="ltr" style="text-align: left;">
object[] parametersArray = new object[] { "my information!" };</div>
<div dir="ltr" style="text-align: left;">
object classInstance = Activator.CreateInstance(types[i], null);</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
object res = methods[z].Invoke(classInstance, parametersArray);</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div dir="ltr" style="text-align: left;">
}</div>
<div dir="ltr" style="text-align: left;">
}</div>
</div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<br />
<br />
ראינו כיצד ניתן להפוך את התוכנית למשהו גנרי אבל מצד שני הקוד שלנו חשוף וכל אחד יכול להפעיל אותו, הצגתי בעבר כיצד ניתן לעשות <a href="http://proxytype.blogspot.co.il/2011/01/managed-net-rootkit.html">Disassembly</a> לקבצי DLL שנוצרו ב .Net וה Reflection לוקח חלק חשוב בתהליך, לסיום החלטתי שזו הזדמנות טובה להראות את היכולות של ה Reflection בעזרת כלי קטן שמאפשר לנתח קבצי DLL בצורה נוחה ומהירה, בדומה לדוגמה הקודמת התוכנית מקבלת נתיב ל DLL ופורסת אותו, היא מראה את הפונקציות, המשתנים והאירועים של האובייקטים בקובץ.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGftGSvXyl-HNe1tn3ygAY7mj17SguTtB1BMLaRz7uWHkp4OZXTpSWFgWEX80VHt4LS4Bq_POGxSPLyYJcknIyGWEUGpK2wwy0g9RXa10T1g8GnqjgRcvekOley3UZqi4k5l-9QcOcwNTd/s1600/1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGftGSvXyl-HNe1tn3ygAY7mj17SguTtB1BMLaRz7uWHkp4OZXTpSWFgWEX80VHt4LS4Bq_POGxSPLyYJcknIyGWEUGpK2wwy0g9RXa10T1g8GnqjgRcvekOley3UZqi4k5l-9QcOcwNTd/s1600/1.png" height="370" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">DLLReflector</td></tr>
</tbody></table>
<br />
<br />
<span style="color: #3d85c6;"><b>סיכום:</b></span><br />
<br />
אז כמו שכבר אמרתי בהתחלה בדרך כלל לא נמצא ל Reflection שימוש אלא במקרים מאוד מסויימים, ההתעסקות בניתוח האובייקט עלולה להפוך את התוכנית למסורבלת ואיטית ולכן כדאי לחשוב פעמיים לפני שבוחרים בדרך הזאת, אבל אין ספק שזה לוקח את האינטליגנציה של התוכנה צעד אחד קדימה.<br />
<br />
קוד להורדה:<br />
<div dir="ltr" style="text-align: left;">
<a href="https://sourceforge.net/projects/dllreflector/files/dllReflector_src.rar/download">https://sourceforge.net/projects/dllreflector/files/dllReflector_src.rar/download</a></div>
<br />
<br />
סקיינט?<br />
<br />
<br /></div>
<div style="text-align: right;">
<br /></div>
</div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0tag:blogger.com,1999:blog-4229028639498269114.post-84581312388496946042014-01-17T04:39:00.000-08:002014-02-12T12:45:11.933-08:00Arduino And EEPROM<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXksylgxG0p7sOtFx3D0nYybwR9_t9HYeIg4pL3lnCgI-_QOk3ZICPHaFhQZ2V96kiaMHco522NK880xzgXCUJILYHA0zK5EDwrgDjUdwrdpYuaJKhFY-XkgcTdfS-cwd2ASMncDSZj8t7/s1600/logo_arduino.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXksylgxG0p7sOtFx3D0nYybwR9_t9HYeIg4pL3lnCgI-_QOk3ZICPHaFhQZ2V96kiaMHco522NK880xzgXCUJILYHA0zK5EDwrgDjUdwrdpYuaJKhFY-XkgcTdfS-cwd2ASMncDSZj8t7/s1600/logo_arduino.jpg" height="139" width="320" /></a></div>
<br />
שנה חדשה נפתחה בבלוג, היא עמוסה באתגרים חדשים את זה אני יכול להבטיח לכם, את המאמר הראשון השנה החלטתי להקדיש לכוכב מהשנה שעברה, הפעם נתעסק בכיצד ניתן להרחיב את הזיכרון המוגבל ב Arduino שהוא 32K בלבד.<br />
<br />
<b><span style="color: #3d85c6;">דרישות</span></b><br />
<br />
<ul style="text-align: right;">
<li>Arduino Uno</li>
<li>24LC256 EEPROM</li>
<li>Wires</li>
<li>Breadboard</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi05cWUM57kv_jTrCghHTe9Nq4U2sesiP_pPT64C3Dvq3l_peEOFekH2Fjv_X2IDNjdS-EkdT4mpYam9hyarFY8tTHPWZFFS39xgm1y-X4gQdM2JAllKMWTCbZAnaTSTvpY6Bl9BR4J32Nq/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi05cWUM57kv_jTrCghHTe9Nq4U2sesiP_pPT64C3Dvq3l_peEOFekH2Fjv_X2IDNjdS-EkdT4mpYam9hyarFY8tTHPWZFFS39xgm1y-X4gQdM2JAllKMWTCbZAnaTSTvpY6Bl9BR4J32Nq/s1600/5.png" height="320" width="314" /></a></div>
<br />
<br />
<br />
<div dir="ltr" style="text-align: left;">
<b><span style="color: #3d85c6;">EEPROM - </span></b><span style="text-align: right;"><span style="color: #3d85c6;"><b>Electrically Erasable Programmable Read-Only Memory</b></span></span></div>
<div dir="ltr" style="text-align: left;">
<br /></div>
<div style="text-align: right;">
אין ספק שהשם מפוצץ אבל בסופו של דבר מדובר ביחידת זיכרון שמאפשרת לשמור על המידע גם כאשר המכשיר כבוי, הרכיב שבחרתי עליו להדגים הוא 24LC256 שמאוד נפוץ במחיר 2 $ בלבד מאפשר לנו להרחיב את הזיכרון בעוד 256K ,הוא אינו נדיף בניגוד ל Ram ובנוסף הכתיבה והקריאה הן ברמת Bit בודד בניגוד לזיכרון Flash שלצורך שינוי ביט אחד יש לקרוא בלוק של מידע ,לטעון אותו לזיכרון ה Ram, לעשות את השינוי ולכתוב בחזרה ל Flash מה שהופך את העסק למסורבל אבל חיוני מאוד למידע בנפחים גדולים.</div>
<div style="text-align: right;">
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiflyHAGimOlH-__OooJy6PNfhzZzTtPyvgcm-nqowFUaoEwBF-isFQsBoGWJHl7QIoAYNnntV4t3WRnhPEpvlYYRk9lcqeYbCf7nuaqnY89LN9cZzSMtjpXHt2D4l8ISrrz5o2k7o30Y-k/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiflyHAGimOlH-__OooJy6PNfhzZzTtPyvgcm-nqowFUaoEwBF-isFQsBoGWJHl7QIoAYNnntV4t3WRnhPEpvlYYRk9lcqeYbCf7nuaqnY89LN9cZzSMtjpXHt2D4l8ISrrz5o2k7o30Y-k/s1600/2.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">256K של זיכרון לא נדיף</td></tr>
</tbody></table>
<div dir="ltr" style="text-align: left;">
<div dir="rtl" style="text-align: right;">
הרגליים האנלוגיות (A5, A4) ב Arduino Uno מאפשרות לעבוד בתקשורת <a href="http://en.wikipedia.org/wiki/I%C2%B2C">I2C Inter-Integrated Circuit </a> שדומה מאוד ל SPI שראינו במאמר <a href="http://proxytype.blogspot.co.il/2013/09/arduino-microsd.html">Arduino and MicroSD</a> ההבדל העיקרי הוא שב SPI עבור כל רכיב נצטרך רגל אחת מה Arduino לעומת I2C שבו כל הרכיבים מתחברים לאותן כניסות בלוח ובקלות ניתן להוסיף עוד רכיבים, מדובר על 2 רגליים שבעזרתן מייצרים Bus הרגל הראשונה היא השעון, והשניה ל Data, לכל רכיב יש כתובת ייחודית שדרכה מתחברים בעזרת הממשק.<br />
<br /></div>
</div>
</div>
<div dir="ltr" style="text-align: left;">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWoXMjZhAwUvF91rJE8m8zZcXWqO6hyphenhyphenqi3_1EejfTztpD9mQrfkS2_tv73gVT-4PNEAQ90HOLsVEq5jiWUcFsYlxCJkIrtwrR4uTJ7Y_i5agTZahCcqksE2JxDGpCy9YEi-2kWVMYkn3kQ/s1600/4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWoXMjZhAwUvF91rJE8m8zZcXWqO6hyphenhyphenqi3_1EejfTztpD9mQrfkS2_tv73gVT-4PNEAQ90HOLsVEq5jiWUcFsYlxCJkIrtwrR4uTJ7Y_i5agTZahCcqksE2JxDGpCy9YEi-2kWVMYkn3kQ/s1600/4.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">המון חיבורים עם 2 רגליים בלבד</td></tr>
</tbody></table>
<br />
<div dir="rtl" style="text-align: right;">
<b><span style="color: #3d85c6;">קוד</span></b></div>
<div dir="rtl" style="text-align: right;">
<br /></div>
<div dir="rtl" style="text-align: right;">
החלטתי לתת דוגמה קצת יותר מורכבת מאשר כתיבה וקריאה של ערך בודד אלא לכתוב ולקרוא מחרוזות, ניתן לכתוב ולקרוא 16bytes בלבד בכל פעם לכן יש להתקדם בכתובות בזיכרון בעזרת חלוקה ל Pages. </div>
<br />
<span style="color: orange;">#include <Wire.h></span><br />
<br />
<span style="color: lime;">//unique address for the eeprom 24LC256</span><br />
<span style="color: orange;">#define eeprom1 0x50 </span><br />
<span style="color: orange;">#define readblock 100</span><br />
<span style="color: orange;">#define pageblock 16</span><br />
<br />
<span style="color: lime;">//size of the message</span><br />
unsigned char length = 0;<br />
<span style="color: lime;">//receive data buffer</span><br />
unsigned char rdata[readblock];<br />
<br />
<br />
void setup(void)<br />
{<br />
<span style="color: lime;">//example of parsable string</span><br />
unsigned char str_data[]={"{message:this is working! using EEPROM}\n"};<br />
<br />
Serial.begin(9600);<br />
<br />
<span style="color: lime;">//Active I2C interface</span><br />
Wire.begin(); <br />
<br />
<span style="color: lime;"> //writing data to 24LC256</span><br />
writeData(str_data);<br />
}<br />
<br />
void loop(){<br />
<br />
Serial.println("DATA READ");<br />
<br />
<span style="color: lime;"> //reading data to 24LC256 </span><br />
readData(rdata,readblock);<br />
Serial.write(rdata,readblock);<br />
<br />
delay(1000);<br />
}<br />
<br />
<br />
void writeData( unsigned char * str_data)<br />
{<br />
<br />
unsigned char pages = 0;<br />
unsigned char offset = 0;<br />
unsigned char index = 0;<br />
unsigned char counter = 0;<br />
<br />
<span style="color: lime;"> //get the length of data</span><br />
length = getStrLength(str_data); <br />
<span style="color: lime;">//get the number of page to write</span><br />
pages = length / pageblock;<br />
<br />
<span style="color: lime;"> //make the magic</span><br />
for(index = 0; index <= pages;index++)<br />
{<br />
<span style="color: lime;"> //connecting to the device</span><br />
Wire.beginTransmission(eeprom1);<br />
<br />
<span style="color: lime;">//set the position of writing,</span><br />
Wire.write((int)((offset) >> 8)); //MSB - Most significant bit<br />
Wire.write((int)((offset) & 0xFF)); // LSB - Least significant bit<br />
<br />
<span style="color: lime;">//total bytes writed to jump the next page address</span><br />
unsigned char i= 0;<br />
<br />
for(i= 0; i < pageblock;i++)<br />
{<br />
<span style="color: lime;">//writing the char to the memory unit.</span><br />
Wire.write((byte) str_data[counter]);<br />
<br />
<span style="color: lime;"> //if counter equal data length quit!</span><br />
if(counter == length)<br />
break;<br />
<br />
<span style="color: lime;">//increment the total counter of length</span><br />
counter++; <br />
}<br />
<br />
<span style="color: lime;">//end I2C transmission</span><br />
Wire.endTransmission();<br />
<br />
<span style="color: lime;">//move offset to the next page </span><br />
offset += i;<br />
<br />
<span style="color: lime;"> //give it some time...</span><br />
delay(10);<br />
<br />
} <br />
<br />
}<br />
<br />
void readData(unsigned char* data, unsigned int length)<br />
{<br />
<br />
unsigned char offset = 0;<br />
unsigned char counter = 0;<br />
<br />
<span style="color: lime;">//start reading pages until new line break</span><br />
while(true)<br />
{<br />
<span style="color: lime;"> //total bytes writed to jump the next page address </span><br />
unsigned char i=0;<br />
Wire.beginTransmission(eeprom1);<br />
<br />
<span style="color: lime;"> //set position of reading</span><br />
Wire.write((int)(offset >> 8)); //MSB - Most significant bit<br />
Wire.write((int)(offset & 0xFF)); //LSB - Least significant bit<br />
<br />
<span style="color: lime;">//end I2C transmission</span><br />
Wire.endTransmission();<br />
<br />
<span style="color: lime;">//request data from device</span><br />
Wire.requestFrom(eeprom1,length);<br />
<br />
while(Wire.available())<br />
{<br />
<span style="color: lime;">//write char to position data</span><br />
data[counter] = Wire.read();<br />
<br />
<span style="color: lime;">//end of message!</span><br />
if(data[counter] == '\n')<br />
{<br />
return; <br />
}<br />
<br />
i++;<br />
counter++;<br />
}<br />
<br />
offset+=i;<br />
delay(10);<br />
}<br />
}<br />
<br />
<span style="color: lime;">//get the length from chars array</span><br />
unsigned char getStrLength(unsigned char * data)<br />
{<br />
unsigned char str_len=0; <br />
do{ str_len++; } while(data[str_len]); <br />
return str_len;<br />
}<br />
<br />
<div>
<br /></div>
<br /></div>
<div style="text-align: right;">
<span style="color: #3d85c6;"><b>מבנה סופי</b></span></div>
<div style="text-align: right;">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfGQn4PZ-pvZtBJh07Ih_YQyDLe_LxxmPkHIIUjlWn0LuyCe17nWUPeHa8eFESCukoa_D4Gv2NVPPPi3d6Q1ZGygg_0fJG0x18bMrL9Xd5vWGX-C47HQ2qGO0Gv3AnuPiVUZ8tgGp_1k1G/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfGQn4PZ-pvZtBJh07Ih_YQyDLe_LxxmPkHIIUjlWn0LuyCe17nWUPeHa8eFESCukoa_D4Gv2NVPPPi3d6Q1ZGygg_0fJG0x18bMrL9Xd5vWGX-C47HQ2qGO0Gv3AnuPiVUZ8tgGp_1k1G/s1600/1.png" height="277" width="400" /></a></div>
<br /></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<span style="color: #3d85c6;"><b>סיכום</b></span></div>
<div style="text-align: right;">
<br />
אפשרות הרחבת הזיכרון מאפשרת לשמור מידע יעודי עבור התוכניות שלנו ועדיין להשאיר מספיק מקום לקוד ב Arduino, החיבור עצמו פשוט ומאפשר לתפעל מספר רכיבים מבלי לבזבז רגליים, ממשק I2C נפוץ מאוד ויש בו שימוש רחב במוצרים רבים לכן חשוב להכיר אותו.<br />
<br />
שנה חמישית, ואו!</div>
<div style="text-align: right;">
<br /></div>
<br /></div>
Proxytypehttp://www.blogger.com/profile/10011410053622514741noreply@blogger.com0