BladeX开发入门(记录)
BladeX 物联网平台是一款高度集成的物联网解决方案,涵盖设备管理、数据采集、实时监控、数据分析以及开放API服务等核心功能。
平台经过精心设计与开发,提供了全面的品类、产品和设备支持。设备注册成功后,能够轻松桥接至其他物联网云平台,实现设备的无缝集成。
同时提供服务端订阅功能,支持MQTT与AMQP两者方式将设备数据订阅转发至自建服务端,实现设备数据的自定义监控与分析。
官方环境要求
基础开发环境
- Java: 17
- NodeJs: 18
- Maven: 3.6+
- MySql: 5.7+
- Redis: 5.0+
- InfluxDB: 1.8.x+
IDE插件
- Lombok Plugin (必装)
- MybatisX Plugin (idea选装)
推荐IDE
- 后端使用 IntelliJ IDEA
- 前端使用 IntelliJ WebStorm
本机测试环境
操作系统:Windows 10
IDE使用:IntelliJ IDEA
前端使用:VSCODE
一、环境准备
1 下载安装JDK17
下载openjdk17,前往下载地址找到符合自己机器的版本并安装配置环境变量,三种推荐版本选其一或公司选型的Jdk均可
-
下载地址(Azul Zulu):https://www.azul.com/downloads/?version=java-17-lts&package=jdk#zulu
-
下载地址(Eclipse Temurin™):https://adoptium.net/zh-CN/temurin/releases/?version=17
-
下载地址(Amazon Corretto):https://aws.amazon.com/cn/corretto/?filtered-posts.sort-by=item.additionalFields.createdDate&filtered-posts.sort-order=desc
选择Azul Zulu,找到windows版本进行下载:
下载zip版本,加压缩,验证版本信息:
定位到<installation_folder>\bin目录,执行:java -version
(可选)添加<installation_folder>\bin
到您的PATH
系统变量,以便您可以java
从任何目录执行而无需指定完整路径:
我的电脑->属性->高级系统设置->环境变量->系统变量->Path->编辑
在打开的对话框中,添加bin文件夹路径(Azul Zulu 安装文件.zip文件解压到的目录
)。
注意:确保bin
文件夹位于列表顶部(避免多个jdk版本导致不生效)
2 安装Maven
由于电脑已经安装3.9.4版本,略过:
3 NodeJs
由于电脑已经安装18.16.0,略过:
4 安装MySQL(用docker可不安装)
(1) 下载
下载地址:https://dev.mysql.com/downloads/mysql/
默认是最新版本,可以选择下载msi或者zip:
由于环境要求是5.7+,最后选择5.7版本的最新版本(根据网上的建议)
切换到档案Archives,选择5.7.44版本:
解压缩到目录下(my.ini是新建的,详见下文)
(2) 配置
配置环境变量:将MySQL安装路径下的bin目录配置到Path变量中Path添加:D:\Program Files\mysql\mysql-5.7.44-winx64\bin
在【安装目录】内,新建 my.ini 空文件,添加以下内容(替换【安装目录】):
[mysql] # 设置 mysql 客户端默认字符集 default-character-set=utf8 [mysqld] #设置 3306 端口 port = 3306 # 设置 mysql 的安装目录 basedir= 【安装目录】 # 设置 mysql 数据库的数据的存放目录 datadir= 【安装目录】\data # 允许最大连接数 max_connections=200 # 服务端使用的字符集默认为 8 比特编码的 latin1 字符集 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB
如下:
注意:我在windows server 2016安装mysql时,将my.ini拷贝到服务器上,修改路径后运行报错:
原因:文件编码问题,Windows Server会比Windows更为严格,一般注意编码问题,检查是否有多余的字符或者隐藏的字符,通常是多余的空格可能会造成影响,或者检查路径,尝试使用/
通过排查,将文件编码从UTF-8转换成ANSI编码,发现每行末尾都添加了几个空格,将这几个空格去掉,再次运行解决了问题
(3) 安装
以管理员身份运行cmd,进入到MySQL的bin目录,执行初始化命令:
mysqld --initialize --user=mysql --console
该命令用来初始化数据,在5.7以前的版本是不需要执行该命令的。初始化完成后会提供一个临时的root密码,如下图红色方框,记下该密码:0uNDD&/lq<Tr
再执行如下命令进行MySQL服务安装:
mysqld –install mysql
mysql为默认的服务名,可不写,若安装成功则有如下提示:
需要注意的是一定要以管理员身份运行cmd,否则会出现如下图所示提示:
(4) 启动
启动服务
net start mysql
当出现如下图所示提示时表示MySQL安装并启动成功。
MySQL5.7以前的版本在安装时不需要执行第四步中的mysqld –initialize命令,
5.7版本如果漏掉该命令后在此步骤会出现如下错误:
因为该版本的压缩包里面有些文件和文件夹(如data文件夹)需要在执行mysqld -initialize命令后才创建。
(5) 登录
mysql -u root -p
提示输入密码,输入前面安装的时候记录下的密码,按回车后出现如下页面表示登录成功,并进入了MySQL命令行模式。
(6) 修改密码
ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘new_password’
修改成功会提示:Query OK, 0 rows affected (0.00 sec)
注意:sql命令要以分号结束,如果第一次没有结束,第二行再次执行还是会报错,分号结束后再执行就正常了,如上图所示。
如果没有修改密码就执行其它的SQL命令,则会提示如下错误:
(7) 操作数据库
安装和启动已经完成后,可输入下列语句,显示已有数据库:
show databases;
退出命令行模式,可输入以下任一一个命令:
exit quit \q
停止数据库服务,输入:
net stop mysql
5 Redis(用docker可不安装)
参考文档:https://blog.csdn.net/ljj20161221/article/details/135134670
Window下Redis的安装和部署详细图文教程(包含Redis Desktop Manage安装和使用):https://www.jb51.net/database/320870vp2.htm
6 安装Docker
使用docker挂在mysql、redis、influxdb,宿主机器可无需安装mysql、redis
下载地址:https://docs.docker.com/desktop/install/windows-install/
下载完后按照默认安装好,修改 docker desktop 配置
1)开启WSL 2运行Docker,正常是默认开启的
2)修改资源存储目录:
3)配置国内镜像源,可以添加多个,json格式
"registry-mirrors": [ "https://mirror.ccs.tencentyun.com", "http://hub-mirror.c.163.com", "https://registry.docker-cn.com" ]
具体可参考:https://blog.csdn.net/mst_sun/article/details/135087651
二、Bladex物联网平台工程运行
1、中间件运行
根据需要先创建挂载目录:
注:以下命令在命令行中执行,为避免出现其他问题,建议以管理员身份运行
docker启动mysql并挂载文件(关闭大小写敏感)
docker run ^ --name mysql -d -p 13306:3306 ^ -v D:\develop\docker\data\mysql\data:/var/lib/mysql ^ -v D:\develop\docker\data\mysql\conf:/etc/mysql/conf.d ^ -e MYSQL_ROOT_PASSWORD=mysql123456 ^ --privileged=true ^ mysql:5.7.44 ^ --lower_case_table_names=1
注意:
- 运行前先创建好目录:D:\develop\docker\data\mysql\data和D:\develop\docker\data\mysql\conf
- 因本机安装了mysql,端口3306被占用,改用了13306
- Windows下换行用^;Linux底下换行用\
创建数据库并导入sql:
- 服务启动成功后打开数据库,创建数据库名
bladex_iot
(字符集采用utf8mb4
) - 导入
BladeX-Links
工程根目录下/doc/sql
文件夹的bladex.mysql.iot.create.sql
文件与bladex.mysql.sys.create.sql
以navicat为例,新建完后右键运行SQL文件,然后找到指定文件运行即可。
docker启动redis(注意生产环境必须关闭端口映射并且设置密码)
docker run --name redis -d -p 6379:6379 -v D:\develop\docker\data\redis\data:/data redis:7.2.4
注:开发环境就没设置密码了
docker启动influxdb并挂载数据
docker run -d --name influxdb ^ -p 8086:8086 ^ -v D:\develop\docker\data\influxdb:/var/lib/influxdb ^ -e INFLUXDB_DB=links ^ -e INFLUXDB_HTTP_AUTH_ENABLED=true ^ -e INFLUXDB_ADMIN_USER=admin ^ -e INFLUXDB_ADMIN_PASSWORD=links ^ influxdb:1.8.10
可以在docker中看到启动情况:
2、 后端运行
(1)获取BladeX-Links代码,使用IDEA打开工程,点击maven
刷新按钮下载依赖
- 物联网平台底层基于BladeX架构开发,运行方式两者基本一致,在此之前推荐先查阅框架相关资料
- 特别详细的步骤,请看https://www.kancloud.cn/smallchill/blade/1482370
(2)修改配置前先获取秘钥:
bladex-links\blade-server\src\test\java\org\springblade\test\Sm2KeyGenerator.java
bladex-links\blade-server\src\test\java\org\springblade\test\SignKeyGenerator.java
右键运行:
在输出中可以看到public-key和private-key
sign-key和aes-key:
(3)修改BladeX-Links工程下的blade-server配置
修改application.yml配置文件,修改密钥保持与blade-broker一致
bladex-links\blade-server\src\main\resources\application.yml:
blade-server的端口号默认是80,根据实际情况选择是否修改(测试因80端口被占用,改用8099端口):
修改application-dev.yml配置文件,修改数据库、redis、influxdb、minio等配置
bladex-links\blade-server\src\main\resources\application-dev.yml:端口密码等配置信息根据自己安装时候的实际情况修改
(4)修改BladeX-Links工程下的blade-broker配置
修改application.yml配置文件,修改密钥保持与blade-server一致
bladex-links\blade-broker\src\main\resources\application.yml:
修改application-dev.yml配置文件,修改数据库、redis、influxdb、minio等配置
bladex-links\blade-broker\src\main\resources\application-dev.yml:
(5)启动服务端
启动BladeX-Links
工程下的blade-broker
模块的BrokerApplication
启动类,看到如下日志,则说明启动成功
____ _ _ __ __ _ _ _ | _ \| | | | \ \ / / | | (_) | | | |_) | | __ _ __| | ___ \ V / | | _ _ __ | | _____ | _ <| |/ _` |/ _` |/ _ \ > < | | | | '_ \| |/ / __| | |_) | | (_| | (_| | __// . \ | |___| | | | | <\__ \ |____/|_|\__,_|\__,_|\___/_/ \_\ |_____|_|_| |_|_|\_\___/ :: SpringBlade :: blade-broker:dev :: Running SpringBoot 3.2.4 :: 2024-06-03 00:26:26.238 INFO 21536 --- [kground-preinit] o.h.validator.internal.util.Version : HV000001: Hibernate Validator 8.0.1.Final 2024-06-03 00:26:26.265 INFO 21536 --- [ main] o.s.mqtt.broker.BrokerApplication : Starting BrokerApplication using Java 17.0.10 with PID 21536 (/Users/chill/Workspaces/product/BladeX-IOT/blade-broker/target/classes started by chill in /Users/chill/Workspaces/product/BladeX-IOT) 2024-06-03 00:26:26.265 DEBUG 21536 --- [ main] o.s.mqtt.broker.BrokerApplication : Running with Spring Boot v3.2.4, Spring v6.1.5 2024-06-03 00:26:26.266 INFO 21536 --- [ main] o.s.mqtt.broker.BrokerApplication : The following 1 profile is active: "dev" 2024-06-03 00:26:26.887 INFO 21536 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode 2024-06-03 00:26:26.888 INFO 21536 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. 2024-06-03 00:26:26.904 INFO 21536 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 9 ms. Found 0 Redis repository interfaces. 2024-06-03 00:26:26.956 WARN 21536 --- [ main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'mqttAccountMapper' and 'org.springblade.mqtt.broker.auth.mapper.MqttAccountMapper' mapperInterface. Bean already defined with the same name! 2024-06-03 00:26:26.956 WARN 21536 --- [ main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'mqttAuthLogMapper' and 'org.springblade.mqtt.broker.auth.mapper.MqttAuthLogMapper' mapperInterface. Bean already defined with the same name! 2024-06-03 00:26:26.957 WARN 21536 --- [ main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'deviceMapper' and 'org.springblade.mqtt.broker.device.mapper.DeviceMapper' mapperInterface. Bean already defined with the same name! 2024-06-03 00:26:26.998 INFO 21536 --- [ main] s.c.l.p.BladePropertySourcePostProcessor : BladePropertySourcePostProcessor init. 2024-06-03 00:26:27.021 INFO 21536 --- [ main] s.c.l.p.BladePropertySourcePostProcessor : BladePropertySourcePostProcessor process @BladePropertySource bean. 2024-06-03 00:26:27.336 WARN 21536 --- [ main] io.undertow.websockets.jsr : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used 2024-06-03 00:26:27.343 INFO 21536 --- [ main] io.undertow.servlet : Initializing Spring embedded WebApplicationContext 2024-06-03 00:26:27.343 INFO 21536 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1057 ms 2024-06-03 00:26:27.503 INFO 21536 --- [ main] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource 2024-06-03 00:26:27.541 INFO 21536 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited 2024-06-03 00:26:28.647 INFO 21536 --- [ main] n.d.i.m.core.server.MqttServerCreator : Mica mqtt http api enable:false websocket enable:true 2024-06-03 00:26:29.059 INFO 21536 --- [ main] o.s.core.boot.config.RetryConfiguration : configServerRetryInterceptor: Changing backOffOptions to initial: 1000, multiplier: 1.2, maxInterval: 5000 2024-06-03 00:26:29.072 INFO 21536 --- [ main] o.s.core.log.logger.BladeLogger : blade-broker: BladeLogger init success! 2024-06-03 00:26:29.459 INFO 21536 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint(s) beneath base path '/actuator' 2024-06-03 00:26:29.633 INFO 21536 --- [ main] io.undertow : starting server: Undertow - 2.3.12.Final 2024-06-03 00:26:29.636 INFO 21536 --- [ main] org.xnio : XNIO version 3.8.8.Final 2024-06-03 00:26:29.640 INFO 21536 --- [ main] org.xnio.nio : XNIO NIO Implementation Version 3.8.8.Final 2024-06-03 00:26:29.651 INFO 21536 --- [ main] org.jboss.threads : JBoss Threads version 3.5.0.Final 2024-06-03 00:26:29.668 INFO 21536 --- [ main] o.s.b.w.e.undertow.UndertowWebServer : Undertow started on port 8888 (http) 2024-06-03 00:26:29.670 INFO 21536 --- [ Thread-1] org.tio.utils.timer.TimingWheelThread : Starting 2024-06-03 00:26:29.670 INFO 21536 --- [sync-executor-1] o.s.core.launch.StartEventListener : ---[BLADE-BROKER]---启动完成,当前使用的端口:[8888],环境变量:[dev]--- 2024-06-03 00:26:29.672 INFO 21536 --- [ main] org.tio.server.TioServer : |----------------------------------------------------------------------------------------| | TioConfig name | BladeX-Mqtt-Server | | Mica net version | 1.0.0 | | Started at | 2024-06-03 00:26:29 | | Listen on | 0.0.0.0:1883 | | Main Class | org.springblade.mqtt.broker.BrokerApplication | | Jvm start time | 4318ms | | Tio start time | 2ms | | Pid | 21536 | |----------------------------------------------------------------------------------------| 2024-06-03 00:26:29.673 INFO 21536 --- [ main] org.tio.server.TioServer : |----------------------------------------------------------------------------------------| | TioConfig name | BladeX-Mqtt-Server-HTTP/Websocket | | Mica net version | 1.0.0 | | Started at | 2024-06-03 00:26:29 | | Listen on | 0.0.0.0:8083 | | Main Class | org.springblade.mqtt.broker.BrokerApplication | | Jvm start time | 4319ms | | Tio start time | 1ms | | Pid | 21536 | |----------------------------------------------------------------------------------------| 2024-06-03 00:26:29.684 INFO 21536 --- [ main] o.s.mqtt.broker.BrokerApplication : Started BrokerApplication in 3.669 seconds (process running for 4.348) 2024-06-03 00:26:29.957 INFO 21536 --- [-192.168.31.254] io.undertow.servlet : Initializing Spring DispatcherServlet 'dispatcherServlet' 2024-06-03 00:26:29.958 INFO 21536 --- [-192.168.31.254] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2024-06-03 00:26:29.958 INFO 21536 --- [-192.168.31.254] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms
启动BladeX-Links
工程下的blade-server
模块的ServerApplication
启动类 ,看到如下日志,则说明启动成功
____ _ _ __ __ _ _ _ | _ \| | | | \ \ / / | | (_) | | | |_) | | __ _ __| | ___ \ V / | | _ _ __ | | _____ | _ <| |/ _` |/ _` |/ _ \ > < | | | | '_ \| |/ / __| | |_) | | (_| | (_| | __// . \ | |___| | | | | <\__ \ |____/|_|\__,_|\__,_|\___/_/ \_\ |_____|_|_| |_|_|\_\___/ :: SpringBlade :: blade-server:dev :: Running SpringBoot 3.2.4 :: 2024-06-03 00:26:26.462 INFO 21541 --- [kground-preinit] o.h.validator.internal.util.Version : HV000001: Hibernate Validator 8.0.1.Final 2024-06-03 00:26:26.493 INFO 21541 --- [ main] org.springblade.ServerApplication : Starting ServerApplication using Java 17.0.10 with PID 21541 (/Users/chill/Workspaces/product/BladeX-IOT/blade-server/target/classes started by chill in /Users/chill/Workspaces/product/BladeX-IOT) 2024-06-03 00:26:26.493 DEBUG 21541 --- [ main] org.springblade.ServerApplication : Running with Spring Boot v3.2.4, Spring v6.1.5 2024-06-03 00:26:26.493 INFO 21541 --- [ main] org.springblade.ServerApplication : The following 1 profile is active: "dev" 2024-06-03 00:26:27.153 INFO 21541 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode 2024-06-03 00:26:27.154 INFO 21541 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. 2024-06-03 00:26:27.192 INFO 21541 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 32 ms. Found 0 Redis repository interfaces. 2024-06-03 00:26:27.237 WARN 21541 --- [ main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[org.springblade]' package. Please check your configuration. 2024-06-03 00:26:27.298 INFO 21541 --- [ main] s.c.l.p.BladePropertySourcePostProcessor : BladePropertySourcePostProcessor init. 2024-06-03 00:26:27.320 INFO 21541 --- [ main] s.c.l.p.BladePropertySourcePostProcessor : BladePropertySourcePostProcessor process @BladePropertySource bean. 2024-06-03 00:26:27.637 WARN 21541 --- [ main] io.undertow.websockets.jsr : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used 2024-06-03 00:26:27.643 INFO 21541 --- [ main] io.undertow.servlet : Initializing Spring embedded WebApplicationContext 2024-06-03 00:26:27.643 INFO 21541 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1133 ms 2024-06-03 00:26:27.813 INFO 21541 --- [ main] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource 2024-06-03 00:26:27.847 INFO 21541 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited 2024-06-03 00:26:30.954 INFO 21541 --- [ main] o.s.core.boot.config.RetryConfiguration : configServerRetryInterceptor: Changing backOffOptions to initial: 1000, multiplier: 1.2, maxInterval: 5000 2024-06-03 00:26:30.962 INFO 21541 --- [ main] o.s.core.log.logger.BladeLogger : blade-server: BladeLogger init success! 2024-06-03 00:26:31.395 INFO 21541 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint(s) beneath base path '/actuator' 2024-06-03 00:26:31.866 INFO 21541 --- [ main] io.undertow : starting server: Undertow - 2.3.12.Final 2024-06-03 00:26:31.869 INFO 21541 --- [ main] org.xnio : XNIO version 3.8.8.Final 2024-06-03 00:26:31.872 INFO 21541 --- [ main] org.xnio.nio : XNIO NIO Implementation Version 3.8.8.Final 2024-06-03 00:26:31.882 INFO 21541 --- [ main] org.jboss.threads : JBoss Threads version 3.5.0.Final 2024-06-03 00:26:31.899 INFO 21541 --- [ main] o.s.b.w.e.undertow.UndertowWebServer : Undertow started on port 80 (http) 2024-06-03 00:26:31.901 INFO 21541 --- [sync-executor-1] o.s.core.launch.StartEventListener : ---[BLADE-SERVER]---启动完成,当前使用的端口:[80],环境变量:[dev]--- 2024-06-03 00:26:31.910 INFO 21541 --- [ main] org.springblade.ServerApplication : Started ServerApplication in 5.638 seconds (process running for 5.923) 2024-06-03 00:26:32.271 INFO 21541 --- [-192.168.31.254] io.undertow.servlet : Initializing Spring DispatcherServlet 'dispatcherServlet' 2024-06-03 00:26:32.271 INFO 21541 --- [-192.168.31.254] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2024-06-03 00:26:32.273 INFO 21541 --- [-192.168.31.254] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms
注意:
- 由于采用Java17,Java 模块化系统(Java Module System)的安全限制导致的针对反射等场景有可能会出现如下错误:
Cause: java.lang.reflect.InaccessibleObjectException: Unable to make field protected java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.h accessible: module java.base does not "opens java.lang.reflect" to unnamed module @223aa2f7
- 解决方案:在启动参数中添加
--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED
3、 前端运行
获取前端代码bladex-links-ui,根据自己的习惯选择IDE打开(本人使用VSCODE)。
修改website.js配置文件,bladex-links-ui\src\config\website.js(需要和后端保持一致):
blade-server默认为80端口,如果不是80端口,请修改vite.config.mjs
中的proxy
配置:
然后再终端执行启动web端:
npm install npm run dev
最终运行成功页面:
默认用户密码登录后:
<本文完>