From 38ac854746779d739b3154ae972723156762f95a Mon Sep 17 00:00:00 2001 From: Yan_yan Date: Fri, 13 Nov 2020 17:32:47 +0800 Subject: [PATCH] add apparch/lian.md --- docs/doc/apparch/imagesrc/lian.png | Bin 0 -> 18412 bytes docs/doc/apparch/lian.md | 183 ++++++++++++++++++++++++++++- 2 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 docs/doc/apparch/imagesrc/lian.png diff --git a/docs/doc/apparch/imagesrc/lian.png b/docs/doc/apparch/imagesrc/lian.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ffb7b49361a3cafd3360a521170226f5b09fef GIT binary patch literal 18412 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 literal 0 HcmV?d00001 diff --git a/docs/doc/apparch/lian.md b/docs/doc/apparch/lian.md index 61bb10e..484a6c9 100644 --- a/docs/doc/apparch/lian.md +++ b/docs/doc/apparch/lian.md @@ -1 +1,182 @@ -# 联 +# 联 - 网络框架 + +多数嵌入式操作系统,应具备传输多种网络协议数据的能力,但是网络协议种类繁多,为每种协议都开放单独的接口,势必会增加操作系统使用者的开发负担,亦不利于嵌入式操作系统的普及与推广。 + +XiUOS网络框架采用以网络适配器为中心的抽象方式,发送与接收数据时,只需要像Linux socket网络通信一样,仅关注发送与接收的数据,而不用把重点放在所使用的具体协议上。这种抽象方式有效屏蔽了种类繁多的网络协议细节,对外提供统一的网络接口,简化了基于嵌入式操作系统的网络开发。网络框架对各类协议的网络设备进行了抽象: +* 一个网络协议设备,被抽象为一个xs_Adapter + +xs_Adapter可以被设计为采用类似面向对象的方法,针对不同的网络协议,扩展其数据成员与接口,从而为种类繁多的网络协议实现统一的管理架构。在网络应用开发的过程中,只需要使用对应网络协议的xs_Adapter实例,而无需关心网络协议的硬件细节,从而实现了网络数据收发功能与底层硬件的解耦。 + +
+ +![LIAN IMAGE](./imagesrc/lian.png) + +
+ +## 1. XiUOS网络框架关键数据结构定义和解析 + +* struct xs_Adapter结构 +```c +struct xs_Adapter +{ +    const char name[XS_NAME_MAX]; /* name of the adapter instance */ +    enum xs_AdpterType type;      /* type of adapter, such as lora adapter */ +    xs_AdapterInfo info;   /* adapter model info, such as vendor name and model name */ +    struct xs_AdpterOps ops; /* socket-like APIs for data transferring */ +    struct xs_AdpterInterface interface; /* physical interface for transferring data */ +    struct XS_DOUBLE_LINKLIST_NODE link; /* link list node */ +}; +``` +name成员是一个可读的名字,用于唯一标识一个xs_Adapter结构。type成员表示该xs_Adapter所使用的网络协议,用一个枚举变量表示: + +```c +enum xs_AdapterType { +    XS_ADAPTER_LORA = 0, /* Lora */ +    XS_ADAPTER_4G ,      /* 4G */ +    /* ...... */ +    XS_ADAPTER_WIFI ,    /* Wifi */ +}; +``` + +info成员包含此网络设备的基础信息,如厂家名vendor与型号product_model。 + +```c +struct xs_AdapterInfo{ +    const char *vendor; +    const char *product_model; +}; +``` + +ops成员包含统一的、类似文件系统的API,用于对网络适配器进行实际的数据读写。在使用一个网络适配器前后需要打开(open)/关闭(close)该网络适配器,send、receive分别用与从网络适配器接收数据与向网络适配器发送数据,ioctl用于配置Adapter属性: + +```c +struct xs_AdapterOps { +    int (*open)(struct xs_Adapter *sadapter); +    void (*close)(struct xs_Adapter *sadapter); +    int (*join)(struct xs_Adapter *sadapter,int net_type, int dev_type, int net_number); +    int (*send)(struct xs_Adapter *sadapter, const char* data, int len,int des_dev, int time_out, bool block, int delay); +    int (*receive)(struct xs_Adapter *sadapter, char* rev_buffer, int buffer_len,int time_out, bool block); +    int (*ioctl)(struct xs_Adapter *sadapter, int cmd, void *arg); +}; +``` + +其中需要注意的是,join接口的所使用的net_type和dev_type参数,分别来自枚举: + +```c +enum xs_net_type{ +    XS_CENTRALIZATION = 0, +    XS_ADHOC, +}; + +enum xs_dev_type{ +    XS_Client = 0, +    XS_GATEWAY, +}; +``` +net_type代表的含义是,使用传统的中心化网络或者自组网络。dev_type代表的含义是,此设备是普通设备或者网关设备。 + +最后,在系统中每种网络协议的xs_Adapter被分别组织成不同双链表,如Lora的xs_Adapter链表、4G的xs_Adapter链表等,使用的链表节点即为link成员。 + +## 2. XiUOS网络框架驱动开发 + +以Lora网络适配器为例。网络框架针对每个具体的网络适配器将xs_Adapter进行扩充,采用类似面向对象的手段添加其他必要成员,如: + +```c +struct xs_AdapterLora { +    struct xs_Adapter parent; /* inherit from xs_Adapter */ + +    const char *deve_ui; /* Lora specific value */ +    const char *app_key; /* Lora specific value */ +}; +``` + +实现xs_AdapterOps中的数据通信API,具体实现细节取决于所使用网络协议,无法实现的API可以置为NULL: + +```c +struct xs_AdapterOps lora_example_ops = { +    .open = lora_example_open; +    .close = lora_example_close; +    .send = lora_example_send; +    .receive = NULL; +    .ioctl = lora_example_ioctl; +}; +``` + +填充xs_AdapterLora,并将其注册。 + +```c +int xs_AdapterRegister(struct xs_Adapter *sadapter); + +extern struct xs_AdapterOps lora_example_ops; +/* declare xs_AdapterLora */ +struct xs_AdapterLora lora_example_adapter; + +void register_lora_adapter() +{ +    /* initialize and register the xs_Adapter object */ +    memset(&lora_example_adapter, 0, sizeof(lora_example_adapter)); +    lora_example_adapter.parent.name = "adapter1"; +    lora_example_adapter.parent.type = XS_ADAPTER_LORA; +    lora_example_adapter.parent.info.vendor = "xxx"; +    lora_example_adapter.parent.info.product_model = "yyy"; +    lora_example_adapter.parent.ops = &lora_example_ops; +    lora_example_adapter.parent.interface.bus_device = xs_DeviceFind("uart1"); +    lora_example_adapter.deve_ui = "mmm"; +    lora_example_adapter.app_key = "nnn"; +    xs_AdapterRegister(&lora_example_adapter); +} +``` + +## 3. XiUOS网络框架的使用实例 + +网络应用开发者使用网络框架提供的API操作网络适配器,网络适配器API可以分为通用API与协议特有API。通用API用于网络适配器的获取、打开与关闭,协议特有API用于特定协议的数据采样。以Lora网络适配器为例: + +```c +/* generic API: find a adapter instance by its name */ +struct xs_Adapter *xs_AdapterFind(const char *name); + +/* generic API: open/close a adapter instance */ +int xs_AdapterOpen(struct xs_Adapter *adapter); +void xs_AdapterClose(struct xs_Adapter *adapter); +/* Lora API: get current Lora adapter reading */ +uint32_t xs_AdapterReceive(struct xs_Adapter *adapter, char* rev_buffer, int buffer_len,int time_out, bool block); +``` + +在获取数据前,需要先获取并打开要使用的网络适配器;网络适配器打开后可以随时对网络适配器数据进行读取;使用完毕后,须关闭网络适配器。完整的使用过程示例如下: + +```c +#define BUFFER_MAX 512 +int main(int argc, char *argv[]) +{ +int ret; +    char rev_buffer[BUFFER_MAX]; + +    struct xs_Adapter *adapter; +    struct xs_AdapterLora *lora_adapter; + +    /* get the Lora adapter instance */ +    adapter = xs_AdapterFind("lora_1"); +    XS_ASSERT(adapter->type == XS_ADAPTER_LORA); +    /* open the Lora adapter instance */ +    lora_adapter = (struct xs_AdapterLora *)adapter; +    ret = xs_AdapterOpen(adapter); +    XS_ASSERT(ret == XS_EOK); +   +    xs_AdapterReceive(adapter, rev_buffer, BUFFER_MAX, 0, true); +    xs_kprintf("Data read from lora_adapter is %s \n", rev_buffer); +    xs_AdapterClose(adapter); +    return 0; +} +``` + +## 4. XiUOS自组网功能简介 + +传统的数据收集与上报系统架构,一般采用星型拓扑的组织形式,以网关为中心,将数据收集设备(传感器)连接组织起来,传感器之间一般没有大规模的数据流动。而这种中心化的网络架构,有其自身的缺点,如中心节点的数据压力经常逼近极限,成为整个系统的性能瓶颈,或者一旦程序崩溃,即造成其承载的所有传感器发生掉线事故。 +所以我们在提供中心化网络服务的同时,也提供了去中心化的自组网络服务,自组网结构一般具有以下优点: + +1、动态接入 +传统的中心节点型网络,需要网关手动配置想要连接的传感器,然后对区域进行轮询扫描,传感器则在被轮询到时,被动地上报自己的数据。而自组网新节点需接入时,可实现主动接入,无需对网关进行手动配置,节省运维成本。 +2、去中心化 +自组网内无中心节点,节点之间可进行自主路由协商,以此来实现跳转通信,相比传统中心化网络,有效分摊网络流量,进而分散节点运算压力。自组网具有良好的健壮性,任何一个节点发生崩溃,其所承载的传感器会自动寻找其他上传节点,不会造成大面积的掉线事故。 +3、不依赖现有网络 +节点之间通信,不依赖现有的网络基础设施,自组网内部实现网络自治,以此应对通信地点和时间的不确定性。 \ No newline at end of file