树莓派物联网服务器搭建流程:集成 Node.js、InfluxDB、Grafana 和 MQTT 协议
目录
一、搭建准备
1. 硬件要求
2. 软件要求
二、技术栈概述
三、搭建步骤
1. 安装操作系统
2. 启动树莓派
3. 更新系统
4. 安装必要的软件
4.1 安装 Python 和 Flask
4.2 安装 Node.js
4.3 安装 Mosquitto(MQTT Broker)
4.4 安装 InfluxDB
4.5 启动 InfluxDB 服务
4.6 安装 Grafana
5. 配置数据源
6. 创建数据库
7. 搭建一个简单的物联网应用
7.1 安装依赖库
7.2 编写 Python 脚本
代码示例
代码说明
8. 运行 Python 脚本
9. 验证数据
9.1 验证 InfluxDB 数据
10. 使用 Grafana 进行数据可视化
10.1 登录 Grafana
10.2 添加数据源
10.3 创建仪表板
10.4 监控数据
11. 总结
随着物联网(IoT)技术的快速发展,使用树莓派搭建自己的物联网服务器成为了许多开发者和爱好者的热门选择。树莓派不仅价格低廉,而且功能强大,适合从简单项目到复杂应用的各种需求。本文将详细介绍如何在树莓派上搭建物联网服务器,涵盖所需的技术栈、搭建步骤以及代码示例。
一、搭建准备
1. 硬件要求
- 树莓派(推荐树莓派 3B+ 或 4B)
- SD卡(至少16GB,推荐使用Class 10)
- 电源适配器(5V/2.5A 或 5V/3A)
- 网络连接(Wi-Fi 或以太网)
2. 软件要求
- Raspbian(或其他支持的操作系统,如 Ubuntu)
- Python 3
- Node.js
- MQTT Broker(Mosquitto)
- InfluxDB
- Grafana
二、技术栈概述
在搭建物联网服务器时,通常会涉及多种技术,包括编程语言、数据库、消息传递协议、数据可视化工具和操作系统。以下是常见技术栈的简要介绍:
-
编程语言:
- Python:用于数据收集和处理,常用框架如 Flask。
- JavaScript:用于前端开发,Node.js 用于服务器端开发。
- Java:用于开发基于 Java 的物联网平台(如 ThingsBoard)。
-
操作系统:
- Raspbian:树莓派的官方操作系统。
- Ubuntu:适用于树莓派的另一个常见 Linux 发行版。
-
数据库:
- InfluxDB:时序数据库,适合存储传感器数据。
- MySQL/MariaDB:关系型数据库。
- SQLite:轻量级数据库,适用于小型项目。
-
消息传递协议:
- MQTT:轻量级的消息队列协议。
- HTTP/HTTPS:基于 REST API 的数据传输协议。
-
服务器软件:
- Node-RED:流式开发工具,用于图形化编程。
- Mosquitto:MQTT Broker。
-
数据可视化工具:
- Grafana:分析与监控平台,用于数据可视化。
- Matplotlib:Python 库,用于生成图表。
三、搭建步骤
1. 安装操作系统
首先,您需要在 SD 卡上安装 Raspbian 操作系统。可以使用 Raspberry Pi Imager 工具。
- 下载并安装 Raspberry Pi Imager。
- 选择操作系统(推荐选择 Raspbian)。
- 选择 SD 卡,点击“写入”。
2. 启动树莓派
- 将 SD 卡插入树莓派,连接电源和网络。
- 使用 HDMI 线连接显示器,启动树莓派。
- 完成初始设置,包括语言、时区、网络配置等。
3. 更新系统
打开终端,运行以下命令更新系统:
sudo apt update
sudo apt upgrade -y
4. 安装必要的软件
4.1 安装 Python 和 Flask
sudo apt install python3 python3-pip -y
pip3 install Flask
4.2 安装 Node.js
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt install -y nodejs
4.3 安装 Mosquitto(MQTT Broker)
sudo apt install mosquitto mosquitto-clients -y
启动 Mosquitto 服务:
sudo systemctl enable mosquitto
sudo systemctl start mosquitto
4.4 安装 InfluxDB
添加 InfluxDB 的仓库:
wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -
echo "deb https://repos.influxdata.com/debian stretch stable main" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt update
sudo apt install influxdb -y
4.5 启动 InfluxDB 服务
安装完成后,启动 InfluxDB 服务,并设置其在启动时自动运行:
sudo systemctl start influxdb
sudo systemctl enable influxdb
您可以使用以下命令检查 InfluxDB 的状态:
sudo systemctl status influxdb
4.6 安装 Grafana
Grafana 是一个强大的数据可视化工具,可以与 InfluxDB 集成。安装 Grafana 的步骤如下:
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:grafana/grafana
sudo apt update
sudo apt install -y grafana
启动 Grafana 服务并设置为开机自启:
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
5. 配置数据源
在 Grafana 中配置 InfluxDB 作为数据源:
- 打开浏览器,输入
http://<树莓派的IP地址>:3000
访问 Grafana(默认用户名和密码均为admin
)。 - 登录后,系统会提示您修改密码,建议立即更改。
- 点击左侧菜单中的“Configuration”(配置)图标,然后选择“Data Sources”(数据源)。
- 点击“Add data source”(添加数据源),选择“InfluxDB”。
- 输入以下配置:
- URL:
http://localhost:8086
- Database: 输入您想要使用的数据库名称(可以在后面创建)。
- User 和 Password: 如果没有设置,可以留空。
- URL:
- 点击“Save & Test”确认配置是否成功。
6. 创建数据库
在 InfluxDB 中创建一个用于存储物联网数据的数据库,例如 iot_data
:
influx
进入 InfluxDB 的命令行界面后,运行以下命令:
CREATE DATABASE iot_data
使用以下命令查看创建的数据库:
SHOW DATABASES
7. 搭建一个简单的物联网应用
接下来,我们将创建一个简单的 Python 应用,用于模拟传感器数据并将其发送到 InfluxDB 和 MQTT Broker。
7.1 安装依赖库
在终端中安装 paho-mqtt
和 influxdb
Python 库:
pip3 install paho-mqtt influxdb
7.2 编写 Python 脚本
我们将创建一个名为 sensor.py
的 Python 文件,该脚本将模拟传感器数据,并将这些数据发送到 InfluxDB 和 MQTT Broker。下面是完整的代码示例以及相应的说明。
代码示例
import time
import random
import paho.mqtt.client as mqtt
from influxdb import InfluxDBClient# MQTT 配置
MQTT_BROKER = "localhost" # MQTT Broker 地址
MQTT_PORT = 1883 # MQTT Broker 端口
MQTT_TOPIC = "iot/sensor" # MQTT 主题名称# InfluxDB 配置
INFLUXDB_HOST = "localhost" # InfluxDB 地址
INFLUXDB_PORT = 8086 # InfluxDB 端口
INFLUXDB_DATABASE = "iot_data" # InfluxDB 数据库名称# 创建 InfluxDB 客户端
influx_client = InfluxDBClient(INFLUXDB_HOST, INFLUXDB_PORT, database=INFLUXDB_DATABASE)# 创建 MQTT 客户端
mqtt_client = mqtt.Client()# 连接到 MQTT Broker
mqtt_client.connect(MQTT_BROKER, MQTT_PORT)# 发送传感器数据的函数
def send_sensor_data():while True:# 模拟传感器读取数据temperature = random.uniform(20.0, 30.0) # 模拟温度数据(20.0 到 30.0 摄氏度之间)humidity = random.uniform(30.0, 50.0) # 模拟湿度数据(30% 到 50% 之间)# 构建 InfluxDB 数据点json_body = [{"measurement": "sensor_data", # 数据测量的名称"tags": {"device": "raspberry_pi" # 标签,用于标识设备},"fields": {"temperature": temperature, # 温度字段"humidity": humidity # 湿度字段}}]# 写入数据到 InfluxDBinflux_client.write_points(json_body)# 将数据发送到 MQTTmqtt_client.publish(MQTT_TOPIC, f"Temperature: {temperature:.2f}, Humidity: {humidity:.2f}")# 打印发送的数据到控制台print(f"Sent data - Temperature: {temperature:.2f}, Humidity: {humidity:.2f}")time.sleep(5) # 每5秒发送一次if __name__ == "__main__":send_sensor_data()
代码说明
-
导入模块:
import time import random import paho.mqtt.client as mqtt from influxdb import InfluxDBClient
time
:用于控制发送数据的时间间隔。random
:用于生成模拟的温度和湿度数据。paho.mqtt.client
:用于与 MQTT Broker 进行通信的库。influxdb
:用于与 InfluxDB 数据库进行交互的库。
-
配置 MQTT 和 InfluxDB:
MQTT_BROKER = "localhost" MQTT_PORT = 1883 MQTT_TOPIC = "iot/sensor"INFLUXDB_HOST = "localhost" INFLUXDB_PORT = 8086 INFLUXDB_DATABASE = "iot_data"
- 这里定义了 MQTT 和 InfluxDB 的连接配置。
localhost
表示运行在同一台机器上。
- 这里定义了 MQTT 和 InfluxDB 的连接配置。
-
创建 InfluxDB 客户端:
influx_client = InfluxDBClient(INFLUXDB_HOST, INFLUXDB_PORT, database=INFLUXDB_DATABASE)
- 创建一个 InfluxDB 客户端对象,用于后续的数据写入。
-
创建 MQTT 客户端:
mqtt_client = mqtt.Client() mqtt_client.connect(MQTT_BROKER, MQTT_PORT)
- 创建一个 MQTT 客户端对象并连接到指定的 MQTT Broker。
-
发送传感器数据的函数:
def send_sensor_data():while True:# 模拟传感器读取数据temperature = random.uniform(20.0, 30.0) # 模拟温度数据(20.0 到 30.0 摄氏度之间)humidity = random.uniform(30.0, 50.0) # 模拟湿度数据(30% 到 50% 之间)
while True:
循环将不断运行,模拟持续读取传感器数据。random.uniform(20.0, 30.0)
生成一个介于 20.0 和 30.0 之间的随机浮点数,模拟温度读数。random.uniform(30.0, 50.0)
生成一个介于 30.0 和 50.0 之间的随机浮点数,模拟湿度读数。
-
构建 InfluxDB 数据点:
json_body = [{"measurement": "sensor_data", # 数据测量的名称"tags": {"device": "raspberry_pi" # 标签,用于标识设备},"fields": {"temperature": temperature, # 温度字段"humidity": humidity # 湿度字段}} ]
- 这里构建一个 JSON 格式的数据点,包含:
- measurement:数据测量的名称(在 InfluxDB 中的表名)。
- tags:用于对数据进行标记的键值对,可以用于过滤和分组。
- fields:实际存储的数据,包括温度和湿度。
- 这里构建一个 JSON 格式的数据点,包含:
-
写入数据到 InfluxDB:
influx_client.write_points(json_body)
- 使用
write_points
方法将构建的数据点写入 InfluxDB。
- 使用
-
将数据发送到 MQTT:
mqtt_client.publish(MQTT_TOPIC, f"Temperature: {temperature:.2f}, Humidity: {humidity:.2f}")
- 使用
publish
方法将数据发送到指定的 MQTT 主题。这里使用了格式化字符串,将温度和湿度格式化为两位小数。
- 使用
-
打印发送的数据到控制台:
print(f"Sent data - Temperature: {temperature:.2f}, Humidity: {humidity:.2f}")
- 在控制台输出发送的数据,方便调试和查看。
-
设置发送间隔:
time.sleep(5) # 每5秒发送一次
- 使用
time.sleep(5)
使程序每 5 秒钟发送一次数据,模拟定时的传感器读取。
- 使用
-
主程序入口:
if __name__ == "__main__":send_sensor_data()
- 这部分代码确保当脚本作为主程序运行时,调用
send_sensor_data
函数开始数据发送。
- 这部分代码确保当脚本作为主程序运行时,调用
8. 运行 Python 脚本
在终端中,您可以使用以下命令运行 Python 脚本:
python3 sensor.py
确保您已经安装了所有必要的依赖库,并且已经启动了 InfluxDB 和 MQTT Broker。运行脚本后,您将看到每 5 秒生成并发送一次的温度和湿度数据,如下所示:
Sent data - Temperature: 24.56, Humidity: 35.78
9. 验证数据
9.1 验证 InfluxDB 数据
您可以在终端中进入 InfluxDB 的命令行界面验证数据是否成功写入:
influx
在 InfluxDB 命令行中,选择数据库并查询数据:
USE iot_data;
SELECT * FROM sensor_data;
这将显示您发送的传感器数据。
使用以下命令行工具来订阅 MQTT 主题:
mosquitto_sub -h localhost -t "iot/sensor"
运行此命令后,您应该能够看到类似以下的输出,显示通过 MQTT 发送的传感器数据:
Temperature: 24.56, Humidity: 35.78
Temperature: 22.34, Humidity: 40.12
Temperature: 25.01, Humidity: 30.45
这表明您的 Python 脚本成功将模拟的温度和湿度数据通过 MQTT Broker 发送出去。
10. 使用 Grafana 进行数据可视化
在成功发送和存储数据后,我们可以使用 Grafana 来可视化这些数据。以下是如何在 Grafana 中创建仪表板以显示传感器数据的步骤。
10.1 登录 Grafana
打开浏览器,访问 Grafana 的界面,通常地址为 http://<树莓派的IP地址>:3000
。使用默认的用户名和密码(均为 admin
)登录。
10.2 添加数据源
- 登录后,点击左侧菜单中的“Configuration”(配置)图标,然后选择“Data Sources”(数据源)。
- 点击“Add data source”(添加数据源),选择“InfluxDB”。
- 在配置页面中,输入以下信息:
- URL:
http://localhost:8086
- Database: 输入
iot_data
(我们之前创建的数据库名称)。 - User 和 Password: 如果没有设置,留空即可。
- URL:
- 点击“Save & Test”确认配置是否成功。
10.3 创建仪表板
- 在 Grafana 左侧菜单中,选择“+”图标,然后选择“Dashboard”(仪表板)。
- 点击“Add new panel”(添加新面板)。
- 在查询部分选择数据源为刚刚添加的 InfluxDB。
- 输入查询语句:
SELECT mean("temperature") AS "Average Temperature" FROM "sensor_data" WHERE $timeFilter GROUP BY time($interval) fill(null)
- 此查询将计算传感器数据的平均温度。
- 在“Visualization”选项卡中选择您想要的图表类型(例如,图形、单值等)。
- 点击“Apply”保存面板设置。
- 您可以重复以上步骤以添加更多面板,例如显示湿度数据、实时数据等。
10.4 监控数据
完成以上步骤后,您将能够在 Grafana 中监控和可视化传感器数据。您可以根据需要自定义仪表板,以便更好地展示您感兴趣的数据。
11. 总结
在本篇文章中,我们详细介绍了如何在树莓派上搭建一个物联网服务器,步骤包括:
- 准备工作:选择合适的硬件和软件环境。
- 安装操作系统:在树莓派上安装 Raspbian 操作系统。
- 安装必要的软件:包括 Python、MQTT Broker(Mosquitto)、InfluxDB 和 Grafana。
- 编写数据收集脚本:使用 Python 编写脚本以模拟传感器数据,并将数据发送到 InfluxDB 和 MQTT Broker。
- 验证数据:通过 InfluxDB 和 MQTT 客户端验证数据是否成功存储和发送。
- 使用 Grafana 可视化数据:设置 Grafana,创建仪表板以实时监控传感器数据。
非常感谢您阅读到这里!您的关注和支持是我不断前进的动力。跟随着我探索嵌入式领域,希望因为兴趣而成为嵌入式领域的专家。
在这个快速发展的技术时代,嵌入式系统无处不在,从智能家居到医疗设备,从自动驾驶汽车到工业控制,每一个领域都离不开嵌入式技术的支持。对我来说,嵌入式不仅仅是一门技术,更是一种激情和追求。通过不断学习和实践,我深深爱上了这个充满挑战和机遇的领域。每一次调试成功,每一个创新的实现,都是我继续前行的动力。
——by 极客小张
相关文章:

树莓派物联网服务器搭建流程:集成 Node.js、InfluxDB、Grafana 和 MQTT 协议
目录 一、搭建准备 1. 硬件要求 2. 软件要求 二、技术栈概述 三、搭建步骤 1. 安装操作系统 2. 启动树莓派 3. 更新系统 4. 安装必要的软件 4.1 安装 Python 和 Flask 4.2 安装 Node.js 4.3 安装 Mosquitto(MQTT Broker) 4.4 安装 InfluxDB…...

typescript 断言
/* 断言 确定后期一定是某种格式 可用于表单大对象初始化是空,赋值时有具体字段。前期断言是会是某种格式 */interface obj {name: stringlocation: stringage?: number }// 会报错 // let data: obj { // // } let data: obj {} as obj; // 断言data会有obj里…...

期刊评价指标及其查询方法
1、期刊评价体系一 科睿唯安《期刊引证报告》(Journal Citation Reports, JCR) 科睿唯安每年发布的《期刊引证报告》(Journal Citation Reports, JCR)是一个独特的多学科期刊评价工具。JCR数据库提供基于引文数据的统计信息的期…...

巴斯勒相机(Basler) ACE2 dart 系列说明和软件
巴斯勒相机(Basler) ACE2 dart 系列说明和软件...

【Pycharm中anaconda使用介绍】
在安装好anaconda之后,首先打开anaconda界面,执行以下操作 1.查看Anaconda中当前存在的环境 conda info -e 或者 conda-env list 查看–安装–更新–删除包 conda list: conda search package_name 查询包 conda install package_name conda …...

2024下半年,前端的技术风口来了
“ 你近期有体验过哪些大模型产品呢? 你有使用大模型API做过一些实际开发吗? 在你日常开发中,可以与大模型相关应用结合来完成工作吗? ” **最近,一直在和同事聊,关于前端可以用大模型干点啥ÿ…...

Spock Unit Test in Java
优质博文:IT-BLOG-CN 一、简介 Spock是一个基于Groovy语言的测试和规范框架,使得测试代码更简介,得益于JUnit Runner,Spock兼容大部分IDE和测试框架JUnit/JMock/Powermock等。基于BDD行为驱动开发,功能非常强大。提…...

:= 符号python
在 Python 3.8 及更高版本中,引入了一种新的语法特性,称为"海象运算符"(Walrus Operator),它使用 : 符号。这个运算符的主要目的是在表达式中同时进行赋值和返回赋值的值。 使用海象运算符可以在一些情况下…...

UPLOAD-LABS靶场[超详细通关教程,通关攻略]
---------------------------------------- 靶场环境: 下载链接: https://codeload.github.com/c0ny1/upload-labs/zip/refs/heads/master 使用小皮集成环境来完成这个靶场 将文件放到WWW目录下就可以进行访问 ------------------------------------…...

测试面试宝典(三十七)—— 接口测试中的加密参数如何处理?
1)先了解接口使用的加密方式(md5、rsa...) 2)检查接口测试工具是否支持这种加密方式,如果支持的话,直接使用对应功能就行了(比如Jmeter支持md5);如果加密方式是公司内部特有的算法,可以在接口测试工具中调…...

