From 4380bb5653b6c078509a52f6a20895f7a3762acb Mon Sep 17 00:00:00 2001 From: maikebing Date: Sun, 31 Jul 2022 04:43:37 +0000 Subject: [PATCH] deploy: c408809871ab5ad4f5d4e6ee19da8101c29014e0 --- 404.html | 4 ++-- assets/js/0e384e19.61896b51.js | 1 + assets/js/0e384e19.76af2495.js | 1 - .../{runtime~main.2c1fdcec.js => runtime~main.ce19f659.js} | 2 +- blog/archive/index.html | 4 ++-- blog/first-version-doc/index.html | 4 ++-- blog/index.html | 4 ++-- blog/tags/index.html | 4 ++-- blog/tags/iotsharp/index.html | 4 ++-- docs/intro/index.html | 6 +++--- docs/tutorial-basics/aggregate/index.html | 4 ++-- docs/tutorial-basics/debug/index.html | 4 ++-- docs/tutorial-basics/deploy/index.html | 4 ++-- docs/tutorial-basics/gateway/index.html | 4 ++-- docs/tutorial-basics/influxdb/index.html | 4 ++-- docs/tutorial-basics/iotsharp/index.html | 4 ++-- docs/tutorial-basics/sourcecode/index.html | 4 ++-- docs/tutorial-basics/webapi/index.html | 4 ++-- docs/tutorial-extras/http/index.html | 4 ++-- docs/tutorial-extras/mqtt/index.html | 4 ++-- docs/tutorial-extras/raw_data_gateway/index.html | 4 ++-- index.html | 4 ++-- markdown-page/index.html | 4 ++-- 23 files changed, 43 insertions(+), 43 deletions(-) create mode 100644 assets/js/0e384e19.61896b51.js delete mode 100644 assets/js/0e384e19.76af2495.js rename assets/js/{runtime~main.2c1fdcec.js => runtime~main.ce19f659.js} (98%) diff --git a/404.html b/404.html index 154e504e..d925f36c 100644 --- a/404.html +++ b/404.html @@ -6,13 +6,13 @@ Page Not Found | IoTSharp 在线文档 - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- + \ No newline at end of file diff --git a/assets/js/0e384e19.61896b51.js b/assets/js/0e384e19.61896b51.js new file mode 100644 index 00000000..ea87c6cd --- /dev/null +++ b/assets/js/0e384e19.61896b51.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkiotsharp=self.webpackChunkiotsharp||[]).push([[671],{3905:function(e,t,r){r.d(t,{Zo:function(){return m},kt:function(){return k}});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},m=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),c=u(r),k=n,h=c["".concat(p,".").concat(k)]||c[k]||s[k]||o;return r?a.createElement(h,i(i({ref:t},m),{},{components:r})):a.createElement(h,i({ref:t},m))}));function k(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:n,i[1]=l;for(var u=2;u=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},m=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},s=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),s=u(r),k=n,h=s["".concat(p,".").concat(k)]||s[k]||c[k]||o;return r?a.createElement(h,i(i({ref:t},m),{},{components:r})):a.createElement(h,i({ref:t},m))}));function k(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=s;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:n,i[1]=l;for(var u=2;u=f)&&Object.keys(c.O).every((function(e){return c.O[e](n[u])}))?n.splice(u--,1):(o=!1,f0&&e[d-1][2]>f;d--)e[d]=e[d-1];e[d]=[n,r,f]},c.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},c.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var f=Object.create(null);c.r(f);var a={};t=t||[null,n({}),n([]),n(n)];for(var o=2&r&&e;"object"==typeof o&&!~t.indexOf(o);o=n(o))Object.getOwnPropertyNames(o).forEach((function(t){a[t]=function(){return e[t]}}));return a.default=function(){return e},c.d(f,a),f},c.d=function(e,t){for(var n in t)c.o(t,n)&&!c.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},c.f={},c.e=function(e){return Promise.all(Object.keys(c.f).reduce((function(t,n){return c.f[n](e,t),t}),[]))},c.u=function(e){return"assets/js/"+({4:"3fc0374d",13:"01a85c17",53:"935f2afb",69:"a1402aa2",85:"1f391b9e",89:"a6aa9e1f",103:"ccc49370",113:"e92b9761",195:"c4f5d8e4",279:"b64b6df2",362:"e7f6a271",414:"393be207",449:"efdf10ba",477:"b2f554cd",514:"1be78505",533:"b2b675dd",535:"814f3328",562:"44b3aa03",569:"c0a3ef7c",571:"12418a3d",592:"4a4400a9",608:"9e4087bc",610:"6875c492",612:"b26f26e7",645:"4e4af493",655:"4dd18239",671:"0e384e19",713:"a7023ddc",732:"09a89718",829:"c9b73897",879:"f89a48e8",892:"b2206c24",918:"17896441",934:"7302895b"}[e]||e)+"."+{4:"2f4a5674",13:"528361dc",53:"ab4badee",69:"a6ec6182",75:"7727d34c",85:"c76bee88",89:"5dcca70e",103:"d8ea52c3",113:"60f4f85a",195:"6acfc264",279:"cb9e1224",362:"88ce0c54",414:"12b00c24",449:"03ad337c",477:"d2e5b51d",514:"fb32330c",533:"dc8fc196",535:"4c8387f6",562:"470a5443",569:"a921104f",571:"f02bc7a7",592:"43600cbf",608:"17fed9a8",610:"a162ab52",612:"378a3eaa",645:"89d3dddd",655:"3b81d22b",671:"76af2495",713:"b590ea01",732:"99f0c66a",829:"ec517f75",879:"149294f2",892:"f0846ce0",918:"01b344f4",926:"99aece81",934:"27843ce2"}[e]+".js"},c.miniCssF=function(e){},c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},f="iotsharp:",c.l=function(e,t,n,a){if(r[e])r[e].push(t);else{var o,u;if(void 0!==n)for(var i=document.getElementsByTagName("script"),d=0;d=f)&&Object.keys(c.O).every((function(e){return c.O[e](n[u])}))?n.splice(u--,1):(o=!1,f0&&e[d-1][2]>f;d--)e[d]=e[d-1];e[d]=[n,r,f]},c.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},c.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var f=Object.create(null);c.r(f);var a={};t=t||[null,n({}),n([]),n(n)];for(var o=2&r&&e;"object"==typeof o&&!~t.indexOf(o);o=n(o))Object.getOwnPropertyNames(o).forEach((function(t){a[t]=function(){return e[t]}}));return a.default=function(){return e},c.d(f,a),f},c.d=function(e,t){for(var n in t)c.o(t,n)&&!c.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},c.f={},c.e=function(e){return Promise.all(Object.keys(c.f).reduce((function(t,n){return c.f[n](e,t),t}),[]))},c.u=function(e){return"assets/js/"+({4:"3fc0374d",13:"01a85c17",53:"935f2afb",69:"a1402aa2",85:"1f391b9e",89:"a6aa9e1f",103:"ccc49370",113:"e92b9761",195:"c4f5d8e4",279:"b64b6df2",362:"e7f6a271",414:"393be207",449:"efdf10ba",477:"b2f554cd",514:"1be78505",533:"b2b675dd",535:"814f3328",562:"44b3aa03",569:"c0a3ef7c",571:"12418a3d",592:"4a4400a9",608:"9e4087bc",610:"6875c492",612:"b26f26e7",645:"4e4af493",655:"4dd18239",671:"0e384e19",713:"a7023ddc",732:"09a89718",829:"c9b73897",879:"f89a48e8",892:"b2206c24",918:"17896441",934:"7302895b"}[e]||e)+"."+{4:"2f4a5674",13:"528361dc",53:"ab4badee",69:"a6ec6182",75:"7727d34c",85:"c76bee88",89:"5dcca70e",103:"d8ea52c3",113:"60f4f85a",195:"6acfc264",279:"cb9e1224",362:"88ce0c54",414:"12b00c24",449:"03ad337c",477:"d2e5b51d",514:"fb32330c",533:"dc8fc196",535:"4c8387f6",562:"470a5443",569:"a921104f",571:"f02bc7a7",592:"43600cbf",608:"17fed9a8",610:"a162ab52",612:"378a3eaa",645:"89d3dddd",655:"3b81d22b",671:"61896b51",713:"b590ea01",732:"99f0c66a",829:"ec517f75",879:"149294f2",892:"f0846ce0",918:"01b344f4",926:"99aece81",934:"27843ce2"}[e]+".js"},c.miniCssF=function(e){},c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},f="iotsharp:",c.l=function(e,t,n,a){if(r[e])r[e].push(t);else{var o,u;if(void 0!==n)for(var i=document.getElementsByTagName("script"),d=0;d Archive | IoTSharp 在线文档 - + - + \ No newline at end of file diff --git a/blog/first-version-doc/index.html b/blog/first-version-doc/index.html index 2f6619ec..d1dbf4c6 100644 --- a/blog/first-version-doc/index.html +++ b/blog/first-version-doc/index.html @@ -6,13 +6,13 @@ 第一版文档发布 | IoTSharp 在线文档 - +

第一版文档发布

· One min read
maikebing

2022年2月14日情人节, 我们发布了第一版文档, 在这里特别感谢王海东先生(535915157@qq.com), 推荐了博客平台, 也实现了第一个教程。

- + \ No newline at end of file diff --git a/blog/index.html b/blog/index.html index 43babb15..8e448e56 100644 --- a/blog/index.html +++ b/blog/index.html @@ -6,13 +6,13 @@ Blog | IoTSharp 在线文档 - +

· One min read
maikebing

2022年2月14日情人节, 我们发布了第一版文档, 在这里特别感谢王海东先生(535915157@qq.com), 推荐了博客平台, 也实现了第一个教程。

- + \ No newline at end of file diff --git a/blog/tags/index.html b/blog/tags/index.html index 17a9a4c2..56dd402c 100644 --- a/blog/tags/index.html +++ b/blog/tags/index.html @@ -6,13 +6,13 @@ Tags | IoTSharp 在线文档 - + - + \ No newline at end of file diff --git a/blog/tags/iotsharp/index.html b/blog/tags/iotsharp/index.html index 7eece92d..b3506eb2 100644 --- a/blog/tags/iotsharp/index.html +++ b/blog/tags/iotsharp/index.html @@ -6,13 +6,13 @@ One post tagged with "iotsharp" | IoTSharp 在线文档 - +

One post tagged with "iotsharp"

View All Tags
- + \ No newline at end of file diff --git a/docs/intro/index.html b/docs/intro/index.html index a9a02330..5b563661 100644 --- a/docs/intro/index.html +++ b/docs/intro/index.html @@ -6,13 +6,13 @@ IoTSharp 简介 | IoTSharp 在线文档 - +
-

IoTSharp 简介

让我们探索一下 IoTSharp 在五分钟内.

IoTSharp 是什么?

IoTSharp 是一个基于.Net 6.0 使用C#开发的数据收集、处理、可视化与设备管理的开源物联网(IoT)平台基础平台,支持 HTTP、MQTT 、CoAP等协议实现设备的数字孪生,且属性数据和遥测数据协议简单类型丰富,简易设置即可将数据存储在PostgreSql、MySql、Oracle、SQLServer、Sqlite 或者 InfluxDB 2.0;TDengine;TimescaleDB等时序数据库中。

IoTSharp的系统必备有哪些?

  • [Docker]](https://www.docker.com/) 最新版本
    • 如果你要部署IoTSharp, 我们首先推荐的是docker, 以及Docker-Compose, 通过我们推荐的docker-compose.yml 你可以直接部署成功,而不用煞费周折的部署环境。
  • 关系型数据库 用来存储基础数据和属性数据。
    • PostgreSQL 验证过的版本为 PostgreSQL 11.3,12.x等。
    • MySql 验证过的版本为 MySQL 8.0.17
    • Oracle 验证过的版本为 Oracle Standard Edition 12c Release 2 , 操作系统为Cent OS 7
    • Sqlite 程序内置,均验证。 小项目推荐。
    • SQLServer 验证过的版本为 Microsoft SQL Server 2016 (RTM-GDR) (KB4019088) - 13.0.1742.0 (X64)
    • InMemory 通过EF 的内存数据库,一般用于测试 。
  • 时序数据库 用来存储遥测数据并提供遥测数据的查询统计等等。
    • 通过EFCore 使用关系型数据库来存储带有时间戳的数据,虽然不推荐,但不妨是一种小型项目的最佳选择。
    • InfluxDB 2.x 我们致力于推荐的时序数据库, InfluxDB集成非常好用的可视化工具, 除了不符合信创没有任何可挑剔的。
    • TDengine 我们致力于推荐的国产时序数据库, 甚至为了支持它我花了大量时间编写他的提供程序 Maikebing.EntityFrameworkCore.Taos
    • PinusDB 国产松果时序数据库, 简单易用, 我们也为他编写了提供程序, PinusDB.Data
    • TimescaleDB 基于PostgreSQL的时序数据库, 你可以直接选择它来当时序数据库也可以当关系型数据库, 一次搞定。
    • 关系数据库 分区法 , 我们有支持这种方式,但始终不推荐,除非你想只想用一个数据库且通过分区就能搞定你的数据量。
    • SingleTable 通过EF的的单表存储。 通过单表, 我们就不需要依赖于数据库或者分区等等。 小项目推荐。
  • 消息队列 我们是通过CAP项目来实现的,因此它支持的理论上我们都支持。
    • RabbitMQ 我们推荐的。
    • Kafka 测试似乎正常。
    • ZeroMQ 针对出门的ZeroMQ , 我们编写了MaiKeBing.CAP.ZeroMQ 和 MaiKeBing.HostedService.ZeroMQ 以支持它。
    • InMemory 通过它可以不需要依赖任何外接, 这是CAP提供的一种途径。 小项目推荐。
  • 消息队列存储
    • PostgreSql 如果全称用PostgreSQL 可以考虑。
    • MongoDB 我们推荐的
    • LiteDB .Net 编写的NoSQL 项目, 小项目推荐,
    • InMemory 存储在内存, 不依赖于外接。 小项目推荐。

如何部署?

如何使用docker-compose 安装IoTSharp ?

  • RMI 使用Rabbitmq 作为 EventBus, Mongodb 作为消息存储, 遥测数据使用Influx 2.0 ,这个方案中遥测数据也可以使用TDengine

  • ZPT 使用ZeroMQ 作为 EventBus, PostgreSQL 作为消息存储, 遥测数据使用 TDengine

  • ZPS 默认开发配置, IoTSharp 和 PostgreSql, 遥测数据可以通过单表或者分表。

初次使用

  • 初始租户和管理员、用户注册信息在系统发现你未初始化时自动跳转到安装界面, 填写完成后, 系统会初始化权限、基础数据等种子数据。
  • X509 CA证书用于通过证书进行保障安全通讯和关系验证, 第一次时需要调用高级管理员权限办法并写入系统, 尤其是当你使用了非管理员用户进行启动IoTSharp 时 , 因此, 需要确保第一次生成使用高权限, 后续使用低权限。

关于赞助

  • 我们接受资金以及任何方式的的捐赠,但并不意味着我们会为您承诺或担保任何事情, 也并不意味着对你使用IoTSharp带来的负面影响负有责任。 所有你使用IoTSharp造成的任何损失以及任何关联的责任等我们均不会有任何责任和义务承担,你需要为你做的决定而负责。
  • IoTSharp开源并不等于你可以用他申报项目、申请专利、提供云服务、重新包装等某种其他方式来获利但对IoTSharp毫无建树。 我们讨厌这种自私行为。
- +

IoTSharp 简介

让我们探索一下 IoTSharp 在五分钟内.

IoTSharp 是什么?

IoTSharp 是一个基于.Net 6.0 使用C#开发的数据收集、处理、可视化与设备管理的开源物联网(IoT)平台基础平台,支持 HTTP、MQTT 、CoAP等协议实现设备的数字孪生,且属性数据和遥测数据协议简单类型丰富,简易设置即可将数据存储在PostgreSql、MySql、Oracle、SQLServer、Sqlite 或者 InfluxDB 2.0;TDengine;TimescaleDB等时序数据库中。

IoTSharp的系统必备有哪些?

  • [Docker]](https://www.docker.com/) 最新版本
    • 如果你要部署IoTSharp, 我们首先推荐的是docker, 以及Docker-Compose, 通过我们推荐的docker-compose.yml 你可以直接部署成功,而不用煞费周折的部署环境。
  • 关系型数据库 用来存储基础数据和属性数据。
    • PostgreSQL 验证过的版本为 PostgreSQL 11.3,12.x等。
    • MySql 验证过的版本为 MySQL 8.0.17
    • Oracle 验证过的版本为 Oracle Standard Edition 12c Release 2 , 操作系统为Cent OS 7
    • Sqlite 程序内置,均验证。 小项目推荐。
    • SQLServer 验证过的版本为 Microsoft SQL Server 2016 (RTM-GDR) (KB4019088) - 13.0.1742.0 (X64)
    • InMemory 通过EF 的内存数据库,一般用于测试 。
    • Cassandra 现在开始我们通过 EFCore.Cassandra 支持了Cassandra。
  • 时序数据库 用来存储遥测数据并提供遥测数据的查询统计等等。
    • 通过EFCore 使用关系型数据库来存储带有时间戳的数据,虽然不推荐,但不妨是一种小型项目的最佳选择。
    • InfluxDB 2.x 我们致力于推荐的时序数据库, InfluxDB集成非常好用的可视化工具, 除了不符合信创没有任何可挑剔的。
    • TDengine 我们致力于推荐的国产时序数据库, 甚至为了支持它我花了大量时间编写他的提供程序 Maikebing.EntityFrameworkCore.Taos
    • PinusDB 国产松果时序数据库, 简单易用, 我们也为他编写了提供程序, PinusDB.Data
    • TimescaleDB 基于PostgreSQL的时序数据库, 你可以直接选择它来当时序数据库也可以当关系型数据库, 一次搞定。
    • 关系数据库 分区法 , 我们有支持这种方式,但始终不推荐,除非你想只想用一个数据库且通过分区就能搞定你的数据量。
    • SingleTable 通过EF的的单表存储。 通过单表, 我们就不需要依赖于数据库或者分区等等。 小项目推荐。
  • 消息队列 我们是通过CAP项目来实现的,因此它支持的理论上我们都支持。
    • RabbitMQ 我们推荐的。
    • Kafka 测试似乎正常。
    • ZeroMQ 针对出门的ZeroMQ , 我们编写了MaiKeBing.CAP.ZeroMQ 和 MaiKeBing.HostedService.ZeroMQ 以支持它。
    • InMemory 通过它可以不需要依赖任何外接, 这是CAP提供的一种途径。 小项目推荐。
  • 消息队列存储
    • PostgreSql 如果全称用PostgreSQL 可以考虑。
    • MongoDB 我们推荐的
    • LiteDB .Net 编写的NoSQL 项目, 小项目推荐,
    • InMemory 存储在内存, 不依赖于外接。 小项目推荐。

如何部署?

如何使用docker-compose 安装IoTSharp ?

  • RMI 使用Rabbitmq 作为 EventBus, Mongodb 作为消息存储, 遥测数据使用Influx 2.0 ,这个方案中遥测数据也可以使用TDengine

  • ZPT 使用ZeroMQ 作为 EventBus, PostgreSQL 作为消息存储, 遥测数据使用 TDengine

  • ZPS 默认开发配置, IoTSharp 和 PostgreSql, 遥测数据可以通过单表或者分表。

初次使用

  • 初始租户和管理员、用户注册信息在系统发现你未初始化时自动跳转到安装界面, 填写完成后, 系统会初始化权限、基础数据等种子数据。
  • X509 CA证书用于通过证书进行保障安全通讯和关系验证, 第一次时需要调用高级管理员权限办法并写入系统, 尤其是当你使用了非管理员用户进行启动IoTSharp 时 , 因此, 需要确保第一次生成使用高权限, 后续使用低权限。

关于赞助

  • 我们接受资金以及任何方式的的捐赠,但并不意味着我们会为您承诺或担保任何事情, 也并不意味着对你使用IoTSharp带来的负面影响负有责任。 所有你使用IoTSharp造成的任何损失以及任何关联的责任等我们均不会有任何责任和义务承担,你需要为你做的决定而负责。
  • IoTSharp开源并不等于你可以用他申报项目、申请专利、提供云服务、重新包装等某种其他方式来获利但对IoTSharp毫无建树。 我们讨厌这种自私行为。
+ \ No newline at end of file diff --git a/docs/tutorial-basics/aggregate/index.html b/docs/tutorial-basics/aggregate/index.html index aa569ce3..be934482 100644 --- a/docs/tutorial-basics/aggregate/index.html +++ b/docs/tutorial-basics/aggregate/index.html @@ -6,13 +6,13 @@ 遥测数据聚合 | IoTSharp 在线文档 - +

遥测数据聚合

对于物联网平台来说, 聚合是非常重要的数据查询方式, IoTSharp支持指定时间段、遥测、聚合断面、聚合方式等, IoTSharp提供了统一的接口 /api/Devices/id/TelemetryData 来完成这一点。

参数示例如下:


{ "keys": "", "begin": "2022-03-23T11:44:56.488Z", "every": "1.03:14:56:166", "aggregate": "Mean" }

keys 指定了要查询那些遥测, begin 和 end决定了时间范围, end可以忽略, 但是begin必须存在, every 决定了返回的数据与数据之间的时间间隔, 比如每五分钟一条数据, 或者每1秒钟一条数据, aggregate决定了是取最大值?中值 ?或者其他。

支持情况

注意

` 目前只支持了InfluxDB 和IoTDB 其他数据库根据我们内部或者其他贡献者的项目需求而定。

- + \ No newline at end of file diff --git a/docs/tutorial-basics/debug/index.html b/docs/tutorial-basics/debug/index.html index 036819b9..9f8327a5 100644 --- a/docs/tutorial-basics/debug/index.html +++ b/docs/tutorial-basics/debug/index.html @@ -6,7 +6,7 @@ 如何调试IoTSharp? | IoTSharp 在线文档 - + @@ -14,7 +14,7 @@

如何调试IoTSharp?

本教程使用rabbit_mongo_influx 方式进行源码运行

注意

编译运行要在docker运行的基础上进行,因为需要使用rabbitmq、mongo、influxdb等应用; 要先停止容器中的iotsharp,建议直接使用VS打开解决方案, 设置docker-compose 为启动项。这样Vs会自动启动相应的容器, 并将IoTSharp设置为调试模式。

docker stop iotsharp
注意

另外前端使用angular,需要安装node、npm或yarn才可以进行前端编译,如果项目启动时无法跳转至前端界面, 那么在VS启动项目之前需要先 npm install -g @angular/cli@13.3.7

我的node版本v16.13.1,npm版本8.1.2,yarn版本1.22.17,可用

生成解决方案

打开解决方案IoTSharp.sln

先生成解决方案,第一次生成ng的前端比较慢

修改配置文件

/IoTSharp/IoTSharp/appsettings.Development.json
{
"ConnectionStrings": {
"IoTSharp": "Server=127.0.0.1;Database=IoTSharp;Username=postgres;Password=future;Pooling=true;MaxPoolSize=1024;",
"EventBusStore": "mongodb://root:kissme@127.0.0.1:27017",
"TelemetryStorage": "http://127.0.0.1:8086/?org=iotsharp&bucket=iotsharp-bucket&token=iotsharp-token&&latest=-72h",
"EventBusMQ": "amqp://root:kissme@127.0.0.1:5672"
},
"DataBase": "PostgreSql",
"EventBusStore": "MongoDB",
"EventBusMQ": "RabbitMQ",
"TelemetryStorage": "InfluxDB"
}
注意

一定要把influx的连接字符串中的iotsharp-token换成自己的token

源码启动

IoTSharp项目设为启动项目,运行

源码启动

访问后台前端

默认的后台部分页面访问地址默认的是 http://localhost:5000 ,会涉及到swagger 以及健康检查等页面

访问后台前端

访问前端

前端会在项目启动后开始开始自动编译,浏览器会打开一个 等待页面, 此页面等待直到前端就绪, 然后会重定位到前端部分。 新的前端SPA采用.Net 6.0在中的新方法, 因此等待不会像之前那么久。

访问前端

- + \ No newline at end of file diff --git a/docs/tutorial-basics/deploy/index.html b/docs/tutorial-basics/deploy/index.html index 72bec753..5adeb912 100644 --- a/docs/tutorial-basics/deploy/index.html +++ b/docs/tutorial-basics/deploy/index.html @@ -6,7 +6,7 @@ 如何部署IoTSharp? | IoTSharp 在线文档 - + @@ -14,7 +14,7 @@

如何部署IoTSharp?

本教程使用rabbit_mongo_influx 方式进行部署

修改docker-compose.yml文件

注意

influxdb_cli容器的相关配置,通过此命令行容器,初始化influxdb, 初始化之前需要提前设置好token等,如果自己自行配置, 则直接删除此配置即可。

/IoTSharp/Deployments/rabbit_mongo_influx/docker-compose.yml
influxdb_cli:
links:
- influx
image: quay.io/influxdb/influxdb:v2.0.4
entrypoint: influx setup --bucket iotsharp-bucket -t iotsharp-token -o iotsharp --username=root --password=1-q2-w3-e4-r5-t --host=http://influx:8086 -f
restart: on-failure:20
depends_on:
- influx

启动容器

进入/IoTSharp/Deployments/rabbit_mongo_influx,执行

docker-compose up -d

看到下图说明运行成功 docker-compose启动成功

初始化influxdb

浏览器访问 http://localhost:8086/,初始化influxdb

初始化influxdb

Org: iotsharp Bucket: iotsharp-bucket

然后点Config Later

创建token

添加token

复制token

复制token

修改配置文件

/IoTSharp/Deployments/rabbit_mongo_influx/appsettings.Production.json
"TelemetryStorage":"http://influx:8086/?org=iotsharp&bucket=iotsharp-bucket&token=iotsharp-token&&latest=-72h",

iotsharp-token修改为你的真实token

重启IoTSharp容器

命令行执行

docker restart iotsharp

注册

Chrome浏览器访问 http://localhost:2927/

注册

访问

注册后登入进入首页 访问

- + \ No newline at end of file diff --git a/docs/tutorial-basics/gateway/index.html b/docs/tutorial-basics/gateway/index.html index 1edcf0e7..1fc30a45 100644 --- a/docs/tutorial-basics/gateway/index.html +++ b/docs/tutorial-basics/gateway/index.html @@ -6,14 +6,14 @@ 如何对接第三方网关? | IoTSharp 在线文档 - +

如何对接第三方网关?

本教程使用iotgateway 进行演示设备输入的接入 ,源码地址 https://github.com/iioter/iotgateway

添加网关

注意设备类型认证方式 添加网关

复制网关token

复制网关token

修改网关配置

修改网关配置

刷新iotsharp页面

IoTSharp设备列表可以看到,一个网关2个设备均已在线

设备在线

- + \ No newline at end of file diff --git a/docs/tutorial-basics/influxdb/index.html b/docs/tutorial-basics/influxdb/index.html index bb30f645..bec0e86f 100644 --- a/docs/tutorial-basics/influxdb/index.html +++ b/docs/tutorial-basics/influxdb/index.html @@ -6,13 +6,13 @@ 如何查询遥测源数据? | IoTSharp 在线文档 - +

如何查询遥测源数据?

遥测数据存储方式有很多种, 这里暂时只介绍 InfluxDB 的查询方法

浏览器访问 http://localhost:8086/

注意, 地址取决于你安装地址, 或者容器的映射地址。 一些情况下遥测数据能存储在InfluxDB之前, 你可能需要手动创建taken等填写到配置文件中。

influxdb数据

- + \ No newline at end of file diff --git a/docs/tutorial-basics/iotsharp/index.html b/docs/tutorial-basics/iotsharp/index.html index 95551dc6..13b2210e 100644 --- a/docs/tutorial-basics/iotsharp/index.html +++ b/docs/tutorial-basics/iotsharp/index.html @@ -6,13 +6,13 @@ IoTSharp是什么? | IoTSharp 在线文档 - +

IoTSharp是什么?

IoTSharp是一个基于 .Net 6.0 使用C#语言编写的以实现可见与不可见的物理设备数字孪生物联网平台, 什么是数字孪生?

属性数据(Attributes Data)

显示设备中类似于型号, 性别或者串口、IP地址等设备上固定的信息我们称之为属性数据。 属性数据分三侧如下:

  • 客户侧属性 型号、性别等固定属性从设备中采集到的称之为客户端侧属性
  • 服务侧属性 姓名、用途、归于哪一个资产旗下的标识等这些服务端定义的属性就是服务侧属性。
  • 任意侧属性 类似串口配置, IP地址配置等服务端定义需要下发到客户端的数据称之为任意侧属性。

遥测数据 (Telemetry Data)

遥测数据类似温度、湿度、气压、电压、年龄 体温 等不停的在变化的我们均称之为遥测数据, 这些数据主要以时序方式存储,你可以将其用于基于时间序列的预测, 也可以统计分析环比,利用大数据工具探索这些数据之前的关系等等。 或者提供图表等可视化展示等等。

远程控制(RPC)

比如 灯 , 我们拥有他的属性瓦数,拥有他的遥测数据亮度和耗电量, 远程控制就是灯的开关功能我们称之为远程控制, 远程控制分服务单向、双向和客户端远程控制。 以下分别介绍:

  • 服务端单向控制 业务层调用IoTSharp提供的统一API,调用后直接返回,不等待设备返回,实际结果一般是通过遥测数据体现, 假设 空调温度, 你控制空调将温度设置为31°, 效果则从遥测反馈的结果来体现。

  • 服务端双向控制 业务层调用IoTSharp后,需要等待设备响应结果, 比如, 灯泡的开关控制了打开, 我们需要可靠的知道控制灯泡的开关是否确实打开了灯泡,并告诉服务端结果, 结果包括成功、失败、为什么失败, 或者超时。

  • 客户端远程控制 比如, 一个报警按钮, 按下报警按钮后, 信息发送到IoTSharp , IoTSharp 通过远程控制的规则链调用了你事先提供的接口后,将结果提供给客户端, 客户端确认无误,这样一个过程就叫 客户端远程控制。

    规则链

    IoTSharp提供的规则链功能具有非常丰富的自定义能力和脚本支持能力, 类似一个流程图, 数据先进入到某个规则链, 这个规则链的起点中IoTSharp将数据转换为一个对象, 然后 你可以连接多个 任务块, 连接线上的动态表达式结果决定了需要将数据转交给后面的那些任务块, 在后面的任务块收到对象数据后, 任务块中你实现指定的脚本开始发挥作用, 这些脚本可以是前端最熟悉的JS,也可以是C#, 也可以是Python, 也可以是 SQL、当然, 你也可以装载C#写动态库,或者是我们预制的功能。 这些任务块有输入, 有输出, 输出依然为一个对象数据, 如果输出上依然连接有连接线, 那么开始计算条件 走向下一个任务块, 否则就算结束。

- + \ No newline at end of file diff --git a/docs/tutorial-basics/sourcecode/index.html b/docs/tutorial-basics/sourcecode/index.html index 7e2e17b8..79e91f52 100644 --- a/docs/tutorial-basics/sourcecode/index.html +++ b/docs/tutorial-basics/sourcecode/index.html @@ -6,13 +6,13 @@ 在哪里下载源码? | IoTSharp 在线文档 - +

在哪里下载源码?

根据你的网络环境, 可以通过多个渠道下载。

使用Git拉取源码

Git 克隆

git clone https://github.com/IoTSharp/IoTSharp.git

另外, 也可以在GitHub或者Gitee上下载ZIP获取源代码。

- + \ No newline at end of file diff --git a/docs/tutorial-basics/webapi/index.html b/docs/tutorial-basics/webapi/index.html index 140f60cb..30e60aab 100644 --- a/docs/tutorial-basics/webapi/index.html +++ b/docs/tutorial-basics/webapi/index.html @@ -6,14 +6,14 @@ webapi查询遥测 | IoTSharp 在线文档 - + - + \ No newline at end of file diff --git a/docs/tutorial-extras/http/index.html b/docs/tutorial-extras/http/index.html index c3018854..bb1e03f5 100644 --- a/docs/tutorial-extras/http/index.html +++ b/docs/tutorial-extras/http/index.html @@ -6,13 +6,13 @@ Http协议 | IoTSharp 在线文档 - +

Http协议

IoTSharp支持Http协议上传遥测数据, 可以通过标准接口, 也可以通过在属性里设置 映射方式 接收数据, 也可以通过规则链进行解析数据然后再推送的指定数据。

IoTSharp直连设备和常规网关设备的数据上传

PushDataToMap

PushDataToMap 是 RawDataGateway 的Http接口,同样, 在Mqtt里面也支持它。

- + \ No newline at end of file diff --git a/docs/tutorial-extras/mqtt/index.html b/docs/tutorial-extras/mqtt/index.html index 7dcef941..86224bec 100644 --- a/docs/tutorial-extras/mqtt/index.html +++ b/docs/tutorial-extras/mqtt/index.html @@ -6,14 +6,14 @@ MQTT协议 | IoTSharp 在线文档 - +

MQTT协议

本文章介绍如何通过MQTT进行遥测和属性数据上传以及RPC控制的实现。

发送属性和遥测数据

设备分直连设备和网关设备, 发送数据方式也有所不同。 telemetry 为 遥测, attributes表示属性,客户端上传的属性在服务器端永远为 ClientSide , 即客户端侧属性。 不推荐在服务端修改。

连接直连设备或者网关

通过 mqtt客户端连接mqtt服务器,用户名填写 token, 密码可以为空。

直连设备发送遥测数据

devices/me/telemetry
devices/me/attributes

MQTT的负载为如下格式

{
"stringvalue":"here is strvalue",
"intvalue":234
}

网关设备发送遥测数据

devices/{设备名称}/telemetry
devices/{设备名称}/attributes

{设备名称} 则是隶属当前网关设备处理的设备名称。 MQTT的负载为如下格式

{
"stringvalue":"here is strvalue",
"intvalue":234
}

网关子设备的上线与已下线

gateway/connect
gateway/disconnect

注意, 这里直接兼容

v1/gateway/connect
v1/gateway/disconnect

网关设备批量发送设备遥测数据和属性数据

gateway/telemetry
gateway/attributes

注意, 这里直接兼容

v1/gateway/telemetry
v1/gateway/attributes

批量发送数据格式如下:

{
"subdevice1": [
{
"ts": 637834108219892435,
"devicestatus": 0,
"values": {
"string": "this string",
"float": 22.222
}
}
],
"subdevice2": [
{
"ts": 637834108219892435,
"devicestatus": 0,
"values": {
"intvalue": 22
}
}
]
}

这里是一个C#合成批量上传的例子

 Dictionary<string, List<Playload>> pairs = new Dictionary<string, List<Playload>>();
var plst = new List<Playload>();
var values = new Dictionary<string, object>();
values.Add("string", "this string");
values.Add("intvalue",22);
plst.Add(new Playload() { DeviceStatus = DeviceStatus.Good, Ticks = DateTime.Now.Ticks, Values = values });
values.Add("float", 22.222);
plst.Add(new Playload() { DeviceStatus = DeviceStatus.Bad, Ticks = DateTime.Now.Ticks, Values = values });
pairs.Add("subdevice1",plst);
pairs.Add("subdevice2", plst);
var str= Newtonsoft.Json.JsonConvert.SerializeObject(pairs);
Console.WriteLine(str);

订阅属性

直连设备请求属性

发布请求

  devices/me/attributes/request/{请求唯一标识}

订阅结果

 devices/me/attributes/response/{请求唯一标识}

网关设备请求属性

发布请求

  devices/{设备名称}/attributes/request/{请求唯一标识}

订阅结果

 devices/{设备名称}/attributes/response/{请求唯一标识}

发起上行RPC远程控制

上行RPC控制是指 终端设备远程调用服务端的内容, IoTSharp 收到此请求则调用规则链, 你可以在规则链中处理此请求, 关于规则链请查看相关章节。

  devices/{设备名称}/rpc/request/{方法名称}

设备名称这里如果是直连设备, 则为me, 如果是网关设备, 则是设备名称, {方法名称}用于区别调用了何种方法, 这里交由规则链处理。 通过规则链, 你可以调用 内部服务, 也可以调用外部服务等, 发挥你的想象就好。

发起下行RPC远程控制

下行RPC是指平台端或者第三方服务调用IoTSharp进行远程控制终端设备的方法。

通过MQTT发起时, 先订阅response, 然后发布request。

 devices/{设备名称}/rpc/request/{方法名称}/{请求唯一标识}
devices/{设备名称}/rpc/response/{方法名称}/{请求唯一标识}

RawDataGateway

在Mqtt中我们通过topic gateway/json 和 gateway/xml 来支持 RawDataGateway 解析。

第三方服务调用时我们建议通过通过 Web Api 发起, 示例如下

curl -X 'POST' \
'https://cloud.iotsharp.net/api/Devices/{设备的TOKEN}/Rpc/{方法名称}?timeout={超时时间}' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '"{参数, 可以是json}"'

- + \ No newline at end of file diff --git a/docs/tutorial-extras/raw_data_gateway/index.html b/docs/tutorial-extras/raw_data_gateway/index.html index d99e9457..b71ef0a5 100644 --- a/docs/tutorial-extras/raw_data_gateway/index.html +++ b/docs/tutorial-extras/raw_data_gateway/index.html @@ -6,7 +6,7 @@ 原生数据推送网关 | IoTSharp 在线文档 - + @@ -14,7 +14,7 @@

原生数据推送网关

http 协议

在Http协议中使用 接口 PushDataToMap 来实现, 并通过设置网关的属性值让接口自动解析下面的数据, 如果是文本包含字符串json也可以通过配置进行处理。 http 请求

curl --location --request POST  'http://cloud.iotsharp.net/api/Devices/{网关Token}/PushDataToMap/json' \
--header 'Content-Type: application/json' \
--data-raw '{
"dev_id": "2021082640",
"volt": 0,
"sample_time": "2022-03-17 15:21:47",
"datas": [
{
"point_name": "2",
"mon_type": 4,
"dev_type": 10,
"depth": 0,
"data1": 0
}
]
}'

样例数据 如下:

{"dataType":"1","dataJson":"{\"serialNumber\":\"12003378\",\"uploadDate\":\"2022-03-20 22:22:19\",\"pm25\":21,\"pm10\":26,\"windSpeed\":25,\"windDirection\":14,\"noise\":46,\"temperature\":60,\"humidity\":900,\"sprayStatus\":0,\"warnReason\":64}"}

属性配置参考

  1. map_to_attribute{映射到子设备的属性名称} 属性值为在当前json中的路径。 例如:
    _map_to_attribute_currentAllowWeight    currentAllowWeight   
    _map_to_attribute_driverCardNo driverCardNo
    _map_to_attribute_version version

2. _map_to_devname 指定设备的名称使用哪个字段
3. _map_to_devname_format 指定设备名称的格式,可用的变量有 $devname 和 $subdevname, 格式内容为 hf_crane_$devname
4. _map_to_jsontext_in_json 指定如果是文本类型的将自动将字符串转为json,示例中为: dataJson
5. _map_to_telemetry_{映射到子设备中的遥测名称}

_map_to_telemetry_windSpeed windSpeed

 6. _map_to_subdevname 二级关联
7. _map_to_data_in_array 如果子设备数据在某个数组占用, 则这里指定。

注意, 当_map_to_data_in_array 指定了字段时 , 使用 '@' 的字段指定的是 根json路径, 不使用 则表示当前数组元素中的路径。
_map_to_data_in_array和_map_to_jsontext_in_json只能使用其中一种, 不能重合。
- + \ No newline at end of file diff --git a/index.html b/index.html index eebc0b80..cc7c4735 100644 --- a/index.html +++ b/index.html @@ -6,13 +6,13 @@ IoTSharp 在线文档 | IoTSharp 在线文档 - +

IoTSharp 在线文档

IoTSharp is an open-source IoT platform for data collection, processing, visualization, and device management.

数字孪生

IoTSharp 通过服务侧、客户端侧属性、遥测数据、RPC等实现了数字孪生, 实现了所有设备统一接口提供给业务调用。

docu_tree

规则链

IoTSharp 允许你通过JS、C#、Lua、Python、SQL等脚本处理数据并结合动态Linq表达式处理节点与节点之间的走向以实现数据清洗、告警、事件等相应手段, 也可以将网关数据通过规则链合成真正的数字孪生设备。

多样性

IoTSharp 重复考虑到物联网架构的重要性,因此我们具有丰富的中间件支持,比如消息中间件(RabbitMQ、RabbitMQ、Kafka、ZeroMQ)进行处理、也支持多种时序数据库(InfluxDB、Taos、TimescaleDB)存储和处理遥测数据。基础数据我们支持多种关系型数据库(MySQl、PostgreSQL、Oracle、Sql Server、Sqlite)

- + \ No newline at end of file diff --git a/markdown-page/index.html b/markdown-page/index.html index f0c6b947..07afbf24 100644 --- a/markdown-page/index.html +++ b/markdown-page/index.html @@ -6,13 +6,13 @@ Markdown page example | IoTSharp 在线文档 - +

Markdown page example

You don't need React to write simple standalone pages.

- + \ No newline at end of file -- GitLab