私は頻繁にコンピュータから離れる必要があり、iPhoneがiMacから十分に近い/十分に離れているときに実行するコマンドをトリガーしたいと思います(iPhoneの隣と壁の反対側2〜3メートル)。数分の待ち時間で問題ありません。
部分的な解決策:近接
reduxcomputing-proximityをダウンロードしましたが、動作しますが、これはデバイスがBluetoothの範囲に出入りしたときにのみトリガーされますが、希望する範囲ははるかに小さくなっています。
(近接[IOBluetoothDevice -remoteNameRequest]
は、デバイスがBluetooth範囲内にあるかどうかを確認するためにポーリングします。)
拡張:rawRSSI
私は[IOBluetoothDevice -rawRSSI]
iPhoneに接続しているときにRSSIを取得していましたが(切断するとこれは戻ります+127
)、iPhoneのバッテリー寿命を節約するために、完全なBluetooth接続を確立することは避けたいと思います。
接続を維持すると、数分ごとにポーリングするよりも多くのバッテリー寿命が消費されると私は考えていますか?
isInRange
ここでの方法をオーバーライドして、前の方法proximity
と比較しておそらく比較的バッテリーを消費する実用的なソリューションを提供しました。remoteNameRequest:
- (BOOL)isInRange {
BluetoothHCIRSSIValue RSSI = 127; /* Valid Range: -127 to +20 */
if (device) {
if (![device isConnected]) {
[device openConnection];
}
if ([device isConnected]) {
RSSI = [device rawRSSI];
[device closeConnection];
}
}
return (RSSI >= -60 && RSSI <= 20);
}
(プロキシミティは同期呼び出しを使用します。必要に応じて、非同期になるように編集しますが、今のところ重要ではありません。)
Linuxの場合:l2ping-照会スキャン?
このSOの投稿は、「問い合わせスキャン」中にRSSIを取得することについて言及していますが、これは私が望むように聞こえますが、Macを使用しているときにLinuxBluezライブラリを使用することについて説明しています。可能!(USBパススルーを備えたVMを使用して2番目のBluetoothデバイスを接続することを検討しました...しかし、より単純なソリューションが望ましいでしょう!)
IOBluetoothDeviceInquiry
クラスがあるようですが、これが私にとって役立つかどうかはわかりません。この単純な問題のためだけにBluetoothプロトコルを学ぶつもりはありません!
コマンド
興味のために、そして特にソリューションに関連していないので、これが私が現在トリガーしているAppleスクリプトです
範囲内で:
tell application "Skype"
send command "SET USERSTATUS ONLINE" script name "X"
do shell script "afplay '/System/Library/Sounds/Blow.aiff'"
end tell
範囲外:
tell application "Skype"
send command "SET USERSTATUS AWAY" script name "X"
do shell script "afplay '/System/Library/Sounds/Basso.aiff'"
end tell
これらは長くなる可能性がありますが!