# 数据源

数据源（Source）用于从外部系统中读取数据。NeuronEX 支持将数据源加载为三种模式：`流(Stream)`、`扫描表(Scan Table)`、`查询表(Lookup Table)`。

一般的数据源都可以选择加载为`流(Stream)`，表（包括`扫描表`和`查询表`）是保留大量的数据状态的方法，一般用来和`流(Stream)`结合使用，以应对复杂的处理场景。

:::tip 提示
在使用`规则(Rule)`时，至少有一个源必须为`流(Stream)`。
:::


## 数据源类型

目前 NeuronEX 内置以下数据源类型，以及它们支持的加载模式：

| 名称                        | 描述                                  | 流   | 扫描表 | 查询表 |
| --------------------------- | ---------------------------------- | ---- | ------ | ------ |
| [Neuron](./neuron.md)       | 从NeuronEX的数采模块读取数据           | ✅    | ✅      |❌ |
| [MQTT](./mqtt.md)           | 从 MQTT 主题读取数据                       | ✅    | ✅    | ❌    |
| [HTTP pull](./http_pull.md) | 从 HTTP 服务器中拉取数据                   | ✅    | ✅    | ❌    |
| [HTTP push](./http_push.md) | 通过 HTTP 推送数据到 NeuronEX              | ✅    | ✅   | ❌     |
| [内存](./memory.md)         | 从 NeuronEX 内存主题读取数据以形成规则流水线 | ✅    | ✅      | ✅     |
| [SQL](./sql.md)         | 从数据库中查询数据                        | ✅    | ✅      | ✅|
| [文件](./file.md)           | 从文件中读取数据                           | ✅    | ✅    | ❌    |
| [Video](./video.md)         | 从视频流中查询数据                        | ✅    | ✅   | ❌    |
| [Simulator](./simulator.md)         | 生成模拟数据供测试                       | ✅    | ✅   | ❌    |
| [Redis](./redis.md)         | 从 Redis 读取数据                      | ❌    | ❌   |  ✅   |
| [CAN](./can.md)         | 从 CAN 总线读取数据                      | ✅    | ✅   |  ❌   |
| [Kafka](./kafka.md)         | 从 Kafka 读取数据                      | ✅    | ❌   |  ❌   |
| [WebSocket](./websocket.md)         | 从 WebSocket 读取数据                      | ✅    | ✅   |  ❌   |

## 定义和运行

在 NeuronEX 中，在**源管理**页面创建了流或者表之后，实际上只是创建了一个数据源的逻辑定义而非真正物理运行的数据输入。只有当使用了该数据源的规则启动之后，数据流才会真正运行。

:::tip 提示
在**源管理**页面创建的流或者表，可在多个规则的 SQL 的 `from` 子句中使用。
:::

用户可以在创建 **数据源(Source)** 时通过指定`共享(SHARED)`字段来定义是否共享数据源。


## 数据源解码

用户可以在创建 **数据源(Source)** 时通过指定`流格式`字段来定义解码方式。当前支持 `json`、 `binary`、`protobuf`、`delimited`，如希望使用自定义格式，也可以选择 `custom`。
:::tip 提示
数据源进入规则处理前，会先进行解码，解码后的数据会作为规则的输入。
:::

## 数据结构

NeuronEX 支持带结构/无结构的流，默认为无结构。即在 **源管理** -> **创建流** 时，`是否为带结构的流`选项不打勾。详见[流参数配置](./stream.md#流参数配置)。



