Archive for the 'USB-Phone' Category

השמשה של USB Phone בלינוקס

יש לכם טלפון USB שעובד בווינדוס עם סקייפ ואין לכם מושג איך להפעיל אותו בלינוקס?
נסו לכתוב בטרמינל (terminal\מסוף\Shell או איך שאתם מעדיפים לקרוא לזה): lsusb, יוצא לכם בפלט את השורה הזו?

$ lsusb
...
Bus 006 Device 006: ID 0851:c080 Macronix International Co., Ltd
...

אז כנראה שיש לכם אותה שפורפרת USB כמו שלי, הנה מדריך איך אפשר להשמיש אותה בלינוקס,

קודם קצת פרטים על השפורפרת:
השפורפרת מזוהה ע"י הלינוקס (דביאן) ככרטיס קול וכהתקן HID
בכל שידור מהשפופרת להתקן במחשב /dev/hidraw0 נשלחים 8 בייט, בלחיצה 8 ובשחרור 8.

ונעבור לקצת פרטים על התוכנות שישמשו אותנו:
udev – לענייננו, תוכנה שמנטרת חיבור חומרה למחשב ומאפשרת פעולות עקב אירועי חומרה.
xdotool – לענייננו, תוכנה המאפשרת שליחת מקשים מתוך סקריפטים,
הערה: xdotool עובדת על גבי שרת הX.
sflphone – תוכנת VoIP.

ועכשיו לסקריפט הBASH שישמש אותנו על מנת לקרוא את המידע מהשפורפרת ולהעביר אותו בצורה שמישה,
את הסקריפט נשמור ב: /home/<user>/bin/USB-phone.sh (כמובן לשנות לתיקיית משתמש שלכם)

#!/bin/bash

export DISPLAY=:0;	# ‫בחירת תצוגה לפעילות‪

function update_wid {
	local tmp=( $(wmctrl -l|grep "SFLphone VoIP Client") );	# ‫בחירה בחלון של SFLphone‪
	[[ -n "${tmp[0]}" ]] && opt="--window ${tmp[0]}" || opt="";	# ‫הגדרת המשתנה opt לצורת העבודה בשביל xdotool‪
	echo "update wid: ${tmp[0]}";
}

update_wid;	# ‫עדכון הגדרת חלון או כללי לxdotool‪
speaker="B0";	# ‫משתנה דו מצבי של הרמקול המובנה בשפופרת‪

cat /dev/hidraw0 |
 while read -n1 in[0]; do
for ((i=1;i<=15;i++)); do
	read -n1 in[$i];
done;	# ‫קריאת 16 בייטים, 8 של  לחיצת כפתור ו8 של שחרור כפתור‪

a="$(printf %d \'"${in[0]}")";	# ‫המרת הבייטים הרלוונטיים למספרים דצימליים‪
b="$(printf %d \'"${in[2]}")";	# ‫^^^‪

if [[ "$a" == "0" ]]; then
	if [[ "$b" -le "38" &&  "$b" -ge "30" ]]; then
		xdotool type $opt $((b-29));	# ‫הספרות 1,2,4,5,6,7,8,9‪
	elif [[ "$b" == "0" ]]; then
		xdotool type $opt 3;	# ‫הספרה 3‪
	elif [[ "$b" == "39" ]]; then
                xdotool type $opt 0;	# ‫הספרה 0‪
        elif [[ "$b" == "81" ]]; then
		xdotool key $opt Down;	# ‫כפתור למטה‪
        elif [[ "$b" == "82" ]]; then
                xdotool key $opt Up;	# ‫כפתור למעלה‪
	fi
elif [[ "$a" == "2" ]]; then
	if [[ "$b" == "37" ]]; then
		xdotool keydown SHIFT; xdotool type $opt "*"; xdotool keyup SHIFT;	# ‫כוכבית‪
	elif [[ "$b" == "0" ]]; then
                xdotool keydown SHIFT; xdotool type $opt "#"; xdotool keyup SHIFT;	# ‫סולמית‪
        fi
elif [[ "$a" == "7" ]]; then
        if [[ "$b" == "0" ]]; then	# ‫כפתור C‪
                xdotool key $opt BackSpace; 
        elif [[ "$b" == "4" ]]; then	# ‫כפתור חיוג‪
                xdotool key $opt Return;	# ‫שליחת אנטר‪
        elif [[ "$b" == "11" ]]; then	# ‫כפתור ניתוק‪
                xdotool key $opt Escape;	# ‫שליחת אסקייפ‪
        elif [[ "$b" == "12" ]]; then	# ‫כפתר פונקציות שמאלי‪
                update_wid;	# ‫עדכון הגדרות שליחה לחלון או שליחה כללית‪
	elif [[ "$b" == "22" ]]; then	# ‫כפתור רמקול‪
                echo -e "\x${speaker}" >> /dev/hidraw0	# ‫שליחת משתנה מצב רמקול עכשיוי לשפופרת‪
		[[ "$speaker" == "B0" ]] &&  speaker="AF" || speaker="B0";	# ‫החלפת משתנה מצב רמקול‪
        fi
fi
done



לאחר מכן נוסיף קובץ בשם: /etc/udev/rules.d/026_usb-phone.rules
בו נגדיר את החוק שיגרום להפעלת הסקריפט בחיבור של ההתקן USB Phone שלנו, יש לשנות את <user> למשתמש שלכם:

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", SYSFS{idProduct}=="c080", SYSFS{idVendor}=="0851", MODE="0600", OWNER="<user>" RUN+="/bin/su <user> - -c '/home/<user>/bin/USB-phone.sh %n'"

הסבר מה כתבנו בעצם:
דבר ראשון החוק בודק התקן שזוהה כhidraw (בדיקת שיוויון בKERNEL ובSUBSYSTEM), ושיהיה לו מזהה התקן ספציפי תואם למה שראינו מקודם בlsusb (בדיקת שיוויון בSYSFS),
ואז מתחילים את הפעולות:

MODE="0600"

הרשאות כתיבה וקריאה לבעלים,

OWNER="<user>"

הפיכת המשתמש שבחרתם לבעלי הקובץ של ההתקן,

RUN+="/bin/su <user> - -c '/home/<user>/bin/USB-phone.sh %n'"

הרצה של הסקריפט כמשתמש הנבחר.
עכשיו ננתק ונחבר את הUSB-Phone, והסקריפט אמור לרוץ, כך שכשתלחצו על ספרה היא תשלח לשרת X (או לתוכנה הספציפית).
אם הוא לא רץ נסו לבצע כroot את הפעולה הזו:

/etc/init.d/udev restart

ואם עדיין לא עובד בבקשה דווחו לי וננסה להבין למה.

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