秋招突击——7/23——百度提前批面试准备和正式面试
文章目录 引言一面准备面试预演一1、讲一下hashcode()和equals()关系2、equals()和有什么区别3、讲一下重载和重写的区别4、讲一下深拷贝、浅拷贝的区别5、讲一下Java异常的基类,运行时异常举几个例子,什么情况下会出现?6、讲一下Java中线程的…...

学习日记:数据类型2
目录 1.转义字符 2.隐式类型转换 2.1 强制类型转换 2.2 不同类型间赋值 3.运算符 表达式 3.1 算术运算符 3.2 算术运算优先级 3.3 赋值运算 3.3.1 不同类型间混合赋值 3.4 逗号运算 4.生成随机数 5. 每日一练 1.转义字符 \n 表示换行 \t …...

Django Web框架——05
文章目录 admin 后台数据库管理注册自定义模型类修改自定义模型类的展现样式模型管理器类再谈Meta类 数据表关联关系映射一对一映射一对多映射多对多映射 cookies 和 sessioncookiessessionCookies vs session admin 后台数据库管理 django 提供了比较完善的后台管理数据库的接…...

【React】项目的目录结构全面指南
文章目录 一、React 项目的基本目录结构1. node_modules2. public3. src4. App.js5. index.js6. .gitignore7. package.json8. README.md 二、React 项目的高级目录结构1. api2. hooks3. pages4. redux5. utils 三、最佳实践 在开发一个 React 项目时,良好的目录结构…...

