【问题标题】:signature get error on Alljoyn framework?Alljoyn 框架上的签名出错?
【发布时间】:2013-09-18 00:51:28
【问题描述】:

我正在使用 Alljoyn 框架的 Android 应用程序,但我遇到了一些问题

我有一个自定义对象

public class Package implements BusObject {


    public static enum DataSendType {
        TEXT,IMAGE
    }

    public static enum PackageStatus {
        NONE, SENDING, DONE
    }

    @Signature("s")
    private String m_id;
    @Signature("a")
    private ArrayList<DataPackage> m_listPackage;
    @Signature("r")
    private PackageStatus m_status;
    @Signature("r")
    private DataSendType m_type;
    @Signature("s")
    private String m_packageName;
}

和界面

@BusInterface (name="xxxx.simpleinterface")
public interface SimpleInterface {

    @BusSignal (name="Chat", signature="o")
    public void Chat(Package message) throws BusException;
}

但我收到此错误在使用 Chat(Package) 时无法将类包编组为 'o'..

请帮助我,因为我无法在 2 周内解决此错误。

对不起,我的英语太差了:)

【问题讨论】:

  • 你想作为信号的一部分发送什么是一个带有 id 字符串、字节数组、枚举状态、枚举发送类型、字符串的结构?最重要的是 m_listPackage 是什么?

标签: alljoyn


【解决方案1】:

查看您的代码,您尝试发送的似乎是一个结构,结构的签名应该是"r" 或由括号() 包围的实际签名。即对于Package,签名将是"(sayiis)"

  • 使用 AllJoyn,您可以发送数组,但不能发送 ArrayList,并且您必须指定数组中的数据类型。
  • 由于您的DataSendType 指定了TEXTIMAGE,我假设您要发送一个字节数组。
  • 我没有添加签名的大多数项目,因为 AllJoyn 可以使用反射找出签名。然而,AllJoyn 不知道枚举将作为整数传输,因此我必须指定枚举的签名。
  • 包不必实现 BusObject。在您的代码中,当您实现 SimpleInterface 时,应该扩展 SimpleInterface 和 `BusObject'
  • 使用 AllJoyn 发送的任何内容都应该是公开的,以便接口可以读取成员变量。

    public class Package {
        public static enum DataSendType{
            TEXT,
            IMAGE
        }
    
        public static enum PackageStatus {
            NONE,
            SENDING,
            DONE
        }
    
        @Position(0)
        public String m_id;
        @Position(1)
        public byte[] m_listPackage;
        @Position(2)
        @Signature("i")
        public PackageStatus m_status;
        @Position(3)
        @Signature("i")
        public DataSendType m_type;
        @Position(4)
        public String m_packageName;
    }
    

对于接口的签名应该是"r" 对于结构签名"o" 表示对象路径。这是一个 AllJoyn 对象路径,这意味着它只是一个带有路径数据的字符串。

@BusInterface (name="xxxx.simpleinterface")
public interface SimpleInterface {

    @BusSignal (name="Chat", signature="r")
    public void Chat(Package message) throws BusException;
}

如果您确实需要使用 ArrayList,请在发送 Chat 信号之前将 ArrayList 转换为实际数组。

【讨论】:

    猜你喜欢
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多