PyBlueZ
از PyLearn.com
| نکته ها و ترفند ها • ماژول ها و ابزار وابسته • نمونه پروژه و برنامه • پرسش و پاسخ |
مقدمه:
براي اتصال دادن دستگاههاي الکترونيک مختلف با يکديگر، راههاي گوناگوني وجود دارد که از جملهي آنها به کابل هاي ترکيبدهنده، سيم هاي الکتريکي، کابل هاي Ethernet در کنار WiFi و امواج Infrared اشاره کرد. وقتي شما از کامپيوتر، دستگاههاي بازي کامپيوتري يا تلفن استفاده ميکنيد قطعات و قسمتهاي مختلف اين سيستمها، اجتماعي از دستگاههاي الکترونيک را راهاندازي ميکنند. اين دستگاهها با استفاده از انواع سيمها، کابل ها، امواج راديويي، اشعههاي ماوراء بنفش و مادون قرمز به اضافهي اتصالدهندهها، پروتکلها و روشهاي گوناگون ديگر با همديگر تعامل ميکنند. از طرفي هنر ارتباط دادن اشياء با يکديگر، روز به روز در حال پيچيدهتر شدن است.
vAvv5i <a href="http://ifyrerjapteo.com/">ifyrerjapteo</a>, [url=http://bcevdbecfoaa.com/]bcevdbecfoaa[/url], [link=http://qjcwwbexrclp.com/]qjcwwbexrclp[/link], http://ymlvnavngsif.com/
بلوتوث و انواع آن
طبق تعريف , بلوتوث يک پيام راديويي استاندارد و پروتوکل ارتباطات, اصولا طراحي شده براي مصرف انرژي کمتر, با بردي کوتاه (1متر 10 متر 100 متر) که هزينه کمي براي فرستنده وگيرنده دارد و ميکروچيپسي (microchips) است که در هر دستگاهي مي تواند باشد. به عبارت ديگر بلوتوث يک پروتوکل و استانداردي است که از فرکانس هايي با برد کم استفاده مي کند تا يک ارتباط بي سيم ميان دو دستگاه سازگار با هم به وجود اورد.
- توانايي دستگاه هاي بلوتوث به سه کلاس دسته تقسيم مي شوند :
- کلاس 1
- کلاس 2
- کلاس3
- رده بندي براساس بردي است که مي توانند با دستگاه هاي ديگر ارتباط برقرار کنند.
- ترتيب زير از طولاني ترين برد به کوتاه ترين برد است:
کلاس 1 : شامل دستگاه هايي که طولاني ترين برد را دارند. بيشترين برد انها تقريبا 100 متر است , دستگاه هاي اين کلاس نسبت به ديگر کلاس ها بيشترين توان و برق را مصرف مي کنند. مصرف اين دستگاه ها 100MW است.
کلاس 2 : برد اين نوع دستگاه ها متوسط است. بيشترين برد اينها براي ارتباط برقرار کردن 10متر مي تواند باشد. مصرف اين دستگاه ها هم 2.5MWاست.
کلاس 3 : اين دستگاه ها بيش از يک متر نمي توانند با ديگر دستگاه ها ارتباط برقرار کنند.توان مصرفي اين دستگاه هاي اين کلاس خيلي کمتر از ديگر کلاس ها است که حدودا 1MW است.
اگر شما محدوده توان هاي مورد نياز را ملاحضه کرده باشيد مي بينيد که با کم کردن برد ,مصرف نيز کاهش مي يابد. در ادامه ما مي خواهيم نگاه کنيم به چگونگي استفاده سرويس ها از بلوتوث موجود در دستگاه ها است. هر دستگاه سرويس هاي معيني تهيه مي کند براي فهميدن و تشخيص دادن همانند تشخيص يک ارتباط بي سيم. يک مجموعه از اين جور سرويس ها يک نمايه (profile) تشکيل مي دهند. گاهي وقت ها هم نمايه ها فقط محتوي يک سرويس هستند, همانند جرياني از صوت هاي يک فايل audio, يا اينکه مي توانند شامل چندين سرويس متمايز از هم باشند همانند گرفتن يک فيلم زنده در حال جريان. 27 نمايه استاندارد وجود دارد که دستگاه ها مي توانند استفاده کنند. بعضي از اين نمايه هايي که مورد استفاده قرار مي گيرند:
- نمايه اصلي تصاوير : براي ارسال , دريافت و تغيير سايز تصاوير
- نمايه اصلي چاپ : براي استفاده برخي از اينها : vCards , text , e-mail etc .تا ارسال کنيم به پرينتر دستگاه .
- نمايه ارسال فايل : براي دسترسي به فايل هاي سيستم ديگر دستگاه ها.
- نمايه هدست (headset) : تدارک پشتيباني از هدست هاي بلوتوث براي کار با بلوتوث تلفن همراه براي مخابره صوت. يکي از پرکاربردترين نمايه ها است.
- نمايه سريال پورت : تقليد سريال اتصال کابلي و ارتباطي , که از پروتوکل RFCOMM استفاده مي کند.
نوشتن يک برنامه براي دستگاه بلوتوث در حقيقت, به معني برنامه نويسي براي نمايه ها يا دسترسي کاربردي به انها است.براي برنامه نويسي , کتابخانه BlueZ بطور عمده مورد استفاده قرار مي گيرد. اين کتابخانه امکان دسترسي و کار با پشته بلوتوث به صورت شي گرا و روشي پيمانه اي (ماژولار)به ما می دهد. پيتون از بسته PyBlueZ براي اين کار استفاده مي کند.
بسته Microsoft Bluetooth براي پشته ويندوز و BlueZ براي پشته GNU/Linux مورد استفاده قرار مي گيرد. استفاده کردن از PyBlueZ , يکي از اسان ترين راههاي ايجاد يک ارتباط ميان سيستم ها است همانند لپ تاپ ها , دستگاه هاي تلفن همراه و برنامه هاي پايه اي نمايه ها همچون ارسال فايل , ارتباطات شبکه اي و از اين قبيل .حالا که شما با وسايل و کتابخانه اين نوع برنامه نويسي کمي اشنا شديد ,ما مي توانيم در قدم هاي بعدي برنامه هايي براي استفاده از دستگاه بلوتوث ايجاد کنيم.
برنامه نویسی مرحله به مرحله بلوتوث با پایتون
براي هر نمايه يک جور برنامه نويسي وجود دارد , دوتا از مهمترين کارهايي که در ابتدا بايد انجام بدهيد در زير امده است:
- جستجو و پيدا کردن دستگاه ها در محدوده برد
- نگاه کردن به اسم های دستگاه
بايد اين نکته را در ذهن خود داشته باشيد که هر دو اينها احتمالي هستند.بعضي اوقات در اولين جستجو امکان موفق نشدن وجود دارد.از اين رو بايد چند بار سعي کنيد تا بتوانيد موفق شويد. جستجو و پيدا کردن دستگاه ها در محدوده برد:
1. اولين گام براي پيدا کردن دستگاه ها در محدوده برد است که بتوان با انها يک ارتباط ايجاد کرد.پيدا کردن يک دستگاه نيازمند فراخواني متد discover_devices() است. اين متد يک ليست از ادرس هاي دستگاه هاي کشف شده بر مي گرداند. براي مثال, دستور زير دستگاه هاي کشف شده در محدوده برد را در يک ليست برمي گرداند.
discovered_devices = discover_devices()
2. نگاه کردن به اسم هاي دستگاه ها:
ادرس هاي دستگاه هاي پيدا شده به صورت "XX:XX:XX:XX:XX" هستند که هر X يک کاراکتر به صورت هگزادسيمال (شانزده شانزدهي)نمايش داده مي شود" يک octet از 48 بيت ادرس تشکيل شده است "(یعنی ادرس ها 48 بیت هستند).اگر چه در حقيقت دسترسي به اين دستگاه ها نيازمند برقراري يک ارتباط است, اول بايد بفهميم اسم دستگاه بصورت ادرس چگونه است.يکي از اصلي ترين دلايل که یک نفر نامي براي دستگاه انتخاب مي کند اين است که راحتتر در حافظه و ذهن مي ماند و اين اسان تر از يک ادرس 48بيتي است.
- براي فهميدن نام دستگاه مي توان از متد lookup_name() استفاده کرد. اين متد ادرس دستگاه را مي گيرد و معادل ان را به صورت نام (octet) برمي گرداند.براي مثال نام دستگاه "Raj" از ليست ادرس هاي پيدا شده جستجو مي شود:
target_device = "Raj"
target_device_address = None
for address in discovered_devices:
if target_device==lookup_name(address):
target_device_address=address
break
if target_device_address is not None:
print "The address of the target device is :",
target_device_address
else:
print "Could not find address of target device"
در کد بالا اگر زبان پيتون را بلد باشيد کامل متوجه مي شويد. ليستي از ادرس هاي دستگاه را پيدا مي کند و يکي يکي انها را بوسيله تابع lookup_name() با نام "Raj" مقايسه مي کند اگر يکي تطبيق داشته باشد يک پيام چاپ مي شود و متد break باعث خروج از حلقه مي شود.تمام ان مراحل لازمه اتصال به هر دستگاه است. بار ديگر عمل اکتشاف انجام شده, سپس براساس نوع سرويس ,ارتباط مي تواند شروع شود. حالا ان مراحل شفاف هستند, بگذاريد ما نگاه کنيم به مثال هاي دنياي واقعي براي استفاده مراحل فقط تفصيل کردن در مورد دسترسي يک دستگاه بلوتوث.
برنامه نویسی عملی بلوتوث با پایتون
اولين قانون براي برنامه هاي اين نوع هدف ها در جهان واقعي تهيه پيمانه اي بودن است.در اين مورد , ما مي توانيم پيمانه اي بودن را به وسيله بسته بندي کردن کد دستگاه هاي کشف شده در يک کلاس.نام کلاس را Dveices مي خوهيم باشد. براي شروع ماژول(بسته) را import مي کنيم:
from bluetooth import *
بعد اين کار مي رسيم به کلاس سازنده. کلاس سازنده نام دستگاه را مي گيرد ادرس اين دستگاه بايد درست باشد(کار کند).
from bluetooth import *
class Devices:
def __init__( self, target_device_name):
self.target_device=target_device_name
self.target_device_address= None
بعد ما متدي براي انجام کار lookup تعريف مي کنيم. اگر دستگاه مورد برپا باشد(درست باشد), ادرس دستگاه را در متغير self.target_device_address قرار مي دهد.براي پيدا کردن ادرس , تکرار مي کند ليست ادرس هاي برگشت داده شده توسط متد discover_devices() و هر ادرس را به وسيله متد lookup_name عبور مي دهد.
from bluetooth import *
class Devices:
def __init__( self, target_device_name):
self.target_device=target_device_name
self.target_device_address= None
def check_devices(self):
discovered_devices=discover_devices()
for address in discovered_devices:
if self.target_device==lookup_name(address):
self.target_device_address=address
break
بعد مي رسيم به متدي براي چک کردن که ايا ادرس دستگاه مورد نظر برپا(found) است يا نه. اگر برپا باشد ادرس ان را برخواهد گرداند, در غير اين صورت None را بر مي گرداند.
from bluetooth import *
class Devices:
def __init__( self, target_device_name):
self.target_device=target_device_name
self.target_device_address= None
def check_devices(self):
discovered_devices=discover_devices()
for address in discovered_devices:
if self.target_device==lookup_name(address):
self.target_device_address=address
break
def device_found(self):
self.check_devices()
if self.target_device_address is not None:
return self.target_device_address
else:
return None
حالا کلاس ما کامل شد. حالا ان را به وسيله فراخواني توابع و ماژول هاي ديگر تست مي کنيم اولين کار پرسيدن نام و گرفتن ان است تا به نام ان پي ببرد.سپس ايجاد کردن يک شي به وسيله کلاس Device و فراخواني متد check_device. نتيجه برگشتي ها براي ما نمايش داده خواهد شد. کد به صورت زير است:
user_device= raw_input("Enter the device to be discovered:")
device = Devices(user_device)
addr = device.device_found()
if addr is not None:
print "The address for the device is :". addr
else:
print "The device could not be discovered"
بحث ما در مورد برنامه نويسي بلوتوث با پيتون به پايان رسيد در مرحله هاي بعدي در مورد ايجاد و پيدا کردن سرويسها بحث خواهيم کرد...