Django学习(二)
get请求 练习: views.py def test_method(request):if request.method GET:print(request.GET)# 如果链接中没有参数a会报错print(request.GET[a])# 使用这个方法,当查询不到参数时,不会报错而是返回你设置的值print(request.GET.get(c,n…...

Java引用类型
强软弱虚 以 ZGC 为例,谈一谈 JVM 是如何实现 Reference 语义的 SoftReference 到底在什么时候被回收 ? 如何量化内存不足 ? PhantomReference 和 WeakReference 究竟有何不同 ThreadLocal 和 Netty ByteBuf中使用到的引用类型 https://w…...

ubunto安装redis
更新包管理工具 sudo apt update 安装Redis sudo apt install redis-server Redis已经安装并且服务已启动 sudo systemctl status redis-server Redis开机启动项 sudo systemctl enable redis-server 可以编辑配置文件 /etc/redis/redis.conf,然后重启Redis服务 比如…...

【odoo17 | Owl】前端js钩子调用列表选择视图
概要 在我们选择多对一或者多对多字段的时候,经常看到可以弹出列表弹窗让人一目了然的效果,效果如下: 那么,这种效果是odoo本身封装好的组件,我们在平时的前端界面开发的时候,既不是后端视图的情况下&#…...

MATLAB基础:函数与函数控制语句
今天我们继续学习Matlab中函数相关知识。 API的查询和调用 help 命令是最基本的查询方法,可查询所有目录、指定目录、命令、函数。 我们直接点击帮助菜单即可查询所需的API函数。 lookfor 关键字用于搜索相关的命令和函数。 如,我们输入lookfor inpu…...

