EMQ X+TDengine 搭建 MQTT 物联网可视化平台

147 篇文章 41 订阅
订阅专栏

物联网数据采集涉及到大量设备接入、海量的时序数据传输,EMQ X MQTT 服务器 与 TDengine 大数据平台的组合技术栈完全能够胜任场景中的海量时间序列监测数据的传输、存储和计算。

数据入库后,往往需要其他方式如数据可视化系统将数据按照规则统计、展现出来,实现数据的监控、指标统计等业务需求,以便充分发挥数据的价值,TDengine 搭配开源软件 Grafana 可以快速搭建物联网数据可视化平台。

上述整套方案无需代码开发,涉及的产品均能提供开源软件、企业服务、云端 SaaS 服务不同层次的交付模式,能够根据项目需求实现免费版或企业版私有化落地以及云端部署。

在这里插入图片描述

方案介绍

EMQ X 简介

EMQ X 是基于高并发的 Erlang/OTP 语言平台开发,支持百万级连接和分布式集群架构,发布订阅模式的开源 MQTT 消息服务器。EMQ X 内置了大量开箱即用的功能,其 开源版 EMQ X Broker企业版 EMQ X Enterprise 均支持通过规则引擎将设备消息存储到 TDengine。

TDengine 是什么

TDengine 是涛思数据专为物联网、车联网、工业互联网、IT 运维等设计和优化的大数据平台。除核心的快 10 倍以上的时序数据库功能外,还提供缓存、数据订阅、流式计算等功能,最大程度减少研发和运维的复杂度,且核心代码,包括集群功能全部开源。

TDengine 提供社区版、企业版和云服务版,安装/使用教程详见 TDengine 使用文档。

Grafana 简介

Grafana 是一个跨平台、开源的度量分析和可视化工具,可以查询处理各类数据源中的数据,进行可视化的展示。它可以快速灵活创建的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式;支持 Graphite,TDengine、InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和 KairosDB 等数据源,支持数据项独立/混合查询展示;可以创建自定义告警规则并通知到其他消息处理服务或组件中。

业务场景

本文模拟物联网环境数据采集场景,假设现有一定数据的环境数据采集点,所有采集点数据均通过 MQTT 协议 传输至采集平台(MQTT Publish),主题设计如下:

sensor/data

传感器发送的数据格式为 JSON,数据包括传感器采集的温度、湿度、噪声音量、PM10、PM2.5、二氧化硫、二氧化氮、一氧化碳、传感器 ID、区域、采集时间等数据。

{
    "temperature": 30,
    "humidity" : 20,
    "volume": 44.5,
    "PM10": 23,
    "pm25": 61,
    "SO2": 14,
    "NO2": 4,
    "CO": 5,
    "id": "10-c6-1f-1a-1f-47",
    "area": 1,
    "ts": 1596157444170
}

现在需要实时存储以便在后续任意时间查看数据,提出以下的需求:

  • 每个设备按照每 5 秒钟一次的频率进行数据上报,数据库需存储每条数据以供后续回溯分析;
  • 通过可视化系统查看 任意区域、任意时间区间内 的指标数据,如平均值、最大值、最小值。

环境准备

本文所用各个组件均有 Docker 镜像,除 EMQ X 需要修改少数配置为了便于操作使用下载安装外,TDengine 与 Grafana 均使用 Docker 搭建。

安装包资源与使用教程参照各自官网:

  • EMQ X:EMQ 官网 https://www.emqx.io/cn/
  • TDengine:涛思数据官网 https://www.taosdata.com/cn/
  • Grafana:Grafana 官网 https://grafana.com/

安装 EMQ X

如果您是 EMQ X 新手用户,推荐通过 EMQ X 文档 快速上手

访问 EMQ X 下载 页面下载适合您操作系统的安装包,本文截稿时 EMQ X 开源版最新版本为 v4.1.1,下载 zip 包的启动步骤如下 :

