Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Bluetooth в Mac OS из Python

Я тут учусь работать с Блютузом из Пайтона на «Маке», пока сделал сканирование всех видимых в эфире устройств:

import objc
import time
from Foundation import NSDate, NSDefaultRunLoopMode
from AppKit import NSApplication, NSAnyEventMask

objc.loadBundle('IOBluetooth', globals(), bundle_path=u'/System/Library/Frameworks/IOBluetooth.framework')

class DeviceInquiry(NSObject): 
    def init(self):
        self = super(DeviceInquiry, self).init()
        self._inquiry = IOBluetoothDeviceInquiry.inquiryWithDelegate_(self)    
        self._stop = False
        
        return self
        
    def getfounddevices(self):
        self._inquiry.start()

        app = NSApplication.sharedApplication()
        app.setActivationPolicy_(2)        
        while not self._stop:
            time.sleep(.01)
            app.nextEventMatchingMask_untilDate_inMode_dequeue_(NSAnyEventMask,\
            NSDate.dateWithTimeIntervalSinceNow_(1), NSDefaultRunLoopMode, True)

        return tuple((dev.getName(), dev.getAddressString()) for dev in self._inquiry.foundDevices())

    @objc.typedSelector("v@:@@")
    def deviceInquiryDeviceFound_device_(self, inquiry, device):
        self._stop = True 

    @objc.typedSelector("v@:@iB")
    def deviceInquiryComplete_error_aborted_(self, inquiry, err, aborted):
        self._stop = True

print DeviceInquiry.new().getfounddevices()

Модуль pyobjc (в маковском Пайтоне он уже есть) — это мост между Пайтоном и Обжектив-Си, т. е. в реальности вызывается «кокосовое» АПИ «Мака».

Последняя строчка — пример использования, выдаётся список списков, состоящих из двух элементов — имени устройства и его «адреса» (это шесть шестнадцатеричных чисел, разделённые минусом).

2 комментария
Саша 1 год

Здравствуйте! А для получения процента батареи с блютуз устройства использовать batteryLevel_()?

Евгений Степанищев 1 год

Здравствуйте, я не знаю. Этой заметке 10 лет.

Саша 1 год

А вы уже не пишете код на мак ?

Евгений Степанищев 1 год

С блютусом не работаю.