商业版中,消息存储在mongdb 中,消息存储 _data 的base64 encode方式及decode 具体是怎么实现的,求代码指导

lovo1 4月前 178

"_data":{"$binary":{"base64":"CAESBWhlbGxvQAM=","subType":"00"}}

_data 解码的方式,求指导

最新回复 (6)
  • x86 4月前
    引用 2
    请参考这两个 issue,如果有不明白的,请具体补充:

    https://bbs.wildfirechat.cn/thread-2332.htm
    https://bbs.wildfirechat.cn/thread-2421.htm
  • lovo1 4月前
    引用 3
    我直接用base64, 解编码为明文可以吗
  • lovo1 4月前
    引用 4
               System.out.println(new String(Base64.getDecoder().decode(base64edData))); 测试main  获取消息时可以,不在商业版用此方法 解编码后,出现乱码
  • lovo1 4月前
    引用 5
    你好!我想在JAVA 中解析成明文
  • x86 4月前
    引用 6
    解码要和客户端消息的定义对应起来才能解开,不能完全撇开客户端的消息定义,直接将消息解开。
  • HeavyRain 4月前
    引用 7
    首先IM服务数据库关系型数据库和MongoDB存储的数据都是一样的,字段名也一样,可以忽略掉数据库的差异,读取出来数据。

    其次需要理解野火的消息体系,在野火的协议栈和IM服务传输和存储的都是统一的格式,在Server SDK和客户端SDK都叫MessagePayload,在IM服务内部为WFCMessage.MessageContent,在这2个结构体了定义的是相同的字段。

    在客户端UI层和SDK中另外定义了一些消息内容,比如文本、图片、语音等,每个消息内容的格式都不相同,但在客户端的IMSDK中最终都会转化为MessagePayload,并交给协议栈和IM服务处理。所以无论那个消息内容,在协议栈和IM服务都是相同的格式,只有在客户端才转成千变万化的消息。

    比如客户端发送一个文本消息的流程如下:1. UI层代码构建一个文件消息内容,调用SDK的发送方法 -》 2. SDK找到这个消息的Encode方法,encode出来这个消息的MessagePayload, 调用协议栈的发送方法 -》3. 协议栈发送MessagePayload到IM服务,IM服务保存到数据库,并把MessagePlayload推送到目的客户端协议栈 -》4. 目的客户端协议栈上报收到MessagePayload到SDK -》5. SDK根据MessagePaylod里面的消息类型找到对应的消息内容,调用这个消息内容的Decode方法,转成文本消息内容 -》 6. SDK回调UI层,收到文本消息。

    所以如果要从数据库中读取出文本消息,需要2个步骤:首先在数据库中MessagePayload或者是WFCMessage.MessageContent是以二进制方式存储在_data字段,需要服务器端研发根据社区版IM服务源码里的方法,把二进制转化为MessagePayload;下一步是客户端研发拿到了MessagePayload,根据MessagePayload的type字段(这个字段是客户端消息内容的类型,比如文本是1,语音是2,图片是3,地理位置是4,等等)找到对应的消息内容类型,比如是文本消息还是图片消息等,用对应的消息内容来Decode出来。也就是说客户端研发需要告诉服务器端研发 消息内容 与 MessagePayload互相转换的规则。

    MessagePayload中,有个特殊的字段是binaryContent,这个字段是二进制数据字段,在Web SDK和Server SDK的API中,直接使用二进制不方便,所以名字会改成bas64edBinaryContent或者base64edData,顾名思义二进制数据字段base64为字符串,在与其他平台核对数据时,需要注意。
返回