## 解压下载好的安装包
unzip emqx-macosx-v4.1.1.zip
cd emqx

## 以 console 模式启动 EMQ X 方便调试
./bin/emqx console

启动成功后浏览器访问 http://127.0.0.1:18083 访问 EMQ X 管理控制台 Dashboard,使用 admin public 默认用户名密码完成初次登录。

EMQ X 企业版 4.1.2 提供了原生 TDengine 写入插件,性能更好、使用更方便,请移步 规则引擎-写入数据到 TDengine查看

安装 TDengine

为了方便测试使用通过 Docker 进行安装(需映射网络端口),也可以使用安装包的方式进行安装:

## 拉取并启动容器
docker run -d --name tdengine -p 6030-6041:6030-6041 tdengine/tdengine:latest

## 启动后检查容器运行状态
docker ps -a

安装 Grafana

使用以下命令通过 Docker 安装并启动 Grafana:

docker run -d --name=grafana -p 3000:3000 grafana/grafana

启动成功后浏览器访问 http://127.0.0.1:3000 访问 Grafana 可视化面板,使用 admin admin 默认用户名密码完成初次登录,登录后按照提示修改密码使用新密码登录进入主界面:

配置 EMQ X 存储数据到 TDengine

TDengine 创建数据库与数据表

进入TDengine Docker 容器:

docker exec -it tdengine bash

创建 test 数据库:

taos
create database test;

创建 sensor_data 表,关于 TDengine 数据结构以及 SQL 命令参见 TAOS SQL:

use test;
CREATE TABLE sensor_data (
  ts timestamp,
  temperature float,
  humidity float,
  volume float,
  PM10 float,
  pm25 float,
  SO2 float,
  NO2 float,
  CO float,
  sensor_id NCHAR(255), 
  area TINYINT,
  coll_time timestamp
);

配置 EMQ X 规则引擎

打开 EMQ X Dashboared,进入 规则引擎 -> 规则 页面,点击 创建 按钮进入创建页面。

规则 SQL

规则 SQL 用于 EMQ X 消息以及事件筛选,以下 SQL 表示从 sensor/data 主题筛选出 payload 数据:

SELECT
  payload
FROM
  "sensor/data"

使用 SQL 测试功能 ,输入测试数据进行筛选结果测试,测试有结果且输出内容如下,标明 SQL 编写正确:

{
  "payload": "{\"temperature\":30,\"humidity\":20,\"volume\":44.5,\"PM10\":23,\"pm2.5\":61,\"SO2\":14,\"NO2\":4,\"CO\":5,\"id\":\"10-c6-1f-1a-1f-47\",\"area\":1,\"ts\":1596157444170}"
}

image20200731104046137.png

响应动作

为支持各种不同类型平台的开发,TDengine 提供符合 REST 设计标准的 API。通过 RESTful Connector 提供了最简单的连接方式,即使用 HTTP 请求携带认证信息与要执行的 SQL 操作 TDengine。

使用 EMQ X 开源版中的 发送到 Web 服务 即可通过 RESTful Connector 写入数据到 TDengine。即将到来的 EMQ X 企业版 4.1.1 版本将提供原生更高性能的写入 Connector。

发送到 Web 服务需要两个数据,一个是关联资源,另一个是消息内容模板。

  • 关联资源:HTTP 服务器配置信息,此处为 TDengine 的 RESTful Connector
  • 消息内容模板:此处为携带数据的 INSERT SQL,注意我们应当在 SQL 中指定数据库名,字符类型也要用单引号括起来, 消息内容模板为:
INSERT INTO test.sensor_data VALUES(
  now,
  ${payload.temperature},
  ${payload.humidity},
  ${payload.volume},
  ${payload.PM10},
  ${payload.pm25},
  ${payload.SO2},
  ${payload.NO2},
  ${payload.CO},
  '${payload.id}',
  ${payload.area},
  ${payload.ts}
)

image20200731145609393.png

