乐趣区

关于c:Linux网络开发必学教程19分布式智能家居项目雏形

需要剖析

  • 客户端进入室内后可能被动发现服务(如,环境服务,灯光服务)
  • 各种服务能够有不同的载体(如:由不同设施提供)
  • 各种服务之间,服务与客户端之间齐全无耦合(服务可自在增减)
  • 客户端能够是挪动 APP,能够是桌面软件。。。

技术可行性剖析

  • 发现服务:UDP 播送 + 自定义协定

    • 客户端被动播送服务查问协定包
    • 服务设施接管到协定包,回复协定内容及协定应用形式
  • 服务自在增减:自定义协定

    • 服务设施遵循雷同的协定:数据传输协定,服务提供模式,等
    • 客户端通过协定应用服务,无需关怀服务设施的状态及地位

基础设施

提供服务的设施(嵌入式,服务器,PC,等)必须具备联网能力,且遵循服务协定。

零碎概要设计

交互流程

零碎具体设计

  • 服务发现

    • 客户端被动播送服务发现数据包
  • 服务应答

    • 服务设施将本机 IP 及可能提供的服务信息发回客户端

客户端具体设计

  • 通过播送服务发现数据包,收集以后环境的服务信息
  • 可用服务通过“菜单”形式出现,并提醒服务应用形式
  • 抉择服务后,连贯到对应设施,通过协定音讯发送服务申请命令
  • 收到设施回复后,断开设施连贯(申请 – 应答)

服务端具体设计

  • 联网模块

    • 设施提供服务前,必须联网(无线 or 有线)
  • 服务前端

    • 接管服务发现数据包,并应答以后设施服务信息
  • 服务后端

    • 服务设施驱动,如:温湿度传感器驱动,灯光管制驱动,等

硬件选型

这里展现应用的小熊派,运行 openharmony。能够不用关怀硬件,间接在 PC 编写雷同网络性能可执行文件即可

服务设施软件架构设计

服务设施启动流程

几个问题

  • 设施上运行什么操作系统?
  • 设施运行的操作系统如何创立多个并行执行工作?
  • 设施如何通过 wifi 联网?
  • 设施上的网络编程通过什么接口实现?

OpenHarmony 是什么

  • 凋谢原子基金会(OpenAtom Foundation)旗下开源我的项目

    • 定位是一个面项全场景的开源分布式操作系统
  • 我的项目蕴含了分布式操作系统所需的全副能力

    • 包含内核层、零碎服务层、利用框架层
  • 华为及泛滥贡献者,在开源社区内间接奉献

  • 轻量零碎 :硬件资源极其无限,反对的设施最小内存为 128KiB。可撑持的产品如智能家居畛域的连贯类模组、传感器设施、穿戴类设施等。
  • 小型零碎 :面项利用处理器的设施,反对的设施最小内存为 1MBiB。可撑持的产品如智能家居畛域的 IP Camera、电子猫眼、路由器以及智慧出行的行车记录仪等。
  • 规范零碎 :面项利用处理器例如 Arm Cortex-A 的设施,反对的设施最小内存为 128MiB, 能够提供加强的交互能力、3D GPU 以及硬件合成能力、更多控件以及动效更丰盛的图形能力、残缺的利用框架。可撑持的产品如高端的冰箱显示屏。

OpenHarmony 轻量级零碎利用开发精要

  • 零碎组件裁剪与配置 .//vendor/hisilicon/hispark_pegasus/config.json
  • 板载性能裁剪与配置 .//device/hisilicon/hispark_pegasus/sdk_liteis/build/config/usr_config.mk

  • application/sample/wifi-iot/app 目录下新建工程目录(如:demo_server)
  • 工程目录下新建 BUILD.gn 文件
  • 批改 application 目录下的 BUILD.gn 文件画图

  • 注册入口函数
  • 创立工作
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"

static void* Init_Task(const char* arg)
{printf("[dt4sw] Hello, D.T.Software!\n");

    return arg;
}

static void Main_Entry(void)
{osThreadAttr_t attr = {0};
    
    attr.name = "Init Task";
    attr.stack_size = 1024 * 4;
    attr.priority = 20;

    if(osThreadNew((osThreadFunc_t)Init_Task, NULL, &attr) == NULL )
    {printf("[dt4sw] Failed to create task!\n");
    }
}

SYS_RUN(Main_Entry);
退出移动版