Archive for the 'IOBluetoothHostController' Category

2017/08/05 Bluetoothに接続中のデバイス名を取得、AirPodsを切断する

Bluetoothに接続中のデバイス情報を取得し、そのうち名称に「AirPods」を含むものの接続をオフ/オンにするAppleScriptです。

bluetooth1.png
▲実行前(AirPodsが接続状態)

bluetooth2.png
▲実行中(AirPodsが切断状態)

Bluetoothデバイスとの接続制御を行うAppleScriptをいろいろ試してみましたが、だいたい想定どおりのレベルのものができたような気がします。

本Scriptを実行すると、ペアリングずみのデバイス情報一覧を取得し、そのうち名称に「AirPods」を含むものを抽出してデバイスのアドレス情報を抽出し、接続を切断したのちに10秒時間待ちを行い、再度接続を行います。

この処理フロー全体には実用性も意味もありませんが、ひととおりの動作を検証するためのものです。実際にはこの処理フローの一部のみ(名称を取得するだけとか、指定名称のデバイスを接続するとか)を選択して使うことになります。

本来なら、デバイスのBluetoothアドレスからデバイス情報にアクセスして、デバイスタイプ(マウス、ヘッドセット、スピーカーなど)やメーカー名などで判定するような処理が理想的なんですが、一応妥協してデバイスの名称の文字列で判定するようにしたものです。

AppleScript名:Bluetoothに接続中のデバイス名を取得、AirPodsを切断する
– Created 2017-08-05 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.5″ –macOS 10.11 or later
use scripting additions
use framework “Foundation”
use framework “IOBluetooth”
–参照 https://github.com/lapfelix/BluetoothConnector
–http://piyocast.com/as/archives/4761

property IOBluetoothHostController : a reference to current application’s IOBluetoothHostController
property IOBluetoothDevice : a reference to current application’s IOBluetoothDevice

set dList to getActiveBluetoothDevices() of me
–>  {{deviceName:”Piyomaru AirPods”, deviceAddress:”Xx-XX-xX-Xx-xx-xx”}, {deviceName:”Takaaki Naganoya のマウス”, deviceAddress:”xx-xx-XX-xx-XX-Xx”}, {deviceName:”Takaaki Naganoya のキーボード #1″, deviceAddress:”XX-XX-xX-xx-Xx-xX”}}

set dRes to filterRecListByLabel(dList, “deviceName contains ’AirPods’”) of me
if dRes = {} then return false –Case: No match
set dAddr to dRes’s first item’s deviceAddress

set cnRes1 to disconnectBluetoothDeviceByAddress(dAddr) of me
–>  true (Successfully Disconnected)

delay 10

set cnRes2 to connectBluetoothDeviceByAddress(dAddr) of me
–>  true (Successfully Connected)

–指定アドレスのBluetooth Deviceを接続する
on connectBluetoothDeviceByAddress(addressStr as string)
  if getBluetoothPowerState() = false then error “Bluetooth Power is not active with your Mac”
  
set aBTList to IOBluetoothDevice’s pairedDevices() as list
  
  
repeat with i in aBTList
    set aClass to (current application’s NSStringFromClass(i’s |class|())) as string
    
if aClass is equal to “IOBluetoothDevice” then
      set anAddress to i’s addressString() as string
      
      
if anAddress = addressStr then
        i’s openConnection()
        
return true
      end if
    end if
  end repeat
  
return false
end connectBluetoothDeviceByAddress

–指定アドレスのBluetooth Deviceの接続を切る
on disconnectBluetoothDeviceByAddress(addressStr as string)
  if getBluetoothPowerState() = false then error “Bluetooth Power is not active with your Mac”
  
set aBTList to IOBluetoothDevice’s pairedDevices() as list
  
  
repeat with i in aBTList
    set aClass to (current application’s NSStringFromClass(i’s |class|())) as string
    
if aClass is equal to “IOBluetoothDevice” then
      set anAddress to i’s addressString() as string
      
      
if anAddress = addressStr then
        i’s closeConnection()
        
return true
      end if
    end if
  end repeat
  
return false
end disconnectBluetoothDeviceByAddress

–ペアリング済みのBluetooth Deviceの情報を取得
on getActiveBluetoothDevices()
  if getBluetoothPowerState() = false then error “Bluetooth Power is not active with your Mac”
  
set aBTList to IOBluetoothDevice’s pairedDevices() as list
  
set devList to {}
  
  
repeat with i in aBTList
    set aClass to (current application’s NSStringFromClass(i’s |class|())) as string
    
if aClass = “IOBluetoothDevice” then
      set aName to i’s |name|() as string
      
set anAddress to i’s addressString() as string
      
set aPaired to i’s isPaired() as boolean
      
–set aConnect to i’s isConnected() as boolean
      
if aPaired = true then
        set the end of devList to {deviceName:aName, deviceAddress:anAddress}
      end if
    end if
  end repeat
  
  
return devList
end getActiveBluetoothDevices

–Mac本体のBluetoothのパワー状態を取得
on getBluetoothPowerState()
  set aCon to IOBluetoothHostController’s alloc()’s init()
  
set pRes to (aCon’s powerState()) as boolean
end getBluetoothPowerState

–リストに入れたレコードを、指定の属性ラベルの値で抽出
on filterRecListByLabel(aRecList as list, aPredicate as string)
  set aArray to current application’s NSArray’s arrayWithArray:aRecList
  
  
set aPredicate to current application’s NSPredicate’s predicateWithFormat:aPredicate
  
set filteredArray to aArray’s filteredArrayUsingPredicate:aPredicate
  
  
set bList to filteredArray as list
  
return bList
end filterRecListByLabel

★Click Here to Open This Script 

2017/07/25 Bluetoothに接続中のデバイス名を取得するv4

Macに接続中のBluetoothデバイス名を取得するAppleScriptです。

一応、実行前にMac本体のBluetoothがオンになっているかどうかチェックしてから取得しています。

ペアリング中のBluetoothデバイス(主にAirPods)を強制的にペアリング解除できないかと調べていたら途中でできたものです。

ただし、macOS 10.13 Betaではこの通りには取得できていなかったのと、一部のデバイス(Bluetooth接続のゲームコントローラー)についてはこのやり方では「接続中のデバイス」の絞り込みができませんでした。もっと接続中であることを識別する適切な方法があるのかも?

AppleScript名:Bluetoothに接続中のデバイス名を取得するv4
– Created 2017-07-24 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “IOBluetooth”
–http://piyocast.com/as/archives/4747

set pRes to getBluetoothPowerState() of me
if pRes = false then return

set dArray to current application’s IOBluetoothDevice’s pairedDevices()
set aRes to my filterRecListByLabel1(dArray, “mIONotification != 0″)
set dNames to (aRes’s mName) as list
–>  {”Piyomaru AirPods”, “Takaaki Naganoya のマウス”}

–リストに入れたレコードを、指定の属性ラベルの値で抽出
on filterRecListByLabel1(aRecList, aPredicate as string)
  set aArray to current application’s NSArray’s arrayWithArray:aRecList
  
set aPredicate to current application’s NSPredicate’s predicateWithFormat:aPredicate
  
set filteredArray to aArray’s filteredArrayUsingPredicate:aPredicate
  
return filteredArray
end filterRecListByLabel1

–Mac本体のBluetoothのパワー状態を取得
on getBluetoothPowerState()
  set aCon to current application’s IOBluetoothHostController’s alloc()’s init()
  
set pRes to (aCon’s powerState()) as boolean
end getBluetoothPowerState

★Click Here to Open This Script