创建过程

点击响应动作下的 添加 按钮,在弹出框内选择 发送数据到 Web 服务,点击 新建资源 新建一个 WebHook 资源。

image20200731104403456.png

资源类型选择 Webhook,请求 URL 填写 http://127.0.0.1:6041/rest/sql,请求方法选择 POST, 还需添加 Authorization 请求头作为认证信息

Authorization 的值为 Basic + TDengine 的 {username}:{password} 经过 Base64 编码之后的字符串, 例如 root:taosdata 编码后实际填入的值为:Basic cm9vdDp0YW9zZGF0YQ==

在响应动作创建页面选择新建的资源,并填入消息模板内容即可。

image20200804110459517.png

生成模拟数据

以下脚本模拟了 10000 个设备在过去 24 小时内、每隔 5 秒钟上报一条模拟数据并发送到 EMQ X 的场景。

  • 总数据量: 24 * 3600 / 5 * 100 = 172 万条
  • 消息 TPS: 20

读者安装 Node.js ,按需修改配置参数后可以通过以下命令启动:

npm install mqtt mockjs --save --registry=https://registry.npm.taobao.org
node mock.js

附:模拟生成数据并发送到 EMQ X 代码,请根据集群性能调整相关参数

// mock.js
const mqtt = require('mqtt')
const Mock = require('mockjs')

const EMQX_SERVER = 'mqtt://localhost:1883'
const CLIENT_NUM = 100
const STEP = 5000 // 模拟采集时间间隔 ms
const AWAIT = 5000 // 每次发送完后休眠时间,防止消息速率过快 ms
const CLIENT_POOL = []

startMock()


function sleep(timer = 100) {
  return new Promise(resolve => {
    setTimeout(resolve, timer)
  })
}

async function startMock() {
  const now = Date.now()
  for (let i = 0; i < CLIENT_NUM; i++) {
    const client = await createClient(`mock_client_${i}`)
    CLIENT_POOL.push(client)
  }
  // last 24h every 5s
  const last = 24 * 3600 * 1000
  for (let ts = now - last; ts <= now; ts += STEP) {
    for (const client of CLIENT_POOL) {
      const mockData = generateMockData()
      const data = {
        ...mockData,
        id: client.options.clientId,
        ts,
      }
      client.publish('sensor/data', JSON.stringify(data))
    }
    const dateStr = new Date(ts).toLocaleTimeString()
    console.log(`${dateStr} send success.`)
    await sleep(AWAIT)
  }
  console.log(`Done, use ${(Date.now() - now) / 1000}s`)
}

/**
 * Init a virtual mqtt client
 * @param {string} clientId ClientID
 */
function createClient(clientId) {
  return new Promise((resolve, reject) => {
    const client = mqtt.connect(EMQX_SERVER, {
      clientId,
    })
    client.on('connect', () => {
      console.log(`client ${clientId} connected`)
      resolve(client)
    })
    client.on('reconnect', () => {
      console.log('reconnect')
    })
    client.on('error', (e) => {
      console.error(e)
      reject(e)
    })
  })
}

/**
* Generate mock data
*/
function generateMockData() {
 return {
   "temperature": parseFloat(Mock.Random.float(22, 100).toFixed(2)),
   "humidity": parseFloat(Mock.Random.float(12, 86).toFixed(2)),
   "volume": parseFloat(Mock.Random.float(20, 200).toFixed(2)),
   "PM10": parseFloat(Mock.Random.float(0, 300).toFixed(2)),
   "pm25": parseFloat(Mock.Random.float(0, 300).toFixed(2)),
   "SO2": parseFloat(Mock.Random.float(0, 50).toFixed(2)),
   "NO2": parseFloat(Mock.Random.float(0, 50).toFixed(2)),
   "CO": parseFloat(Mock.Random.float(0, 50).toFixed(2)),
   "area": Mock.Random.integer(0, 20),
   "ts": 1596157444170,
 }
}

