热门开源项目OpenHarmony

news2024/12/27 10:06:56

目录

1.概述

1.1.开源项目的意义

1.2.开源项目对软件行业的促进作用

1.3.小结

2.OpenHarmony

2.1.技术架构

2.2.分布式软总线

2.2.1.架构

2.2.2.代码介绍

2.2.2.1.代码目录

2.2.2.2.说明

2.2.2.3.发现组网和传输 

2.2.2.3.1.发现

2.2.2.3.2.组网

2.2.2.3.3.传输

3.开源地址


1.概述

开源项目(Open Source Project)指的是源代码公开、用户可以自由使用、修改和分发的软件项目。开源项目通常以某种开源许可证发布,确保了源代码的自由使用和传播。常见的开源许可证包括GNU通用公共许可证(GPL)、MIT许可证、Apache许可证等。

1.1.开源项目的意义

1. 促进创新:开源项目的源代码是公开的,任何人都可以审视、理解并在其基础上进行创新和改进。鼓励了技术的快速迭代和发展。

2. 协同合作:来自世界各地的开发者可以共同协作,贡献他们的技能和知识,从而推进项目的发展。

3. 教育资源:开源代码是学习编程和软件开发的绝佳资源。学生和新手可以通过阅读和分析这些代码来提高自己的编程技巧。

4. 透明性和信任:由于源代码是公开的,用户可以检查代码中是否存在恶意行为、漏洞或其他问题,从而增加了对软件的信任度。

5. 降低成本:开源软件通常是免费的,可以显著降低企业和个人的使用成本,同时避免各种专利和版权纠纷。

1.2.开源项目对软件行业的促进作用

1. 加速技术进步:开源促进了技术的共享和交流,加速了技术进步。一些重要的技术领域,例如操作系统(如Linux)、数据库系统(如MySQL)、编程语言(如Python)、大数据平台(如Hadoop)等,都有大量成功的开源项目。

2. 增强市场竞争:开源项目降低了进入门槛,让更多的小公司和初创企业能够进入市场。推动了整体行业的进步和创新。

3. 标准化:许多开源项目成为了行业标准,帮助建立和推广了技术标准,减少了不同系统之间的兼容性问题。

4. 社区支持和生态系统:强大的开源社区提供了广泛的支持和资源,如文档、论坛和教程,为开发人员提供了丰富的学习材料和解决问题的途径。

5. 促进开发者成长:参与开源项目可以帮助开发者积累实际经验,提升技能,增加曝光和就业机会。

6. 推动开源商业模式:虽然开源软件本身是免费的,但推动了包括技术支持、咨询服务、定制开发及托管服务等在内的新商业模式。

1.3.小结

开源项目不仅贡献了大量高质量的软件资源,而且还通过打造开放、共享的生态系统,为整个软件行业带来了巨大的活力和创新动力。

2.OpenHarmony

OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代、基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展。

基于OpenHarmony的HarmonyOS总装机量已经超过了8亿。HarmonyOS原生应用已超过4000。预计在6月21号的华为开发者大会上,会发布HarmonyOS NEXT版,不再兼容安卓应用。

另一个具有代表性的OpenHarmony发行版KaihongOS,是面向全场景的万物智联技术底座,在OpenHarmony基础上技术创新和系统能力增强,深开鸿打造丰富KaihongOS产品矩阵,助力千行百业数智化转型,引领行业变革,构建万物智联新时代。是由原华为终端BG软件部总裁(现任深开鸿CEO)王成录牵头打造。

OpenHarmony在GitCode的地址:GitCode - 全球开发者的开源社区,开源代码托管平台

2.1.技术架构

OpenHarmony整体遵从分层设计,从下向上依次为:内核层、系统服务层、框架层和应用层。系统功能按照“系统 > 子系统 > 组件”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的组件。OpenHarmony技术架构如下所示:

详细介绍可参考第2章的GitCode链接。 

2.2.分布式软总线

这里我们选择分布式软总线来进行说明。