2024.7.30 搜索插入位置(二分法)
题解 二分法 left和right标记二分区间 ans标记n,因为存在大于所有数的可能。 var searchInsert function(nums, target) {const n nums.length;let left 0, right n - 1, ans n;while (left < right) {//计算中位数let mid ((right - left) >> 1)…...

Socket通信(C++)
文章目录 什么是SocketSocket通信过程C Socket通信APIint socket(int domain, int type, int protocol);int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);struct sockaddrstruct sockaddr_unstruct sockaddr_in / struct sockaddr_in6 int connect(int …...

小白学大模型:LLaMA-Factory 介绍与使用
最近这一两周看到不少互联网公司都已经开始秋招提前批了。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球友…...

java算法day26
java算法day26 207 课程表208 实现Trie(前缀树) 207 课程表 这题对应的知识是图论里的拓扑排序的知识。从题意就可以感受出来了。题目说如果要学习某课程,那么就需要先完成某课程。 这里我描述比较复杂的情况:课程与课程之间也有可能是多对一的场景或者…...

docker笔记7-dockerfile
docker笔记7-dockerfile 一、dockerfile介绍二、dockerfile指令三、构建自己的镜像 一、dockerfile介绍 Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。 以下是常用的 Dockerfile 关键字的完整列表和说明: 二、docker…...

Spring-cloud Alibaba组件--Dubbo
远程调用技术 RestFul风格 基于HTTP协议实现,而HTTP是一种网络传输协议,基于TCP,规定了数据传输的格式。 RPC协议 Remote Produce Call 远程过程调用,类似的还有 RMI ( remote method invoke)。自定义数…...

右值引用--C++11
左值引用和右值引用 传统的C语法中就有引用的语法,而C11中新增了的右值引用语法特性,所以从现在开始我们 之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。 什么是左值?什么是左值引用?…...

这样做外贸报价表,客户看了才想下单
报价,是外贸业务中最重要的一步,作为外贸人,不会做报价表可不行。有人说,直接在邮件里回复价格不就好了?是的,产品简单的可以这么做,但你也不能忽视报价表的价值,一份完美的价格表对…...

Swift学习入门,新手小白看过来
😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。 😊 座右铭:不…...

【Ant Design Pro】快速上手
初始化 初始化脚手架:快速开始 官方默认使用 umi4,这里文档还没有及时更新(不能像文档一样选择 umi 的版本),之后我选择 simple。 然后安装依赖。 在 package.json 中: "start": "cross-e…...

Hive3:Hive初体验
1、创建表 CREATE TABLE test(id INT, name STRING, gender STRING);2、新增数据 INSERT INTO test VALUES(1, 王力红, 男); INSERT INTO test VALUES(2, 钉钉盯, 女); INSERT INTO test VALUES(3, 咔咔咔, 女);3、查询数据 简单查询 select * from test;带聚合函数的查询 …...