0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

玩转OpenHarmony社交场景:即时通讯平台

OpenAtom OpenHarmony 来源:未知 2023-01-01 08:05 次阅读

开源项目 OpenHarmony是每个人的 OpenHarmonyad914b52-8964-11ed-bfe3-dac502259ad0.jpg

朱伟

中国科学院软件所

OpenHarmony知识体系工作组

一、简介

本样例是基于即时通讯(Instant messaging,简称IM)服务实现的OpenAtom OpenHarmony(简称“OpenHarmony”)应用,允许两人或多人使用互联网即时地传递文字、图片、文件、语音、emoji等讯息,可应用于各类聊天场景,为人们带来更加及时高效的通讯体验。 此外即时通讯平台具备较高的定制化特点,适用于多种行业,客户可以根据自己的需求来定制,实现即时通讯的内部私有化。 设备端:DAYU200(RK3568)开发板,OpenHarmony 3.1 release系统。

二、即时通讯实现原理

想要实现多个设备之间的无障碍即时通讯,需要多台终端设备、终端应用和服务器配合一起使用。首先应该将终端应用安装到终端设备上,用户通过应用向服务器申请注册账号。随后,用户可以通过账号进行查找,添加其他好友,并向好友发送文字、图片、文件、语音、emoji等讯息。用户发送的讯息会先送达服务器,由服务器判断其好友的状态(离线/在线),然后选择发送或者暂时缓存消息等操作。最后,好友的终端应用接收到消息。实现即时通讯的设备需求:安装应用的终端设备、网络环境和云端服务器。前提条件:用户将应用安装在终端设备上,并且拥有注册账号,且需要通讯的用户也成功注册了账号并且添加了好友。通讯原理:用户在安装了应用的终端设备上编辑信息(文字、图片、文件、语音、emoji等),通过网络将消息发送至云端服务器。当对方用户在线时,云端服务器将把消息推送给对方用户,对方用户安装了应用的终端设备也将接收到信息。当对方用户不在线时,信息将被暂时缓存在云端服务器。

三、4步实现多人即时通讯

(1)通讯功能 通讯功能是通过TCP协议实现的,我们将通讯接口connect()、send()、receive()的实现放置在CPP文件中,通过NAPI的方式对JS层暴露接口。 •connect():客户端和服务器建立连接; • send():消息发送功能 • receive():消息接收功能;
//建立TCP连接
if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
    napi_create_int32(env, 0, &result);
} else {
    napi_create_int32(env, 1, &result);
    OH_LOG_INFO(LOG_APP,"C++ 接收线程启动");
    startRec();
}
 //发送消息
