Почему строки, отправляемые через Multipeer Connectivity, искажаются на принимающей стороне? - PullRequest
0 голосов
/ 16 октября 2018

Я работаю над приложением дополненной реальности, где несколько пользователей могут подключаться и видеть один и тот же виртуальный контент.Я использую платформу Apple Multipeer Connectivity для связи, но у меня возникают проблемы при отправке и получении строки между двумя подключенными узлами.

Идея состоит в том, что, когда SCNNode добавляется в виртуальное пространство пользователя, Multipeer отправит узелположение в трехмерном пространстве, его цвет и размер в одноранговой сети, и принимающие одноранговые узлы могут добавлять одно и то же содержимое в свое пространство.

Я строю строку следующим образом:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    let nodeColor = node.geometry?.firstMaterial?.diffuse.contents
    let nodePosition = node.position
    let dataString = "x: \(nodePosition.x) y: \(nodePosition.y) z: \(nodePosition.z) color: \(nodeColor!) radius: \(sphereRadius)"
    let dataToSend = dataString.data(using: .utf8)
    MultiPeer.instance.send(data: dataToSend!)
}

Вот функция, которая отправляет данные:

public func send(data: Data){
    if isConnected {
        do {
            let item = try NSKeyedArchiver.archivedData(withRootObject: data, requiringSecureCoding: true)
            try session.send(item, toPeers: session.connectedPeers, with: MCSessionSendDataMode.reliable)
        } catch let error {
            printDebug(error.localizedDescription)
        }
    }
}

И на принимающей стороне:

public func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
    let incomingString = String(decoding: data, as: UTF8.self)
    print(incomingString)
}

Я проверил кодотправляя строки, и это вывод на приемном конце из трех из этих строк:

Troot�#-27:@����bplist00�X$versionX$objectsY$archiverT$top:-0.04734481 z: -0.019065317 color: UIExtendedSRGBColorSpace 1 0 0 1 radius: 0.01_NSKeyedArchiver�

Troot�#-27:@����bplist00�X$versionX$objectsY$archiverT$topIExtendedSRGBColorSpace 1 0 0 1 radius: 0.01_NSKeyedArchiver�

Troot�#-27:@����bplist00� X$versionX$objectsY$archiverT$top\277\275U$nullOax: 0.01673067 y: -0.048672535 z: -0.02221658 color: UIExtendedSRGBColorSpace 1 0 0 1 radius: 0.01_NSKeyedArchiver�

Очевидно, что строка отправляется и принимается, но не без дополнительных символов и символов.Спасибо за любой ввод, спасибо!

ОБНОВЛЕНИЕ: Мартин Р. указал, что я не использую NSKeyedUnarchiver для декодирования строки.С тех пор я обновил свой код, чтобы использовать его:

let receivedData = data
let receivedString = String(data: receivedData, encoding: .utf8)
print("Received data \(String(describing: receivedString))")


do {
    let unarchiver = try NSKeyedUnarchiver(forReadingFrom: receivedData)
    let decodedString = unarchiver.decodeData()
    print("Decoded string: \(String(describing: decodedString))")
}catch let error {
    print(error.localizedDescription)
}

Строка больше не искажается, но это ноль.Это верно перед расшифровкой, поэтому строка получает ноль при получении одноранговым узлом.

1 Ответ

0 голосов
/ 16 октября 2018

@ Мартин Р. решил проблему с добавляемыми символами, предложив использовать NSKeyedUnarchiver для распаковки данных.После этого я обнаружил, что строки на приемном конце были нулевыми.Изменение

do {
    let unarchiver = try NSKeyedUnarchiver(forReadingFrom: receivedData)
    let decodedString = unarchiver.decodeData()
    print("Decoded string: \(String(describing: decodedString))")
}catch let error {
    print(error.localizedDescription)
}

на

do {
    let decodedString = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(receivedData)
    print("Decoded string: \(String(describing: decodedString))")
}catch let error {
    print(error.localizedDescription)
}

Исправлена ​​проблема, и теперь строки отправляются и принимаются правильно.

...