IM 协议 IMPP、PRIM、SIMPLE、XMPP

85 篇文章 1 订阅
28 篇文章 0 订阅

IM有四种协议

即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM)、针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)以及XMPP。PRIM与XMPP、 SIMPLE类似,但已经不再使用了。

在这四种协议中,XMPP是最灵活的。XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程 序。而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。

IMPP主要定义必要的协议和数据格式,用来构建一个具有空间接收、发布能力的即时信息系统。这个组织已经出版了三个草案RFC,但主要的有两个:一个是针对站点空间和即时通讯模型的(RFC 2778);另一个是针对即时通讯/空间协议需求条件的(RFC2779)。RFC2778是一个资料性质的草案,定义了所有presence和IM服务的原理。RFC2779定义了IMPP的最小需求条件。另外,这个草案还就presence服务定义了一些条款,如运行的命令、信息的格式,以及presence服务器如何把presence的状态变化通知给客户。

SIMPLE是制定的较为完善的一个。SIMPLE和XMPP两个协议,都符合RFC2778和RFC2779 。SIMPLE计划利用SIP来发送presence信息。SIP是IETF中为终端制定的协议。SIP一般考虑用在建立语音通话中,一旦连接以后,依靠如实时协议(RTP)来进行实际上的语音发送。???但SIP不仅仅能被用在语音中,也可以用于视频。SIMPLE被定义为建立一个IM进程的方法。SIMPLE在2002年夏季得到额外的信任,微软和IBM都致力于在它们的即时通讯系统中实现这个协议。

XMPP

XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。这表明XMPP是可扩展的。可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程序。而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。

XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。XMPP被IETF国际标准组织完成了标准化工作。标准化的核心结果分为两部分:
(1)核心的XML流传输协议
(2)基于XML流传输的即时通讯扩展应用

XMPP的核心XML流传输协议的定义使得XMPP能够在一个比以往网络通信协议更规范的平台上。借助于XML易于解析和阅读的特性,使得XMPP的协议能够非常漂亮。

XMPP的即时通讯扩展应用部分是根据IETF在这之前对即时通讯的一个抽象定义的,与其他业已得到广泛使用的即时通讯协议,诸如AIM,QQ等有功能完整,完善等先进性。

老牌的即时聊天协议,像 Google Hangouts, WhatsApp Messenger 等即时聊天程序都是基于 XMPP 的。

特点在于协议和扩展协议成熟,功能完善,专门为即时聊天(IM)场景设计。

XMPP 依赖 XML 协议,所以放在 IoT 场景里过重,基本不合适,很少有人用。

XMPP的基本网络结构是怎样的?

XMPP中定义了三个角色,客户端,服务器,网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML。

XMPP通过TCP传什么了?

传输的是与即时通讯相关的指令。在以前这些命令要么用2进制的形式发送(比如QQ),要么用纯文本指令加空格加参数加换行苻的方式发送(比如MSN)。而XMPP传输的即时通讯指令的逻辑与以往相仿,只是协议的形式变成了XML格式的纯文本。这不但使得解析容易了,人也容易阅读了,方便了开发和查错。而XMPP的核心部分就是一个在网络上分片断发送XML的流协议。这个流协议是XMPP的即时通讯指令的传递基础,也是一个非常重要的可以被进一步利用的网络基础协议。所以可以说,XMPP用TCP传的是XML流。

MQTT

最近几年随着物联网行业的发展,才慢慢进入公众视线的,像 Facebook Messenger App 使用了 MQTT 协议。

特点在于报文小,协议简单,提供了三个 QoS 级别。这几个特性是专门为网络环境复杂的物联网(IoT)场景设计的。

虽然 MQTT 协议本身过于简单,放在实时聊天协议里的话,多数功能是要自己定制协议来实现的,但总归可以用。

性能

对于移动设备上的 IM App 来说,电量损耗是一个需要认真对待的问题,在这方面,固定头部仅仅消耗 2 个字节的 MQTT 协议显然有着巨大优势。当然前提是设计良好的主题格式,消息体格式和长度。
使用 MQTT 搭配合适的二进制格式的消息体,让聊天信息交换和处理非常轻量。

IM 功能

XMPP 在 IM 的各个功能上的定义非常完善,而 MQTT 需要在基础协议之上自行实现。

认证

XMPP: 通过 SASL RFC4422
MQTT: 协议未定义,通常的实现方式是定制 CONNECT 报文中的 username 和 password 字段,因为 MQTT 只提供了这两个字段可以自行发挥。比如定义 username 为 {“uname”: “Shawn”, “dtype”: “mobile”}, password 为 JWT。(MQTT 5.0 里添加了 AUTH 消息类型)。然后在 MQTT 后台处理 CONNECT 消息进行认证。
在设计的时候是需要仔细考虑的部分。

多设备

XMPP: 核心协议里有定义,通过 resource 实现。比如用户 shawn@emqx.io 的两个设备分别是: shawn@emqx.io/pc, shawn@emqx.io/mobile。