分布式软总线在GitCode的链接:GitCode - 全球开发者的开源社区,开源代码托管平台

在现实生活中,设备之间的通信方式多种多样,比如WIFI和蓝牙等,这些不同的通信方式在使用上存在较大差异,易导致各种通信问题。此外,还面临设备间通信链路融合共享以及冲突无法解决等挑战。分布式软总线通过实现近场设备间统一的分布式通信管理能力,提供一种不区分具体链路的设备发现、连接、组网和传输的通用能力。其主要功能如下:

1. 发现连接:提供基于WIFI、蓝牙等多种通信方式的设备发现和连接能力。
2. 设备组网:提供统一的设备组网和拓扑管理能力,确保在数据传输前已经掌握设备间的连接信息。
3. 数据传输:支持消息和字节数据传输的专用通道。

通过使用分布式软总线提供的API,业务方可以在设备间实现高速通信,无需关注通信的具体细节,从而能够更高效地进行业务平台的部署与运行。

2.2.1.架构

2.2.2.代码介绍

2.2.2.1.代码目录
/foundation/communication/dsoftbus
├── interfaces            # 接口代码
├── core                  # 核心代码
│   ├── common            # 通用代码
│   ├── adapter           # 适配层代码
│   ├── authentication    # 认证代码
│   ├── bus_center        # 组网代码
│   ├── connection        # 连接代码
│   ├── discovery         # 发现代码
│   ├── transmission      # 传输代码
│   └── frame             # 框架代码
├── sdk                   # 运行业务进程代码
│   ├── bus_center        # 组网代码
│   ├── discovery         # 发现代码
│   ├── transmission      # 传输代码
│   └── frame             # 框架代码
└── components            # 依赖组件代码
2.2.2.2.说明

约束:

组网设备需在同一局域网中。
组网之前,需先完成设备绑定,绑定流程参见安全子系统中说明。

须知:

使用跨设备通信时,必须添加权限ohos.permission.DISTRIBUTED_DATASYNC,该权限类型为 dangerous 。

设备主动发现手机时,手机需打开超级终端的允许被“附近设备”发现开关(设置-超级终端-我的设备-允许被发现-附近设备),才能被设备发现。

2.2.2.3.发现组网和传输 
2.2.2.3.1.发现
  • 发布流程

a.上层应用需要对外发布自身能力时,调用服务发布接口发布自身能力。

// 发布回调
typedef struct {
    void (*OnPublishSuccess)(int publishId); //发布成功时回调
    void (*OnPublishFail)(int publishId, PublishFailReason reason);//发布失败时回调
} IPublishCallback;

// 发布服务
int PublishService(const char *pkgName, const PublishInfo *info, const IPublishCallback *cb);

b.上层应用不再需要对外发布自身能力时,调用UnpublishService接口注销服务。

// 注销服务
int UnPublishService(const char *pkgName, int publishId);
  • 发现流程

a.上层应用需要发现特定能力设备时,调用发现接口启动发现。

// 发现回调
typedef struct {
    void (*OnDeviceFound)(const DeviceInfo *device); //发现设备回调
    void (*OnDiscoverFailed)(int subscribeId, DiscoveryFailReason failReason); //启动发现失败回调
    void (*OnDiscoverySuccess)(int subscribeId); //启动发现成功回调
} IDiscoveryCallback;

// 发现服务
int StartDiscovery(const char *pkgName, const SubscribeInfo *info, const IDiscoveryCallback *cb);

b.当软总线发现到设备时,通过回调接口通知业务所发现的设备信息。

c.上层应用不再需要发现时,调用StopDiscovery接口停止设备发现。

// 停止服务
int StopDiscovery(const char *pkgName, int subscribeId);
2.2.2.3.2.组网

a.发起组网请求,携带组网连接地址信息,并且提供组网执行结果回调函数。