可视化配置

组件安装完成,模拟数据写入成功后,按照 Grafana 可视化界面的操作指引,完成业务所需数据可视化配置。

添加数据源(Add data source)

Grafana 的 TDengine 数据源需要手动安装插件,具体安装范式以 TDengine 文档为准。

添加数据源,即显示的数据源信息。选取 TDengine 类型数据源,输入连接参数进行配置,默认情况下,关键配置信息如下:

image20200804110612868.png

添加仪表盘(New Dashboard)

在 EMQ X Sample 仓库获取 Grafana 仪表盘导出文件导入即可查看图表示例。

添加好数据源后,添加需要显示的数据仪表盘信息。仪表盘为多个可视化面板的集合,点击 New Dashboard 后,选择 + Query 通过查询来添加数据面板。

创建面板需要四个步骤,分别是 Queries(查询)Visualization(可视化)General(图表配置)Alert(告警) ,创建时间

平均值面板

使用 Grafana 的可视化查询构建工具,查询出所有设备的平均值。

以下 SQL 按照指定时间段($form $to)、指定时间间隔($interval),查询出数据中关键指标的平均值:

select avg(temperature), avg(humidity), avg(volume), avg(PM10), avg(pm25), avg(SO2), avg(NO2), avg(CO)  from test.sensor_data where coll_time >= $from and coll_time < $to interval($interval)

Visualization 默认不做更改, General 里面修改面板名称为 历史平均值,如果需要对业务进行监控告警,可以在 Alert 里编排告警规则,此处仅做可视化展示,不使用此功能。

image20200803091833280.png

完成创建后,点击左上角返回按钮,该 Dashboard 里成功添加一个数据面板。点击顶部导航栏 保存 图标,输入 Dashboard 名称完成 Dashboard 的创建。

最大值、最小值面板

继续点击 Dashboard 的 Add panel 按钮,添加最大值、最小值图表。操作步骤同添加平均值,仅对查询中 SELECT 统计方法字段做出调整,调整为 AVG 函数为 MAXMIN

select max(temperature), max(humidity), max(volume), max(PM10), max(pm25), max(SO2), max(NO2), max(CO), min(temperature), min(humidity), min(volume), min(PM10), min(pm25), min(SO2), min(NO2), min(CO)  from test.sensor_data where coll_time >= $from and coll_time < $to interval($interval)

image20200803093314019.png

仪表盘效果

保存仪表盘,拖拽调整每个数据面板大小、位置,最终得到一个视觉效果较好的数据仪表盘。仪表盘右上角可以选择时间区间、自动刷新时间,此时设备持续发送数据采集数据,仪表盘数据值会有所变动,实现了比较好的可视化效果。

FAQ

Q: 为什么 Grafana 中没有图标数据?

  • 请拖动时间范围,检查、确保所选时段内有数据

Q: EMQ X 开源版和 EMQ X 企业版写入 TDengine 功能上有什么区别?

  • 开源版使用 Webhook + TDengine RESTful Connector,两边都有一定的性能损耗,最大写入速度约为 700 条/秒
  • 企业版使用 EMQ X 原生插件,能够做到 20,000 条/秒写入

Q: 规则执行了,但是写入不了数据?

  • 请检查认证信息是否配置正确,请求头、连接地址、端口等信息是否匹配 TDengin 版本

总结

至此我们借助 EMQ X + TDengine 完成了物联网数据传输、存储、展现整个流程的系统搭建,读者可以了解到 EMQ X 丰富的拓展能力与 TDengine 完备的大数据平台特性在物联网数据采集中的应用。深入学习掌握 Grafana 的其他功能后,用户可以定制出更完善的数据可视化乃至监控告警系统。

image20200803093438116.png

版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接: https://www.emqx.io/cn/blog/emqx-tdengine-grafana

