6

私は頻繁にコンピュータから離れる必要があり、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

これらは長くなる可能性がありますが!

4

2 に答える 2

2

接続を確立すると、より多くのエネルギーが必要になるというのは正しいことです。ただし、照会スキャンパケットからRSSIにアクセスできるMacOS上のAPIを私は知りません。Mac OS PacketLoggerを使用して、BTアダプタから生のパケットにアクセスできます。この投稿を参照してくださいBluetoothスニファ-できればmacosx

プログラムで数分ごとにデバイスを検出し、パケットロガーで照会スキャンパケットをキャプチャし、RSSIを解析することができます。WireSharkを使用すると、パケットをデコードしてRSSIを見つける方法を理解するのに役立ちます。

最も簡単なオプションは、おそらく定期的に接続を作成し、RSSIを測定してから、接続を切断することです。

于 2011-11-03T17:23:20.427 に答える
1

ユースケースのトレードオフに関して、継続的または定期的な照会を行うと、定期的な接続/読み取りRSSIおよび切断を行う場合と同じか、さらには少し多くのエネルギーが消費されます。使用例によっては、接続を低電力モード(2.56秒間隔でスニフ)に維持し、デバイスが範囲内にある場合は接続を維持する方が効率的な場合があります。また、RSSIを使用して近接度を監視します(ただし、デバイスが近接している場合でも、オブジェクトによる干渉がrssiを大幅に変化させるため、正確ではありません)

于 2011-11-07T17:45:27.677 に答える