请理所当然地认为我在每台设备上最多只使用一个 alljoyn 服务
从我目前所掌握的情况来看,这是您定位其他设备的方式:
- 您设置了一个众所周知的前缀,它是服务的名称,每个人都知道
- 您为每个设备设置一个唯一的后缀
好吧,因为dbus 名称中的所有元素都有某些限制,例如 US-ASCII,你怎么能用法语、希腊语或中文命名设备?
目标是列出所有周围设备及其名称。如果所有设备都有一个简单的英文名称,这很容易,但其他语言甚至特殊字符和空格呢?
如果您所指的字符串是简单的名称,我猜它们的长度相对较小,因此性能不是问题。
使用下面的代码,您可以对任何 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
并通过对其进行解码,您可以取回原始希腊名称Γιώργος
享受!