if(send(sock_cli, data, strlen(data),0) == -1) {
    OH_LOG_INFO(LOG_APP,"zjf == send() : -1");
    napi_create_int32(env, 0, &result);
} else {
    OH_LOG_INFO(LOG_APP,"zjf == send() : !-1");
    napi_create_int32(env, 1, &result);
}
//接收消息
getStep(queue0,sharedMessage); //取出一条消息
const char *c_s=sharedMessage.c_str();//换为char*形式处理
napi_value result;
napi_create_string_utf8(env, c_s, sharedMessage.length(), &result);
std::string().swap(sharedMessage);//清空字符串
(2)文件消息的发送与接收adf71db0-8964-11ed-bfe3-dac502259ad0.png   文件转发是即时通讯办公场景下的重要功能。样例中的文件功能支持文件消息的发送、接收和下载。用户通过点击聊天界面的“+”按钮,选择“文件”按钮,完成本地文件的浏览,随后可以选择是否将文件发送给好友。这个功能的实现包括三个步骤:(1)文件的选择;(2)文件上传到服务器;(3)文件的接收。 • 文件上传
//文件的选择
let file1 = {filename: this.$app.$def.uid +'-'+ FILE_URL, name: 'file', uri: FILE_URL, type:fileType }
let fileId = this.guid();
let data = {};
let header = { "filename": this.selectedFileName.toString()};
//文件上传到服务器
request.upload({ url: "http://" + this.$app.$def.ip +"/file/fileUpload?fileSignature=" + fileId + "&uid=" +this.$app.$def.uid + "&fileType=" +this.$app.$def.chatData[this.idx].unRead, header: header, method: "POST", files: [file1], data: [data] }).then((data) => {
  uploadTask = data;
  uploadTask.on('headerReceive', function callback(headers){
  _this.socketSendFile(fileId, timestamp);
  });
}).catch((err) => {
  console.error('fileSelect=====Failed to request the upload. Cause: ' + JSON.stringify(err));
})
//文件的接收
let downloadConfig = {  //下载参数
            url: fileUrl, 
            header: {}, 
            enableMetered: true, 
            enableRoaming: true,
            filePath: '/data/storage/el2/base/haps/entry/files/' + downloadFileName,
            networkType: request.NETWORK_WIFI
}
request.download(downloadConfig, (err, data) => {
        if (err) {
            return;
        }
        downloadTask = data;
        //下载完成
        downloadTask.on('complete', function callback() {
                prompt.showToast({
                   message: '下载文件成功!',
                   duration: 1000,
                });
});
(3)语音消息的发送与接收 ae0ccc28-8964-11ed-bfe3-dac502259ad0.png   用户通过点击聊天界面的录制按钮,完成语音的录制,随后可以选择是否将语音发送给好友。这个功能的实现包括三个步骤:(1)语音的录制;(2)语音上传到服务器;(3)语音的接收。 图片消息的发送与语音消息的发送步骤相同,文章中不再赘述。
//语音录制
startRecorder(config, callback) {
    if (typeof (this.audioRecorder) !== 'undefined') {
        this.audioRecorder.on('prepare', () => {
        this.audioRecorder.start()
    })
        this.audioRecorder.on('start', () => {
            callback()
        })
        this.audioRecorder.prepare(config)
     } else {
        logger.info(`${TAG} case failed, audiorecorder is null`)
    }
}


//录制好的语音文件的位置
let srcPath = 'internal://cache/' + this.mainData.file + '.wav'
let file1 = { filename: this.$app.$def.uid +'-'+ this.mainData.path, name: 'audio', uri: srcPath, type: "wav" };


//语音消息发送到服务器
request.upload({ url: myurl, header: header, method: "POST", files: [file1], data: [data] }).then((data) => {
            uploadTask = data;
            uploadTask.on('headerReceive', function callback(headers){
              _this.sendAudio(audioId)
            });
            uploadTask.on('progress', function callback(uploadedSize, totalSize) {
                console.info("dialogPages=====upload totalSize:" + totalSize + "  uploadedSize:" + uploadedSize);
            });
        }).catch((err) => {
            console.error('dialogPages=====Failed to request the upload. Cause: ' + JSON.stringify(err));
        })
//语音的接收
let downloadConfig = {    //下载参数
        url: item.content.path,
        header: {},  
        enableMetered: true,                      
        enableRoaming: true,                      
        filePath: filePath,               
        networkType: request.NETWORK_WIFI        
}
        let downloadTask;
        let _this = this
        request.download(downloadConfig, (err, data) => {
            if (err) {
                 return;
            }
            downloadTask = data;
            //下载完成
            downloadTask.on('complete', function callback() {
               let audio = {
                  content: { path: filePath }
                 }
                 _this.playAudio(audio)
});
(4)emoji消息的发送与接收 ae25034c-8964-11ed-bfe3-dac502259ad0.png   emoji是即时通讯软件不可缺少的一部分,可以更加生动地表现用户的聊天情感。在样例中,用户通过点击聊天界面的emoji按钮,即可找到目前应用内支持的所有样式的emoji,随后可以选择具体样式并将其发送给好友。
//引入emoji第三方组件
<element name="emojiExpression" src="../../common/components/emojiExpression/emojiExpression.hml">element>


//第三方组件的展示布局
<div id="moreContainer" if="{{showFace}}">
    <div id="moreOneLine">
        <div class="moreFillGap" style="flex: 1 1;">div>
        <text style="left: 25fp; top: 10fp;">所有表情text>
        <emojiExpression>emojiExpression>
        <div class="moreFillGap" style="flex: 1 1;">div>
    div>
div>

四、即时通讯功能总结

本样例是基于OpenHarmony实现的即时通讯应用,目前已经支持文字、图片、文件、语音、emoji等讯息的快速发送与接收。除此之外还实现了好友的添加与删除、黑名单、安全登录、私聊/群聊、个人信息设置(二维码/头像等)等功能的全方面支持。 代码地址

https://gitee.com/isrc_ohos/instant-message_ohos

五、相关参考链接

样例源码

https://gitee.com/isrc_ohos/instant-message_ohos

OpenHarmony知识体系工作组

https://gitee.com/openharmony-sig/knowledge


原文标题:玩转OpenHarmony社交场景:即时通讯平台

文章出处:【微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    57

    文章

    2348

    浏览量

    42829
  • OpenHarmony
    +关注

    关注

    25

    文章

    3718

    浏览量

    16296

原文标题:玩转OpenHarmony社交场景:即时通讯平台

文章出处:【微信号:gh_e4f28cfa3159,微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一文洞悉PoC公网对讲与DMR数模对讲的优劣之势

    在通信领域,对讲技术以其独特的即时通讯特性,在众多行业和场景中发挥着重要作用。其中,PoC公网对讲和DMR数模对讲作为两种主流的对讲技术,各自具有独特的优势和局限性。本文将对这两种技术进行详细的比较
    的头像 发表于 12-25 16:24 21次阅读
    一文洞悉PoC公网对讲与DMR数模对讲的优劣之势

    [迅为RK3568开发板]非科班也能玩转Android应用,体验QT跨平台能力

    [迅为RK3568开发板]非科班也能玩转Android应用,体验QT跨平台能力
    的头像 发表于 12-18 16:41 275次阅读
    [迅为RK3568开发板]非科班也能<b class='flag-5'>玩转</b>Android应用,体验QT跨<b class='flag-5'>平台</b>能力

    “恒峰国际”完成1亿美金融资,推出区块链平台FO-X

    注入了强大的动力。 与此同时,“恒峰国际”还宣布将打造全新的区块链平台FO-X,并推出了该平台下的首款产品——即时通讯软件FoChat。据悉,FoChat不仅具备即时通讯的基本功能,还
    的头像 发表于 12-13 10:41 1218次阅读

    即时通话软件音频传输质量测试方案

    使用过程中的音频传输质量。即时通话软件基于移动网络链路传输信号,通过本套测试方案中配套的网络损伤仿真设备对传输链路添加不同的网络影响,模拟软件在不同网络环境下的使用情况,进而测得更接近真实应用场景下的音频传输质量。 POLQA测试算法是基于心理声学模型,模拟人类听觉系统对
    的头像 发表于 12-03 14:34 140次阅读
    <b class='flag-5'>即时通</b>话软件音频传输质量测试方案

    无线通信测试平台的技术原理和应用场景

    无线通信测试平台的技术原理和应用场景是无线通信领域的重要组成部分。以下是对这两个方面的详细阐述:一、无线通信测试平台的技术原理无线通信测试平台的技术原理主要基于无线信号传输和接收过程中
    发表于 11-06 14:29

    纯血鸿蒙开启公测 360织语内测“尝鲜版”主攻企业即时通讯

    鸿蒙
    的头像 发表于 10-10 10:36 251次阅读

    物联网行业中MQTT通信协议详解以及使用

    ,该协议构建于TCP/IP协议上,由IBM在1999年发布。 MQTT最大优点在于, 用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务 。 作为一种低开销、低带宽占用的即时通讯协议,使其
    的头像 发表于 09-20 17:08 1429次阅读
    物联网行业中MQTT通信协议详解以及使用

    对等通讯协议有哪些类型

    对等通讯协议(Peer-to-Peer Protocols)是计算机网络中允许两个或多个节点直接相互通信而无需通过中间服务器的协议。这类协议在文件共享、即时通信、区块链技术等领域有广泛应用。以下
    的头像 发表于 09-09 17:11 413次阅读

    Meta旗下社交平台Threads推出新功能

    Meta旗下的新兴社交平台Threads近期宣布了一系列新功能的推出,旨在为企业用户和数字创作者提供更加便捷和强大的内容管理工具。此次更新不仅丰富了平台的交互体验,还进一步提升了数据透明度与发布效率。
    的头像 发表于 08-16 18:00 1213次阅读

    润开鸿“龙芯+OpenHarmony”开发平台DAYU431先锋派新品发布

    润开鸿基于全新龙芯2K0300芯片平台的重磅新品润开鸿HH-SCDAYU431先锋派开发平台正式上市,成为润开鸿DAYU系列产品中符合OpenHarmony生态兼容性标准的第三款龙芯芯片平台
    的头像 发表于 08-07 14:50 515次阅读
    润开鸿“龙芯+<b class='flag-5'>OpenHarmony</b>”开发<b class='flag-5'>平台</b>DAYU431先锋派新品发布

    直击HDC2024:海思携手OpenHarmony,产品力+生态圈引爆AIoT场景应用

    海思携手OpenHarmony,其构成的核心竞争力是什么?带来哪些物联网场景体验的提升?海思与OpenHarmony合作有哪些阶段性的成果?跟随电子发烧友记者的脚步,我们一起来海思+OpenH
    的头像 发表于 06-28 09:15 4718次阅读
    直击HDC2024:海思携手<b class='flag-5'>OpenHarmony</b>,产品力+生态圈引爆AIoT<b class='flag-5'>场景</b>应用

    润开鸿全场景应用开发实训平台通过OpenHarmony兼容性测评

    近日,江苏润开鸿数字科技有限公司(以下简称“润开鸿”)基于OpenHarmony的全场景应用开发实训平台通过OpenHarmony 3.2. Release版本兼容性测评,为高校开展
    的头像 发表于 01-22 10:08 712次阅读

    润开鸿基于OpenHarmony的全场景应用开发实训平台通过兼容性测评

    近日,江苏润开鸿数字科技有限公司(以下简称“润开鸿”)基于OpenHarmony的全场景应用开发实训平台通过OpenHarmony3.2.Release版本兼容性测评,为高校开展
    的头像 发表于 01-20 08:02 551次阅读
    润开鸿基于<b class='flag-5'>OpenHarmony</b>的全<b class='flag-5'>场景</b>应用开发实训<b class='flag-5'>平台</b>通过兼容性测评

    欧盟强制科技巨头遵守新规,24家公司联手指控谷歌、亚马逊

     其中,根据欧盟《数字市场法案》,用户规模超4.5亿、市值达750亿欧元(约合812亿美元)以上者将被视作“看门人”,需严格遵守欧盟规定,例如开放即时通讯应用互通性,设定设备预装应用由用户决定等。此外,不得实施“偏袒自家服务”。
    的头像 发表于 01-17 10:38 667次阅读

    资讯速递 | 厦门大学OpenHarmony技术俱乐部正式揭牌成立

    海嘉里楼报告厅举行。 嘉宾合影 OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一
    的头像 发表于 01-02 16:51 509次阅读
    资讯速递 | 厦门大学<b class='flag-5'>OpenHarmony</b>技术俱乐部正式揭牌成立