博客
MQTT vs HTTP:谁更适合物联网?
10-10 1408
本文将深入探讨在物联网环境下,MQTT 和 HTTP 的不同特性、应用场景以及它们在实际应用中的表现。通过对这两种协议的比较分析,我们可以更好地理解如何根据具体需求选择合适的通信协议,以优化物联网系统的性能和可靠性。
博客
如何在 Rust 中通过 Rumqttc 实现 MQTT 通信
09-25 1374
示例将演示如何使用 rumqttc 库创建一个 MQTT 客户端,并实现消息的发布和订阅。通过这些示例,您将学习如何初始化客户端、设置选项、连接到 MQTT 服务器,以及发布/订阅消息。
博客
提高数据集成稳定性:EMQX Platform 端到端规则调试指南
09-18 1318
本文将为您提供 EMQX 数据集成规则的调试指南,通过调试步骤的详细介绍,帮助您充分了解并利用这一强大的功能。
博客
EMQX Enterprise 5.8.0 发布:实现跨区域、全球分布的集群连接
09-05 449
EMQX Enterprise 5.8.0 版本现已正式发布!这一版本推出了集群连接功能,提供了更强的集群容灾能力,为企业全球业务的正常运转提供保障。此外,该版本还新增了消息转换功能和多项数据集成支持,为用户使用 EMQX Enterprise 构建物联网应用提供了更多灵活性与可能性。同时,本次更新也在安全性方面进行了多项增强。
博客
云端集中管控边缘服务:利用 EMQX ECP 在 K8s 上快速部署 NeuronEX
08-27 1403
EMQX ECP 新增在 K8s 上的快速部署 NeuronEX 服务的功能,本文将详细介绍该功能的原理和使用方法,帮助用户在 ECP 中更便捷地管理 NeuronEX 服务。
博客
EMQX Platform & Snowflake:构建可再生分布式能源的智慧未来
08-13 820
本文将介绍如何采用 EMQX 企业版和 Snowflake,帮助用户在复杂的电力供应链中,实现发电设备数据的采集、存储和分析。
博客
工业边缘网关软件 NeuronEX 中基于角色的访问控制功能
08-13 444
本文将重点介绍 NeuronEX 中基于角色的访问控制功能。该功能支持用户创建不同的角色,不同的角色相对应不同的操作权限,以此达到权限隔离的目的,提高用户数据的安全性、合规性和灵活性。
博客
Vehicle + UNS : 为 SDV 提供全生命周期的数据可互操作性
07-30 486
为了帮助汽车行业客户应对软件定义汽车趋势下的挑战,EMQ 提出将 UNS 应用于汽车领域,以实现 SDV 全生命周期的数据可互操作性。本文将深入探讨汽车领域与 UNS 结合的可行性与可能性。
博客
灵活数据流处理:NeuronEX 支持 JavaScript 自定义函数
07-26 415
本文将重点介绍 NeuronEX 的自定义函数功能,旨在帮助用户更灵活地处理数据流,便于进行模块化的软件协作和维护。
博客
EMQX 跨域集群:增强可扩展性,打破地域限制
07-22 1112
通过跨域集群,单一地理位置的限制被打破,企业可以建立一个跨多云的全球 MQTT 接入网络,让 MQTT 消息得以在不同地区的节点之间自动同步和传输。
博客
MQTT & micro-ROS:构建高效的机器人应用
07-17 1126
在这篇文章中,我们将继续探索,如何在 FreeRTOS 中运行 micro-ROS,并最终通过 MQTT 协议与 EMQX 集成。
博客
在 Windows 平台搭建 MQTT 服务
07-11 2759
本文将以 NanoMQ 为例,使用二进制包和源代码编译两种方式演示如何在 Windows 平台中快速搭建 MQTT 服务。
博客
EMQX 与 MQTT: AI 大模型时代的分布式数据中枢
07-02 494
EMQX 是一款高度可伸缩、分布式 MQTT 消息服务器,在以数据为核心的 AI 时代,帮助企业进行信息的快速和精确传递,构建高效数据系统。
博客
MQTTX 1.10.0 发布:CLI高级文件管理与配置
06-24 900
在本次更新中,CLI 版本在文件管理和配置功能方面进行了显著增强。主要更新包括:支持从文件中读取和写入消息、高级配置选项、文本输出模式、以及改进的日志记录。
博客
数据驱动制造:EMQX ECP 指标监测功能增强生产透明度
06-17 1033
通过集成先进的指标监测工具,EMQX ECP 工业互联数据平台可帮助企业实时监测和控制生产流程。 ECP 提供的指标监测功能,包括指标监控、日志管理和异常告警, 为企业提供了一个全面的数据监控和管理解决方案。
博客
解锁工业数据流:NeuronEX 规则调试功能实操指南
06-11 711
NeuronEX 提供设备数据采集和边缘智能分析服务,本文将重点介绍 NeuronEX 的规则调试功能,旨在帮助用户更高效地进行规则的调试和创建。
博客
EMQX Enterprise 5.7 发布:新增会话持久化、消息 Schema 验证、规则引擎调试与追踪功能
06-03 495
EMQX Enterprise 5.7.0 版本现已正式发布!在这个版本中,我们引入了一系列新的功能和改进,包括会话持久化、消息 Schema 验证、规则引擎调试与追踪测试等功能。此外,新版本还进行了多项改进以及 BUG 修复,进一步提升了整体性能和稳定性。
博客
MQTT 5.0 报文解析 06:AUTH
05-28 914
MQTT 5.0 引入了增强认证特性,它使 MQTT 除了简单密码认证和 Token 认证以外,还能够支持质询/响应风格的认证。为了实现这一点,它在原先 CONNECT 和 CONNACK 报文的基础上,又引入了 AUTH 报文来实现任意多次的认证数据交换。
博客
MQTT 5.0 报文解析 05:DISCONNECT
05-21 680
在 MQTT 中,客户端和服务端可以在断开网络连接前向对端发送一个 DISCONNECT 报文,来指示连接关闭的原因。客户端发送的 DISCONNECT 报文还可以影响服务端在连接断开后的行为,例如是否发送遗嘱消息,是否更新会话过期间隔。
博客
MQTT 5.0 报文解析 04:PINGREQ 与 PINGRESP
05-13 759
除了用于连接、发布和订阅的控制报文,MQTT 还有一类报文用于在客户端和服务端之间模拟心跳,以达到保持连接的目的,它们分别是 PINGREQ 报文和 PINGRESP 报文,我们通常也会称它们为心跳报文。
写文章

