• 热门开源项目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.代码目录
    1. /foundation/communication/dsoftbus
    2. ├── interfaces # 接口代码
    3. ├── core # 核心代码
    4. │ ├── common # 通用代码
    5. │ ├── adapter # 适配层代码
    6. │ ├── authentication # 认证代码
    7. │ ├── bus_center # 组网代码
    8. │ ├── connection # 连接代码
    9. │ ├── discovery # 发现代码
    10. │ ├── transmission # 传输代码
    11. │ └── frame # 框架代码
    12. ├── sdk # 运行业务进程代码
    13. │ ├── bus_center # 组网代码
    14. │ ├── discovery # 发现代码
    15. │ ├── transmission # 传输代码
    16. │ └── frame # 框架代码
    17. └── components # 依赖组件代码
    2.2.2.2.说明

    约束:

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

    须知:

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

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

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

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

    1. // 发布回调
    2. typedef struct {
    3. void (*OnPublishSuccess)(int publishId); //发布成功时回调
    4. void (*OnPublishFail)(int publishId, PublishFailReason reason);//发布失败时回调
    5. } IPublishCallback;
    6. // 发布服务
    7. int PublishService(const char *pkgName, const PublishInfo *info, const IPublishCallback *cb);

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

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

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

    1. // 发现回调
    2. typedef struct {
    3. void (*OnDeviceFound)(const DeviceInfo *device); //发现设备回调
    4. void (*OnDiscoverFailed)(int subscribeId, DiscoveryFailReason failReason); //启动发现失败回调
    5. void (*OnDiscoverySuccess)(int subscribeId); //启动发现成功回调
    6. } IDiscoveryCallback;
    7. // 发现服务
    8. int StartDiscovery(const char *pkgName, const SubscribeInfo *info, const IDiscoveryCallback *cb);

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

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

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

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

    1. // 组网连接地址
    2. typedef struct {
    3. ConnectionAddrType type;
    4. union {
    5. struct BrAddr {
    6. char brMac[BT_MAC_LEN];
    7. } br;
    8. struct BleAddr {
    9. char bleMac[BT_MAC_LEN];
    10. } ble;
    11. struct IpAddr {
    12. char ip[IP_STR_MAX_LEN];
    13. int port;
    14. } ip;
    15. } info;
    16. } ConnectionAddr;
    17. // 组网连接地址类型
    18. typedef enum {
    19. CONNECTION_ADDR_WLAN = 0,
    20. CONNECTION_ADDR_BR,
    21. CONNECTION_ADDR_BLE,
    22. CONNECTION_ADDR_ETH,
    23. CONNECTION_ADDR_MAX
    24. } ConnectionAddrType;
    25. // 组网请求执行结果回调
    26. typedef void (*OnJoinLNNResult)(ConnectionAddr *addr, const char *networkId, int32_t retCode);
    27. // 发起组网请求
    28. int32_t JoinLNN(ConnectionAddr *target, OnJoinLNNResult cb);

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

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

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

    1. // 退网执行结果回调
    2. typedef void (*OnLeaveLNNResult)(const char *networkId, int32_t retCode);
    3. // 退网请求
    4. int32_t LeaveLNN(const char *networkId, OnLeaveLNNResult cb);

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

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

    1. // 事件掩码
    2. #define EVENT_NODE_STATE_ONLINE 0x1
    3. #define EVENT_NODE_STATE_OFFLINE 0x02
    4. #define EVENT_NODE_STATE_INFO_CHANGED 0x04
    5. #define EVENT_NODE_STATE_MASK 0x07
    6. // 节点信息
    7. typedef struct {
    8. char networkId[NETWORK_ID_BUF_LEN];
    9. char deviceName[DEVICE_NAME_BUF_LEN];
    10. uint16_t deviceTypeId;
    11. } NodeBasicInfo;
    12. // 节点状态事件回调
    13. typedef struct {
    14. uint32_t events; // 组网事件掩码
    15. void (*onNodeOnline)(NodeBasicInfo *info); // 节点上线事件回调
    16. void (*onNodeOffline)(NodeBasicInfo *info); // 节点下线事件回调
    17. void (*onNodeBasicInfoChanged)(NodeBasicInfoType type, NodeBasicInfo *info); // 节点信息变化事件回调
    18. } INodeStateCb;
    19. // 注册节点状态事件回调
    20. int32_t RegNodeDeviceStateCb(INodeStateCb *callback);
    21. // 注销节点状态事件回调
    22. int32_t UnregNodeDeviceStateCb(INodeStateCb *callback);
    2.2.2.3.3.传输

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

    1. // 会话管理回调
    2. typedef struct {
    3. int (*OnSessionOpened)(int sessionId, int result);
    4. void (*OnSessionClosed)(int sessionId);
    5. void (*OnBytesReceived)(int sessionId, const void *data, unsigned int dataLen);
    6. void (*OnMessageReceived)(int sessionId, const void *data, unsigned int dataLen);
    7. } ISessionListener;
    8. // 创建会话服务
    9. int CreateSessionServer(const char *pkgName, const char *sessionName, const ISessionListener* listener);

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

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

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

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

     d.通过sessionId关闭会话。

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

     e.删除会话服务。

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

    3.开源地址

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

    OpenHarmony-OpenAtom Foundation:OpenAtom OpenHarmony

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

  • 相关阅读:
    vector常用接口使用【c++】
    kubectl get nodes报错:The connection to the server localhost:8080
    ACK 思维导图
    正则表达式
    SpringMVC之JSR303和拦截器
    【uniapp基础篇】上传图片
    值得学习的Linux内核锁(一)
    el-table 多选表格存在分页,编辑再次操作勾选会丢失原来选中的数据
    C#教程11:类属性
    SpringBoot JWT
  • 原文地址:https://blog.csdn.net/ak2111/article/details/139650876