# DistScheduleServer 数字管家服务端说明 ## 数字管家整体架构视图 ![component](design/component.png) 模块说明: - FA: 数字管家HarmonyOS应用 - IOT Device: 基于OpenHarmony开发板的智能设备,如台灯,窗帘 - DistScheduleServer: 数字管家服务端,对FA提供Restful接口,并调用Huawei IOT Cloud管理IOT设备 - Huawei IOT Cloud: 华为IOT云,用于以mqtt协议,与设备通信。如下发命令,上报状态 - RabbitMQ:消息队列,用于获取告警信息,通知给手机FA - MySql:数据库。保存日程,设备,用户,家庭等信息 ## 如何独立搭建数字管家服务 #### 步骤1.准备部署环境 1.Ubuntu 18.04.4 or 20 2.mysql5.7 (sudo apt install mysql-server) ,请注意不要使用mysql8+,允许外部访问mysql,修改root默认密码或配置新用户(用于服务端mysql配置) 3.openjdk/jdk 1.8 (sudo apt-get install openjdk-8-jdk) 4.RabbitMQ 3.6.10 - rabbitmq安装:https://blog.csdn.net/u010889616/article/details/80643892 - rabbitmq web页面管理启用: ``` rabbitmq-plugins enable rabbitmq_management ``` - 页面管理:http://ip:15672, 服务配置端口为5672 5.IOT云服务([华为云](https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home)) #### 步骤2. 下载代码 ```bash git clone git@gitee.com:openharmony-sig/knowledge_demo_smart_home.git ``` #### 步骤3. 华为IOT云配置 1.使用华为云IOT服务:[地址](https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/instance),建议先[极速体验](https://support.huaweicloud.com/qs-iothub/iot_05_00010.html) 2.新增IOT设备,创建产品(Profile),定义属性,命令,参考[profile](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/profile) 3.申请云服务AK,SK以及appId,这些信息是用于连接华为云权限认证的,把他们配置到文件application-local.properties中.参考[获取AK/SK](https://support.huaweicloud.com/devg-apisign/api-sign-provide-aksk.html) ``` cloud.iot.ak=***** cloud.iot.sk=***** cloud.iot.appId=***** ``` 3.创建转发规则,转发设备信息到AMQP(需要转发设备属性,设备命令,设备消息,这样数字管家服务才能从IOT云中监听到这些信息的变化) 配置队列名,队列地址,accessKey,password到配置文件application-xxx.properties中.参考[数据转发介绍](https://support.huaweicloud.com/usermanual-iothub/iot_01_0024.html) **注意:**转发规则的数据来源分别选择“设备属性,设备命令,设备消息”,转发目标要选择AMQP推送消息队列,并分别建立不同的消息队列接收消息,分别接受设备属性,设备命令,设备消息的消息。 ![image-20211230094153015](design/iot_data_queue.png) ![iot_data_transfer](design/iot_data_transfer.png) ``` cloud.iot.amqp.accessKey= #接入凭证,添加转发目标时,点击接入凭证获取 cloud.iot.amqp.password= #接入凭证密码,添加转发目标时,点击接入凭证获取 cloud.iot.amqp.queueStatusName= #设备状态队列名称(不是规则名称) cloud.iot.amqp.queuePropertyName= #设备属性队列名称(不是规则名称) cloud.iot.amqp.queueMsgName= #设备消息队列名称(不是规则名称) cloud.iot.amqp.connectionUrl= #AMQP连接地址,点击“总览--》平台接入地址”获取 ``` #### 步骤4. 增加sql文件,在数据库中录入新增设备类型 将上述新增的设备名称,服务ID,产品ID(IOT云界面中,点击“产品”菜单可查看),插入到数据库device_type表中。建议是在distschedule-dao\src\main\resources\db\migration目录中新增SQL,如V2_insertProductType.sql ``` INSERT INTO device_type (`name`, `name_en`, `service_id`, `product_id`, `category`) values ('智能风扇', 'fan', 'SmartFan', '6150601d88056b027dd2ca47', 1); ``` **注意:**服务使用[flyway](https://www.jianshu.com/p/733a5a95819e)管理数据库,启动时将会按照distschedule-dao\src\main\resources\db\migration里V1,V2 sql的顺序初始化数据库 #### 步骤5. 修改配置文件 修改配置文件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,APPID cloud.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侧也需要修改 ``` #### 步骤6.编译 编译环境: 1. jdk8 2. maven 3.6.3 进入目录,编译springboot jar包 ```bash cd knowledge_demo_smart_home/Server mvn clean package -Dmaven.test.skip=true ``` 可执行的jar包在knowledge_demo_smart_home/Server/distschedule-core/target/distschedule-core-1.0.0-SNAPSHOT.jar` #### 步骤7. 服务启动 指定profile运行,建议使用local,才会加载前面的application-local.properties的配置文件。如果profile为xxx,则会加载application-xxx.properties的配置文件 也可通过环境变量指定所激活local profile ```bash export SPRING_PROFILES_ACTIVE=local # 激活local ``` ``` java -jar /opt/distschedule-core-1.0.0-SNAPSHOT.jar --spring.profiles.active=local ``` 默认端口8080,启动后如后台无异常,可用浏览器访问http://127.0.0.1:8080/distschedule-api/swagger-ui/index.html ,验证服务是否已正常启动。 IP和端口需要替换成自己的。 #### 步骤8:配置服务开机自启动 ubuntu18.04服务自启动,参考文档:https://www.cnblogs.com/airdot/p/9688530.html 其中:/etc/rc.local文件 ``` #!/bin/bash nohup java -jar /opt/distschedule-core-1.0.0-SNAPSHOT.jar --spring.profiles.active=local> /clouddragonData/log/distschedule/server.log 2>&1 & ``` #### 步骤9:手机FA侧,配置使用自己的数字管家服务和rabbitmq服务 参考[FA侧说明](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/blob/master/FA/DistSchedule/docs/%E6%95%B0%E5%AD%97%E7%AE%A1%E5%AE%B6%E8%AE%BE%E5%A4%87%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97.md#4-%E6%8E%A5%E5%8F%A3%E5%AF%B9%E6%8E%A5) ## 工程结构 ``` - distschedule--core # 入口模块,包含main和controller - distschedule-service # 服务模块 - distschedule-dao # 数据库模块 ``` ## 接口描述 服务集成Swagger3.0,部署以后使用swagger.html查看接口,即http://127.0.0.1:8080/distschedule-api/swagger-ui/index.html 包括如下接口: - 家庭接口 - 日程接口 - 用户接口 - 设备接口 - 设备类型接口 ![interface](design/interface1.png) ## 数据库设计 ![datbase](design/database.png) 使用flyway自动创建数据库,数据库表放在: distschedule-dao\src\main\resources\db\migration 目录下 ## 使用Docker容器部署 详见Dockerfile,docker-compose.yml 1. 参考前面描述,修改配置文件application-local.properties。 2. 插入新的设备类型,V2_insertProductType.sql 3. 编译,构建容器镜像,使用docker-compose启动,即可同时启动mysql,rabbitmq以及数字管家服务, 命令如下 ``` mvn clean package docker build -t distschedule . docker-compose up ``` ## 开发者分享 请点击[这里](share.md)