0

各デバイスで使用している alljoyn サービスはせいぜい 1 つだけであることを当然のことと考えてください。

私がこれまでに得たものから、これは他のデバイスを見つける方法です:

  1. サービスの名前であり、誰もが知っている既知のプレフィックスを設定します
  2. デバイスごとに一意のサフィックスを設定します

dbus 名のすべての要素には、US-ASCII などの特定の制限があるため、フランス語、ギリシャ語、または中国語でデバイスに名前を付けるにはどうすればよいでしょうか?

目標は、周囲のすべてのデバイスとその名前のリストを取得することです。すべてのデバイスに平易な英語の名前が付いていればこれは簡単ですが、他の言語や特殊文字やスペースについてはどうでしょうか?

4

1 に答える 1

1

あなたが参照している文字列が単純な名前である場合、それらの長さは比較的小さいと思うので、パフォーマンスは問題になりません

以下のコードを使用すると、任意の utf8 文字列を英語の文字との間でエンコード/デコードできます。

object LetterConverter {
    private def toTwoLetters(byte: Byte): String = {
      val num = byte + 128;
      //range now from 0 to 255
      val division = num / 26;
      val modulo = num % 26;
      val firstletter = ('a' + division).toChar.toString;
      val secondletter = ('a' + modulo).toChar.toString;
      firstletter + secondletter;
    }

    val byteRange = (-128 to 127).map(_.toByte);

    val letters = byteRange.map(n => toTwoLetters(n));

    private val byteToLetters = byteRange.zip(letters).toMap;
    require(byteToLetters.size == 256, "size really is: " + byteToLetters.size);

    private val lettersToByte = byteToLetters.map(_.swap);
    require(lettersToByte.size == 256, "size really is: " + lettersToByte.size);

    def bytesToLetters(bytes: Seq[Byte]): String = {
      bytes.map(byte => byteToLetters(byte)).mkString;
    }

    def lettersToBytes(letters: String): Seq[Byte] = {
      letters.sliding(2, 2).map(twoLetters => lettersToByte(twoLetters)).toSeq;
    }

    def encode(str: String, charset: Charset = Codec.UTF8): String = {
      bytesToLetters(str.getBytes(charset));
    }

    def decode(letters: String, charset: Charset = Codec.UTF8): String = {
      new String(lettersToBytes(letters).toArray, charset);
    }
}

したがって、プレフィックスがあるとしましょう:com.pligor.service
したがって、英語以外の名前を持つとしましょう:Γιώργος
これは次のようなものに変換されfmaiefoiafmaiofa
ます: そして、それを追加して取得することができます:com.pligor.service.fmaiefoiafmaiofa

クライアント部分で名前を受け取った後、接尾辞を抽出し、fmaiefoiafmaiofaそれをデコードすることで元のギリシャ語の名前を取得できますΓιώργος

楽しみ!

于 2013-09-03T12:39:45.190 に答える