热门文章

  • MQTT X 使用指南 28330
  • MQTT Web Toolkit - MQTT 在线测试工具正式发布 21657
  • 使用微信小程序连接到 MQTT 云服务 12228
  • 2022 年值得尝试的 7 个 MQTT 客户端工具 11976
  • 开源测试工具 JMeter 介绍 - 物联网大并发测试实战 01 11050

分类专栏

  • 工业物联网 7篇
  • mqtt 147篇
  • emqx 77篇
  • eKuiper 8篇
  • 车联网 16篇
  • Kuiper 31篇
  • lot 51篇
  • 集群 2篇
  • EMQX Cloud 6篇
  • 云服务 4篇
  • neuron 13篇
  • 版本发布 60篇
  • 开源 3篇
  • 版本更新 1篇
  • Kubernetes 4篇
  • 云边协同 2篇
  • 华为云 1篇
  • Azure 1篇
  • 腾讯云 1篇
  • 阿里云 1篇
  • JMeter 1篇
  • 物流网 3篇
  • 云边工业
  • cloud 23篇
  • MQTT X 23篇
  • NanoMQ 1篇
  • 桥接 1篇
  • 数据
  • Beckhoff ADS 1篇
  • NONA11 1篇
  • OPC DA 1篇
  • 云原生 1篇
  • ExProto 1篇
  • hstream 13篇
  • 认证鉴权 3篇
  • mqtt新特性 3篇
  • 招聘
  • android 1篇
  • hamler 2篇
  • 树莓派  1篇
  • 配置说明 2篇
  • 规则引擎 19篇
  • 解决方案 20篇
  • 新闻 26篇
  • 安装 6篇
  • 持久化插件 6篇
  • emqx  21篇
  • 物联网 215篇
  • iot 71篇
  • ssl 2篇
  • 指南 3篇

