前言
本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/108971807
fly-iot飞驰物联专栏:
https://blog.csdn.net/freewebsys/category_12219758.html
未经博主允许不得转载。
博主CSDN地址是:https://blog.csdn.net/freewebsys
博主掘金地址是:https://juejin.cn/user/585379920479288
博主知乎地址是:https://www.zhihu.com/people/freewebsystem
1,关于ActorCloud
关于ActorCloud
ActorCloud 是一个物联网云平台,该平台提供了一些设备管理和应用使能等基础能力,使应用开发者从繁琐的底层连接、数据传输和基本数据处理、存储中解放出来,更加关注于业务本身的开发和创新,缩短应用开发周期,降低开发成本,快速地满足客户的需求。ActorCloud旨在解决物联网平台开发过程中的以下问题:
新业务上线周期长:由于物联网应用开发覆盖了硬件、网络、协议、接入、云计算、数据存储、数据分析和前端应用开发等各个方面,导致研发周期比较长,无法快速响应客户的灵活需求。
网络联接类型复杂:物联网接入的网络连接类型非常多,包括运营商提供的2G/3G/4G、NB-IoT,WIFI,LoRaWAN等。
终端、传感器厂家众多,需要保证在终端设备和服务器之间建立稳定的数据通道,减少设备端的开发成本。
安全性:物联网连接的真正实体物理设备,如何保护这些设备的安全访问控制、以及采集上来的数据的安全、可靠性等。
物联网接入的海量设备:物联网应用可能会接入海量的设备,保证在软件的功能性需求满足的情况下,还需保证在海量设备接入的情况下应用的高稳定和高可靠性。
github项目地址:
https://github.com/actorcloud/ActorCloud
gitbook 文档地址:https://wivwiv.gitbooks.io/emq-actorcloud-doc/content/introduction/introduction.html
2,使用postgresql数据库,并配置帐号密码
docker-compose配置文件:
postgres:
image: postgres:13-alpine
container_name: postgres
healthcheck:
test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "root" ]
timeout: 45s
interval: 10s
retries: 10
restart: always
environment:
- POSTGRES_USER=actorcloud
- POSTGRES_PASSWORD=public
- APP_DB_USER=actorcloud
- APP_DB_PASS=public
- APP_DB_NAME=actorcloud
volumes:
- ./postgres:/docker-entrypoint-initdb.d/
ports:
- 5432:5432
然后后端的python服务就可以链接上了。
3,初始化数据库表
研究半边天,才明白 flask 有自动执行的命令。还是挺强大的。
参考这个:
https://blog.csdn.net/lingyingdon/article/details/108084721
Actorcloud 开发了自定义的命令,这边使用 flask 执行命令即可:
# 先设置app 文件:
export FLASK_APP=/data/manage.py
# flask --help
Usage: flask [OPTIONS] COMMAND [ARGS]...
This shell command acts as general utility script for Flask applications.
It loads the application configured (through the FLASK_APP environment
variable) and then provides commands either provided by the application or
Flask itself.
The most useful commands are the "run" and "shell" command.
Example usage:
$ export FLASK_APP=hello.py
$ export FLASK_DEBUG=1
$ flask run
Options:
--version Show the flask version
--help Show this message and exit.
Commands:
db Perform database migrations.
deploy Deploy project
run Runs a development server.
shell Runs a shell in the app context.
upgrade Upgrade project
# 在 /data 目录直接执行即可。
flask upgrade
########## project_manage.project_deploy()
database init
Creating directory /data/migrations/orm ... done
Creating directory /data/migrations/orm/versions ... done
Generating /data/migrations/orm/env.py ... done
Generating /data/migrations/orm/README ... done
Generating /data/migrations/orm/alembic.ini ... done
Generating /data/migrations/orm/script.py.mako ... done
Please edit configuration/connection/logging settings in '/data/migrations/orm/alembic.ini' before proceeding.
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
INFO [alembic.ddl.postgresql] Detected sequence named 'roles_id_seq' as owned by integer column 'roles(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'groups_id_seq' as owned by integer column 'groups(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'app_api_logs_id_seq' as owned by integer column 'app_api_logs(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'devices_id_seq' as owned by integer column 'devices(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'invitations_id_seq' as owned by integer column 'invitations(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'lwm2m_items_id_seq' as owned by integer column 'lwm2m_items(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'device_count_day_id_seq' as owned by integer column 'device_count_day(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'data_points_id_seq' as owned by integer column 'data_points(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'certs_id_seq' as owned by integer column 'certs(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'emqx_bills_month_id_seq' as owned by integer column 'emqx_bills_month(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'dict_code_id_seq' as owned by integer column 'dict_code(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'timer_publish_id_seq' as owned by integer column 'timer_publish(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'actor_tasks_id_seq' as owned by integer column 'actor_tasks(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'resources_id_seq' as owned by integer column 'resources(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'login_logs_id_seq' as owned by integer column 'login_logs(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'app_api_logs_month_id_seq' as owned by integer column 'app_api_logs_month(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'emqx_bills_day_id_seq' as owned by integer column 'emqx_bills_day(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'history_alerts_id_seq' as owned by integer column 'history_alerts(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'app_api_logs_day_id_seq' as owned by integer column 'app_api_logs_day(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'services_id_seq' as owned by integer column 'services(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'device_count_month_id_seq' as owned by integer column 'device_count_month(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'system_info_id_seq' as owned by integer column 'system_info(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'current_alerts_id_seq' as owned by integer column 'current_alerts(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'device_count_hour_id_seq' as owned by integer column 'device_count_hour(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'app_api_logs_hour_id_seq' as owned by integer column 'app_api_logs_hour(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'messages_id_seq' as owned by integer column 'messages(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'codec_id_seq' as owned by integer column 'codec(id)', assuming SERIAL and omitting
INFO [alembic.ddl.postgresql] Detected sequence named 'permissions_id_seq' as owned by integer column 'permissions(id)', assuming SERIAL and omitting
INFO [alembic.env] No changes in schema detected.
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
终于可以把数据标创建了:
进入到 postgresql 当中执行:
docker exec -it postgres sh
/ # psql -U actorcloud
psql (13.11)
Type "help" for help.
actorcloud=#
actorcloud=# \c actorcloud
actorcloud=# \d
List of relations
Schema | Name | Type | Owner
--------+---------------------------+----------+------------
public | actions | table | actorcloud
public | actions_id_seq | sequence | actorcloud
public | actor_tasks | table | actorcloud
public | actor_tasks_id_seq | sequence | actorcloud
public | alembic_version | table | actorcloud
public | app_api_logs | table | actorcloud
public | app_api_logs_day | table | actorcloud
public | app_api_logs_day_id_seq | sequence | actorcloud
public | app_api_logs_hour | table | actorcloud
public | app_api_logs_hour_id_seq | sequence | actorcloud
public | app_api_logs_id_seq | sequence | actorcloud
public | app_api_logs_month | table | actorcloud
public | app_api_logs_month_id_seq | sequence | actorcloud
public | applications | table | actorcloud
public | applications_groups | table | actorcloud
public | applications_id_seq | sequence | actorcloud
public | certs | table | actorcloud
public | certs_devices | table | actorcloud
public | certs_id_seq | sequence | actorcloud
public | codec | table | actorcloud
public | codec_id_seq | sequence | actorcloud
public | connect_logs | table | actorcloud
public | current_alerts | table | actorcloud
public | current_alerts_id_seq | sequence | actorcloud
public | data_points | table | actorcloud
public | data_points_id_seq | sequence | actorcloud
public | data_streams | table | actorcloud
public | data_streams_id_seq | sequence | actorcloud
public | device_count_day | table | actorcloud
public | device_count_day_id_seq | sequence | actorcloud
public | device_count_hour | table | actorcloud
public | device_count_hour_id_seq | sequence | actorcloud
public | device_count_month | table | actorcloud
public | device_count_month_id_seq | sequence | actorcloud
public | device_events | table | actorcloud
public | device_events_day | table | actorcloud
public | device_events_hour | table | actorcloud
public | device_events_latest | table | actorcloud
public | device_events_month | table | actorcloud
public | devices | table | actorcloud
public | devices_id_seq | sequence | actorcloud
public | dict_code | table | actorcloud
public | dict_code_id_seq | sequence | actorcloud
public | emqx_bills | table | actorcloud
public | emqx_bills_day | table | actorcloud
public | emqx_bills_day_id_seq | sequence | actorcloud
public | emqx_bills_hour | table | actorcloud
public | emqx_bills_month | table | actorcloud
public | emqx_bills_month_id_seq | sequence | actorcloud
public | end_devices | table | actorcloud
public | gateways | table | actorcloud
public | groups | table | actorcloud
public | groups_devices | table | actorcloud
public | groups_id_seq | sequence | actorcloud
public | history_alerts | table | actorcloud
public | history_alerts_id_seq | sequence | actorcloud
public | invitations | table | actorcloud
public | invitations_id_seq | sequence | actorcloud
public | login_logs | table | actorcloud
public | login_logs_id_seq | sequence | actorcloud
public | lwm2m_items | table | actorcloud
public | lwm2m_items_id_seq | sequence | actorcloud
public | lwm2m_objects | table | actorcloud
public | lwm2m_objects_id_seq | sequence | actorcloud
public | messages | table | actorcloud
public | messages_id_seq | sequence | actorcloud
public | permissions | table | actorcloud
public | permissions_id_seq | sequence | actorcloud
public | products | table | actorcloud
public | products_id_seq | sequence | actorcloud
public | publish_logs | table | actorcloud
public | resources | table | actorcloud
public | resources_id_seq | sequence | actorcloud
public | roles | table | actorcloud
public | roles_id_seq | sequence | actorcloud
public | rules | table | actorcloud
public | rules_actions | table | actorcloud
public | rules_id_seq | sequence | actorcloud
public | services | table | actorcloud
public | services_id_seq | sequence | actorcloud
public | streams_points | table | actorcloud
public | system_info | table | actorcloud
public | system_info_id_seq | sequence | actorcloud
public | tenants | table | actorcloud
public | tenants_id_seq | sequence | actorcloud
public | timer_publish | table | actorcloud
public | timer_publish_id_seq | sequence | actorcloud
public | upload_info | table | actorcloud
public | upload_info_id_seq | sequence | actorcloud
public | users | table | actorcloud
public | users_groups | table | actorcloud
public | users_id_seq | sequence | actorcloud
(92 rows)
# select * from roles;
id | createAt | updateAt | roleName | description | roleType | isShare | tenantID
----+----------------------------+----------+---------------------+------------------------------------------------------+----------+---------+----------
1 | 2023-05-22 14:00:48.369222 | | super_admin_role | 平台管理员 | 1 | 0 |
2 | 2023-05-22 14:00:48.400963 | | company_admin_role | 公司用户管理员 | 1 | 0 |
3 | 2023-05-22 14:00:48.455674 | | personal_admin_role | 个人用户管理员 | 1 | 0 |
4 | 2023-05-22 14:00:48.490984 | | system_user_role | 用户拥有平台全部功能的权限 | 1 | 1 |
5 | 2023-05-22 14:00:48.521896 | | common_user_role | 用户仅能查看所有资源信息 | 1 | 1 |
6 | 2023-05-22 14:00:48.531339 | | device_user_role | 用户能管理设备、产品、分组等信息 | 1 | 1 |
7 | 2023-05-22 14:00:48.546975 | | admin_app_role | 应用能调用平台提供的所有API | 2 | 1 |
8 | 2023-05-22 14:00:48.564569 | | display_app_role | 应用仅能查看设备、产品、分组、证书、策略、日志等信息 | 2 | 1 |
9 | 2023-05-22 14:00:48.571691 | | device_app_role | 应用能查看、新建、编辑、删除、控制设备 | 2 | 1 |
(9 rows)
可以看到已经有了 92 个数据标和 seq。但是没有数据。
然后就可以创用户了,其中还校验了下email 的格式:
临时先注释掉这个校验行。然后就可以登陆成功啦!
split_email = value.split('@')[0]
#if split_email in current_app.config.get('RESERVED'):
# raise FormInvalid(field='email')
看产品的创建支持非常多的协议:
然后就可以创建设备信息了:
4,总结
终于解决数据库的问题了,原来使用的是flask的命令执行就可以了。
数据库的表非常的多,原来以为只有少数几个表,但是看结果吓坏了。
一共有 55 张表,后续得继续研究下。
actions
actor_tasks
alembic_version
app_api_logs
app_api_logs_day
app_api_logs_hour
app_api_logs_month
applications
applications_groups
certs
certs_devices
codec
connect_logs
current_alerts
data_points
data_streams
device_count_day
device_count_hour
device_count_month
device_events
device_events_day
device_events_hour
device_events_latest
device_events_month
devices
dict_code
emqx_bills
emqx_bills_day
emqx_bills_hour
emqx_bills_month
end_devices
gateways
groups
groups_devices
history_alerts
invitations
login_logs
lwm2m_items
lwm2m_objects
messages
permissions
products
publish_logs
resources
roles
rules
rules_actions
services
streams_points
system_info
tenants
timer_publish
upload_info
users
users_groups
本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/108971807