zoukankan      html  css  js  c++  java
  • EMQ插件组合实现物联网边缘平台的设备通信管理

    上一篇随笔我简单的记录了我对EMQ插件开发的了解过程,最后发现还是可以组合复用已有插件,因此这篇随笔用于记录使用的情况以及是否达到预期。

    首先测试mysql认证插件的使用方式:

    emqx_auth_mysql

    根据readme,使用该插件需要先在数据库上运行它们的sql脚本,在docker中完成这一步可以参考这篇文章

    主要的思想是,在Dockerfile中先用环境变量设置免密登录,然后执行各个sql脚本(创建数据库,数据表,插入数据),最后一个脚本创建用户,设置权限和密码。

    将该插件的sql脚本执行后顺便插入一个测试用的用户:

    INSERT INTO mqtt_user ( username,password )
                           VALUES
                           ( "device1","device1" );
    
    INSERT INTO mqtt_acl ( allow,username,access,topic )
                           VALUES
                           ( 1,"device1",1,"a" ),
                           ( 0,"device1",2,"a" ),
                           ( 1,"device1",3,"b" );

    根据插件的源码,它会根据用户名查询数据库,一共有六种可能:

    1. 数据库存在该用户,密码未加盐:
      1. 密码正确,返回ok
      2. 密码错误,返回error
    2. 数据库存在该用户,密码加盐:
      1. 密码正确,返回ok
      2. 密码错误,返回error
    3. 数据库不存在该用户,返回ignore(即沉默,交给其他插件处理,如果没有其他插件,则会同意)
    4. 查询错误(数据库连接失败),此时不通过任何请求(但是数据库连接失败时无法启动插件,这种情况只会出现在建立连接后数据库断开的情况)

    emqx_auth_http

    这个插件同样可以支持普通用户认证,超级用户认证和访问权限控制,只需填写对应服务的http接口即可,传输的内容都放在http包的body中(如果设置为post的话)或者url中(如果设置为get的话),收到的结果根据状态码和body分类,一共四种:

    1. 返回状态码200,但是body为"ignore",此时行为为ignore;
    2. 返回状态码200,body不是“ignore”,此时行为为ok;
    3. 返回状态码非200,此时行为为error;
    4. http请求失败,此时返回error,不同意任何连接

    另外还有超级用户认证和访问权限控制,他们都遵守以下规则:

    1. 同意:状态码200
    2. 否决:状态码非200
    3. 交给其他插件处理:状态码200,body为“ignore”

    比较麻烦的一点是这两个功能是关不掉的,因此如果不想使用该插件管理访问权限和超级用户认证,那就需要返回200和ignore

    需求逻辑整理

    目前的需求是,客户端的密码是加密过的,而且是需要认证服务器获得之后验证的,因此无法提前保存在数据库,因此,mysql中不能保存相关用户的密码。

    根据这两个插件的行为,排除连接失败和合并两种数据库的密码验证后,可以组合出9种行为,每种行为后方标记分别为:理论行为,需求行为

    • mysql中有相关用户
      • mysql验证通过
        • http验证通过: ok,ok
        • http验证失败: error,error
        • http验证忽视: ok,ok
      • mysql验证失败
        • http验证通过: ok,ok
        • http验证失败: error,error
        • http验证忽视: error,error
    • mysql中没有相关用户
      • http验证通过: ok,ok
      • http验证失败: error,error
      • http验证忽视: ignore,ignore

    经过列举,我发现当mysql不保存用户时,这两个插件的行为完全符合我的需求,因此完全可以使用这两个插件的组合来完成平台的认证和权限控制。其中mysql只负责权限控制,ignore用户登录,而http认证服务器只负责用户登录,ignore权限控制。

    emqx_web_hook

    webhook的概念很简单,就是在各类hook点给预设的API发送数据,用以动态监控指定动作。这跟CPU上的调试用的埋点非常类似,GDB就是用这种思想监控程序的执行过程。

    emq的webhook插件使用很简单,只需要设置API的URL,再勾选要监控的动作即可,它硬编码了要发送的格式,即在Body中发送json格式的文本,json中的内容也根据action硬编码,无法配置,目前我们可以适应该接口,如果有需求,可以将其改成可配置的软接口,也可以直接更改硬编码的接口。

  • 相关阅读:
    【Language】 TIOBE Programming Community Index for February 2013
    【diary】good health, good code
    【web】a little bug of cnblog
    【Git】git bush 常用命令
    【web】Baidu zone ,let the world know you
    【diary】help others ,help yourself ,coding is happiness
    【Git】Chinese messy code in widows git log
    【windows】add some font into computer
    SqlServer启动参数配置
    关于sqlserver中xml数据的操作
  • 原文地址:https://www.cnblogs.com/bforever/p/10518122.html
Copyright © 2011-2022 走看看