最新评论

  • MQTT vs HTTP:谁更适合物联网?

    穷苦书生_万事愁: 博主的这篇关于“MQTT vs HTTP:谁更适合物联网?”的文章真的让我眼前一亮,对这个主题有了全新的认识。文章中的细节描写非常到位,让我不仅仅了解了两种协议的区别,更深刻地感受到了博主的深厚功底和专业知识。期待博主未来能够持续分享更多高质量的文章,同时也希望能够得到博主的指导,共同进步。非常感谢博主的分享和支持!

  • 如何在 PHP 项目中使用 MQTT

    qq_33710603: 循环有啥用 去掉每次链接服务端一次就断开了。怎么保持一直连着啊

  • ESP8266 连接到的免费的 EMQ X MQTT 服务器

    前面听说风很大755: 还是连不上

  • ESP32 连接到免费的公共 MQTT 服务器

    努力学习Python的小张: 大佬,这代码vscode可以实现吗,还是必须要arduino吗?

  • 云端集中管控边缘服务:利用 EMQX ECP 在 K8s 上快速部署 NeuronEX

    穷苦书生_万事愁: 博主的这篇文章真是让我眼前一亮,不仅让我对云端集中管控边缘服务有了全新的认识,还通过细节描写让我更深入地理解了这个主题。文章中对于利用 EMQX ECP 在 K8s 上快速部署 NeuronEX 的实践经验和技巧的分享让我受益匪浅,让我感受到了博主的深厚技术功底和丰富经验。希望博主未来能够持续分享更多类似的好文,让读者们都能够从中受益。同时,也期待能够得到博主的指导和帮助,共同进步。感谢博主的无私分享和支持,期待阅读更多精彩的文章!

大家在看

  • [含文档+PPT+源码等]精品大数据项目-python基于Spark实现的微博数据可视化分析
  • 千套源码,free分享(可用做毕设) 505
  • 大模型转行全攻略:必备知识、技能与学习路径详解,大模型零基础入门到精通 1293
  • web前端期末大作业:云南旅游网页主题网站设计——云南城市旅游5页HTML+CSS+JavaScript (2)
  • python基础导图及推导式 python复习笔记 347

最新文章

  • MQTT vs HTTP:谁更适合物联网?
  • 如何在 Rust 中通过 Rumqttc 实现 MQTT 通信
  • 提高数据集成稳定性:EMQX Platform 端到端规则调试指南
2024年33篇
2023年76篇
2022年175篇
2021年51篇
2020年84篇
2019年81篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳坪山网站建设公司通州做网站优化民权专业网站优化推广报价seo优化网站内容网站优化的费用沁阳网站自然优化哪家合适常州网站的优化优化网站排名共同易速达湖南网站关键词优化排名技巧网站优化实训心得兰州网站seo优化方案邯郸企业网站优化推广特点山东百度网站优化运营铜陵网站优化公司哪里有网站seo优化学习杭州网站优化哪家专业网站整体优化流程新乡营销型网站优化方案天津网站排名优化公司哪家靠谱携程网站流程优化汉沽网站关键词优化哪家服务好泰兴网站优化多少钱南昌创域网站优化使命阿里巴巴网站优化排名栾城商城网站优化公司泰安提供网站优化哪家便宜推荐餐饮行业网站优化如何投放梧州网站整站优化网站不做优化了还会有吗优化网站进度有哪些SEO网站优化推广工程师招聘香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化