// 组网连接地址
typedef struct {
    ConnectionAddrType type;
    union {
        struct BrAddr {
            char brMac[BT_MAC_LEN];
        } br;
        struct BleAddr {
            char bleMac[BT_MAC_LEN];
        } ble;
        struct IpAddr {
            char ip[IP_STR_MAX_LEN];
            int port;
        } ip;
    } info;
} ConnectionAddr;

// 组网连接地址类型
typedef enum {
    CONNECTION_ADDR_WLAN = 0,
    CONNECTION_ADDR_BR,
    CONNECTION_ADDR_BLE,
    CONNECTION_ADDR_ETH,
    CONNECTION_ADDR_MAX
} ConnectionAddrType;

// 组网请求执行结果回调
typedef void (*OnJoinLNNResult)(ConnectionAddr *addr, const char *networkId, int32_t retCode);

// 发起组网请求
int32_t JoinLNN(ConnectionAddr *target, OnJoinLNNResult cb);

b.等待组网结果,JoinLNN()返回成功表示软总线接受了组网请求,组网结果通过回调函数通知业务;组网回调函数中addr参数内容和JoinLNN()的入参互相匹配;retCode如果为0,表示组网成功,此时networkId为有效值,后续传输、退网等接口均需使用该参数;retCode如果不为0,表示组网失败,此时networkId为无效值。

c.使用传输相关接口进行数据传输。

d.发送退网请求,携带组网成功后返回的networkId,并且提供退网执行结果回调。

// 退网执行结果回调
typedef void (*OnLeaveLNNResult)(const char *networkId, int32_t retCode);

// 退网请求
int32_t LeaveLNN(const char *networkId, OnLeaveLNNResult cb);

e.等待退网完成,OnLeaveLNNResult()的networkId和退网请求接口中的networkId互相匹配;retCode为0表示退网成功,否则退网失败。退网成功后,networkId变为无效值,后续不应该被继续使用。

f.使用节点(即设备)注册和注销接口,监听网络中节点状态变化等事件。

// 事件掩码
#define EVENT_NODE_STATE_ONLINE 0x1
#define EVENT_NODE_STATE_OFFLINE 0x02
#define EVENT_NODE_STATE_INFO_CHANGED 0x04
#define EVENT_NODE_STATE_MASK 0x07

// 节点信息
typedef struct {
    char networkId[NETWORK_ID_BUF_LEN];
    char deviceName[DEVICE_NAME_BUF_LEN];
    uint16_t deviceTypeId;
} NodeBasicInfo;

// 节点状态事件回调
typedef struct {
    uint32_t events; // 组网事件掩码
    void (*onNodeOnline)(NodeBasicInfo *info);   // 节点上线事件回调
    void (*onNodeOffline)(NodeBasicInfo *info);  // 节点下线事件回调
    void (*onNodeBasicInfoChanged)(NodeBasicInfoType type, NodeBasicInfo *info); // 节点信息变化事件回调
} INodeStateCb;

//  注册节点状态事件回调
int32_t RegNodeDeviceStateCb(INodeStateCb *callback);

// 注销节点状态事件回调
int32_t UnregNodeDeviceStateCb(INodeStateCb *callback);
2.2.2.3.3.传输

a.创建会话服务,并设置会话相关回调,用户可在回调中处理打开/关闭和消息接收事件。

// 会话管理回调
typedef struct {
    int (*OnSessionOpened)(int sessionId, int result);
    void (*OnSessionClosed)(int sessionId);
    void (*OnBytesReceived)(int sessionId, const void *data, unsigned int dataLen);
    void (*OnMessageReceived)(int sessionId, const void *data, unsigned int dataLen);
} ISessionListener;

// 创建会话服务
int CreateSessionServer(const char *pkgName, const char *sessionName, const ISessionListener* listener);

b.创建会话 ,用于收发数据。

// 创建会话
int OpenSession(const char *mySessionName, const char *peerSessionName, const char *peerDeviceId, const char *groupId, const SessionAttribute* attr);

 c.通过sessionId向对端设备发送数据。

