Archive for the 'IOBluetoothDevice' 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 

2014/12/11 Bluetoothに接続中のデバイス名を取得するv3

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

v2が「ペアリングされたデバイス名の一覧を取得する」という動作を行っていましたが、実際に接続中かどうかを確認して名称のリストを返すように修正しました。

ただ、

bt10.png

のように、PlayStation 3のコントローラーもつながっている状態なんですが、これだけ名前が返ってきません。

キーボードやマウスほどきちんとサポートされていない雰囲気なので、まーそんなもんなのかな、と思わないではないですが、まだいまひとつな感じがします。

AppleScript名:Bluetoothに接続中のデバイス名を取得するv3
– Created 2014-12-09 by Takaaki Naganoya
– 2014 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “IOBluetooth”

set aList to currentBluetoothDeviceNames(“displayName”) –Bluetoothメニューに出てくる名称
–> {”Piyomaru Mouse”, “Takaaki Naganoya のキーボード”, “AirTurn105v128-E36E”}

set bList to currentBluetoothDeviceNames(“realName”) –ほんまもんの名称
–> {”System Administrator’s Mouse”, “Takaaki Naganoya のキーボード”, “AirTurn105v128-E36E”}

—Bluetoothで接続中のデバイス名をリストで返す
on currentBluetoothDeviceNames(aParam)
  
  
–Bluetoothでペアリングされたデバイス一覧を取得
  
set bList to current application’s IOBluetoothDevice’s pairedDevices() –ペアリングしたデバイスを取得
  
set cList to bList as list
  
  
–デバイス名称を実際に取得  
  
set dNameList to {}
  
  
repeat with i in cList
    set j to contents of i
    
set aName to |name| of j
    
    
set aConnect to j’s isConnected() –接続中かどうかを確認
    
if aConnect = true then
      
      
if aParam = “displayName” then
        set dName to “”
        
try
          set dName to |displayName| of j
        end try
        
        
if dName is not equal to “” then
          copy dName to aName
        end if
      end if
      
      
set the end of dNameList to aName as string
      
    end if
    
  end repeat
  
  
return dNameList
  
end currentBluetoothDeviceNames

★Click Here to Open This Script 

2014/12/09 Bluetoothに接続中のデバイス名を取得するv2

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

最初のバージョンでは、「recentDevices:」でBluetoothデバイスの接続ヒストリーから過去の履歴を取得して、接続ないしは接近したことのあるものだけを取り出していました。

本バージョンでは、「pairedDevices()」でMac本体とペアリングしたBluetoothデバイス名を取得します。本プログラムの名称を正しく表現すると「Bluetoothにペアリングしたデバイス名一覧を取得」ということになるでしょう。

また、実際にBluetoothデバイスが名乗っている名前(realName)と、名称変更して付けられた名前(Bluetoothデバイス一覧に出てくる名前、displayName)のどちらを取得するかを指定できるようにしました。

まだ、いろいろ試行錯誤中です。

bt1.png

bt2.png

AppleScript名:Bluetoothに接続中のデバイス名を取得するv2
– Created 2014-12-09 by Takaaki Naganoya
– 2014 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “IOBluetooth”

set aList to currentBluetoothDeviceNames(“displayName”) –Bluetoothメニューに出てくる名称
–> {”Piyomaru Mouse”, “Piyomaru iPad mini”, “Takaaki Naganoya のキーボード”, “Piyomaru iPhone”, “AirTurn105v128-E36E”, “Beats Wireless”}

set bList to currentBluetoothDeviceNames(“realName”) –ほんまもんの名称
–> {”System Administrator’s Mouse”, “Piyomaru iPad mini”, “Takaaki Naganoya のキーボード”, “Piyomaru iPhone”, “AirTurn105v128-E36E”, “Beats Wireless”}

—Bluetoothで接続中のデバイス名をリストで返す
on currentBluetoothDeviceNames(aParam)
  
  
–Bluetoothでペアリングされたデバイス一覧を取得
  
set bList to current application’s IOBluetoothDevice’s pairedDevices() –ペアリングしたデバイスを取得
  
set cList to bList as list
  
  
–デバイス名称を実際に取得  
  
set dNameList to {}
  
  
repeat with i in cList
    set j to contents of i
    
    
set aName to |name| of j
    
    
if aParam = “displayName” then
      set dName to “”
      
try
        set dName to |displayName| of j
      end try
      
      
if dName is not equal to “” then
        copy dName to aName
      end if
    end if
    
    
set the end of dNameList to aName as string
    
  end repeat
  
  
return dNameList
  
end currentBluetoothDeviceNames

★Click Here to Open This Script 

2014/11/06 Bluetoothに接続中のデバイス名を取得する

現在接続中のBluetoothデバイス名の一覧をリストで取得するAppleScriptです。

AppleScript名:asoc_Bluetoothに接続中のデバイス名を取得する
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "IOBluetooth"

set aList to currentBluetoothDeviceNames()
–> {"maro のマウス"}

—Bluetoothで接続中のデバイス名をリストで返す
on currentBluetoothDeviceNames()
  
  
–Bluetoothに最近接続されたデバイス履歴をaMax個まで取得する
  
set aMax to 255
  
set bList to (current application’s IOBluetoothDevice’s recentDevices:aMax)
  
set cList to bList as list
  
  
–デバイス名を実際に取得  
  
set dNameList to {}
  
  
try
    repeat with i in cList
      set j to contents of i
      
      
set aName to |Name| of j
      
set aConnection to (ConnectionHandle of j) as integer
      
      
–ConnectionHandleがffffだと非接続状態
      
if aConnection is not equal to 65535 then
        set the end of dNameList to aName as string
      end if
      
    end repeat
  end try
  
  
return dNameList
  
end currentBluetoothDeviceNames

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に