Files
EdgeManager/README.md
2022-07-09 14:30:30 +08:00

128 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# EdgeManagerSCADA系统
- [EdgeManagerSCADA系统](#edgemanagerscada系统)
- [API](#api)
- [class `EDataCapture`](#class-edatacapture)
- [开发环境](#开发环境)
- [技术细节](#技术细节)
- [0. `EdgeManager\EDataCapture\EDataCapture -> set_data()`为什么是以`6507524`为大小chunked的](#0-edgemanageredatacaptureedatacapture---set_data为什么是以6507524为大小chunked的)
## API
> API设计最大程度遵循了已有的MES规范。
### class `EDataCapture`
0. HTTP POST: `set_data`
**请求**
```json
{
'action': 'set_data',
'param': {
'working_subclass': <string>,
'type': 'string' | 'int' | 'float' | 'bool',
'code': <string>,
// value的类型需与type对应
'value': <string | int | float | bool>,
'device_code': [string],
'batch': [string]
}
}
```
**返回**
操作成功:
```json
{
'action': 'result_set_data',
'errcode': 0,
'errmsg': ''
}
```
操作失败:
```json
{
'action': 'result_set_data',
'errcode': 4002,
'errmsg': 'ROLLBACKed: Bad data received (structure and/or values)'
}
```
## 开发环境
拉取代码:
```bash
# 建议先配置SSH key pair
git clone ssh://git@118.195.187.246:10022/ysun/EdgeManager.git
cd EdgeManager
```
一键部署PHP workerman和TimescaleDB环境
```bash
docker compose up -d
```
进入交互式Prompt
```bash
docker exec -it edge_manager bash
```
后端调试:
```bash
php EdgeManager.php --server_name=GPU-server-01 --user=postgres --password=big_dick start
```
客户端连接:
```bash
sudo apt install postgresql-client
# 登入
psql -h localhost -U postgres
# 显示数据库列表
\l
```
## 技术细节
### 0. `EdgeManager\EDataCapture\EDataCapture -> set_data()`为什么是以`6507524`为大小chunked的
首先明确一点根据PostgreSQL的技术架构条件允许的情况下**一次性插入多条记录是效率最高的**。
这其中,仅插入部分字段的值,比如:
```sql
INSERT INTO films (code, title, did, date_prod, kind)
VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
```
的效率又远远不如插入全部列但使用特殊变量DEFAULT替代缺少的字段比如
```sql
INSERT INTO films VALUES
('UA502', 'Bananas', DEFAULT, '1971-07-13', 'Comedy', '82 minutes');
```
PostgreSQL的文档里没有提及这个话题因为源码里为SQL语句的内存分配[指定了一个最大长度常量`MaxAllocSize`](https://github.com/postgres/postgres/blob/2373fe78dfc9d4aa2348a86fffdf8eb9d757e9d5/src/common/stringinfo.c#L28)其大小为比1GB小1字节。这个值可以在编译前手动修改所以理论上每个PG运行的实例都可以不一样如果我们使用的PG并非修改过源码手动编译的那么SQL语句的最大长度为`1024 ** 3 - 1 = 1073741823` bytes。
> 安全起见下述计算假定working_subclass等字段的最大长度均为我们以往约定的45 bytes。
而此处我源码中的SQL语句头长度为131 bytes注意末尾空格
![](imgs/sql_head.png)
单个语句体的长度为165 bytes
![](imgs/sql_body.png)
所以其最多可以一次性插入`(1073741823 - 131) / 165`条记录,向下取整后即为`6507524`