(二) 搭建数字管家服务器
(二) 搭建数字管家服务器
1. mysql卸载
# 删除mysql的数据文件sudo rm /var/lib/mysql/ -R# 删除mysql的配置文件sudo rm /etc/mysql/ -R# 自动卸载mysql(包括server和client)sudo apt-get autoremove mysql* --purgesudo apt-get remove apparmor# 然后在终端中查看MySQL的依赖项dpkg --list|grep mysql
2. mysql5.7安装
# mysql5.7.33安装包下载wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.33-1ubuntu18.04_amd64.deb-bundle.tar# 新建目录mkdir mysql5.7.33mv mysql-server_5.7.33-1ubuntu18.04_amd64.deb-bundle.tar mysql5.7.33/cd mysql5.7.33# 解压缩tar -xvf mysql-server_5.7.33-1ubuntu18.04_amd64.deb-bundle.tar# 删除2个测试相关的包sudo rm -f mysql-testsuite_5.7.33-1ubuntu18.04_amd64.debsudo rm -f mysql-community-test_5.7.33-1ubuntu18.04_amd64.deb# 安装包libtinfo5sudo apt-get install libtinfo5sudo apt-get install libmecab2# 利用dpkg进行安装sudo dpkg -i mysql-*.deb# 查看mysql版本mysql -V# 登录sudo mysql# 修改用户密码,创建用户ALTER USER 'root'@'localhost' IDENTIFIED BY 'AndrewYy-chan1';CREATE USER 'dimp'@'%' IDENTIFIED BY 'AndrewYy-chan1';# 设置授权账户grant all on *.* to root@'%' identified by 'AndrewYy-chan1' with grant option;flush privileges;exit# 修改配置文件sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf# 在配置文件中添加以下代码character_set_server=utf8#注释bind-address=127.0.0.1#bind-address=127.0.0.1# 重启mysql服务service mysql restart# 登录mysqlmysql -u root -p
3. openjdk/jdk 1.8安装
sudo apt-get install openjdk-8-jdk
4. RabbitMQ 3.6.10安装
# 安装Erlangsudo apt-get updatesudo apt-get install erlang erlang-nox# 安装RabbitMq# 添加rabbitmq的仓库列表配置文件echo 'deb http://www.rabbitmq.com/debian/ testing main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list# 加入rabbitmq signing keywget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -# 安装RabbitMqsudo apt-get updatesudo apt-get install rabbitmq-server# 启用web管理插件sudo rabbitmq-plugins enable rabbitmq_management# 重启rabbitmq服务sudo systemctl restart rabbitmq-server# 新增一个用户sudo rabbitmqctl add_user root root# 为root用户设置权限所有权限sudo rabbitmqctl set_permissions -p / root ".*" ".*" ".*"# 设置root用户为管理员角色sudo rabbitmqctl set_user_tags root administrator# 访问网址http://localhost:15672(http://andrewyychan.cn:15672)
5. Maven安装
# 安装mavensudo apt install maven# 检测setting.xml所在位置mvn -X# Maven home: /usr/share/maven# 打开setting.xml文件进行编辑sudo nano /usr/share/maven/conf/settings.xml# 更换本地仓库<localRepository>/home/yy/maven/repository</localRepository># 添加远程仓库<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror>
6. 下载数字管家源码
git clone git@gitee.com:openharmony-sig/knowledge_demo_smart_home.gitgit clone https://gitee.com/openharmony-sig/knowledge_demo_smart_home.git --depth=1
7. 华为云IoT
1. 申请华为云AK/SK
- 华为云网址:https://www.huaweicloud.com/
- 点击控制台——>我的凭证——>访问密钥——>新增访问密钥,得到ak和sk
- 点击设备接入——>资源空间,获取APPID
- 点击产品,创建产品
2. 产品创建
-
填写产品信息
-
点击规则——>数据转发——>创建规则
规则名称 资源空间 数据来源 触发事件 转发目标 设备消息上报 所有资源空间 设备消息 设备消息上报 AMQP推送消息队列 设备状态上报 所有资源空间 设备状态 设备状态变更 AMQP推送消息队列 设备属性接收 所有资源空间 设备属性 设备属性上报 AMQP推送消息队列 -
配置AMQP:点击IoTDA实例——>基础版详情——>AMQPS预置接入凭证,获得accesse_key和access_code.
8. 修改源码文件
-
在knowledge_demo_smart_home\Server\distschedule-dao\src\main\resources\db\migration目录中新增SQL,如V2_insertProductType.sql
# 将新增的设备名称,服务ID,产品ID(IOT云界面中,点击“产品”菜单可查看),插入到数据库device_type表中INSERT INTO device_type (`name`, `name_en`, `service_id`, `product_id`, `category`)values ('智能风扇', 'Fan', 'SmartFan', '62511e8f2d0897328703a093', 1);
-
修改配置文件knowledge_demo_smart_home\Server\distschedule-core\src\main\resources\application-local.properties
# mysql数据库配置,需要提前部署和创建distschedule的数据库# 数据库地址spring.datasource.url=datasource_url:jdbc:mysql://*****:3306/distschedule?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai # 数据库账号spring.datasource.username=*****# 数据库密码spring.datasource.password=****# 华为IOT云配置,参考上面的介绍,申请IOT云的AK,SK,APPIDcloud.iot.ak=*****cloud.iot.sk=*****cloud.iot.appId=*****# IOT云配置,参考上面的介绍,配置并获取华为IOT云的数据转发队列cloud.iot.amqp.accessKey= #接入凭证,添加转发目标时,点击接入凭证获取cloud.iot.amqp.password= #接入凭证密码,添加转发目标时,点击接入凭证获取cloud.iot.amqp.queueStatusName= #设备状态队列名称(不是规则名称)cloud.iot.amqp.queuePropertyName= #设备属性队列名称(不是规则名称)cloud.iot.amqp.queueMsgName= #设备消息队列名称(不是规则名称)cloud.iot.amqp.connectionUrl=amqps://*****.iot-amqps.cn-north-4.myhuaweicloud.com:5671?amqp.vhost=default&amqp.idleTimeout=8000&amqp.saslMechanisms=PLAIN #AMQP连接地址,点击“总览--》平台接入地址”获取# rabbitmq消息队列,用于手机监听告警信息spring.rabbitmq.host=***** # rabbitmq地址spring.rabbitmq.port=***** # rabbitmq端口spring.rabbitmq.username=***** # rabbitmq用户名spring.rabbitmq.password=***** # rabbitmq密码spring.rabbitmq.exchange.deviceproperty=deviceproperty_exchange # 消息exchange,可不改。如修改的话,FA侧也需要修改
# mysql数据库配置,需要提前部署和创建distschedule的数据库# 数据库地址spring.datasource.url=jdbc:mysql://andrewyychan.cn:3306/distschedule?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai # 数据库账号spring.datasource.username=root# 数据库密码spring.datasource.password=AndrewYy-chan1# 华为IOT云配置,参考上面的介绍,申请IOT云的AK,SK,APPIDcloud.iot.ak=CBKGWM9HDK7JSIF4OFTGcloud.iot.sk=7g0iehyUtRYmBcgiF9uZjVXs2NdCNKGe4bOYadlGcloud.iot.appId=249c89b43a9f46ca8ec4b9cf52e736cf# IOT云配置,参考上面的介绍,配置并获取华为IOT云的数据转发队列cloud.iot.amqp.accessKey=01giD1n9 #接入凭证,添加转发目标时,点击接入凭证获取cloud.iot.amqp.password=OeW8DuZMZrKy4UnkbWj6jZxL1D5doQU9 #接入凭证密码,添加转发目标时,点击接入凭证获取cloud.iot.amqp.queueStatusName=DefaultQueue #设备状态队列名称(不是规则名称)cloud.iot.amqp.queuePropertyName=DefaultQueue #设备属性队列名称(不是规则名称)cloud.iot.amqp.queueMsgName=DefaultQueue #设备消息队列名称(不是规则名称)cloud.iot.amqp.connectionUrl=amqps://a161bde384.iot-amqps.cn-north-4.myhuaweicloud.com.iot-amqps.cn-north-4.myhuaweicloud.com:5671?amqp.vhost=default&amqp.idleTimeout=8000&amqp.saslMechanisms=PLAIN #AMQP连接地址,点击“总览--》平台接入地址”获取# rabbitmq消息队列,用于手机监听告警信息spring.rabbitmq.host=andrewyychan.cn # rabbitmq地址spring.rabbitmq.port=15672 # rabbitmq端口spring.rabbitmq.username=root # rabbitmq用户名spring.rabbitmq.password=root # rabbitmq密码spring.rabbitmq.exchange.deviceproperty=deviceproperty_exchange # 消息exchange,可不改。如修改的话,FA侧也需要修改
9. 编译运行
# 编译cd knowledge_demo_smart_home/Servermvn clean package -Dmaven.test.skip=true # 运行sudo java -jar /home/ubuntu/project/knowledge/knowledge_demo_smart_home/Server/distschedule-core/target/distschedule-core-1.0.0-SNAPSHOT.jar --spring.profiles.active=local# jar包位置:knowledge_demo_smart_home/Server/distschedule-core/target/distschedule-core-1.0.0-SNAPSHOT.jar# 访问链接http://127.0.0.1:8080/distschedule-api/swagger-ui/index.html(http://andrewyychan.cn:8080/distschedule-api/swagger-ui/index.html)
10. 服务自启动
# 建立rc-local.service文件sudo nano /etc/systemd/system/rc-local.service# 将下列内容复制进rc-local.service文件[Unit]Description=/etc/rc.local CompatibilityConditionPathExists=/etc/rc.local [Service]Type=forkingExecStart=/etc/rc.local startTimeoutSec=0StandardOutput=ttyRemainAfterExit=yesSysVStartPriority=99 [Install]WantedBy=multi-user.target# 创建文件rc.localsudo nano /etc/rc.local# 将下列内容复制进rc.local文件#!/bin/bashsudo nohup java -jar /home/ubuntu/project/knowledge/knowledge_demo_smart_home/Server/distschedule-core/target/distschedule-core-1.0.0-SNAPSHOT.jar --spring.profiles.active=local> /home/ubuntu/project/distschedule/server.log 2>&1 &# 给rc.local加上权限sudo chmod +x /etc/rc.local# 启用服务sudo systemctl enable rc-local# 启动服务并检查状态sudo systemctl start rc-local.servicesudo systemctl status rc-local.service# 重启并检查test.log文件cat /home/ubuntu/project/distschedule/server.log
11. 数据库设计
12、数据管家FA接入新服务端
1. 修改 OKHttpUtilsRx2
将SERVER_URL变量修改为自己的服务端api地址
// src/main/java/com/example/distschedule/rx2/OKHttpUtilsRx2.java// 后端服务器地址 private static final String SERVER_URL = "http://andrewyychan.cn:8080/distschedule-api/";
2. 修改 DeviceStateListener
将RABBITMQ数据修改为自己的
// src/main/java/com/example/distschedule/listener/DeviceStateListener.javaprivate static final String DEVICEPROPERTY_EXCHANGE = "deviceproperty_exchange";//监听队列名称 private static final String RABBITMQ_HOST = "andrewyychan.cn"; private static final int RABBITMQ_PORT = 15672; private static final String RABBITMQ_USER = "root"; private static final String RABBITMQ_CODE = "root"; private static DeviceStateListener instance;
3. 修改 DeviceData
将data put的key值修改为自己的productID
// src/main/java/com/example/distschedule/database/DeviceData.java// 电风扇 data.put("62511e8f2d0897328703a093", new DeviceDataBean(DeviceControlAbility.ACTION_FAN, ResourceTable.Media_icon_fraction_fan_online, ResourceTable.Media_icon_fraction_fan_offline, command -> CommandUtil.parseFanCommand(command)));