MQTT: 协议未定义。因为 MQTT 协议里,唯一标识设备使用的是 Client ID,所以设计的难点在于,如何定义 Client ID 的格式,并且能够跟 IM 需求里的 username 做对应,并且实现多终端同步。常见的做法是:

限制用户名里不能有特殊字符 ‘@’, ‘/’;

对于 ClientID 的格式为 ‘username@device’, 比如用户 “shawn” 的两个 ClientID: “shawn@pc”, “shawn@mobile”。

对于用户 shawn 的这两个终端,通过订阅相同的主题来同步所有别人发来的聊天消息。比如都订阅主题:‘p2p/talk/shawn’。并且向外发送消息时需要将消息复制到主题 ‘p2p/talk/shawn’ 以同步发出的消息,这样做时,还需要忽略自己发出的同步消息。

状态显示

XMPP: XMPP Presence RFC 3921.
MQTT: 协议未定义,可以通过订阅对方状态来实现:比如用户

移动 IM 的那些坑点

1、长连接

android 平台 维护 client 到 server 的长连接

IM 或推送,建立长连接是必须的,可以节省 TCP 来回创建的开销,但断线之后,是否需要即刻重连,尤其是处于地铁、WIFI 边缘地带,可能会造成重连风暴,需要添加稍加延迟连接机制。

2、心跳包 GGSN

维护移动网 GGSN

3、消息回执处理 Ack

移动网络很容易丢包, 发送、接受应加入回执处理

4、语音、图片的收发优化

大数据拆分成多个包, 一个包大概 10 字节

Openfire、Tigase、Prosody、Mosquitto、ejabberd

IM活跃社区 http://www.52im.net/
在这里插入图片描述
在这里插入图片描述
从 IMserver 性能以及后期维护和招人成本上来看, 应该是 Tigase > Openfire > Ejabberd

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要确定仿真模型,包括光伏电池组、逆变器、电网等部分。然后,编写相应的代码实现仿真模型,可以使用Matlab中的Simulink工具进行建模和仿真。 以下是一个简单的家用光伏发电系统的仿真代码,仅供参考: ```matlab % 模型参数 Voc = 41.8; % 开路电压 Isc = 9.7; % 短路电流 Vmpp = 33.6; % 最大功率点电压 Impp = 9.1; % 最大功率点电流 Pmpp = Vmpp * Impp; % 最大功率点功率 Vdc = 48; % 直流电压 Vpv = 60; % 光伏电池组电压 Eff_inverter = 0.95; % 逆变器效率 Eff_system = 0.9; % 系统效率 % 逆变器模型 function [Pout, Vout] = inverter(Pin, Vin, Eff_inverter) Vout = Vin * Eff_inverter; Pout = Pin * Eff_inverter; end % 光伏电池组模型 function [Ppv, Vpv] = pv_panel(Vmpp, Impp, Vpv) Ppv = Vpv * Impp; if Vpv > Vmpp Ppv = Ppv - (Vpv - Vmpp) * Impp; Vpv = Vmpp; end end % 电网模型 function [Pgrid, Vgrid] = grid(Pout, Vout, Eff_system) Pgrid = Pout * Eff_system; Vgrid = Vout; end % 主程序 t = 0:0.01:24; % 时间范围 Pin = Pmpp * sin(2 * pi / 24 * t); % 输入功率,假设为正弦波 Vpv = Voc / 2; % 初始电压 Pout = zeros(size(t)); % 输出功率 Vout = zeros(size(t)); % 输出电压 Pgrid = zeros(size(t)); % 电网输出功率 Vgrid = zeros(size(t)); % 电网输出电压 for i = 1:length(t) [Ppv, Vpv] = pv_panel(Vmpp, Impp, Vpv); [Pout(i), Vout(i)] = inverter(Pin(i), Vdc, Eff_inverter); [Pgrid(i), Vgrid(i)] = grid(Pout(i), Vout(i), Eff_system); end % 可视化结果 subplot(3, 1, 1) plot(t, Pin) xlabel('Time (hr)') ylabel('Input Power (W)') title('Input Power Profile') subplot(3, 1, 2) plot(t, Pout, t, Pgrid) legend('Output Power', 'Grid Power') xlabel('Time (hr)') ylabel('Power (W)') title('Output Power Profile') subplot(3, 1, 3) plot(t, Vout, t, Vgrid) legend('Output Voltage', 'Grid Voltage') xlabel('Time (hr)') ylabel('Voltage (V)') title('Output Voltage Profile') ``` 该代码实现了一个简单的家用光伏发电系统的仿真模型,包括光伏电池组、逆变器、电网等部分。其中,输入功率假设为正弦波,电池组电压初始值设为开路电压的一半,逆变器和系统效率分别设为0.95和0.9。最终,通过可视化结果展示了输入功率、输出功率和电压等参数随时间的变化情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值