使用 Smack 客户端映射 Openfire 自定义插件

Mapping Openfire Custom plugin with aSmack Client

我是 XMPP 的新手,如果这个问题听起来很愚蠢,请原谅我。我想创建一个自定义插件并将其映射到 Android 上的 aSmack 客户端。我正在尝试应用我的 Web 服务知识,但我没有成功。所以请引导我思考最好的方法,一个例子会很有帮助。提前致谢。

插件的种类很多,我们就大致说一下吧。 Igniterealtime Plugin guide

您想定义一个全新的 IQ Stanza 来管理 UserCustomParam。 比方说:

<iq from="user1@myserver" to="myserver" type="get">
 <usercustomparam xmls:"com.records.iq" retrive="favouritecolor">
</iq>

你必须:

第 1 步: 定义一个插件(class 实现插件) 添加一个新的处理程序

MyCustomHandler colorshandler;
IQRouter iqRouter = XMPPServer.getInstance().getIQRouter();
iqRouter.addHandler(colorshandler);

第 2 步: 根据需要实现 MyCustomHandler(读取数据库、写入数据库、读取服务器端等)。

public class MyCustomHandler extends IQHandler {
    public static final String NAMESPACE_TICKET_IQ = "com.records.iq";
    public static final String TAG_TICKET_IQ = "usercustomparam ";

现在您的服务器已准备好管理您的自定义 IQ 请求。

客户端时间:

第 3 步: 向您的 ProviderManager 注册一个 IQProvider

ProviderManager.addIQProvider("usercustomparam ","com.records.iq", new IQUserCustomParamProvider());

第 4 步: 根据需要实施 IQUserCustomParamProvider

public class IQUserCustomParamProvider extends IQProvider<IQUserCustomParam>

在 Provider 中,您将解析来自服务器的传入 IQ,并创建一个 IQUserCustomParam,其中包含一个实例参数,例如

String favouriteColor

Step5:你需要实现IQUserCustomParam

public class IQUserCustomParam extends IQ
    private final static String childElementName = "usercustomparam";
    private final static String childElementNamespace = "com.records.iq";

public IQUserCustomParam (String color)
    {
        this(childElementName , childElementNamespace );

        this.setType(IQ.Type.result);
        this.setFavouriteColor(color);
    }

第6步:现在设置已经完成,但是您还没有定义何时接受来自服务器的IQUserCustomParam。所以你需要一个 StanzaFilter

public class IQUserCustomParamFilter implements StanzaFilter

第 7 步:您还没有定义如何处理来自服务器的 IQUserCustomParam。所以你需要一个 StanzaListner

public class IQUserCustomParamListner implements StanzaListener

第 8 步: 最后,您必须在您的连接上注册组合 filter/listner:

AbstractXMPPConnection connection = ...;
connection.addAsyncStanzaListener(new PersonalConfigListner(this), new IQMUCConfigTicketFIlter();

如果对您有帮助,请不要忘记采纳答案!

这是插件实现的示例:

首先,您应该实现插件接口:

public class MotDPlugin implements Plugin

然后,这需要实现intitalizePlugin和destroyPlugin方法,如下所示:

public void initializePlugin(PluginManager manager, File pluginDirectory) {
   serverAddress = new JID(XMPPServer.getInstance().getServerInfo().getName());
   router = XMPPServer.getInstance().getMessageRouter();

   SessionEventDispatcher.addListener(listener);
}

public void destroyPlugin() {
   SessionEventDispatcher.removeListener(listener);

   listener = null;
   serverAddress = null;
   router = null;
}

更多关于此示例,您可以参考Openfire Plugin Development: Message of the Day

希望对您有所帮助。

有一个关于插件的简单实例:

public class TestIQHandle extends IQHandler {
    private static final String MODULE_NAME = "test plugin";
    private static final String NAME_SPACE = "com:test:testplug";
    private IQHandlerInfo info;
    public TestIQHandle(){
        super(MODULE_NAME);
        info = new IQHandlerInfo("query", NAME_SPACE);
    }
    public TestIQHandle(String moduleName) {
        super(moduleName);
        info = new IQHandlerInfo("query", NAME_SPACE);
    }
    @Override
    public IQ handleIQ(IQ packet) throws UnauthorizedException {
        IQ reply = IQ.createResultIQ(packet);
        Element groups = packet.getChildElement();
        if(true){
            System.out.println("=======invalid========");
        }
        if(!IQ.Type.get.equals(packet.getType())){
            reply.setChildElement(groups.createCopy());
            reply.setError(PacketError.Condition.bad_request);
            return reply;
        }
        //StringUtils.substringBefore(packet.getFrom().toString(), "@");
        return reply;
    }
    @Override
    public IQHandlerInfo getInfo() {
        // TODO Auto-generated method stub
        return info;
    }
}