上一篇随笔我简单的记录了我对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硬编码,无法配置,目前我们可以适应该接口,如果有需求,可以将其改成可配置的软接口,也可以直接更改硬编码的接口。

EMQ插件组合实现物联网边缘平台的设备通信管理的更多相关文章

  1. 【IoT】物联网NB-IoT之电信物联网开放平台对接流程浅析

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/liwei16611/article/de ...

  2. EMQ插件通过HTTP连接认证服务器实现认证

    需求 在EMQ中添加认证插件,将到来的MQTT连接的ClientID.UserName.Password通过HTTP协议发送到认证服务器,用返回的数据决定是否允许该连接: 在连接时和断开时向服务器发送 ...

  3. 阿里云物联网边缘计算加载MQTT驱动

    写在前面 本文在LinkEdge快速入门样例驱动的基础上,加载了MQTT订阅的客户端,使得边缘端容器可以通过MQTT获得外部数据. 1. 系统需求 物联网边缘计算平台,又名Link IoT Edge[ ...

  4. 国内物联网平台(8):中移物联网开放平台OneNet

    国内物联网平台(8)——中移物联网开放平台OneNet 马智 平台定位 OneNET是中移物联网有限公司搭建的开放.共赢设备云平台,为各种跨平台物联网应用.行业解决方案,提供简便的云端接入.存储.计算 ...

  5. 使用树莓派搭建LoRaWAN网关并接入腾讯云物联网开发平台

    安装树莓派环境 制作镜像 下载img文件烧录器 传送门:img文件烧录器地址,下载完成之后双击安装 下载镜像文件 传送门:树莓派系统镜像 推荐下载这个版本的img,因为有桌面,并且大小适中. 下载完之 ...

  6. iNeuOS工业互联平台,开放设备驱动管理、服务驱动管理、云组态自定义画布等,促进平台开放、赋能和落地。发布:v2.3版本。

    目       录 1.      概述... 2 2.      iNeuOS平台演示... 2 3.      设备驱动管理... 2 4.      服务驱动管理... 3 5.      云组 ...

  7. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  8. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  9. Wing-AEP平台LWM2M设备接入

    实现Wing-AEP中国电信物联网开放平台,LWM2M设备接入 一.准备 接入模组:BC35-G 平台地址:https://www.ctwing.cn/ 点击右上角控制台 点击左侧栏点击产品中心 二. ...

随机推荐

  1. zabbix mongodb 监控添加

    在zabbix 上添加mongodb的监控 由于使用的是zabbix 3.0 所有在模板里面又自己的模板名字叫:Template MongoDB 所以 客户端的配置如下 到配置文件目录 /usr/lo ...

  2. mysoft

    @@a8649fbb56349908b5ca6708fb94b3ddabcf6b97381a9797d3dfb139b8749287117@@##74e02e1207e5a0a8996ba89f1d6 ...

  3. dedecms 后台栏目全部展开 包括三级栏目

    include/typeunit.class.admin.php 搜索以下代码并删除 style='display:none'

  4. 了解并安装Nginx

    公司使用nginx作为请求分发服务器,发现本人在查看nginx配置上存在些许困难,故仔细阅读了陶辉的<深入理解nginx模块开发与框架>第一部分,并作此记录. 了解 我根据书上的思路来了解 ...

  5. 查看jar包依赖树

    在eclipse执行如下命令: 可以在控制台上查看层级依赖关系

  6. Spring笔记之配置数据源

    任何DAO访问数据库,最开始都需要配置数据源,数据源中定义了访问数据库的常用配置.有了数据源才能创建数据模板,然后把数据模板注入到DAO中,通过调用数据访问模板中的相应方法来对数据库进行相关操作. 常 ...

  7. Django的orm练习

    models(创建表): class Grade(models.Model): """年级表""" gname=models.CharFie ...

  8. mysql导入redis

    将mysql中数据库指定表导入redis 如何将mysql中某个数据库中的表数据快速导入redis? 以下将演示将本地127.0.0.1中数据库test中的表t_abc导入本地redis中.步骤如下: ...

  9. pidstat 命令(Linux 进程使用资源情况采样)

    pidstat 作用 pidstat 获取服务器指定进程的使用资源信息(包括 CPU.设备IO.内存.线程.任务切换等). 执行一波 [root@wille ~]# pidstat Linux 2.6 ...

  10. 【洛谷P3957】跳房子

    题目大意:给定一个数轴和 N 个点,点有点权,现从 0 位置出发,初始时每次只能走 d 的距离,可以在数轴上任意位置停下,此时,会得到一个点权和.现允许支付 x 的费用,使得每次可以走的距离为一个范围 ...