// 发送字节数据
int SendBytes(int sessionId, const void *data, unsigned int len);
// 发送消息数据
int SendMessage(int sessionId, const void *data, unsigned int len);

 d.通过sessionId关闭会话。

// 关闭会话
void CloseSession(int sessionId);

 e.删除会话服务。

// 删除会话服务
int RemoveSessionServer(const char *pkgName, const char *sessionName);

3.开源地址

OpenHarmony-GitCode:GitCode - 全球开发者的开源社区,开源代码托管平台

OpenHarmony-OpenAtom Foundation:OpenAtom OpenHarmony

分布式软总线-GitCode:GitCode - 全球开发者的开源社区,开源代码托管平台 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1820928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣148. 排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5] 示例 3&…

数据分析常用6种分析思路(下)

作为一名数据分析师,你又没有发现,自己经常碰到一些棘手的问题就没有思路,甚至怀疑自己究竟有没有好好学过分析? 在上篇文章里,我们讲到了数据分析中的流程、分类、对比三大块,今天,我们继续讲…

PHP地方门户分类信息网站源码讯客分类信息系统源码(含手机版)

源码介绍 1.上传程序到网站根目录,访问http://域名/install/index.php 进行安装,不要直接打开网址,先直接安装; 2.安装完成后 后台恢复数据即可 默认帐号密码都是admin http://域名/admin/ 3.不要删除任何文件,因为删除文件或者修改代码可能造成错误 运…

vuejs3 pinia持久化存储

插件地址: 快速开始 | pinia-plugin-persistedstate 安装插件: 安装pinia后,再安装这个插件 npm i pinia-plugin-persistedstate 引入插件: 在main.ts或者main.js里 //main.ts或者main.js里import { createPinia } from pi…

