热门开源项目OpenHarmony
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 - 全球开发者的开源社区,开源代码托管平台
相关文章:

热门开源项目OpenHarmony
目录 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.传输…...

NewspaceAi之GPT使用新体验
GPT功能 使用地址:https://newspace.ai0.cn/ 上车 挂挡 踩油门,一脚到底,开始你的表演 问题1:你能做什么详细告诉我? 下面内容是GPT的回答 当然!作为一个基于GPT-4架构的AI,我能够在许多方面为…...
详解红黑树
红黑树规则 节点是红色或黑色。根节点是黑色。每个叶子节点都是黑色的空节点(NIL节点)。每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。 红黑树…...

探索JavaScript逆向工程与风控等级
探索JavaScript逆向工程与风控等级 在当今的网络安全领域,JavaScript逆向工程(简称JS逆向)已成为许多开发者和安全专家关注的焦点。JS逆向主要涉及对JavaScript代码的分析与理解,以发现其内部逻辑、数据流及潜在漏洞。这种技术常用…...

C++ 22 之 立方体案例
c22立方体案例.cpp #include <iostream> #include <string>using namespace std;class Cube{ private:int cube_l; // 长int cube_w; // 宽int cube_h; // 高public:// 设置长void set_l(int l){cube_l 1;}// 设置宽void set_w(int w){cube_w w;}// 设置高void …...

vue2使用antv/g6-editor实现可拖拽流程图
依赖下载 照着这个引入就好,然后npm install 源码 <template><div id"vue-g6-editor"><el-row><el-col :span"24"></el-col></el-row><!-- 工具栏 --><el-row><el-col :span"24&qu…...
springboot学习小结
背景 业务上需要开发,组里一位前辈给我指路 spring基础 什么是spring spring提供一个容器称为spring应用上下文,容器里可以创建和管理组件,组件会在容器里装配好,组件也可以叫bean。 装配不由组件创建他依赖的组件࿰…...

vue聊天发送Emoji表情
在用web端写聊天发送表情的功能中,使用web端有系统自带的unicode表情会出现每端不统一的情况,不好用不能统一,在这里我想到了一个非常好的思路,可以解决这个问题! 那就是发送表情用图片的形式呈现,然后发给…...

360数字安全:2024年4月勒索软件流行态势分析报告
勒索软件传播至今,360 反勒索服务已累计接收到数万勒索软件感染求助。随着新型勒索软件的快速蔓延,企业数据泄露风险不断上升,勒索金额在数百万到近亿美元的勒索案件不断出现。勒索软件给企业和个人带来的影响范围越来越广,危害性…...

【MySQL】日志详解
本文使用的MySQL版本是8 日志概览 它们记录了数据库系统中的不同操作和事件,以便于故障排除、性能优化和数据恢复。本文将介绍MySQL中常见的几种日志,同时也会介绍一点常用的选项。 官方文档:MySQL :: MySQL 8.0 Reference Manual :: 7.4 M…...
MyBatis 延迟加载,一级缓存,二级缓存设置
MyBatis不仅提供了一级缓存和二级缓存机制,还支持延迟加载(Lazy Loading),以进一步优化性能。 1. 延迟加载(Lazy Loading) 延迟加载是在需要时才加载数据,而不是在查询时立即加载所有相关数据。…...

Linux 基本指令2
cp 指令 cp[选项]源文件 目标文件 将源文件的内容复制到目标文件中,源文件可以有多个,最后一个文件为目标文件,目标文件也可以是一段路径,若目的地不是一个目录的话会拷贝失败。若没有路径上的目录则会新建一个,若源是…...
联邦学习的基本流程,联邦学习权重聚合,联邦学习权重更新
目录 联邦学习的基本流程是 S_t = np.random.choice(range(K), m, replace=False) 联邦学习权重聚合 model.state_dict() 联邦学习权重更新 下载数据集 https://ossci-datasets.s3.amazonaws.com/mnist/train-images-idx3-ubyte.gz 联邦学习的基本流程是 **1. server初始…...

React保姆级教学
React保姆级教学 一、创建第一个react项目二、JSX基本语法与react基础知识1、 插值语法:2、 循环一个简单列表3、 实现简单条件渲染4、 实现复杂的条件渲染5、 事件绑定6、 基础组件(函数组件)7、 使用useState8、 基础样式控制9、 动态类名1…...

数据结构和矩阵细节用法:double、cell和complex #matlab
矩阵建立 建立矩阵用[]; 矩阵的同一行内的元素用逗号或者空格隔开; 矩阵的不同行的元素用分号隔开 eg. 矩阵 A 1 2 3 4 5 6 7 8 9 在matlab中矩阵A表示为: clc;clear; A[1,2,3;4,5,6;7,8,9]; %或者A[1 2 3;4 5 …...

12. Django 第三方功能应用
12. 第三方功能应用 因为Django具有很强的可扩展性, 所以延伸了第三方功能应用. 通过本章的学习, 读者能够在网站开发过程中快速实现API接口开发, 验证码生成与使用, 站内搜索引擎, 第三方网站实现用户注册, 异步任务和定时任务, 即时通信等功能.12.1 Django Rest Framework框…...
UnityWebRequest获取本地txt文件,其中中文乱码问题(踩坑记录)
Unity获取本地streamingassert下txt文件,遇到点问题,就是用UnityWebRequest下载一个txt文件的时候,原txt在资源管理器用notepad打开显示正常,但是Unity里调试,打印内容却是乱码, 在notepad 转存为utf-8&…...

轮到国产游戏统治Steam榜单
6月10日晚8点,《黑神话:悟空》实体版正式开启全款预售,预售开启不到5分钟,所有产品即宣告售罄。 Steam上,《黑神话:悟空》持续占据着热销榜榜首的位置。 但在《黑神话:悟空》傲人的光环下,还有一款国产游戏取得出色的成绩。 6月10日&#…...

不想搭集群,直接用spark
为了完成布置的作业,需要用到spark的本地模式,根本用不到集群,就不想搭建虚拟机,hadoop集群啥的,很繁琐,最后写作业还用不到集群(感觉搭建集群对于我完成作业来说没有什么意义)&…...

【MATLAB源码-第225期】基于matlab的计算器GUI设计仿真,能够实现基础运算,三角函数以及幂运算。
操作环境: MATLAB 2022a 1、算法描述 界面布局 计算器界面的主要元素分为几大部分:显示屏、功能按钮、数字按钮和操作符按钮。 显示屏 显示屏(Edit Text):位于界面顶部中央,用于显示用户输入的表达式和…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...