{"componentChunkName":"component---src-templates-blog-detail-tsx","path":"/blog/2019-07-04-online-formaldehyde-monitoring-system","result":{"data":{"currentBlog":{"id":"d6260dcf-6000-54c1-82c8-1e96f13d0f2b","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/qianyi/b96CibCt70iaaJcib7FH02wTKvoHALAMw4f553WgrmrmItKmjkMfO2fI0YJcpdO2WibwHXYAOGZyMaQruxD3skk7icQ.jpg","authors":["ecky"],"categories":["user-stories"],"date":"2019-07-04T00:00:00.000Z","title":"基于「树莓派+腾讯云」的在线甲醛监测系统","description":"本文详述腾讯云多产品组合设计和体验报告 之 “树莓派+腾讯云=在线甲醛监测系统”。涉及腾讯云产品：API网关、无服务器云函数、云数据库、腾讯云图。","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["树莓派","Serverless"],"keywords":"Serverless,serverless framework,腾讯云serverless","outdated":null},"wordCount":{"words":378,"sentences":118,"paragraphs":118},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-07-04-online-formaldehyde-monitoring-system.md","fields":{"slug":"/blog/2019-07-04-online-formaldehyde-monitoring-system/","keywords":["go","java","python","serverless","无服务器","无服务器云函数","云函数","javascript","serverlesscloud"]},"html":"<p>扔掉小瓶盖，腾讯云带你体验在线甲醛监测系统！本文详述腾讯云多产品组合设计和体验报告 之 “树莓派+腾讯云=在线甲醛监测系统”。涉及腾讯云产品：API网关、无服务器云函数、云数据库、腾讯云图。</p>\n<blockquote>\n<p><strong>正文</strong></p>\n</blockquote>\n<p>身边朋友在装修新房，顺便来吐槽甲醛检测麻烦，比如 有检测无监测（一次性），比如测试复杂（现场+人工）等等。刚好做为云产品经理，经常想的就是如何了解和验证多云产品组合方案的可用性问题，索性结合一下，直接把这个需求上云，然后就有了这套系统。老规矩，先上结论。</p>\n<blockquote>\n<p><strong>系统概要</strong></p>\n</blockquote>\n<h3 id=\"产品设计特性\"><a href=\"#%E4%BA%A7%E5%93%81%E8%AE%BE%E8%AE%A1%E7%89%B9%E6%80%A7\" aria-label=\"产品设计特性 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>产品设计特性</strong></h3>\n<ul>\n<li>原型验证：验证多产品联动效果与开发成本。</li>\n<li>软硬结合：扩展云端能力至线下物理环境。</li>\n<li>能力扩展：serverless分离云端与终端，独立扩展云监控、消息队列等其它产品。</li>\n<li>通用架构：云端使用通用数据结构及接口，免开发即对接各种监测数据上报。</li>\n<li>弱环境要求：可PoE供电，5V/0.5A低功耗可长期运行。</li>\n</ul>\n<h3 id=\"系统组成\"><a href=\"#%E7%B3%BB%E7%BB%9F%E7%BB%84%E6%88%90\" aria-label=\"系统组成 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>系统组成</strong></h3>\n<p><em>终端：终端组件</em></p>\n<ul>\n<li>RaspberryPi 3B+（raspbian-stretch-lite/GPIO接口/python2.7)</li>\n<li>UART-CH2O传感器（UART接口）</li>\n<li>128X32 OLED屏 SSD1306芯片（I2C接口）</li>\n</ul>\n<p>注：RaspberryPi后续简写为Rpi</p>\n<p><em>云端：腾讯云产品</em></p>\n<ul>\n<li>腾讯云 API网关</li>\n<li>腾讯云 无服务器云函数</li>\n<li>腾讯云 云数据库 Mysql</li>\n<li>腾讯云 腾讯云图</li>\n</ul>\n<h3 id=\"效果展示\"><a href=\"#%E6%95%88%E6%9E%9C%E5%B1%95%E7%A4%BA\" aria-label=\"效果展示 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>效果展示</strong></h3>\n<p><em>腾讯云图</em></p>\n<p><img src=\"https://img.serverlesscloud.cn/qianyi/b96CibCt70iaaJcib7FH02wTKvoHALAMw4fgzEuBERygLb3q5GPrpYJxxtLuXNJDCduKvkSTjHBdxmHxPApzb96xA.jpg\"></p>\n<p><em>终端组件</em></p>\n<p><img src=\"https://img.serverlesscloud.cn/qianyi/b96CibCt70iaaJcib7FH02wTKvoHALAMw4f553WgrmrmItKmjkMfO2fI0YJcpdO2WibwHXYAOGZyMaQruxD3skk7icQ.jpg\"></p>\n<p>当前版本中，Rpi 使用wifi 连接互联网（也可使用有线网），故此处上云有网络依赖。</p>\n<h3 id=\"传感器原理与功能定位\"><a href=\"#%E4%BC%A0%E6%84%9F%E5%99%A8%E5%8E%9F%E7%90%86%E4%B8%8E%E5%8A%9F%E8%83%BD%E5%AE%9A%E4%BD%8D\" aria-label=\"传感器原理与功能定位 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>传感器原理与功能定位</strong></h3>\n<p><em>UART-CH2O传感器</em></p>\n<ul>\n<li>原理：电化学传感器通过与被测气体发生反应并产生与气体浓度成正比的电信号来工作。</li>\n<li>优点：简单易操作</li>\n<li>缺点：非定量分析法，受温湿度、其它气体干扰准确度，且需要较准。</li>\n<li>结论：以长期使用后的房间环境做为基准，进行0基准点参考。用于温湿度差异不大的环境下，提供实时监测（相对值），并附加长期趋势分析。</li>\n</ul>\n<blockquote>\n<p><strong>设计与实现</strong></p>\n</blockquote>\n<h3 id=\"产品设计与技术策略\"><a href=\"#%E4%BA%A7%E5%93%81%E8%AE%BE%E8%AE%A1%E4%B8%8E%E6%8A%80%E6%9C%AF%E7%AD%96%E7%95%A5\" aria-label=\"产品设计与技术策略 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>产品设计与技术策略</strong></h3>\n<p>设计过程中，也进行了产品生命周期的思考，尝试进行了产品长短期设计的分析与定义（暂不展开，后续有时间写一下）。</p>\n<p>确认了形态目标后，遵循下面几个基本原则，进行具体技术设计：</p>\n<ul>\n<li>分级可用：避免单环故障，系统全面崩溃</li>\n<li>读写分离：便于后续调试、优化、更新版本</li>\n<li>远程维护：避免出现场处理异常</li>\n</ul>\n<h3 id=\"概要架构图\"><a href=\"#%E6%A6%82%E8%A6%81%E6%9E%B6%E6%9E%84%E5%9B%BE\" aria-label=\"概要架构图 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>概要架构图</strong></h3>\n<p><img src=\"https://img.serverlesscloud.cn/qianyi/b96CibCt70iaaJcib7FH02wTKvoHALAMw4f8JMUrO0qsyllIiahf4bno7rUGiaN1LbDhBUp5OlIQiajwLa8OCIaGjXRA.jpg\"></p>\n<p>从架构看来</p>\n<ul>\n<li>云端部分：由于云产品的能力提供了各种便利，学习和搭建成本很低。</li>\n<li>终端部分：需要多考虑免维护与自动恢复，各项工作内容稍多一些。</li>\n</ul>\n<h3 id=\"分级可用目标\"><a href=\"#%E5%88%86%E7%BA%A7%E5%8F%AF%E7%94%A8%E7%9B%AE%E6%A0%87\" aria-label=\"分级可用目标 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>分级可用目标</strong></h3>\n<p>4.本地实时展示+本地缓存+数据上云 +云端显示。</p>\n<p>3.本地实时展示+本地缓存+数据上云。云图异常。</p>\n<p>2.本地实时展示+本地缓存。上云通路异常。</p>\n<p>1.本地实时展示。本地sqlite异常。</p>\n<p>0.本地无展示。硬件故障或断电。</p>\n<h3 id=\"硬件接线与打开系统接口\"><a href=\"#%E7%A1%AC%E4%BB%B6%E6%8E%A5%E7%BA%BF%E4%B8%8E%E6%89%93%E5%BC%80%E7%B3%BB%E7%BB%9F%E6%8E%A5%E5%8F%A3\" aria-label=\"硬件接线与打开系统接口 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>硬件接线与打开系统接口</strong></h3>\n<p><strong>Rpi GPIO</strong></p>\n<p><em>GPIO</em></p>\n<p>(General-purpose input/output)即通用IO接口，是一种常见的端口扩展器，树莓派使用的是40针的GPIO接口。</p>\n<p><em>RPI GPIO图示</em></p>\n<p><img src=\"https://img.serverlesscloud.cn/qianyi/b96CibCt70iaaJcib7FH02wTKvoHALAMw4f3XudpZ9dHRqDrpWMngFukLDAaFU62LbjFDed3PcF2S67YBp2DsrU0A.jpg\"></p>\n<p><strong>UART-CH2O</strong></p>\n<p><img src=\"https://img.serverlesscloud.cn/qianyi/j3gficicyOvavXLTR2QfHtSID5OWgnGvtCHmv6Nq2bo0CiahlPqiayWSPyd5MnOFlIvrRdG2iaNJrs2rw6I0zEgiajBA.jpg\"></p>\n<p>注：本次使用传感器，硬件接口是1.25mm端子，Rpi是2.5mm端子，使用了 7P1.25转2.5杜邦线，进行连接</p>\n<p><strong>OLED</strong></p>\n<p><em>接线方式(I2C协议)</em></p>\n<p><img src=\"https://img.serverlesscloud.cn/qianyi/j3gficicyOvavXLTR2QfHtSID5OWgnGvtCXouiaibibbdVDYaTLf98BWwqWJ7A0ficdDgoVDZCYOtYGaX894z1hmxszQ.jpg\"></p>\n<p><em>打开I2C接口</em></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"59804293789917080000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`raspi-config`, `59804293789917080000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">raspi<span class=\"token operator\">-</span>config</code></pre></div>\n<p>按下图打开I2C接口</p>\n<p><img src=\"https://img.serverlesscloud.cn/qianyi/b96CibCt70iaaJcib7FH02wTKvoHALAMw4fmVEacqX8hobPyxS0iby0bsjNTuYF9XOK2GwG7crynHw6MTJSiaznjbPA.jpg\"></p>\n<p><img src=\"https://img.serverlesscloud.cn/qianyi/b96CibCt70iaaJcib7FH02wTKvoHALAMw4fSVgOdY3iataWicaURvMoDjET5tciac8WvztRbdlzrlEWFibQiaPLUnEjqZA.jpg\"></p>\n<p><img src=\"https://img.serverlesscloud.cn/qianyi/b96CibCt70iaaJcib7FH02wTKvoHALAMw4f3sKibAjjBy5EC7tbQQvRiabLvtDPKDuk2RicqURx9UibP51g3jeVDMDNHQ.jpg\"></p>\n<p>测试执行</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"5630772296590192000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`i2cdetect -y 1`, `5630772296590192000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">i2cdetect <span class=\"token operator\">-</span>y <span class=\"token number\">1</span></code></pre></div>\n<p><img src=\"https://img.serverlesscloud.cn/qianyi/b96CibCt70iaaJcib7FH02wTKvoHALAMw4fQxxFfbSXmbNbXD06pwe1Xh9ocdW7EYV1ibH0Hkiau0pbLP5bibmiaT7icJA.jpg\"></p>\n<p>看到 3C 即识别硬件成功</p>\n<h3 id=\"本地开发与配置\"><a href=\"#%E6%9C%AC%E5%9C%B0%E5%BC%80%E5%8F%91%E4%B8%8E%E9%85%8D%E7%BD%AE\" aria-label=\"本地开发与配置 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>本地开发与配置</strong></h3>\n<p>本文暂仅放出关键代码(硬件操作部分)，便于大家撸硬件。完整包(代码+配置) 稍后放出，请关注 github/DemoOnTencentCloud。</p>\n<p><strong>环境配置</strong></p>\n<ul>\n<li>启动对时：rc.local 增加 nptdata cn.ntp.org.cn。避免重启后时间错位，监测错位。</li>\n<li>启动拉起：getdata.py oled.py 需持续在线。</li>\n<li>定时检测：getdata.py oled.py cron每分钟判断活性，进程挂掉即拉起。</li>\n<li>定时同步：sync.py cron每分钟执行</li>\n<li>远程维护：使用ssh tunnel 的 Remote Port Forwarding 模式，进行反向代理。</li>\n</ul>\n<p><strong>ssh tunnel</strong></p>\n<p>此处使用 autossh 进行连接，autossh可完成建立通道与监控通道的工作，通道断开后，可自主重连。远端连接云主机，之后可以云主机为跳板，反向代理访问NAT环境Rpi设备。</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"56160020901616090000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`bash autossh -M 监控端口 -R 远程通信端口:localhost:22 账号名@远程IP或域名 -p端口号 -i 账号KEY -o serveraliveinterval=60 -N -f`, `56160020901616090000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">bash autossh <span class=\"token operator\">-</span><span class=\"token constant\">M</span> 监控端口 <span class=\"token operator\">-</span><span class=\"token constant\">R</span> 远程通信端口<span class=\"token punctuation\">:</span>localhost<span class=\"token punctuation\">:</span><span class=\"token number\">22</span> 账号名@远程<span class=\"token constant\">IP</span>或域名 <span class=\"token operator\">-</span>p端口号 <span class=\"token operator\">-</span>i 账号<span class=\"token constant\">KEY</span> <span class=\"token operator\">-</span>o serveraliveinterval<span class=\"token operator\">=</span><span class=\"token number\">60</span> <span class=\"token operator\">-</span><span class=\"token constant\">N</span> <span class=\"token operator\">-</span>f</code></pre></div>\n<p>连接时，在云主机执行</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"63474522507826766000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`bash ssh -p 远程通信端口 localhost`, `63474522507826766000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">bash ssh <span class=\"token operator\">-</span>p 远程通信端口 localhost</code></pre></div>\n<p><strong>getdata.py</strong></p>\n<p>获取传感器读数代码（完整代码待放出 github/DemoOnTencentCloud）</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"63255756638058540000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import serial\nfrom time import sleep\n\nser=serial.Serial(&quot;/dev/serial0&quot;,9600)\n\nwhile True :\n    r_data = ser.read()\n    sleep(0.3)\n    data_left = ser.inWaiting()\n    r_data += ser.read(data_left)\n    if 9 != len(r_data):\n        print 'error length: %d'%len(r_data)\n        continue\n    else:\n        n=ord(r_data[4])*256+ord(r_data[5])\n        updatedata(n/1000.0) # ppm = n/1000.0`, `63255756638058540000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> serial\n<span class=\"token keyword\">from</span> time <span class=\"token keyword\">import</span> sleep\n\nser<span class=\"token operator\">=</span>serial<span class=\"token punctuation\">.</span><span class=\"token function\">Serial</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/dev/serial0\"</span><span class=\"token punctuation\">,</span><span class=\"token number\">9600</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">while</span> True <span class=\"token punctuation\">:</span>\n    r_data <span class=\"token operator\">=</span> ser<span class=\"token punctuation\">.</span><span class=\"token function\">read</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">0.3</span><span class=\"token punctuation\">)</span>\n    data_left <span class=\"token operator\">=</span> ser<span class=\"token punctuation\">.</span><span class=\"token function\">inWaiting</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    r_data <span class=\"token operator\">+=</span> ser<span class=\"token punctuation\">.</span><span class=\"token function\">read</span><span class=\"token punctuation\">(</span>data_left<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">if</span> <span class=\"token number\">9</span> <span class=\"token operator\">!=</span> <span class=\"token function\">len</span><span class=\"token punctuation\">(</span>r_data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        print <span class=\"token string\">'error length: %d'</span><span class=\"token operator\">%</span><span class=\"token function\">len</span><span class=\"token punctuation\">(</span>r_data<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">continue</span>\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        n<span class=\"token operator\">=</span><span class=\"token function\">ord</span><span class=\"token punctuation\">(</span>r_data<span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">256</span><span class=\"token operator\">+</span><span class=\"token function\">ord</span><span class=\"token punctuation\">(</span>r_data<span class=\"token punctuation\">[</span><span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        <span class=\"token function\">updatedata</span><span class=\"token punctuation\">(</span>n<span class=\"token operator\">/</span><span class=\"token number\">1000.0</span><span class=\"token punctuation\">)</span> # ppm <span class=\"token operator\">=</span> n<span class=\"token operator\">/</span><span class=\"token number\">1000.0</span></code></pre></div>\n<p><strong>flusholed.py</strong></p>\n<p>依赖库安装</p>\n<p>(基于 <a href=\"https://github.com/adafruit/Adafruit%5C_Python%5C_SSD1306\">https://github.com/adafruit/Adafruit\\_Python\\_SSD1306</a>)</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"29810896420778410000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`sudo python -m pip install --upgrade pip setuptools wheel\nsudo pip install Adafruit-SSD1306`, `29810896420778410000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">sudo python <span class=\"token operator\">-</span>m pip install <span class=\"token operator\">--</span>upgrade pip setuptools wheel\nsudo pip install Adafruit<span class=\"token operator\">-</span><span class=\"token constant\">SSD1306</span></code></pre></div>\n<p>下为功能伪代码。（完整代码待放出 github/DemoOnTencentCloud）</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"22851252103415230000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`# 读取 cachefile 缓存文件\n# 刷新 OLED 显示`, `22851252103415230000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"># 读取 cachefile 缓存文件\n# 刷新 <span class=\"token constant\">OLED</span> 显示</code></pre></div>\n<p><strong>sync.py</strong></p>\n<p>下为功能伪代码。（完整代码待放出 github/DemoOnTencentCloud）</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"71646449427680370000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`# 访问 APIGW，获取最新记录时间戳\n# 读本地sqlite库，获取增量数据\n# 访问 APIGW，提交更新数据`, `71646449427680370000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"># 访问 <span class=\"token constant\">APIGW</span>，获取最新记录时间戳\n# 读本地sqlite库，获取增量数据\n# 访问 <span class=\"token constant\">APIGW</span>，提交更新数据</code></pre></div>\n<p><strong>Sqlite结构</strong></p>\n<p><em>表结构</em></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"99980741636971660000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`CREATE TABLE &quot;sensordata&quot; (\n&quot;id&quot; INTEGER PRIMARY KEY AUTOINCREMENT,\n&quot;utime&quot; INTEGER NOT NULL,\n&quot;utype&quot; INTEGER DEFAULT 0 NOT NULL,\n&quot;udata&quot; REAL NOT NULL,\n&quot;sdata&quot; TEXT\n);`, `99980741636971660000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token constant\">CREATE</span> <span class=\"token constant\">TABLE</span> <span class=\"token string\">\"sensordata\"</span> <span class=\"token punctuation\">(</span>\n<span class=\"token string\">\"id\"</span> <span class=\"token constant\">INTEGER</span> <span class=\"token constant\">PRIMARY</span> <span class=\"token constant\">KEY</span> <span class=\"token constant\">AUTOINCREMENT</span><span class=\"token punctuation\">,</span>\n<span class=\"token string\">\"utime\"</span> <span class=\"token constant\">INTEGER</span> <span class=\"token constant\">NOT</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span>\n<span class=\"token string\">\"utype\"</span> <span class=\"token constant\">INTEGER</span> <span class=\"token constant\">DEFAULT</span> <span class=\"token number\">0</span> <span class=\"token constant\">NOT</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span>\n<span class=\"token string\">\"udata\"</span> <span class=\"token constant\">REAL</span> <span class=\"token constant\">NOT</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span>\n<span class=\"token string\">\"sdata\"</span> <span class=\"token constant\">TEXT</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><img src=\"https://mmbiz.qpic.cn/mmbiz_png/j3gficicyOvavXLTR2QfHtSID5OWgnGvtCZfFpxEIpmXX5kMIfJeNzzjSrEEZicEmDQcic6iaE9a1OhDX8NRqO9TjEw.jpg\"></p>\n<h3 id=\"云端开发与配置\"><a href=\"#%E4%BA%91%E7%AB%AF%E5%BC%80%E5%8F%91%E4%B8%8E%E9%85%8D%E7%BD%AE\" aria-label=\"云端开发与配置 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>云端开发与配置</strong></h3>\n<p><strong>无服务器云函数</strong></p>\n<p>优先配置 无服务器云函数，参考 文档 建立并保存“函数代码”后，在管理页面的“触发方式”功能中，直接生成对应API网关。</p>\n<p><img src=\"data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==\"></p>\n<p>（完整代码待放出 github/DemoOnTencentCloud）。</p>\n<p>当前主要强调几个注意事项：</p>\n<ol>\n<li>自动提交：连接数据库必须使用“autocommit = True,”参数，否则由于事务隔离，DB链接重新连接前，查询结果不变。（查不到新增记录ID）</li>\n<li>返回头：API网关开启“响应集成”时，云函数返回值需结合返回信息，指定\"Content-Type\"，否则出现 \"transfer closed with outstanding read data remaining\" 错误。</li>\n<li>验证连接：云函数实例可长期存在，但一定时间未操作mysql链接时，mysql将释放链接，所以代码中需要进行验证链路可用性。</li>\n</ol>\n<p><strong>API网关</strong></p>\n<p><em>配置服务</em></p>\n<p>参考 文档 ，以上“触发方式”中建立的API网关服务，由API网关的 服务 页面，点击相应服务名，选择“API管理”分页，点击“编辑”，然后配置“请求方法-POST”、“鉴权类型-密钥对”、“使用响应集成”，其它余配置按默认即可。</p>\n<p><em>下载与使用SDK</em></p>\n<p>API网关 控制台 -> 点击 <strong>服务名</strong> -> 点击 <strong>API文档/SDK</strong> -> 点击 <strong>下载SDK</strong></p>\n<p>（完整配置待放出 github/DemoOnTencentCloud）</p>\n<p><strong>云数据库 Mysql</strong></p>\n<p><em>表结构</em></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"61440750139299130000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`SET SQL_MODE = &quot;NO_AUTO_VALUE_ON_ZERO&quot;;\nSET AUTOCOMMIT = 0;\nSTART TRANSACTION;\nSET time_zone = &quot;+00:00&quot;;\n\nCREATE TABLE \\`sensordata\\` (\n  \\`id\\` int(11) NOT NULL,\n  \\`stime\\` timestamp NULL DEFAULT NULL,\n  \\`utype\\` int(11) NOT NULL DEFAULT '0',\n  \\`udata\\` float NOT NULL,\n  \\`sdata\\` varchar(256) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nALTER TABLE \\`sensordata\\`\n  ADD PRIMARY KEY (\\`id\\`);\n\nALTER TABLE \\`sensordata\\`\n  MODIFY \\`id\\` int(11) NOT NULL AUTO_INCREMENT;\nCOMMIT;`, `61440750139299130000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token constant\">SET</span> <span class=\"token constant\">SQL_MODE</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"NO_AUTO_VALUE_ON_ZERO\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token constant\">SET</span> <span class=\"token constant\">AUTOCOMMIT</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token constant\">START</span> <span class=\"token constant\">TRANSACTION</span><span class=\"token punctuation\">;</span>\n<span class=\"token constant\">SET</span> time_zone <span class=\"token operator\">=</span> <span class=\"token string\">\"+00:00\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token constant\">CREATE</span> <span class=\"token constant\">TABLE</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">sensordata</span><span class=\"token template-punctuation string\">`</span></span> <span class=\"token punctuation\">(</span>\n  <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">id</span><span class=\"token template-punctuation string\">`</span></span> <span class=\"token function\">int</span><span class=\"token punctuation\">(</span><span class=\"token number\">11</span><span class=\"token punctuation\">)</span> <span class=\"token constant\">NOT</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span>\n  <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">stime</span><span class=\"token template-punctuation string\">`</span></span> timestamp <span class=\"token constant\">NULL</span> <span class=\"token constant\">DEFAULT</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span>\n  <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">utype</span><span class=\"token template-punctuation string\">`</span></span> <span class=\"token function\">int</span><span class=\"token punctuation\">(</span><span class=\"token number\">11</span><span class=\"token punctuation\">)</span> <span class=\"token constant\">NOT</span> <span class=\"token constant\">NULL</span> <span class=\"token constant\">DEFAULT</span> <span class=\"token string\">'0'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">udata</span><span class=\"token template-punctuation string\">`</span></span> float <span class=\"token constant\">NOT</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span>\n  <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">sdata</span><span class=\"token template-punctuation string\">`</span></span> <span class=\"token function\">varchar</span><span class=\"token punctuation\">(</span><span class=\"token number\">256</span><span class=\"token punctuation\">)</span> <span class=\"token constant\">DEFAULT</span> <span class=\"token constant\">NULL</span>\n<span class=\"token punctuation\">)</span> <span class=\"token constant\">ENGINE</span><span class=\"token operator\">=</span>InnoDB <span class=\"token constant\">DEFAULT</span> <span class=\"token constant\">CHARSET</span><span class=\"token operator\">=</span>utf8<span class=\"token punctuation\">;</span>\n\n<span class=\"token constant\">ALTER</span> <span class=\"token constant\">TABLE</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">sensordata</span><span class=\"token template-punctuation string\">`</span></span>\n  <span class=\"token constant\">ADD</span> <span class=\"token constant\">PRIMARY</span> <span class=\"token constant\">KEY</span> <span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">id</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token constant\">ALTER</span> <span class=\"token constant\">TABLE</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">sensordata</span><span class=\"token template-punctuation string\">`</span></span>\n  <span class=\"token constant\">MODIFY</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">id</span><span class=\"token template-punctuation string\">`</span></span> <span class=\"token function\">int</span><span class=\"token punctuation\">(</span><span class=\"token number\">11</span><span class=\"token punctuation\">)</span> <span class=\"token constant\">NOT</span> <span class=\"token constant\">NULL</span> <span class=\"token constant\">AUTO_INCREMENT</span><span class=\"token punctuation\">;</span>\n<span class=\"token constant\">COMMIT</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><img src=\"https://mmbiz.qpic.cn/mmbiz_png/j3gficicyOvavXLTR2QfHtSID5OWgnGvtCGBuE8euzdzk2c1LKibKgpGiccgCyFFmToHfLVq7rbXFyGh8ibxZjibltIA.jpg\"></p>\n<p><strong>云图配置</strong></p>\n<p><em>简要使用说明</em></p>\n<p>拖选组件 -> 点击数据栏 -> 选择数据库 -> 填写SQL -> 开启自动更新 -> 预览 -> 发布</p>\n<p><em>操作示例图</em></p>\n<p><img src=\"https://img.serverlesscloud.cn/qianyi/b96CibCt70iaaJcib7FH02wTKvoHALAMw4fhFB0fec4tPbkKXibWxgdqyxSrtKg5KE4ey5v1A9gwKnocfASlcw52Hg.jpg\"></p>\n<p><em>组件配置信息</em></p>\n<ul>\n<li>最新同步时间 - 通用文本</li>\n</ul>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"80130866693269440000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`select concat('最新同步时间 ',stime) as value from sensordata order by id desc limit 1`, `80130866693269440000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">select <span class=\"token function\">concat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'最新同步时间 '</span><span class=\"token punctuation\">,</span>stime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> value <span class=\"token keyword\">from</span> sensordata order by id desc limit <span class=\"token number\">1</span></code></pre></div>\n<ul>\n<li>国标系数比 - 水位图</li>\n</ul>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"40765603644782670000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`select round((udata)/0.08*100, 2) as value from sensordata order by id desc limit 1`, `40765603644782670000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">select <span class=\"token function\">round</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>udata<span class=\"token punctuation\">)</span><span class=\"token operator\">/</span><span class=\"token number\">0.08</span><span class=\"token operator\">*</span><span class=\"token number\">100</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> value <span class=\"token keyword\">from</span> sensordata order by id desc limit <span class=\"token number\">1</span></code></pre></div>\n<ul>\n<li>实时读数 - 基本条形图</li>\n</ul>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"10437696490201432000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`select round(udata, 3) as x, '' as y from sensordata order by id desc limit 1`, `10437696490201432000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">select <span class=\"token function\">round</span><span class=\"token punctuation\">(</span>udata<span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> x<span class=\"token punctuation\">,</span> <span class=\"token string\">''</span> <span class=\"token keyword\">as</span> y <span class=\"token keyword\">from</span> sensordata order by id desc limit <span class=\"token number\">1</span></code></pre></div>\n<ul>\n<li>10分钟数据 - 基本折线图</li>\n</ul>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"80950052717480590000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`select * from (select id, round(udata, 3) as y, date_format(stime, '%H:%i:%S') as x, utype as s from sensordata order by id desc limit 360) as t1 order by id asc`, `80950052717480590000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">select <span class=\"token operator\">*</span> <span class=\"token keyword\">from</span> <span class=\"token punctuation\">(</span>select id<span class=\"token punctuation\">,</span> <span class=\"token function\">round</span><span class=\"token punctuation\">(</span>udata<span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> y<span class=\"token punctuation\">,</span> <span class=\"token function\">date_format</span><span class=\"token punctuation\">(</span>stime<span class=\"token punctuation\">,</span> <span class=\"token string\">'%H:%i:%S'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> x<span class=\"token punctuation\">,</span> utype <span class=\"token keyword\">as</span> s <span class=\"token keyword\">from</span> sensordata order by id desc limit <span class=\"token number\">360</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> t1 order by id asc</code></pre></div>\n<ul>\n<li>7天数据 - 基本折线图</li>\n</ul>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"32152636973349892000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`select distinct (dt), round(AVG(udata),3) as y, dt as x, '0' as s from (select id, date_format(stime, '%Y-%m-%d %H') as dt, udata from sensordata order by id desc limit 604800) as t1 group by dt order by dt ASC`, `32152636973349892000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">select <span class=\"token function\">distinct</span> <span class=\"token punctuation\">(</span>dt<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">round</span><span class=\"token punctuation\">(</span><span class=\"token constant\">AVG</span><span class=\"token punctuation\">(</span>udata<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> y<span class=\"token punctuation\">,</span> dt <span class=\"token keyword\">as</span> x<span class=\"token punctuation\">,</span> <span class=\"token string\">'0'</span> <span class=\"token keyword\">as</span> s <span class=\"token keyword\">from</span> <span class=\"token punctuation\">(</span>select id<span class=\"token punctuation\">,</span> <span class=\"token function\">date_format</span><span class=\"token punctuation\">(</span>stime<span class=\"token punctuation\">,</span> <span class=\"token string\">'%Y-%m-%d %H'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> dt<span class=\"token punctuation\">,</span> udata <span class=\"token keyword\">from</span> sensordata order by id desc limit <span class=\"token number\">604800</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> t1 group by dt order by dt <span class=\"token constant\">ASC</span></code></pre></div>\n<blockquote>\n<p><strong>写在最后</strong></p>\n</blockquote>\n<p>关于丢数据（非守护进程）、脏数据（未较验数据唯一性）、缺乏系统监控告警（未接入云监控）等等待优化点，由于时间关系暂未展开，后面可以再行探讨。</p>\n<blockquote>\n<p><strong>传送门：</strong></p>\n<ul>\n<li>GitHub: <a href=\"https://github.com/serverless/serverless/blob/master/README_CN.md\">github.com/serverless</a> </li>\n<li>官网：<a href=\"https://serverless.com/\">serverless.com</a></li>\n</ul>\n</blockquote>\n<p>欢迎访问：<a href=\"https://serverlesscloud.cn/\">Serverless 中文网</a>，您可以在 <a href=\"https://serverlesscloud.cn/best-practice\">最佳实践</a> 里体验更多关于 Serverless 应用的开发！</p>","tableOfContents":"<ul>\n<li><a href=\"/blog/2019-07-04-online-formaldehyde-monitoring-system/#%E4%BA%A7%E5%93%81%E8%AE%BE%E8%AE%A1%E7%89%B9%E6%80%A7\">产品设计特性</a></li>\n<li><a href=\"/blog/2019-07-04-online-formaldehyde-monitoring-system/#%E7%B3%BB%E7%BB%9F%E7%BB%84%E6%88%90\">系统组成</a></li>\n<li><a href=\"/blog/2019-07-04-online-formaldehyde-monitoring-system/#%E6%95%88%E6%9E%9C%E5%B1%95%E7%A4%BA\">效果展示</a></li>\n<li><a href=\"/blog/2019-07-04-online-formaldehyde-monitoring-system/#%E4%BC%A0%E6%84%9F%E5%99%A8%E5%8E%9F%E7%90%86%E4%B8%8E%E5%8A%9F%E8%83%BD%E5%AE%9A%E4%BD%8D\">传感器原理与功能定位</a></li>\n<li><a href=\"/blog/2019-07-04-online-formaldehyde-monitoring-system/#%E4%BA%A7%E5%93%81%E8%AE%BE%E8%AE%A1%E4%B8%8E%E6%8A%80%E6%9C%AF%E7%AD%96%E7%95%A5\">产品设计与技术策略</a></li>\n<li><a href=\"/blog/2019-07-04-online-formaldehyde-monitoring-system/#%E6%A6%82%E8%A6%81%E6%9E%B6%E6%9E%84%E5%9B%BE\">概要架构图</a></li>\n<li><a href=\"/blog/2019-07-04-online-formaldehyde-monitoring-system/#%E5%88%86%E7%BA%A7%E5%8F%AF%E7%94%A8%E7%9B%AE%E6%A0%87\">分级可用目标</a></li>\n<li><a href=\"/blog/2019-07-04-online-formaldehyde-monitoring-system/#%E7%A1%AC%E4%BB%B6%E6%8E%A5%E7%BA%BF%E4%B8%8E%E6%89%93%E5%BC%80%E7%B3%BB%E7%BB%9F%E6%8E%A5%E5%8F%A3\">硬件接线与打开系统接口</a></li>\n<li><a href=\"/blog/2019-07-04-online-formaldehyde-monitoring-system/#%E6%9C%AC%E5%9C%B0%E5%BC%80%E5%8F%91%E4%B8%8E%E9%85%8D%E7%BD%AE\">本地开发与配置</a></li>\n<li><a href=\"/blog/2019-07-04-online-formaldehyde-monitoring-system/#%E4%BA%91%E7%AB%AF%E5%BC%80%E5%8F%91%E4%B8%8E%E9%85%8D%E7%BD%AE\">云端开发与配置</a></li>\n</ul>"},"previousBlog":{"id":"9f2e5366-1acf-5010-a024-eeb4b7875881","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/serverless-guru-case-study/serverless-guru-case-study-thumb.png","authors":["NickGottlieb"],"categories":["user-stories"],"date":"2019-07-09T00:00:00.000Z","title":"BuildCenter 和 Serverless Guru 如何简化无服务器开发周期","description":"BuildCenter 为构建者提供数字工具。了解 Serverless Guru 如何使用无服务器框架帮助构建者简化操作。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":381,"sentences":48,"paragraphs":48},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-07-09-buildcenter-serverless-development-cycle.md","fields":{"slug":"/blog/2019-07-09-buildcenter-serverless-development-cycle/","keywords":["serverless","单页应用","无服务器","Serverless","Guru","服务器","BuildCenter","serverless","堆栈","框架"]}},"nextBlog":{"id":"e5cbc7f7-4743-507a-be01-abb06982a340","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020414/1586871710979-%E5%85%AC%E5%85%B1%E7%94%A8.png","authors":["李帅"],"categories":["guides-and-tutorials"],"date":"2019-07-03T00:00:00.000Z","title":"云函数 SCF 场景下的 DevOps 实现 —— Jenkins 篇","description":"本文意图描述在 SCF 场景下，如何基于 Jenkins 搭建自己的 CI/CD 流程","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["DevOps","Serverless"],"keywords":"Serverless,serverless cloud function,无服务器架构","outdated":null},"wordCount":{"words":107,"sentences":38,"paragraphs":38},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-07-03-scf-devops-jenkins.md","fields":{"slug":"/blog/2019-07-03-scf-devops-jenkins/","keywords":["java","python","serverless","spa","Pipeline","scf","stage","git","echo","Deploy","serverlesscloud"]}},"recommendBlogs":{"edges":[{"node":{"id":"4300b21c-7209-5256-86ff-0d38e3daec9b","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/14f1c8eed372e76c1b139703b2f6d0fa.jpg","authors":["KieranMcCarthy"],"categories":["user-stories","engineering-culture"],"date":"2018-01-09T00:00:00.000Z","title":"我是如何在四年时间里，从厨师转行为 Serverless 应用开发者","description":"我是厨师出身，现在成为了一名 Serverless 应用开发者。","authorslink":["https://serverless.com/author/kieranmccarthy/"],"translators":["Aceyclee"],"translatorslink":["https://www.zhihu.com/people/Aceyclee"],"tags":["应用开发","Serverless"],"keywords":"Serverless 应用开发,Serverless 管理,厨师转行为 Serverless 应用开发者","outdated":null},"wordCount":{"words":285,"sentences":38,"paragraphs":36},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-01-09-from-chef-to-serverless-developer-in-4-years.md","fields":{"slug":"/blog/2018-01-09-from-chef-to-serverless-developer-in-4-years/","keywords":["无服务器","无服务器开发","云函数","学习","Serverless","构建","Framework","开发者","服务器","应用","学位","简历"]}}},{"node":{"id":"713a0563-4bf9-5721-bacb-3b4ef609fe4a","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/camp-fire/camp-fire-housing-thumb.jpg","authors":["EricWyne"],"categories":["guides-and-tutorials","user-stories"],"date":"2018-12-05T00:00:00.000Z","title":"Serverless Twitter 机器人帮助为坎普山火受灾者安置住房","description":"加利福尼亚州的坎普山火致使数千人流离失所，为此，我构建了一个简单的 Serverless Twitter 机器人来帮助将受灾者安置在临时住房！","authorslink":["https://serverless.com/author/ericwyne/"],"translators":["Aceyclee"],"translatorslink":["zhihu.com/people/Aceyclee"],"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":157,"sentences":26,"paragraphs":26},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-12-05-serverless-twitter-camp-fire.md","fields":{"slug":"/blog/2018-12-05-serverless-twitter-camp-fire/","keywords":["serverless","无服务器","云函数","Serverless","org","住房","Twitter","函数","受灾","机器人","山火"]}}},{"node":{"id":"98602143-b837-5f50-a24f-3b1ec76044d7","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/sqquid/sqquid-serverless-thumb.jpg","authors":["RonPeled"],"categories":["user-stories"],"date":"2018-12-17T00:00:00.000Z","title":"SQQUID：100% 无服务器初创公司","description":"SQQUID 将 AWS Lambda 和无服务器框架用于其核心产品和营销网站。我们来看看一个完全无服务器的初创公司是怎样的。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":266,"sentences":42,"paragraphs":42},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-12-17-sqquid-one-hundred-percent-serverless.md","fields":{"slug":"/blog/2018-12-17-sqquid-one-hundred-percent-serverless/","keywords":["go","serverless","无服务器","无服务器架构","服务器","架构","Lambda","集成","FaaS","串行","系统"]}}},{"node":{"id":"29dc2e58-d2ba-56f9-aee1-d21b0bc62e0e","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/ao-com-story/ao-serverless-thumbnail.png","authors":["NickGottlieb"],"categories":["user-stories"],"date":"2019-04-24T00:00:00.000Z","title":"AO.com：逐渐转向无服务器优先","description":"AO.com 的 SCV 团队率先尝试无服务器服务。折服于无服务器框架的快速周转时间和低维护成本，整个团队逐渐转向无服务器优先。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":236,"sentences":42,"paragraphs":35},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-04-24-ao-serverless-first.md","fields":{"slug":"/blog/2019-04-24-ao-serverless-first/","keywords":["serverless","无服务器","服务器","团队","Lambda","功能","构建"]}}},{"node":{"id":"752d08d1-387a-5bde-acf3-98141baab294","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020414/1586871710979-%E5%85%AC%E5%85%B1%E7%94%A8.png","authors":["Anycodes"],"categories":["user-stories"],"date":"2019-06-20T00:00:00.000Z","title":"如何用 Serverless 为 Python 云函数打包依赖","description":"在使用无服务器云函数SCF时通常会遇到导入第三方库的问题，很多小伙伴比较头疼是：应该如何打包进去？这里，推荐几个不错的方法。","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["云函数","Serverless"],"keywords":"Serverless,Serverless应用,无服务器云函数","outdated":null},"wordCount":{"words":81,"sentences":43,"paragraphs":43},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-06-20-for-python-cloud-functions.md","fields":{"slug":"/blog/2019-06-20-for-python-cloud-functions/","keywords":["java","serverless","无服务器","无服务器云函数","云函数","serverlesscloud","安装","serverless","pillowtest"]}}},{"node":{"id":"2dc78814-9d77-555b-a1bb-ad202c8ec2d1","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/cloudforecast/thumbnail.png","authors":["FrancoisLagier"],"categories":["user-stories"],"date":"2019-08-07T00:00:00.000Z","title":"Serverless：初创企业的理想选择？（CloudForecast 案例分析）","description":"CloudForecast 是 2018 年成立的一家独立初创企业，本文将介绍他们决定选择 Serverless 的原因。","authorslink":["https://serverless.com/author/francoislagier/"],"translators":["Aceyclee"],"translatorslink":["zhihu.com/people/Aceyclee"],"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":211,"sentences":29,"paragraphs":29},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-08-07-serverless-for-startups.md","fields":{"slug":"/blog/2019-08-07-serverless-for-startups/","keywords":["serverless","云函数","serverless","函数","Serverless","utm","Framework","blog","CloudForecast","cloudforecast"]}}},{"node":{"id":"97450b07-658b-5207-8216-1c7b9b51b115","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020114/1578988490344-v2-8b2cd2c5275aa2c5a3c5083a148a7a9f_1200x500.jpg","authors":["Anycodes"],"categories":["user-stories"],"date":"2019-09-01T00:00:00.000Z","title":"如何通过 Serverless 与自然语言处理，让搜索引擎「看」到你的博客","description":"Serverless 与自然语言处理结合的一个小应用","authorslink":["https://www.zhihu.com/people/liuyu-43-97"],"translators":null,"translatorslink":null,"tags":["个人博客","serverless"],"keywords":"Serverless 自然语言处理","outdated":null},"wordCount":{"words":106,"sentences":34,"paragraphs":34},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-09-01-search-engine-blog.md","fields":{"slug":"/blog/2019-09-01-search-engine-blog/","keywords":["serverless","云函数","keywords","serverlesscloud","summary"]}}},{"node":{"id":"ae4fd2f8-515c-5aec-b584-38427ef33f7e","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020114/1578989800047-part-00492-780.jpg","authors":["Anycodes"],"categories":["guides-and-tutorials","user-stories"],"date":"2019-09-16T00:00:00.000Z","title":"突破传统 OJ 瓶颈，「判题姬」接入云函数","description":"通过 Serverless 实现在线编程","authorslink":["https://www.zhihu.com/people/liuyu-43-97"],"translators":null,"translatorslink":null,"tags":["在线编程","云函数"],"keywords":"Serverless 在线编程,Serverless OJ","outdated":null},"wordCount":{"words":169,"sentences":30,"paragraphs":30},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-09-16-online-Judge.md","fields":{"slug":"/blog/2019-09-16-online-Judge/","keywords":["python","serverless","云函数","代码","函数","serverless"]}}}],"totalCount":64}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"d6260dcf-6000-54c1-82c8-1e96f13d0f2b","previousBlogId":"9f2e5366-1acf-5010-a024-eeb4b7875881","nextBlogId":"e5cbc7f7-4743-507a-be01-abb06982a340","categories":["user-stories"]}}}