上一篇随笔我简单的记录了我对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. java常用的加密技术

    详见:https://blog.csdn.net/it_beecoder/article/details/71480770 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以 ...

  2. MySQL快速清空表数据

    truncate table 可以不删除表的情况下,快速情况表数据

  3. 微服务架构:构建PHP微服务生态

    微服务架构:构建PHP微服务生态   Linux系统技术交流QQ群(1675603)验证问题答案:刘遄 导读 诞生于 2014 年的“微服务架构”,其思想经由 Martin Fowler 阐述后,在近 ...

  4. php保留两位小数并且四舍五入 保留两位小数并且不四舍五入

    php保留两位小数并且四舍五入 $num = 5566.56831; echo sprintf("%.2f", $num); php保留两位小数并且不四舍五入 $num = 556 ...

  5. R 语言中的多元线性回归

    示例 sessionInfo() # 查询版本及系统和库等信息 # 工作目录设置 getwd() path <- "E:/RSpace" setwd(path) rm(lis ...

  6. HDU - 6589 Sequence (生成函数+NTT)

    题目链接 设序列a的生成函数$\large f(x)=\sum\limits_{i=0}^{n-1}a_ix^i$,则操作1,2,3分别对应将$f(x)$乘上$\Large\frac{1}{1-x}, ...

  7. HDU - 6253 Knightmare (打表+拉格朗日插值)

    题目链接 题意:一个马在无限大的棋盘中跳,问跳n步能跳到多少个不同的格子. 首先写个打表程序打一下n比较小的时候的表: #include<bits/stdc++.h> using name ...

  8. mybatis 中 if-test 判断大坑

    [<if test="takeWay == '0'">]mybatis的if判断 单个的字符要写到双引号里面才行,改为<if test='takeWay == & ...

  9. 51 Nod 1086 多重背包问题(单调队列优化)

    1086 背包问题 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有N种物品,每种物品的数量为C1,C2......Cn.从中任选若干件放 ...

  10. Unity3D_(地形)创建基本场景

    第一人称漫游场景 地形漫游系统: (自己绘制的GIF文件超过20MB放不上博客园.截取了几张图片)按键盘上的“上下左右”可以控制第一人称的漫游视角 资源包和项目源文件:传送门 自己做的项目可执行文件: ...