C++ | Leetcode C++题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; class Solution { public:int gcd(int a, int b) {return b ? gcd(b, a % b) : a;}int maxPoints(vector<vector<int>>& points) {int n points.size();if (n < 2) {return n;}int ret 0;for (int i 0; i < n; i…

94. 二叉树的中序遍历(Swift实现, 迭代)

题目描述 使用迭代方法解题 class TreeNode {var val: Intvar left: TreeNode?var right: TreeNode?init(_ val: Int) {self.val valself.left nilself.right nil} }func inorderTraversal(_ root: TreeNode?) -> [Int] {var result [Int]() // 用于存储中序遍历…

11.第十一章 字典

11. 字典 本章介绍另一种内置类型: 字典. 字典是Python最好的语言特性之一, 它是很多高效而优雅的算法的基本构建块.11.1 字典是一个映射 字典类似于列表, 但更加通用. 在列表中, 下标必须是整数. 而字典的下标(几乎)可以是任意类型. 字典包含下标(称为键)集合和值集合. 每个…

人工智能的前沿技术 博客 期刊 论文 推荐

在学习和关注人工智能的前沿技术时&#xff0c;有几个权威期刊和会议是非常重要的资源。以下是一些推荐的期刊和会议&#xff0c;涵盖了机器学习、深度学习、自然语言处理和生成式AI等领域的最新研究和进展&#xff1a; 博客 Andrej Karpathy’s blog - 深度学习领域知名专家…

在AI云原生时代应该如何应对复杂的算力环境

引言 随着在2019年ChatGPT4的爆火,AI这个之前常常被人觉得非常高深的技术渐渐的被越来越多的人们所了解,越来越多的公司、组织和开发者开始投入AI的使用和开发中来.随着AI和LLM的火热,算力资源也变的越来越紧缺,所以如何高效的管理和使用算力资源也变成了必须要面对的问题。 …

13. 第十三章 案例研究-选择数据结构

13. 案例研究-选择数据结构 到这里尼应该已经学会了Python的核心数据结构, 也见过了一些使用它们的算法. 如果你想要更多地了解算个发可以阅读第21章. 本章配合联系介绍一个案例分析, 帮你思考如何选择数据结构并如何使用它们.13.1 单词频率分析 1. 练习1 编写一个程序, 读入…

【C语言函数实现节选1】

前言&#xff1a; 通过前面的博客&#xff0c;C语言基本知识基本上我已给大家分享完成&#xff01;接下来我会通过两篇博客结 合前面的知识实现一下常见的函数。实现方式不唯一&#xff0c;大家只要大体思路符合都是可以的&#xff0c;在学习 的过程中尽量自己先实现&#xf…

安装VM虚拟机并创建一个Linux CentOS 7无桌面系统

一、安装vm虚拟机软件 1 下载vm压缩包 百度网盘链接 链接&#xff1a;https://pan.baidu.com/s/1ipiWatBr0wHKMt5c5nQirw?pwdwoy2 提取码&#xff1a;woy2 2.下载完毕后&#xff0c;先将杀毒软件关闭 全部关闭 3. 解压后按照步骤安装即可 按照按照步骤&#xff0c;观看…

C++240613

自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面 要求&#xff1a;每行代码都有注释 #include "my_widget.h"My_Widget::My_Widget(QWidget *parent): QWidget(parent) {//设置窗口的标题this->setWindowTitle("真爱生命&#xff0c;远离赌博&…

Vue31-生命周期的简介

一、需求&#xff1a;文字的透明度递减 示例&#xff1a; 对象的简写形式 new vue({ key:value, key:value, 。。。。。。 }) 二、代码的实现 注意&#xff1a;JS不擅长小数的计算&#xff01;&#xff01;&#xff01; 此写法不好&#xff01;&#xff01;&#xff01;追求…

借力AI,助力网络钓鱼(邮件)检测

引言 互联网时代&#xff0c;邮件系统依然是人们工作、生活中的很重要的一部分&#xff0c;与此同时&#xff0c;邮件系统的发展带来的钓鱼邮件问题也成为网络中的最大的安全隐患之一。本文将为大家解开网络钓鱼&#xff08;邮件&#xff09;的神秘面纱&#xff0c;一探究竟&a…

刚刚!彬川机器人社招校招入职Verify测评素质性格测评真题原题题库更新了【含答案】

一、测评环境 温馨提示 1.本次测评包含【素质性格测评】和【Verify测评】两部分&#xff0c;预计用时60min&#xff0c;请确保作答时周围环境无干扰、网络畅通&#xff1b; 2.请使用电脑完成作答&#xff0c;建议使用以下浏览器登录&#xff1a;IE9.0及以上版本&#xff0c;火…

笔记99:OSQP 求解器示例代码

注1&#xff1a;以下代码是 OSQP 的官方文档提供的示例&#xff0c;我加上了详细的注释&#xff1b; 注2&#xff1a;OSQP 库仅支持C语言&#xff0c;不支持C&#xff0c;所以下面的示例代码使用的是C语言&#xff1b;但是 OSQP 求解库提供了针对C的接口 OSQP-EIGEN&#xff1…

免费的端口映射工具哪个好用

端口映射&#xff0c;即从一个网络环境下的端口映射到另一个网络环境下访问的过程。通常由软件方式来提供这一过程的实现&#xff0c;或一些客户端工具。当涉及内外网时&#xff0c;如内网端口地址映射到外网地址&#xff0c;即是内网穿透的原理。免费的端口映射工具有哪些&…

C++设计模式——Decorator装饰器模式

一&#xff0c;装饰器模式简介 装饰器模式是一种结构型设计模式&#xff0c; 它允许在不改变现有对象的情况下&#xff0c;动态地将功能添加到对象中。 装饰器模式是通过创建具有新行为的对象来实现的&#xff0c;这些对象将原始对象进行了包装。 装饰器模式遵循开放/关闭原…

对补码的理解:两种求法

课本的结论是&#xff1a;二进制数的最高位是符号位。符号位为 0 表示正数和 零 &#xff0c;符号位为 1 表示负数。 正数是原码反码补码都是一样的。负数的反码是&#xff1a;符号位不变&#xff0c;剩下位取反。 负数的补码是&#xff1a;符号位不变&#xff0c;剩下位取反&a…