数据专栏

智能大数据搬运工,你想要的我们都有

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

昨天,数字化研习社举办第一次活动。在自由发言阶段,我谈了自己对数字孪生、工业互联网平台的理解。
在我看来,无论是数字孪生、工业互联网还是 CPS ,我们过去的 20 年都接触过类似的想法和观念,甚至做过很多相关和类似的工作。那么,现在提出这些概念和说法的意义到底何在?
为了理解这些技术的意义,我对比了大学里学过的三门课程:计算机语言、程序设计方法学和软件工程。这三门课都是培养软件人才的。学了计算机语言是不是就可以编程了呢?可以的。但是编出程序的质量可能很差、也很不规范,程序设计方法学就是解决这类问题的。但是,随着软件规模的扩大、参与人数的增多、用户需求的复杂,我们会发现:我们往往要学会协同工作、善于采用工程化的思想,才能开发出真正高水平的软件。于是,我们需要学习软件工程。
类似数字孪生、工业互联网、 CPS 的工作我们都做过。但过去的工作就像学习“计算机语言”,至多算是进入“程序设计方法”的层次。而今天我们遇到的问题,则要进入“软件工程”的层次。
听到一个故事,说中国计划制造某个型号的军用飞机前,举行了一次研讨会。会上,有个即将退休的专家说:我今天不谈怎么造飞机,我们就谈谈将来怎么作战吧。报告引发了极大的轰动。会议结束后,人们发现:需要重新考虑飞机设计的思想。
同样,要理解未来的工业互联网,也要知道未来是怎么用的。
我们知道:工业互联网强调的是大尺度的资源配置和实时协同。空间尺度突破以后,相关问题的复杂性会急剧增加。我们还知道:智能制造基于精益化、标准化,智能制造常常要把人的知识变成计算机的代码。这意味着,针对系统的改变和维护将会成为日常的工作。如果是过去的做法,这会对系统的安全稳定性带来极大的冲击,工作量也会暴增。如果这些问题不解决,工业互联网的应用就一定会遇到瓶颈。而这些困难又会进一步反映到对工业互联网架构的要求。所以,工业互联网需要分层结构、来完成类似阿里数据中台和业务中台的功能,还需要数字孪生等等技术来支撑复杂系统的设计。
我给别人讲创新的时候,曾经把 A380 和玩具飞机放在一起:同样都是飞机,难度相差极大。未来,同样是工业互联网,差别可能也会非常巨大。我们要弄清楚:到底是面向工业的产品,还是“玩具级”的东西。我们国家的科技进步慢,很大的原因就是:我们常常喜欢跟随别人的概念,而具体工作一直停留在“玩具级”的东西上,而不是认真地把事情做好。
硬件开发
2020-04-16 22:47:00

新冠肺炎的突然爆发,给全球数个产业链的增长都带来了负面影响。但疫情也让平时需求量稳定的防疫物资热电堆传感器突然成了紧俏商品。

热电堆是一种热释红外线传感器,主要由热电偶构成的一种器件。它主要应用在耳式体温计、放射温度计、电烤炉、微波炉、食品温度检测等领域中,作为温度检测器件获得了广泛的应用。下面英尚微电子介绍关于非接触温度计中热电堆红外传感器的应用。

热电堆红外测温传感器
热电堆红外传感器 直接感应热辐射,为非接触温度测量提供了解决方案,它具有创新的硅基微机械技术保证了它极好的长期稳定性,非常低的温度灵敏系数,极好的光电特性。它不需要冷却,但在整个温度测量范围内能达到土1°C的精度。对于比较窄的温度测量范围,例如体温测量,精度可以达到+0.1°C。


在非接触温度计中的应用
用高精度热敏电阻来测量热电堆所处的环境温度,然后由CPU计算出测量温度。可以在EEPROM中预先写入一些标准的温度条件,例如:在被测物体温度为37°C、热电堆所处环境温 度为25°C条件下测得的输出电压。且热电堆的输出电压、运放的偏置及增益的离散性等等也可以通过软件来进行修正。
被测量对象的温度与热电堆所处的环境温度之间,存在着下面的关系。
Vout= A(Tb4-Ts4)
Vout为热电堆的输出电压(V)
A为比例系数
Tb为被测物体的温度(K)
因此,被测对象的温度,可以通过测量热电堆输出电压和热电堆所处环境的绝对温度,并通过运算后获得。

结构与工作原理
被红外线照射的吸收膜是一种热容量小、温度容易上升的薄膜。在紧靠衬板中央的下部为一空洞结构,这种结构的设计确保了冷端和测温端的温度差。热电偶由多晶硅与铝构成,两者串联连接,当各个热电偶测温端温度上升时,热电偶之间就会产生热电动势Vn,因此在输出端就可以获得它们的电压之和。
硬件开发
2020-04-16 11:36:00
一、前言
获取边界点一般和行政区划搭配起来使用,比如用户输入一个省市的名称,然后自动定位到该省市,然后对该轮廓获取所有边界点集合输出到js文件,最后供离线使用,获取边界点还有一个功能就是获取当前区域内的左下角右上角等经纬度坐标,这个主要是供离线地图下载使用的,百度地图很好的提供了bdary.get(cityname, function(rs)的函数来获取行政区划的边界点集合,其中rs.boundaries就是所有的边界点集合,估计他是服务器上存储好的每个区域的集合,查询到了立即返回,可能早期也是人工的一点点圈起来连线好存到到数据库的,按照此方式其实可以搞一个程序自动将全国的所有省市边界点集合数据全部扒下来,给离线地图使用,测试了下貌似只支持到县城级别,不支持具体到乡镇。
二、功能特点 同时支持在线地图和离线地图两种模式。 同时支持webkit内核、webengine内核、IE内核。 支持设置多个标注点,信息包括名称、地址、经纬度。 可设置地图是否可单击、拖动、鼠标滚轮缩放。 可设置协议版本、秘钥、主题样式、中心坐标、中心城市、地理编码位置等。 可设置地图缩放比例和级别,缩略图、比例尺、路况信息等控件的可见。 支持地图交互,比如鼠标按下获取对应位置的经纬度。 支持查询路线,可设置起点位置、终点位置、路线模式、路线方式、路线方案(最少时间、最少换乘、最少步行、不乘地铁、最短距离、避开高速)。 可显示点线面工具,可直接在地图上划线、点、矩形、圆形等。 可设置行政区划,指定某个城市区域绘制图层,在线地图自动输出行政区划边界点集合到js文件给离线地图使用。 可静态或者动态添加多个覆盖物。支持点、折线、多边形、矩形、圆形、弧线、点聚合等。 函数接口友好和统一,使用简单方便,就一个类。 支持js动态交互添加点、删除点、清空点、重置点,不需要刷新页面。 支持任意Qt版本、任意系统、任意编译器。
三、体验地址 体验地址: https://pan.baidu.com/s/1uQsDQO5E5crUBN2J-nPeLQ 提取码:1jkp 文件名:bin_map.zip 国内站点: https://gitee.com/feiyangqingyun 国际站点: https://github.com/feiyangqingyun 个人主页: https://blog.csdn.net/feiyangqingyun 知乎主页: https://www.zhihu.com/people/feiyangqingyun/
四、效果图
五、相关代码 void MapBaiDu::getBounds(QStringList &list) { //获取可视区域经纬度 bssw=左下角 bsne=右上角 bsce=中心 list << QString(" function getBounds() {"); list << QString(" var bs = map.getBounds();"); list << QString(" var bssw = bs.getSouthWest();"); list << QString(" var bsne = bs.getNorthEast();"); list << QString(" var bsce = bs.getCenter();"); list << QString(" var rect = bssw.lng + ',' + bssw.lat + ',' + bsne.lng + ',' + bsne.lat + ',' + bsce.lng + ',' + bsce.lat + ',' + map.getZoom();"); //信号发出去 list << QString(" window.%1('bounds', rect);").arg(callFun); list << QString(" }"); } void MapBaiDu::getBoundary(QStringList &list) { list << QString(" function getBoundary() {"); list << QString(" for (var i = 0; i < polygons.length; i++) {"); list << QString(" var polyline = polygons[i];"); list << QString(" var pts = polyline.getPath();"); list << QString(" var result = '';"); list << QString(" for (var j = 0; j < pts.length; j++) {"); list << QString(" result += pts[j].lng + ', ' + pts[j].lat + ';';"); list << QString(" }"); list << QString(" window.%1('newboundary', result);").arg(callFun); list << QString(" }"); list << QString(" }"); }
硬件开发
2020-04-16 09:22:00
一、前言
路线查询的功能只有在线地图才有,因为这个路线规划需要经常更新的,这个数据同步需要大量的人力物力去统计,所以这玩意必须放在服务器端,就算是类似于手机端一样的放在本地离线,也需要隔一段时间更新的,不然数据很可能不正确。路线查询也叫出行规划,基本上分成两大类,一种是开车的一种是不开车的,其中开车的又有多种策略供选择比如最少时间、最短距离、避开高速等,不开车的也有多种策略供选择比如最少时间、最少换乘、最少步行、不乘地铁。路线查询的功能,现在貌似默认只支持经纬度作为参数了,之前是可以直接填入中文名称地名的比如门牌号之类的,这种地址解析或者逆解析的功能需要去后台用对应的秘钥去开通才行。
昨天又重新整理了路径规划这个功能,发现官网增加了步行+骑行两种路径规划方式,所以越发觉得放在服务器上运行的优点特别多,可以不断的优化更新服务器程序,这样就做到了用户无感知无影响,不知不觉中就用上了最新的程序和服务,所以程序界开发中就经常遇到要客户端还是服务端的处理选择,当然客户端也有客户端的的好处。
二、功能特点 同时支持在线地图和离线地图两种模式。 同时支持webkit内核、webengine内核、IE内核。 支持设置多个标注点,信息包括名称、地址、经纬度。 可设置地图是否可单击、拖动、鼠标滚轮缩放。 可设置协议版本、秘钥、主题样式、中心坐标、中心城市、地理编码位置等。 可设置地图缩放比例和级别,缩略图、比例尺、路况信息等控件的可见。 支持地图交互,比如鼠标按下获取对应位置的经纬度。 支持查询路线,可设置起点位置、终点位置、路线模式、路线方式、路线方案(最少时间、最少换乘、最少步行、不乘地铁、最短距离、避开高速)。 可显示点线面工具,可直接在地图上划线、点、矩形、圆形等。 可设置行政区划,指定某个城市区域绘制图层,在线地图自动输出行政区划边界点集合到js文件给离线地图使用。 可静态或者动态添加多个覆盖物。支持点、折线、多边形、矩形、圆形、弧线、点聚合等。 函数接口友好和统一,使用简单方便,就一个类。 支持js动态交互添加点、删除点、清空点、重置点,不需要刷新页面。 支持任意Qt版本、任意系统、任意编译器。
三、体验地址 体验地址: https://pan.baidu.com/s/1uQsDQO5E5crUBN2J-nPeLQ 提取码:1jkp 文件名:bin_map.zip 国内站点: https://gitee.com/feiyangqingyun 国际站点: https://github.com/feiyangqingyun 个人主页: https://blog.csdn.net/feiyangqingyun 知乎主页: https://www.zhihu.com/people/feiyangqingyun/
四、效果图
五、相关代码 void MapBaiDu::addRoute(QStringList &list) { if (!startAddr.isEmpty()) { //地址中带了 , 表示采用的经纬度形式 if (startAddr.contains(",")) { list << QString(" var p1 = new BMap.Point(%1);").arg(startAddr); list << QString(" var p2 = new BMap.Point(%1);").arg(endAddr); } else { list << QString(" var p1 = \"%1\";").arg(startAddr); list << QString(" var p2 = \"%1\";").arg(endAddr); } //0-公交 1-驾车 2-步行 3-骑行 if (routeType == 0) { list << QString(" var transit = new BMap.TransitRoute(map, {renderOptions:{map:map, panel:\"result\"}, policy:%1});").arg(policyType); list << QString(" transit.search(p1, p2);"); } else if (routeType == 1) { list << QString(" var driving = new BMap.DrivingRoute(map, {renderOptions:{map:map, panel:\"result\"}, policy:%1});").arg(policyType); list << QString(" driving.search(p1, p2);"); } else if (routeType == 2) { list << QString(" var walking = new BMap.WalkingRoute(map, {renderOptions:{map:map, panel:\"result\"}, policy:%1});").arg(policyType); list << QString(" walking.search(p1, p2);"); } else if (routeType == 3) { list << QString(" var riding = new BMap.RidingRoute(map, {renderOptions:{map:map, panel:\"result\"}, policy:%1});").arg(policyType); list << QString(" riding.search(p1, p2);"); } } }
硬件开发
2020-04-15 09:16:06
智能垃圾桶检测器的应用,强化了垃圾桶的功能,给人们带来了很多便利,更重要的是,安装了智能垃圾桶检测器之后的垃圾桶及时清运,及时处置。
智能感应垃圾桶,是相对普通垃圾桶而言的,简而言之,就是盖子可以通过感应器来开和关,不用手动和脚踩。和普通垃圾桶比较,多了一个电子部分和机械驱动部分。电子部分由一个 IC 控制,再加一个感应器。机械驱动部分就更简单了,只是驱动盖子的关和开而已了。
目前市面上主要有三种感应方式:热释电红外、红外对管、微波感应,采用了美国进口的不锈钢板材料作为桶身,纯度的高,是一般国产冷轧铁所不能比拟的。运用了红外自动感应功能,美国无锌电路板,感应高度达 {30-40CM} ,开盖之后直到感应区域的东西离开才会将桶盖重新盖上,改进了不仅仅只有市面上感应高度 {15-20CM} 且改进了市面上自动感应无延迟的,容易夹到手的弊端。无锌是国家倡导的环保概念,运用到垃圾桶中,体现了节能环保的概念。
随着人们生活水平提高,家居生活现代化是个必然的趋势。目前几乎所有的传统垃圾桶行业都推出了各自的智能感应垃圾桶,这必将是以后的一个发展趋势。智能感应垃圾桶也必将成为老百姓的消费习惯。就如当初的节能灯管、饮水机一样,现在已全面普及。智能感应垃圾桶在未来的几年中也必将普及。
垃圾桶安装智能垃圾桶检测器,可以监测垃圾桶内垃圾满空状态、火灾隐患,倒伏状态等。当垃圾桶内垃圾装满后,会自动发射信号无线传输到管理平台,管理人员通过平台网页或手机 APP 监控垃圾桶状态,随时进行任务调度和资源分配,实现对突发状况的及时应对,及时安排清运、收集,提高垃圾清运收集效率。遇到暴雨大风天气,垃圾桶被吹倒或者有火灾隐患,都可以及时报警,及时处置。
推荐一款应用在智能垃圾箱内火灾报警器中的一氧化碳传感器,由工采网从国外引进的纽扣式一氧化碳传感器 - TGS5141,TGS5141 一氧化碳传感器 CO 传感器是费加罗研发的可电池驱动的电化学式传感器,使用一个特殊的电极取代了储水器,由于去除了 TGS5042 中使用的储水器, TGS5141 与 TGS5042 相比,其外形尺寸缩减到只有后者的 10% 大小。超小型的体积使其可以成为诸如便携式一氧化碳检测仪、微型住宅一氧化碳检测仪、多用途火灾检测仪的理想选择 。 OEM 客户会发现,通过每个传感器的条形码,可以单独打印每个传感器的数据,使用户可以避免昂贵的气体校准程序,还允许对个别传感器进行追踪。
硬件开发
2020-04-15 08:52:00
EMQ X 的主题重写功能支持根据用户配置的规则在 MQTT 客户端订阅主题、发布消息、取消订阅的时候将 A 主题重写为 B 主题。
EMQ X 的 保留消息 和 延迟发布 可以与主题重写配合使用,例如,当用户想使用延迟发布功能,但不方便修改客户端发布的主题时,可以使用主题重写将相关主题重写为延迟发布的主题格式。
开启主题重写功能
主题重写功能默认关闭,开启此功能需要修改 etc/emqx.conf 文件中的 module.rewrite 配置项。默认 off 表示关闭,如需开启请修改为 on 。
module.rewrite = off
配置主题重写规则
EMQ X 的主题重写规则需要用户自行配置,用户可以自行添加多条主题重写规则,规则的数量没有限制,但由于任何携带主题的 MQTT 报文都需要匹配一遍重写规则,因此此功能在高吞吐场景下带来的性能损耗与规则数量是成正比的,用户需要谨慎地使用此功能。
每条主题重写规则的格式如下:
module.rewrite.rule. = 主题过滤器 正则表达式 目标表达式
每条重写规则都由以空格分隔的主题过滤器、正则表达式、目标表达式三部分组成。在主题重写功能开启的前提下,EMQ X 在收到诸如 PUBLISH 报文等带有主题的 MQTT 报文时,将使用报文中的主题去依次匹配配置文件中规则的主题过滤器部分,一旦成功匹配,则使用正则表达式提取主题中的信息,然后替换至目标表达式以构成新的主题。
目标表达式中可以使用 $N 这种格式的变量匹配正则表达中提取出来的元素, $N 的值为正则表达式中提取出来的第 N 个元素,比如 $1 即为正则表达式提取的第一个元素。
需要注意的是,EMQ X 使用倒序读取配置文件中的重写规则,当一条主题可以同时匹配多条主题重写规则的主题过滤器时,EMQ X 仅会使用它匹配到的第一条规则进行重写,如果该条规则中的正则表达式与 MQTT 报文主题不匹配,则重写失败,不会再尝试使用其他的规则进行重写。因此用户在使用时需要谨慎的设计 MQTT 报文主题以及主题重写规则。
示例
假设 etc/emqx.conf 文件中已经添加了以下主题重写规则:
module.rewrite.rule.1 = y/+/z/# ^y/(.+)/z/(.+)$ y/z/$2
module.rewrite.rule.2 = x/# ^x/y/(.+)$ z/y/x/$1
module.rewrite.rule.3 = x/y/+ ^x/y/(\d+)$ z/y/$1
此时我们分别订阅 y/a/z/b 、 y/def 、 x/1/2 、 x/y/2 、 x/y/z 五个主题: y/def 不匹配任何一个主题过滤器,因此不执行主题重写,直接订阅 y/def 主题。 y/a/z/b 匹配 y/+/z/# 主题过滤器,EMQ X 执行 module.rewrite.rule.1 规则,通过正则正则表达式匹配出元素 [a、b] ,将匹配出来的第二个元素带入 y/z/$2 ,实际订阅了 y/z/b 主题。 x/1/2 匹配 x/# 主题过滤器,EMQ X 执行 module.rewrite.rule.2 规则,通过正则表达式未匹配到元素,不执行主题重写,实际订阅 x/1/2 主题。 x/y/2 同时匹配 x/# 和 x/y/+ 两个主题过滤器,EMQ X 通过倒序读取配置,所以优先匹配 module.rewrite.rule.3 ,通过正则替换,实际订阅了 z/y/2 主题。 x/y/z 同时匹配 x/# 和 x/y/+ 两个主题过滤器,EMQ X 通过倒序读取配置,所以优先匹配 module.rewrite.rule.3 ,通过正则表达式未匹配到元素,不执行主题重写,实际订阅 x/y/z 主题。需要注意的是,即使 module.rewrite.rule.3 的正则表达式匹配失败,也不会再次去匹配 module.rewrite.rule.2 的规则。 版权声明: 本文为 EMQ 原创,转载请注明出处。
原文链接: https://www.emqx.io/cn/blog/rewriting-emqx-mqtt5-topic
硬件开发
2020-04-14 13:55:00

everspin 在此生产基于180nm,130nm和90nm工艺技术节点的MRAM产品。产品包装和测试业务遍及中国,台湾和其他亚洲国家。在平面内和垂直磁隧道结(MTJ)STT-MRAM位单元的开发方面处于市场领先地位。 英尚微电子核心代理商。已为各行业领域的提供了大量优质可靠的非易失性MRAM存储器芯片.

EVERSPIN的SPI产品系列中增加了具有2mm底部裸露焊盘的新型DFN8封装。这种新封装允许该器件既可用于JEDEC标准SOIC-8引脚又可用于DFN8 PCB焊盘图案。图1显示了典型的SOIC-8 PCB焊盘图案。

一些Everspin客户对Everspin“ DC” DFN封装的裸露底部焊盘(4.1mm焊盘)与SOIC-8封装的PCB焊盘之间的边际间隙表示担忧。 Everspin的新型2mm裸露焊盘DFN-8封装缓解了这种担忧。

图1代表了JEDEC标准SOIC-8封装的近似尺寸和建议的PCB焊盘图案(注意:以下尺寸为近似值,可能因供应商而异)

图2和图3分别是Everspin MR25HxxxDC (4.1mm裸露的底部焊盘)和MR25HxxxDF(2.0mm裸露的底部焊盘)的封装尺寸。由于MR25HxxxDC的4.1mm裸露底垫与SOIC-8 PCB焊盘图案之间存在边际间隙,因此具有2.0mm裸露底垫(MR25HxxxDF)的新封装已获Everspin批准生产,并且与JEDEC兼容标准SOIC-8和DFN-8焊盘图案。较小的底垫在底垫和SOIC-8的PCB焊盘图案之间提供足够的间隙。

图2-Everspin MR25HxxxDC封装的封装尺寸


图3-Everspin的MR25HxxxDF封装的封装尺寸
硬件开发
2020-04-14 12:02:00
版权所有 省涯 QQ2252224326,转载请注明出处
1、政策背景
为贯彻《中华人民共和国环境保护法》和《中华人民共和国大气污染防治法》,防治装有柴油机的非道路移动机械排放颗粒物对环境的污染,生态环境部2018年第34号公告发布《非道路移动机械污染防治技术政策》,并发布了GB3847- -2018、GB18285--2018. GB36886- -2018等标准。我们联合行业专家,共同研发了目前国内非道路移动机械污染防治行业最完善、最先进平台,实现了从基础数据采集、牌照编码发放、低排区管理、项目进/出场车辆管理、位置管理、排放数据动态监控、尾气检测、尾气治理、环保执法等全流程管理,形成一车一档,实现非道路工程机械的全数据链跟踪。



2、平台概述
非道路移动机械环保信息管理平台,实现了从基础数据采集、尾气检测、尾气治理、项目施工车辆准入、环保执法检查等全流程管理,形成业务闭环,实现非道路工程机械的全数据链监管。
★监管端:车辆资料、黑名单、车辆档案、牌照发放、检测单位、治理站、动态
★执法端: 移动端扫码识别车辆信息、执法任务执行、黑名单管理等
★企业端:车辆资料采集、车辆档案管理、项目管理、车辆进/出场管理、操作员
★检测端:检测站管理、车辆检测、工单管理、生成检测报告等
★治理端:治理站管理、车辆治理、工单管理、后处理设备加装等

3、组织管理
组织管理分为单位管理、企业管理、用户管理、权限管理四大部分,单位管理为环保监管部门的管理,企业管理为车辆企业、第三方企业、项目企业管理,用户管理:单位、企业用户管理;权限管理:针对不同用户角色授权。

4、执法管理
车辆抽查:车辆现场抽查,执法照片:执法现场照片上传,执法结果:执法结果记录,执法记录:执法记录管理。

5、尾气后处理装置动态监控
在线实时监控系统,用于DPF系统状态提醒,故障报警
① 实时显示尾 气处理系统状态信息,主要包括:排气前后温度、 压差值、再生状态等, 还包括车辆地理位置、 车速和行驶里程等物联网数据
② 配置移动通信接口, 满足远程监管需求,实现数据远程上传与监控
③ 产品出现故障报警后,本地故障报警装置能够自动报警提示驾驶员,并将报警信息通过在线远程监控装置发送至监控平台,实施具体应急方案


6、数据看板
“非道路移动机械环保信息管理平台一数据看板” 实时机械数据、检测情况统计、图形化展示平台数据,实现数据可视化、信息化、科技化。

7、移动端采集
车辆信息采集,基本信息、定位设备信息、尾气处理设备信息、RFID电子标签,检测检测工单提交、检测详情查看、检测管理历史列表治理治理工单提交、治理详细查看、治理管理历史列表个人资料完善、密码修改、消息发布、消息接收。

硬件开发
2020-02-19 13:00:00
前言
安全保护几乎对于所有的项目都是一个挑战,对于物联网项目更是如,自普及应用以来物联网业内已经发生过多起安全事故。
作为物联网通信协议事实标准,MQTT 保持着较高的安全性,提供了多层次的安全设计: 传输层:MQTT 基于 TCP/IP 协议,可以在传输层上使用 SSL/TLS 进行加密传输: 使用 SSL/TLS 加密通信数据,防止中间人攻击; 使用客户端证书作为设备身份凭证,验证设备合法性。 应用层:使用 MQTT 自身的安全特性进行防护: MQTT 协议支持用户名和密码实现客户端的身份校验; MQTT Broker 实现了 Topic 的读写权限控制(Topic ACL)。
EMQ X 完整支持 MQTT 各项安全规范,内置的安全功能无需编程开箱即用,可以快速排除项目中的安全隐患。本系列将围绕各个层次的安全规范,介绍如何通过配置 EMQ X 启用相关功能最终实现相应的安全防护。

emqx-auth-mysql 简介
emqx_auth_mysql 是基于 MySQL 数据库的 MQTT 认证/访问控制插件,通过检查每个终端接入的 username 和 password 是否与用户指定的 MySQL 数据库中存储的信息一致性来实现对终端的连接认证和访问控制。其功能逻辑如下:
本文仅介绍认证功能,ACL 功能见后续文章。
认证原理
设备连接时 EMQ X 将执行按照配置的查询语句,比较查询结果中的 password 字段的值是否与当前请求客户端的密码进行加盐 (salt) 处理、加密后的值是否相等,验证流程如下: 查询结果集中必须有 password 、 salt 字段,可以使用 AS 语法设置如 SELECT *, pwd as password FROM mqtt_user 在数据库中可以为每个客户端都指定一个 salt,EMQ X 根据客户端传入的密码和通过 SQL 返回的 salt 信息生成密文 结果集为空或比对结果不相等,认证失败

创建数据库
你可以使用任何自己喜欢的 客户端,创建好相应的数据库。这里用的是 MySQL 自带的命令行客户端,打开 MySQL 的控制台,如下所示,创建一个名为 emqx 的认证数据库,并切换到 emqx 数据库。 mysql> create database emqx; Query OK, 1 row affected ( 0.00 sec) ​ mysql> use emqx; Database changed

创建表
建议的表结构如下,其中, username 为客户端连接的时候指定的用户名 password_hash 为使用 salt 加密后的密文 salt 为加密串 is_superuser 是否为超级用户,用于控制 ACL,缺省为0;设置成 1 的时候为超级用户,可以跳过 ACL 检查 数据表字段可以不用完全跟下面的一致,可以根据业务需要设置,通过 emqx_auth_mysql.conf 配置文件中的 auth_query 配置项来指定。 CREATE TABLE `mqtt_user` ( `id` int ( 11 ) unsigned NOT NULL AUTO_INCREMENT, `username` varchar ( 100 ) DEFAULT NULL , `password_hash` varchar ( 255 ) DEFAULT NULL , `salt` varchar ( 40 ) DEFAULT NULL , `is_superuser` tinyint ( 1 ) DEFAULT 0 , `created` datetime DEFAULT NULL , PRIMARY KEY (`id`), UNIQUE KEY `mqtt_username` (`username`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
创建成功后,查看一下表结构如下, mysql> desc mqtt_user; +---------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+------------------+------+-----+---------+----------------+ | id | int ( 11 ) unsigned | NO | PRI | NULL | auto_increment | | username | varchar ( 100 ) | YES | UNI | NULL | | | password_hash | varchar ( 255 ) | YES | | NULL | | | salt | varchar ( 40 ) | YES | | NULL | | | is_superuser | tinyint ( 1 ) | YES | | 0 | | | created | datetime | YES | | NULL | | +---------------+------------------+------+-----+---------+----------------+ 6 rows in set ( 0.01 sec)

准备认证数据
本文提供示例数据中密码为 test_password ,加密 salt 为 secret 。即客户端连接时使用的密码是 test_password 。
在 EMQ X 的配置文件的 auth.mysql.password_hash 中, salt 只是一个标识符,表示 salt 与密码明文的拼接关系 。 如果采用 auth.mysql.password_hash = md5,salt ,那么 EMQ X 使用 MD5 算法对 test_passwordsecret 字符串加密 如果采用 auth.mysql.password_hash = salt,md5 ,那么 EMQ X 使用 MD5 算法对 secrettest_password 字符串加密
本文采用第一种配置方式,将得到的 MD5 密文插入表 mqtt_user 。读者可以通过 在线的 MD5 工具 或者自己写程序对密码进行编码。 MD5 ( "test_passwordsecret" ) -> a904b2d1d2b2f73de384955022964595 mysql> INSERT INTO mqtt_user(username,password_hash,salt) VALUES ( 'test_username' , 'a904b2d1d2b2f73de384955022964595' , 'secret' ); ​ Query OK, 1 row affected ( 0.00 sec) ​ mysql> select * from mqtt_user; +----+----------------+----------------------------------+--------+--------------+---------+ | id | username | password_hash | salt | is_superuser | created | +----+----------------+----------------------------------+--------+--------------+---------+ | 3 | test_username1 | a904b2d1d2b2f73de384955022964595 | secret | 0 | NULL | +----+----------------+----------------------------------+--------+--------------+---------+ 1 row in set ( 0.00 sec)

启用认证功能
修改插件配置并启用插件
修改 etc/plugins/emqx_auth_mysql.conf ,修改后的有效配置如下所示,其余 ACL 相关的配置项可以注释: ## 修改为实际 mysql 所在的服务器地址 auth.mysql.server = localhost:3306 ​ ## 修改为上面创建成功的 emqx 数据库 auth.mysql.database = emqx ​ ## 连接认证查询语句 auth.mysql.auth_query = SELECT password_hash AS password, salt FROM mqtt_user WHERE username = '%u' ​ ## 加密算法 plain | md5 | sha | sha256 | bcrypt ## 加盐加密算法 auth.mysql.password_hash = md5,salt ​ ## 不加盐加密算法,直接写算法名称即可 # auth.mysql.password_hash = md5

修改完毕后使用 Dashboard 或命令行重启插件以应用配置,命令行重启示例如下: emqx_ctl plugins reload emqx_auth_mysql

关闭匿名认证
EMQ X 默认开启了匿名认证,即便启用了认证功能,数据库没有查询到数据时设备也能正常连接,只有当查询到数据且密码错误时才会拒绝连接。
打开 etc/emqx.conf 配置文件,禁用匿名认证: ## Value: true | false allow_anonymous = false
重启 emqx 完成配置应用。

测试
准备就绪后,仅通过认证校验之后的设备才能成功连接到 EMQ X: 使用正确的用户名和密码进行连接,并订阅 "topic" 主题,可以连接成功: $ mosquitto_sub -p 1883 -u test_username -P test_password -t 'topic' -d Client mosqsub|5228-wivwiv-mac sending CONNECT Client mosqsub|5228-wivwiv-mac received CONNACK Client mosqsub|5228-wivwiv-mac sending SUBSCRIBE (Mid: 1, Topic: topic, QoS: 0) Client mosqsub|4119-zh ouzibode received SUBACK Subscribed (mid: 1): 0
使用错误的用户名或密码进行连接,并订阅 "topic" 主题,连接失败: $ mosquitto_sub -p 1883 -u test_username -P test_password -t 'topic' -d Client mosqsub/61879-wivwiv-ma sending CONNECT Client mosqsub/61879-wivwiv-ma received CONNACK Connection Refused: not authorised.
总 结
读者在理解了 EMQ X MySQL 认证原理之后,可以结合 MySQL 拓展相关应用。欢迎关注 EMQ X 安全系列文章,后续本系列将依次讲解 EMQ X 与物联网安全相关问题,助您构建高安全物联网项目。 版权声明: 本文为 EMQ 原创,转载请注明出处。
原文链接: https://www.emqx.io/cn/blog/emqx-authentication-1-mqtt-connection-authentication-based-on-mysql
硬件开发
2020-02-18 16:21:00
1. 环境准备
硬件准备 小熊派开发板
M26通信模组
软件准备 QCOM串口助手
文档准备 M26 AT命令手册 此文档来自于移远官方!阅读本教程时,关于AT指令的详细说明请参考该文档!
切换开关
小熊派开发板右上角的开关拨到AT-PC一端,则模组直接与PC相连,方便调试。 所有工具和文档均在『小熊派开源社区』公众号回复“通信模组”获取!
2. 模组信号查询与网络查询AT指令
AT
指令:AT
功能:测试AT指令功能是否正常
示例: AT OK
AT+CPIN?
指令:AT+CPIN?
功能:查询SIM卡是否正常,返回ready则表示SIM卡正常
示例: AT+CPIN? +CPIN: READY OK
AT+CSQ
指令:AT+CSQ
功能:查询模组的信号强度,第一个值为0-31则正常,99为不正常
示例: AT+CSQ +CSQ: 17,0 OK
AT+CREG?
指令:AT+CREG?
功能:查询模组是否注册上GSM网络,+CREG:0,1 表示已注册上本地网,+CREG:0,5表示注册上漫游网。
示例: AT+CREG? +CREG: 0,1 OK
AT+CGREG?
指令:AT+CERGE?
功能:查询模组是否注册上GPRS网络,+CGREG:0,1 表示已注册上本地网,+CGREG:0,5表示注册上漫游网。
示例: AT+CGREG? +CGREG: 0,1 OK
3. 激活移动场景,获取ip地址 必须在查询GPRS网络已正常注册网络的情况下进行本节实验!
AT+QIFGTCNT=0
指令:AT+QIFGTCNT=0
功能:配置当前场景
示例: AT+QIFGCNT=0 OK
AT+QICSGP=1, "CMNET"
指令:AT+QICSGP=1, "CMNET"
功能:设置GPRS的APN,移动CMNET,联通UNINET
示例: AT+QICSGP=1, "CMNET" OK
AT+QIMODE=0
指令:AT+QIMODE=0
功能:设置数据传输模式,0表示非透传模式,1表示透传模式
示例: AT+QIMODE=0 OK
AT+QIDEACT
指令:AT+QIDEACT
功能:在激活GPRS场景之前先关闭GPRS场景,确保连接正确
示例: AT+QIDEACT DEACT OK
AT+QIREGAPP
指令:AT+QIREGAPP
功能:启动任务并设置接入点APN、用户名和密码
示例: AT+QIREGAPP OK
AT+QIACT
指令:AT+QIACT
功能:激活移动场景
示例: AT+QIACT OK
AT+QILOCIP
指令:AT+QILOCIP
功能:查看模组获取的IP地址
示例: AT+QILOCIP 100.125.208.23
4. 基于 TCP 协议连接远程服务器通信实例
4.1. 搭建远程TCP服务器
首先我们需要搭建一个TCP服务器,有两种方式: 在服务器上使用Python、Java、C#等语言自行编写服务器程序; 在本地PC上使用网络调试助手开启TCP服务器;
因为M26模组直接注册的是公网ip地址,所以这里我们使用第一种方式,在Linux服务器上运行一个Python编写的tcp测试服务器: 本地PC使用的是局域网,公网不可以直接根据ip地址访问到本PC,需要进行内网穿透,不推荐使用。
这里的Python程序如下: # tcp-server.py from socket import * host = '' port = 8000 # 创建server socket server_socket = socket(AF_INET,SOCK_STREAM) # 绑定socket监听地址 server_addr = (host,port) server_socket.bind(server_addr) # 开始监听,最大允许连接数5 server_socket.listen(5) # 处理连接请求 try: while True: print('waiting for connect...') #阻塞等待客户端的连接 client_socket, client_addr = server_socket.accept() # 连接成功后,打印客户端信息 print('a client connnect from:', client_addr) while(True): # 向客户端发送数据 client_socket.send('Hello, client!'.encode()) # 接收客户端的数据 data = client_socket.recv(1024) print('recv data is ', data.decode()) # 接收到quit则关闭socket if "quit" in data.decode(): break # 关闭socket client_socket.close() server_socket.close() print("socket closed.") break except: client_socket.close() server_socket.close() print("socket closed.")
运行: python3 tcp-server.py
效果如下:
4.2. 模组连接服务器
查询ip地址: AT+QILOCIP 100.125.208.23
使用AT命令连接TCP服务器,其中第一个参数是协议类型,“TCP”则表示使用TCP协议,第二个参数是TCP服务器ip地址,也可以使用域名,最一个参数是TCP服务器开启监听的端口: AT+QIOPEN=,/,
示例: AT+QIOPEN="TCP","122.51.89.94","8000" OK CONNECT OK
连接之后,在服务器端也可以看到:
4.2. 模组接收消息
模组连接到服务器后,服务器会自动发送消息,模组会打印出收到的信息: Hello, client!
4.3. 模组主动发送消息
使用如下的命令即可向TCP服务器发送消息,首先设置要发送数据的字节数,等待模组返回 > 后,输入要发送的数据即可,如果发送的数据超过了设置的n个字节,则只发送前n个字节,后面的数据被认为是无效数据,不会发送: AT+QISEND >hello<0x1a>
示例: Hello, client!AT+QISEND > hello SEND OK
发送成功看服务器上运行的TCP服务器是否收到:
4.4. 关闭TCP连接
通信完毕之后,可以使用下面的命令关闭TCP连接: AT+QICLOSE
示例: AT+QICLOSE CLOSE OK
硬件开发
2020-02-15 11:43:00
1.E53_ST1扩展板及其驱动
关于E53标准接口
E53接口标准的E取自扩展(Expansion)的英文首字母,板子的尺寸为5×3cm,故采用E53作为前缀来命名尺寸为 5cm*3cm 类型的案例扩展板,任何一款满足标准设计的开发板均可直接适配E53扩展板。
E53扩展板是根据不同的应用场景来设计的,以最大的程度在扩展板上还原真实应用场景,不同案例的扩展板根据不同的应用场景来命名后缀。例如:E53_SC1,SC是智慧城市(Smart City)的缩写,SC1表示的是智慧城市中的智慧路灯,再比如SC2则表示的是智慧城市中的智慧井盖。
E53扩展接口在电气特性上,包含了常用的物联网感知层传感器通信接口,比如5V、3.3V、GND、SPI、UART、IIC、ADC、DAC等等,可以适配各种传感器,还留有4个普通GPIO,如图:
E53_ST1智慧消防扩展板
E53_ST1扩展板采用了E53标准接口,包含了一个GPS模块L80-R,一个无源蜂鸣器,一个LED,其中无源蜂鸣器使用定时器输出PWM信号控制,LED使用普通GPIO控制,GPS模块的数据使用 USART 读取。
如果你对该扩展板板载的 L80-R GPS模块和无源蜂鸣器的驱动不熟悉,请先阅读嵌入式基础教程
2. 移植E53_ST1驱动到LiteOS
复制裸机驱动文件到LiteOS工程
本文中所使用的驱动文件,直接将用于产生PWM的定时器TIM16初始化配置代码和ADC初始化配置代码,所以无需复制其它底层文件。
IoT-Studio中提供的默认工程已经包含了该驱动文件,无需再次添加,如图:
添加驱动文件路径
因为 LiteOS 的整个项目工程使用 make 构建,所以复制驱动文件之后,需要添加驱动文件的路径到 makefile 中,加入编译。
之前我们都是在 project.mk 中直接添加,这里我们使用一种更加简便有效的方法,直接在 user_demo.mk 中配置,只有当开启了该demo后,才会添加这些驱动文件路径,不会造成冲突:
在user_demo.mk中添加如下代码: #example for e53_st1_driver_demo ifeq ($(CONFIG_USER_DEMO), "e53_st1_driver_demo") user_hardware_src = ${wildcard $(TOP_DIR)/targets/STM32L431_BearPi/Hardware/E53_ST1/*.c} user_hardware_inc = -I ${wildcard $(TOP_DIR)/targets/STM32L431_BearPi/Hardware/E53_ST1} endif
添加位置如下:
至此,复制文件到LiteOS工程中,并将新复制的文件路径添加到makefile中,如果开启了该demo,则加入工程编译,就完成了驱动的移植。
3. E53_ST1裸机驱动的使用
初始化E53_ST1扩展板
在第一篇文章中详细的讲述了在LiteOS中初始化设备的两种方式: 在系统启动调度之前初始化:设备在系统中随时可被任意任务使用 在任务中初始化:设备一般只在该任务中被使用
本文中移植的 E53_ST1 扩展板驱动, 不需要多个任务去操作,只需要传感器数据采集任务操作即可,所以初始化放在数据采集任务中 。
操作E53_ST1扩展板
接下来首先创建一个文件夹( 如果已有,不用再次创建 ),用于存放本系列教程实验的代码:

在该文件夹中创建一个文件:
编写代码: #include #include "lcd.h" #include "E53_ST1.h" /* 存放E53_ST1扩展板传感器数据,可在E53_ST1.h中查看定义 */ E53_ST1_Data_TypeDef E53_ST1_Data; /* 用于数据采集和数据处理任务间同步的信号量 */ osal_semp_t sync_semp; /* 数据采集任务-低优先级 */ static int data_collect_task_entry() { /* 初始化扩展板 */ Init_E53_ST1(); while (1) { /* 读取扩展板板载数据,存到数据结构体E53_ST1_Data中 */ E53_ST1_Read_Data(); /* 数据读取完毕,释放信号量,唤醒数据处理任务 */ osal_semp_post(sync_semp); /* 任务睡眠2s */ osal_task_sleep(2*1000); } } /* 数据处理任务-高优先级 */ static int data_deal_task_entry() { char longitude[9]; char Latitude[9]; /* LCD清屏,防止干扰显示 */ LCD_Clear(WHITE); while (1) { /* 等待信号量,未等到说明数据还未采集,阻塞等待 */ osal_semp_pend(sync_semp, cn_osal_timeout_forever); /* 信号量等待,被唤醒,开始处理数据 */ sprintf(longitude, "%.5f", E53_ST1_Data.Longitude); sprintf(Latitude, "%.5f", E53_ST1_Data.Latitude); printf("Longitude: %s\r\n", longitude); printf("Latitude :%s\r\n", Latitude); LCD_ShowString(10, 100, 130, 16, 16, "Longitude Value:"); LCD_ShowString(140, 100, 100, 16, 16, longitude); LCD_ShowString(10, 120, 130, 16, 16, "Latitude Value:"); LCD_ShowString(140, 120, 100, 16, 16, Latitude); /* 接收到GPS信号后,经纬度不为0,LED亮起,蜂鸣器报警1s */ if(E53_ST1_Data.Longitude != 0 && E53_ST1_Data.Latitude != 0) { HAL_GPIO_WritePin(ST1_LED_GPIO_Port, ST1_LED_Pin, GPIO_PIN_RESET); E53_ST1_Beep_StatusSet(ON); printf("Beep and Light ON!\r\n"); osal_task_sleep(1000); E53_ST1_Beep_StatusSet(OFF); printf("Beep OFF!\r\n"); } } } /* 标准demo启动函数,函数名不要修改,否则会影响下一步实验 */ int standard_app_demo_main() { /* 创建信号量 */ osal_semp_create(&sync_semp, 1, 0); /* 数据处理任务的优先级应高于数据采集任务 */ osal_task_create("data_collect",data_collect_task_entry,NULL,0x400,NULL,3); osal_task_create("data_deal",data_deal_task_entry,NULL,0x400,NULL,2); return 0; }
然后按照之前的方法,在 user_demo.mk 中将 E53_ST1_driver_demo.c 文件添加到makefile中,加入编译:
最后在 .sdkconfig 中配置开启宏定义:
编译,烧录,即可看到实验现象。
LCD屏幕上显示当前GPS采集的经纬度,并且每2s更新一次。
当精度值和纬度值都为0时,说明还未成功定位,E53_ST1扩展板的LED灯处于熄灭状态,蜂鸣器处于关闭状态:
当精度值和纬度值不为0时,说明定位成功,E53_ST1扩展板的LED灯亮起,蜂鸣器每2s鸣叫一次:
另外,打开IoT-Studio自带的串口终端,可以查看到串口输出的工作信息: linkmain:V1.2.1 AT 17:18:25 ON Dec 8 2019 Longitude: 0.00000 Latitude :0.00000 WELCOME TO IOT_LINK SHELL LiteOS:/>Longitude: 0.00000 Latitude :0.00000 Longitude: 0.00000 Latitude :0.00000 …… Longitude: 0.00000 Latitude :0.00000 Longitude: 103.95028 Latitude :36.32555 Beep and Light ON! Beep OFF! Longitude: 103.95028 Latitude :36.32555 Beep and Light ON! Beep OFF! Longitude: 103.95028 Latitude :36.32555 Beep and Light ON! Beep OFF! ……
硬件开发
2020-02-14 21:38:00


Linux 镜像烧写
平台:iTOP-3399开发板
系统: Linux 系统


1 RKTool 驱动安装
解 压 光 盘
02
工 具 \ 烧 写 工 具 \windows
目 录 下 的
DriverAssitant_v4.5.zip 文件,打开“DriverInstall.exe”,点击“驱动安
装”,提示安装驱动成功即可。如下图:



驱动安装成功,如下图:




注意事项:
1.目前支持的操作系统包括:XP,Win7_32,Win7_64,Win8_32,Win8_64。
2.XP 系统在驱动安装完后,若还提示“发现新设备”, 安装驱动时选择“自
动安装”。
3.若之前已经安装过老版本驱动,请先点击“驱动卸载”后再进行“驱动安
装”。
2 烧录 Linux 固件
解 压 光 盘
02
工 具 \ 烧 写 工 具 \windows
目 录 下 的
LinuxTool_Release_v2.54.7z 文件,如下图:
得 到
AndroidTool_Release_v2.54
文 件 夹 , 双 击 进 入
AndroidTool_Release_v2.54 文件夹,我们看到有两个文件夹,如下图:





首先拷贝我们编译生成的镜像文件,到 rockdev\Image 目录下,如下图:




然 后 返 回 到 AndroidTool_Release_v2.54 文 件 夹 目 录 下 , 进 入 到
AndroidTool_Release 目录下,鼠标双击运行 AndroidTool.exe,如下图:




这时会打开烧写工具的主界面,如下图:



点击“升级固件”,如下图:





点击“固件”选择刚才的 Linux 镜像文件 update.img 。如下图:



然后使用 Type-C 连接 iTop-3399 开发板到 PC 电脑上面,连接电源适配
器到 iTop-3399 开发板,然后首先按下 iTop-3399 开发板的 vol+按键( 按下
不要松开 ),然后按下 iTop-3399 开发版的电源按键,启动开发板,这时烧
写工具会提示发现新设备( 此时可以松开 vol+按键了 ),如下图( 如果您的
烧写工具没有发现新的设备,可以关闭烧写工具,在重新打开一遍烧写工具,
然后重复一下上面的上电步骤 ):




如果之前烧写 Android 镜像,需要先点击“擦除 flash ”,如下图:





然后点击“升级”,开始下载固件。如下图:





固件烧写完成,烧写工具右边会提示烧写成功, iTop-3399 开发板会自动
启动,如下图:




此时我们的烧写操作就完成了,如果您有购买迅为的屏幕,可以通过使
用屏幕+触摸的方式来体验 Linux 系统,如果没有购买迅为的屏幕,可以通
过 hdmi 接口连接到显示器,通过鼠标来体验 Linux 系统了。
3 单独烧写镜像
解 压 光 盘
02
工 具 \ 烧 写 工 具 \windows
目 录 下 的
LinuxTool_Release_v2.54.7z 文件,如下图:
得 到
AndroidTool_Release_v2.54
文 件 夹 , 双 击 进 入
AndroidTool_Release_v2.54 文件夹,我们看到有两个文件夹,如下图:





首先拷贝我们编译生成的镜像文件,到 rockdev\Image 目录下,以烧写
内核为例,如下图:




然 后 返 回 到 AndroidTool_Release_v2.54 文 件 夹 目 录 下 , 进 入 到
AndroidTool_Release 目录下,鼠标双击运行 AndroidTool.exe,如下图:






这时会打开烧写工具的主界面,如下图:




根据要单独烧写的镜像修改配置,例如单独烧写 boot.img,如下图:





然后使用 Type-C 连接 iTop-3399 开发板到 PC 电脑上面,连接电源适配
器到 iTop-3399 开发板,然后首先按下 iTop-3399 开发板的 vol+按键( 按下
不要松开 ),然后按下 iTop-3399 开发版的电源按键,启动开发板,这时烧
写工具会提示发现新设备( 此时可以松开 vol+按键了 ),如下图( 如果您的烧写工具没有发现新的设备,可以关闭烧写工具,在重新打开一遍烧写工具,
然后重复一下上面的上电步骤 ):




然后点击“执行”按钮,开始烧写镜像,烧写过程中,烧写工具右边会
有对应的打印信息,如下图:





烧写完成,烧写工具右边会提示烧写成功,iTop-3399 开发板会自动启
动,此时我们的烧写操作就完成了。
单独烧写 uboot 和 rootfs 和烧写 boot.img 一样,只需要拷贝相应的镜
像,在烧写工具中选择要烧写的配置即可。
硬件开发
2020-02-14 15:49:00
1.E53_SF1扩展板及其驱动
关于E53标准接口
E53接口标准的E取自扩展(Expansion)的英文首字母,板子的尺寸为5×3cm,故采用E53作为前缀来命名尺寸为 5cm*3cm 类型的案例扩展板,任何一款满足标准设计的开发板均可直接适配E53扩展板。
E53扩展板是根据不同的应用场景来设计的,以最大的程度在扩展板上还原真实应用场景,不同案例的扩展板根据不同的应用场景来命名后缀。例如:E53_SC1,SC是智慧城市(Smart City)的缩写,SC1表示的是智慧城市中的智慧路灯,再比如SC2则表示的是智慧城市中的智慧井盖。
E53扩展接口在电气特性上,包含了常用的物联网感知层传感器通信接口,比如5V、3.3V、GND、SPI、UART、IIC、ADC、DAC等等,可以适配各种传感器,还留有4个普通GPIO,如图:
E53_SF1智慧消防扩展板
E53_SF1扩展板采用了E53标准接口,包含了一个可燃气体传感器MQ-2,一个无源蜂鸣器,一个LED,其中无源蜂鸣器使用定时器输出PWM信号控制,LED使用普通GPIO控制,可燃气体传感器的数据使用ADC读取。
如果你对该扩展板板载的MQ-2传感器和无源蜂鸣器的驱动不熟悉,请先阅读嵌入式基础教程
2. 移植E53_SF1驱动到LiteOS
复制裸机驱动文件到LiteOS工程
本文中所使用的驱动文件,直接将用于产生PWM的定时器TIM16初始化配置代码和ADC初始化配置代码,所以无需复制其它底层文件。
IoT-Studio中提供的默认工程已经包含了该驱动文件,无需再次添加,如图:
添加驱动文件路径
因为 LiteOS 的整个项目工程使用 make 构建,所以复制驱动文件之后,需要添加驱动文件的路径到 makefile 中,加入编译。
之前我们都是在 project.mk 中直接添加,这里我们使用一种更加简便有效的方法,直接在 user_demo.mk 中配置,只有当开启了该demo后,才会添加这些驱动文件路径,不会造成冲突:
在user_demo.mk中添加如下代码: #example for e53_sf1_driver_demo ifeq ($(CONFIG_USER_DEMO), "e53_sf1_driver_demo") user_hardware_src = ${wildcard $(TOP_DIR)/targets/STM32L431_BearPi/Hardware/E53_SF1/*.c} user_hardware_inc = -I ${wildcard $(TOP_DIR)/targets/STM32L431_BearPi/Hardware/E53_SF1} endif
添加位置如下:
至此,复制文件到LiteOS工程中,并将新复制的文件路径添加到makefile中,如果开启了该demo,则加入工程编译,就完成了驱动的移植。
3. E53_SF1裸机驱动的使用
初始化E53_SF1扩展板
在第一篇文章中详细的讲述了在LiteOS中初始化设备的两种方式: 在系统启动调度之前初始化:设备在系统中随时可被任意任务使用 在任务中初始化:设备一般只在该任务中被使用
本文中移植的 E53_SF1 扩展板驱动, 不需要多个任务去操作,只需要传感器数据采集任务操作即可,所以初始化放在数据采集任务中 。
操作E53_SF1扩展板
接下来首先创建一个文件夹( 如果已有,不用再次创建 ),用于存放本系列教程实验的代码:

在该文件夹中创建一个文件:
编写代码: #include #include "lcd.h" #include "E53_SF1.h" /* 存放E53_SF1扩展板传感器数据,可在E53_SF1.h中查看定义 */ E53_SF1_Data_TypeDef E53_SF1_Data; /* 用于数据采集和数据处理任务间同步的信号量 */ osal_semp_t sync_semp; /* 数据采集任务-低优先级 */ static int data_collect_task_entry() { /* 初始化扩展板 */ Init_E53_SF1(); while (1) { /* 读取扩展板板载数据,存到数据结构体E53_SF1_Data中 */ E53_SF1_Read_Data(); /* 数据读取完毕,释放信号量,唤醒数据处理任务 */ osal_semp_post(sync_semp); /* 任务睡眠2s */ osal_task_sleep(2*1000); } } /* 数据处理任务-高优先级 */ static int data_deal_task_entry() { /* smoke_value- 当次数据,old-smoke_value-上次数据 */ int smoke_value = 0, old_smoke_value = 0; /* LCD清屏,防止干扰显示 */ LCD_Clear(WHITE); while (1) { /* 等待信号量,未等到说明数据还未采集,阻塞等待 */ osal_semp_pend(sync_semp, cn_osal_timeout_forever); /* 信号量等待,被唤醒,开始处理数据 */ old_smoke_value = smoke_value; smoke_value = (int)E53_SF1_Data.Smoke_Value; printf("Smoke Value is %d\r\n", smoke_value); LCD_ShowString(10, 100, 200, 16, 16, "Smoke Value is:"); LCD_ShowNum(140, 100, smoke_value, 5, 16); /* 阈值为100,自动打开或关闭LED或蜂鸣器 */ if(old_smoke_value < 100 && smoke_value > 100) { E53_SF1_LED_StatusSet(ON); E53_SF1_Beep_StatusSet(ON); printf("Beep and Light ON!\r\n"); } else if(old_smoke_value > 100 && smoke_value < 100) { E53_SF1_LED_StatusSet(OFF); E53_SF1_Beep_StatusSet(OFF); printf("Beep and Light OFF!\r\n"); } } } /* 标准demo启动函数,函数名不要修改,否则会影响下一步实验 */ int standard_app_demo_main() { /* 创建信号量 */ osal_semp_create(&sync_semp, 1, 0); /* 数据处理任务的优先级应高于数据采集任务 */ osal_task_create("data_collect",data_collect_task_entry,NULL,0x400,NULL,3); osal_task_create("data_deal",data_deal_task_entry,NULL,0x400,NULL,2); return 0; }
然后按照之前的方法,在 user_demo.mk 中将 e53_sf1_driver_demo.c 文件添加到makefile中,加入编译:
最后在 .sdkconfig 中配置开启宏定义:
编译,烧录,即可看到实验现象。
LCD屏幕上显示当前传感器采集的烟感值,并且每2s更新一次。
当烟感值高于100时,E53_SF1扩展板的LED灯自动点亮,蜂鸣器开始鸣叫:
当烟感值低于100时,E53_SF1扩展板的LED灯自动熄灭,蜂鸣器关闭鸣叫:
另外,打开IoT-Studio自带的串口终端,可以查看到串口输出的工作信息: linkmain:V1.2.1 AT 09:31:53 ON Dec 8 2019 Smoke Value is 0 WELCOME TO IOT_LINK SHELL LiteOS:/>Smoke Value is 0 Smoke Value is 0 Smoke Value is 0 Smoke Value is 0 Smoke Value is 279 Beep and Light ON! Smoke Value is 103 Smoke Value is 88 Beep and Light OFF! Smoke Value is 0 Smoke Value is 278 Beep and Light ON! Smoke Value is 27 Beep and Light OFF! ……
硬件开发
2020-02-12 20:12:00
1.E53_IA1扩展板及其驱动
关于E53标准接口
E53接口标准的E取自扩展(Expansion)的英文首字母,板子的尺寸为5×3cm,故采用E53作为前缀来命名尺寸为 5×3cm 类型的案例扩展板,任何一款满足标准设计的开发板均可直接适配E53扩展板。
E53扩展板是根据不同的应用场景来设计的,以最大的程度在扩展板上还原真实应用场景,不同案例的扩展板根据不同的应用场景来命名后缀。例如:E53_SC1,SC是智慧城市(Smart City)的缩写,SC1表示的是智慧城市中的智慧路灯,再比如SC2则表示的是智慧城市中的智慧井盖。
E53扩展接口在电气特性上,包含了常用的物联网感知层传感器通信接口,比如5V、3.3V、GND、SPI、UART、IIC、ADC、DAC等等,可以适配各种传感器,还留有4个普通GPIO,如图:
E53_IA1智慧农业扩展板
E53_IA1扩展板采用了E53标准接口,包含了一个补光灯,一个BH1750光照强度传感器,一个小的贴片电机,一个温湿度传感器SHT30,一个其中补光灯和贴片电机使用普通GPIO控制,BH1750和SHT30使用IIC接口通信。
如果你对该扩展板板载的BH1750光照强度和温湿度传感器驱动不熟悉,请先阅读嵌入式基础教程
2. 移植E53_IA1驱动到LiteOS
复制裸机驱动文件到LiteOS工程
E53_IA1扩展板上的 BH1750 光照强度传感器和SHT30温湿度传感器使用的是 IIC 通信接口,所以除了复制 STM32CubeMX 生成的 i2c.h 和 i2c.h 文件,还需要在此基础上复制包含了 BH1750 传感器驱动和SHT30传感器驱动的 E53_IA1 扩展板驱动文件。
在复制文件的时候,按照上一篇文章中所说的,复制 i2c.h 到Inc 文件夹,复制 i2c.c 到 Src 文件夹,再复制自己编写的驱动文件 E53_IA1.c 、 E53_IA1.h 到 Hardware文件夹。
IoT-Studio中提供的默认工程已经复制好了这些文件,无需再次添加,如图:
添加驱动文件路径
因为 LiteOS 的整个项目工程使用 make 构建,所以复制驱动文件之后,需要添加驱动文件的路径到 makefile 中,加入编译。
project.mk 文件指明了工程中所有文件的路径:
在该文件中: C文件路径 HARDWARE_SRC:对应Hardware文件夹下的Src文件夹 USER_SRC:对应Src文件夹 头文件路径 HARDWARE_INC:对应Hardware文件夹下的Inc文件夹 USER_INC:对应Inc文件夹
如下,E53_IA1 驱动的底层 I2C 接口代码 i2c.c 路径添加到USER_SRC中:
E53_IA1 驱动的底层 I2C 接口代码 i2c.h 路径添加到USER_INC中:
因为SC1和IA1的驱动中都包含BH1750的驱动,所以添加的时候需要注意去掉E53_SC1 的驱动文件 E53_SC1.c 和 E53_SC1.h ,否则会引起冲突。
基于 I2C 驱动的 E53_IA1 驱动文件 E53_IA1.c 添加到HARDWARE_SRC中( 默认未添加,需要手动添加 ):
基于 I2C 驱动的 E53_IA1 驱动文件 E53_IA1 添加到 HARDWARE_INC 中( 默认未添加,需要手动添加 ):
至此,复制文件到LiteOS工程中,并将新复制的文件路径添加到makefile中,加入工程编译,就完成了驱动的移植。
3. E53_IA1裸机驱动的使用
初始化E53_IA1扩展板
在第一篇文章中详细的讲述了在LiteOS中初始化设备的两种方式: 在系统启动调度之前初始化:设备在系统中随时可被任意任务使用 在任务中初始化:设备一般只在该任务中被使用
本文中移植的 E53_IA1 扩展板驱动, 不需要多个任务去操作,只需要传感器数据采集任务操作即可,所以初始化放在数据采集任务中 。
操作E53_IA1扩展板
接下来首先创建一个文件夹( 如果已有,不用再次创建 ),用于存放本系列教程实验的代码:

在该文件夹中创建一个文件:
编写代码: #include #include "lcd.h" #include "E53_IA1.h" /* 存放E53_IA1扩展板传感器数据,可在E53_IA1.h中查看定义 */ E53_IA1_Data_TypeDef E53_IA1_Data; /* 用于数据采集和数据处理任务间同步的信号量 */ osal_semp_t sync_semp; /* 数据采集任务-低优先级 */ static int data_collect_task_entry() { /* 初始化扩展板 */ Init_E53_IA1(); while (1) { /* 读取扩展板板载数据,存到数据结构体E53_IA1_Data中 */ E53_IA1_Read_Data(); /* 数据读取完毕,释放信号量,唤醒数据处理任务 */ osal_semp_post(sync_semp); /* 任务睡眠2s */ osal_task_sleep(2*1000); } } /* 数据处理任务-高优先级 */ static int data_deal_task_entry() { /* lux- 当次数据,old-lux-上次数据 */ int lux = 0, old_lux = 0; int temperature = 0, old_temperature = 0;; int humidity; /* LCD清屏,防止干扰显示 */ LCD_Clear(WHITE); while (1) { /* 等待信号量,未等到说明数据还未采集,阻塞等待 */ osal_semp_pend(sync_semp, cn_osal_timeout_forever); /* 信号量等待,被唤醒,开始处理数据 */ //处理光照强度 old_lux = lux; lux = (int)E53_IA1_Data.Lux; printf("BH1750 Value is %d\r\n", lux); LCD_ShowString(10, 100, 200, 16, 16, "BH1750 Value is:"); LCD_ShowNum(140, 100, lux, 5, 16); /* 光照阈值为1000,自动点亮或者熄灭路灯 */ if(old_lux < 1000 && lux > 1000) { HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_RESET); printf("Light OFF!\r\n"); } else if(old_lux > 1000 && lux < 1000) { HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_SET); printf("Light ON!\r\n"); } //处理湿度数据 humidity = E53_IA1_Data.Humidity; printf("Humidity is %d\r\n", humidity); LCD_ShowString(10, 120, 200, 16, 16, "Humidity: "); LCD_ShowNum(140, 120, humidity, 5, 16); //处理温度数据 old_temperature = temperature; temperature = E53_IA1_Data.Temperature; printf("Temperature is %d\r\n", temperature); LCD_ShowString(10, 140, 200, 16, 16, "Temperature: "); LCD_ShowNum(140, 140, temperature, 5, 16); /* 温度阈值为30,自动开启或者关闭电机 */ if(old_temperature < 30 && temperature >= 30) { HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_SET); printf("Motor ON!\r\n"); } else if(old_temperature >= 30 && temperature < 30) { HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_RESET); printf("Motor OFF!\r\n"); } } } /* 标准demo启动函数,函数名不要修改,否则会影响下一步实验 */ int standard_app_demo_main() { /* 创建信号量 */ osal_semp_create(&sync_semp, 1, 0); /* 数据处理任务的优先级应高于数据采集任务 */ osal_task_create("data_collect",data_collect_task_entry,NULL,0x400,NULL,3); osal_task_create("data_deal",data_deal_task_entry,NULL,0x400,NULL,2); return 0; }
然后按照之前的方法,在 user_demo.mk 中将 e51_ia1_driver_demo.c 文件添加到makefile中,加入编译:
最后在 .sdkconfig 中配置开启宏定义:
编译,烧录,即可看到实验现象。
LCD屏幕上显示当前传感器采集的亮度值,温度值,湿度值,并且每2s更新一次。
当亮度值低于1000时,E53_IA1扩展板的补光灯自动点亮:
当亮度值高于1000时,E53_IA1扩展板的补光灯自动熄灭:
在调节温度的时候,可以用手按着SHT30温湿度传感器,天干物燥,务必提前触摸一下金属物体,释放静电,防止静电破坏传感器!
当温度上升到30°的时候,电机自动启动,当温度降低到30°以下时,电机自动关闭。
另外,打开IoT-Studio自带的串口终端,可以查看到串口输出的工作信息: linkmain:V1.2.1 AT 10:40:09 ON Dec 5 2019 BH1750 Value is 237 Humidity is 19 Temperature is 28 WELCOME TO IOT_LINK SHELL LiteOS:/>BH1750 Value is 1074 Light OFF! Humidity is 19 Temperature is 29 BH1750 Value is 14086 Humidity is 20 Temperature is 30 Motor ON! BH1750 Value is 284 Light ON! Humidity is 21 Temperature is 30 BH1750 Value is 303 Humidity is 21 Temperature is 29 Motor OFF! ……
硬件开发
2020-02-12 19:56:00
/////////////binary.c ///////////// #include int main(int argc, const char *argv[]) { int count=0; int i; int a; scanf("%d",&a); for(i=0;i<32;i++) { if(a&1) count++; a>>=1;//a=a>>1 } printf("count is %d\n",count); return 0; }
硬件开发
2020-02-11 19:50:00
长期以来,全球 IPv4 地址耗尽令人担忧,今天这一时刻终于来临——所有 43 亿个 IPv4 地址已分配完毕,这意味着没有更多的 IPv4 地址可以分配给 ISP 和其他大型网络基础设施提供商。
该过程自 80 年代以来就已预见到,顶级地址实际上已经在 2012 年耗尽。那时,所有 IPv4 地址空间已分配给五大区域互联网注册机构,非洲网络信息中心 (AFRINIC)针对非洲,北美网络信息中心(ARIN)针对南极洲、加拿大、部分加勒比海地区和美国,亚太互联网络信息中心(APNIC)针对东亚、大洋洲、南亚和东南亚,拉丁美洲网络信息中心(LACNIC)针对加勒比海的大部分地区和整个拉丁美洲,以及欧洲网络信息中心(RIPE NCC)针对欧洲、中亚、俄罗斯和西亚。
那些区域性 Internet 注册很快就开始耗尽。2011 年 4 月 15 日,亚太(APNIC)在 2012 年 9 月 14 日为欧洲,中东和中亚(RIPE NCC)分配了最后一个 IPv4 区块,在 2014 年 6 月 10 日为拉丁美洲和加勒比海(LACNIC)分配了最后一个 IPv4 区块。2015 年 9 月 24 日为北美,直到今天,欧洲 RIPE(世界互联网组织) NCC 终于耗尽了存储。
该消息是在一封电子邮件(由 Nikolas Pediaditis 发布)中宣布的,内容为:
亲爱的同事们,
今天,在 2019 年 11 月 25 日 UTC + 1 15:35,我们从可用池中的最后剩余地址进行了最终的/22 IPv4 分配。现在,我们已经用完了 IPv4 地址。
对于网络运营商来说,我们的宣布并不令人惊讶– RIPE 社区早就预料到并计划 IPv4 耗尽。实际上,正是由于社区对这些资源的负责任管理,我们才能够在 2012 年达到最后一个/8 后,向我们服务区域内的数千个新网络提供/22 分配。
从理论上讲,IPv4 地址耗尽应该意味着不能将任何新的 IPv4 设备添加到 Internet,但是实际上,许多因素会进行缓解。
首先是 ISP 可以重用和回收未使用的 IPv4 地址。第二个原因是由于 NAT(网络地址转换),因此可以在 ISP 路由器后面私下使用相同的 IP 地址。当然,最后是向 IPv6 的过渡,现在应该建立良好的秩序,从而可以通过具有 3.4×10^38 巨大地址空间的 Internet 直接进行对等连接。
硬件开发
2020-02-09 12:01:00
在介绍和使用前,读者可以访问我们 项目地址 或 官方网站 ,了解并获取到最新的版本信息,MQTT X 正在快速开发迭代阶段,使用最新版本有助于提高使用体验。
下载
请从 GitHub Releases 下载符合您的版本并安装使用。
如果出现网络原因,导致从 GitHub 下载中出现网速较慢或卡顿的情况时,也可以 前往 EMQ 官网 ,选择符合您的版本并安装使用。
MQTT Broker 准备 如果您没有本地部署的 MQTT Broker,那么可以使用由 EMQ X Cloud 提供的公共 MQTT 服务进行快速测试: Broker 地址: broker.emqx.io Broker TCP 端口: 1883 Broker SSL 端口: 8883 如果您打算本地部署 MQTT Broker,推荐您 下载 EMQ X 进行安装使用。EMQ X 是一款完全开源,高可用低时延的百万级分布式物联网 MQTT 5.0 消息服务器。
使用 Docker 快速安装 EMQ X: docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx
连接配置
在准备好 MQTT Broker 后,进入到主程序页面,可点击左侧菜单栏中的 + 号,如果页面没有数据,还可以直接点击右侧的 新建连接 按钮,快速配置一个新的客户端连接。
进入到创建页面后,需配置或填写连接客户端的相关信息,读者可以在此处配置定义 Broker 连接的所有设置,例如: Broker Host , Broker Port , Client ID , Username , Password , Clean Session 等基础配置信息。
Broker 信息
配置 Broker 信息时, Client ID 、 Host 和 Port 已经默认填写,您也可根据实际的 Broker 信息自行修改。点击 Client ID 右侧的刷新按钮,可快速生成新的 Client ID 。 用户认证信息
如果您的 Broker 开启了用户认证,配置项中可填写 Username 和 Password 信息。 SSL/TLS
当需要开启 SSL/TLS 认证时,只需要将配置中的 SSL/TLS 配置项设置为 true ,并提供了 CA signed self 和 Self signed 两种方式。
如果选择了 Self signed ,可进行证书配置,点击最右侧的文件夹按钮,选择您已经生成好的各项证书,单向连接只需要选择您的 CA File 即可,对于双向认证,还需要选择配置 Client Certificate File 和 Client key file 。
高级配置
高级配置中,可以配置 Connect Timeout 、 KeepAlive 、 Clean Session 、 Auto Reconnect 、 MQTT Version 等信息。 MQTT v5.0
在高级配置中,可以选择 MQTT 的协议版本,支持 MQTT v3.1.1 和 MQTT v5.0 版本,默认为 v3.1.1,如果选择了 v5.0 版本后,还可配置 Session Expiry Interval 、 Receive Maximum (可选)。 遗嘱消息
在高级配置下方的配置卡片中,可以配置遗嘱消息, Last-Will-QoS 和 Last-Will-Retain 的值默认填充为 0 和 False ,输入 Last-Will-Topic 和 Last-Will-Payload 的值便可完成对遗嘱消息的配置。
发布
连接创建成功后,即可进入到连接的主界面,点击顶部连接名称旁的折叠按钮,可以展开并显示该配置的几个基础信息,快速修改该连接的常用配置,修改时需断开连接,重新点击连接后即可生效。在断开连接的状态下,也可点击右边配置按钮,进行更多的连接配置修改。
连接建立后,可以在连接主页面的下方的输入框内,简单输入 Topic 和 Payload 后,点击右下角按钮,发送测试消息了。macOS 用户可以使用 command + enter 快捷键,其它用户可以使用 control + enter 快捷键来快速发送消息。
订阅
点击左下角的 New Subscription 按钮,可以快速订阅一个 Topic,Topic 订阅成功后将立即开始接受消息。
每个 Topic 都会随机分配一个色彩标记,你也可以打开颜色选择器自定义标记的颜色。点击页面订阅列表顶部的最右侧的按钮,可以隐藏订阅列表以显示更多的空间。
鼠标悬浮到 Topic 列表的卡片上时,点击右上角红色按钮,可以快速取消订阅。
我们再新建一个测试连接用于消息发布测试。在页面右下角填入刚才所订阅的 Topic 信息,输入 Payload 的内容后,点击最右侧的发送按钮,就向订阅了该 Topic 的连接客户端发送了一条消息。

如果发送消息的连接客户端也订阅了相同的 topic ,发送成功后该客户端也将即时接收到刚才所发送的消息。注意,在消息框内,右边栏为发送的消息。左边栏为接收到的消息。
其它 设置
点击左侧菜单栏底部的设置按钮,或使用快捷键,macOS 用户可以使用 command + , 快捷键,其它用户可以使用 control + , 快捷键来跳转到设置页面。目前支持设置语言,是否自动检查更新和选择主题。 消息页面的下拉菜单
在消息栏右上角的 All , Received , Published 按钮可以过滤出 全部消息,已接收的消息,和已发布的消息。
点击顶部的操作栏按钮,选择 Search by Topic 项,或使用快捷键,macOS 用户可以使用 command + f 快捷键,其它用户可以使用 control + f 快捷键,打开按 Topic 搜索过滤消息的的功能。
选择 Clear Histroy 项,可以快速清空当前连接中所有发送和接收的消息。
选择 Disconnect 和 Delete Connection 项,可以快速断开连接,删除当前连接。 检查更新
点击左侧底部的 i 按钮,可进入到 About 页面,了解 MQTT X 的版本信息和 EMQ X 的相关信息。点击 Check for Updates 可以检查是否有更新版本。
以上为 MQTT X 使用方法的简单概述。读者可以通过在 GitHub 上的 使用手册 来完整的使用 MQTT X。
本项目基于 Apache 2.0 开源协议,使用过程中,有任何问题都可以到 GitHub issues 来发表问题,讨论观点或是向我们提交 PR,我们会认真查阅并回复所有问题。 版权声明: 本文为 EMQ 原创,转载请注明出处。
原文链接: https://www.emqx.io/cn/blog/mqtt-x-guideline
硬件开发
2020-02-07 15:34:00
MQTT X 是由全球领先的开源物联网中间件提供商 EMQ 开源的一款跨平台 MQTT 5.0 桌面客户端,它支持 macOS,Linux,Windows。 MQTT X 的用户界面借助聊天软件的形式简化了页面的操作逻辑,用户可以快速创建连接保存并同时建立多个连接客户端,方便用户快速测试 MQTT/TCP、MQTT/TLS 的连接、发布/订阅功能及其他特性。
项目地址: GitHub
官方网站: MQTT X Website
MQTT X 适用于正在搭建自己的 MQTT 的消息服务器的用户来测试连接,订阅和发布消息等,在使用客户端时,用户既可以是发布者,也 可以是订阅者。也适用于正在开发或研究 MQTT Broker 的相关用户。在 MQTT 的研究与应用中,无论你身处什么阶段 都可以通过 MQTT X 快速、深入地理解 MQTT 协议相关特性。
该项目完全开源,项目采用了 Vue.js + TypeScript + Electron 的技术栈进行开发,你可以在 GitHub 上查看和浏览项目源码。欢迎前来一起讨论和学习 Electron 项目开发技术。
以下为 MQTT X 的特性和界面的预览: 跨平台,支持 Windows,macOS,Linux 完整支持 MQTT v3.1.1 以及 MQTT v5.0 协议 支持 CA、自签名证书,以及单、双向 SSL/TLS 认证 多界面主题,支持 Light、Dark、Night 三种主题模式切换 订阅 Topic 时可自定义颜色标记 支持简体中文以及英文 支持 MQTT/TCP 连接和 MQTT/WebSocket 连接 支持 $SYS 主题自动订阅,并可按层级展开 支持多种 Payload 格式 Hex, Base64, JSON, Plaintext 简洁的图形化界面
在 MQTT X 的主窗口中,最左侧为菜单栏,从上往下分别对应为:连接页面,关于页面和设置页面;中间一栏为现有连接列表,每次创建连接后,新的连接就会在列表中出现,点击列表中的名称( name@host:port 组成)可快速切换连接;最右侧为连接的主视图界面,可在该页面中进行消息的测试收发等。当连接建立成功后,顶部配置栏会自动折叠,以展示更多的页面空间。 MQTT X 是新推出的产品,采用了 Electron 跨平台技术,界面美观且资源占用较低,MQTT X 在交互上一改常见的单一客户端模式,允许保存多个连接信息; 使用简单,能够快速创建连接,且提供了较为全面的 MQTT 参数配置,以便用户应对任何使用场景、使用方式的模拟测试,包括对于 MQTT v5.0 的支持; 以消息聊天的交互形式收发消息,交互流程简单易懂,允许同时建立多个客户端连接并自由切换互相通信,有较好的交互性,大大提高了交互调试的效率; 完全开源,支持多平台。
截止目前 MQTT X 发布了 v1.2.3 版本,后续更多功能仍在开发中。 版权声明: 本文为 EMQ 原创,转载请注明出处。
原文链接: https://www.emqx.io/cn/blog/mqtt-x-elegant-cross-platform-mqtt5.0-desktop-client
硬件开发
2020-02-07 12:12:00

平台:迅为iMX6开发板
模块:继电器
系统:Android系统

在安卓系统环境下 迅为 iMX6 继电器实验调试步骤。
继电器(Relay),也称电驿,是一种电子控制器件,通常应用于自动控制电路中,实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、 转换电路等作用。

1 硬件连接
本文档测试使用一块开发板,一个继电器模块。使用排线连接开发板和继电器模块。继电 器模块的 U2 端口,连接开发板上的“GPIO”端口。连接后如下图所示。


硬件连接完成之后,就可以进行软件测试了。
2 软件测试
开发板运行 Android 系统之后,将开发版用 OTG 连接到电脑,。在电脑上安装好“360 手机助手”。双击源码的“bin”目录下的“relaytest.apk”,在弹出的对话框中选择“开始发送”。
打开 APP。若弹出个“超级用户请求”对话框,选择“永久记住选择”,点击“允许”, 如下图所示。

程序运行界面如下图所示。

点击“RELAY ON ”按钮打开继电器,可以听到清脆的响声,则表明已经打开。点击 “RELAY OFF”按钮关闭继电器。
继电器开启和关闭的时候,端子输出如下:
当继电器打开,则网络 XispSPIMISO 输出高电平。继电器管脚 2 和 5 导通,端子的管脚 pin-A 输出 5v 电压。
当继电器关闭,则网络 XispSPIMISO 输出低电平。继电器管脚 3 和 5 导通,端子的管脚pin-B 输出 5v 电压。
如果用户想输出其他电压(非 5v),可以去掉 R3 电阻,将要控制的电压,从“COM” 管脚输入即可。
硬件开发
2020-02-06 10:59:00
概念
CAN物理层
异步通讯,具有 CAN_High 和 CAN_Low 两条信号线。
闭环总线网络
CAN 通讯网络是一种遵循 ISO11898 标准的高速、短距离“闭环网络”; 总线最大长度为 40m; 通信速度最高为 1Mbps; 总线的两端各要求有一个“120 欧”的电阻。
开环总线网络
遵循 ISO11519-2 标准的低速、远距离“开环网络”; 最大传输距离为 1km; 最高通讯速率为 125kbps; 两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2 千欧”的电阻。
通讯节点
从 CAN 通讯网络图可了解到,CAN 总线上可以挂载多个通讯节点,节点之间的信号经过总线传输,实现节点间通讯。
CAN通讯不对地址进行编码,只对数据进行编码,理论上可以负载无限设备,只要负载足够;
可以通过中继器增强负载。
CAN 通讯节点由一个 CAN 控制器及 CAN 收发器组成,
控制器与收发器之间通过CAN_Tx 及 CAN_Rx 信号线相连,收发器与 CAN 总线之间使用 CAN_High 及 CAN_Low信号线相连。 CAN_Tx 及 CAN_Rx 使用普通的类似 TTL 逻辑信号 CAN_High 及CAN_Low 是一对差分信号线,比较特别的差分信号
差分信号
这两个信号线: 振幅相等 相位相反 通过两根信号线的电压差值来表示逻辑 0 和逻辑 1。
特性 抗干扰能力强,当外界存在噪声干扰时,几乎会同时耦合到两条信号线上,而接收端只关心两个信号的差值,所以外界的共模噪声可以被完全抵消。 能有效抑制它对外部的电磁干扰,同样的道理,由于两根信号的极性相反,他们对外辐射的电磁场可以相互抵消,耦合的越紧密,泄放到外界的电磁能量越少。 时序定位精确,由于差分信号的开关变化是位于两个信号的交点,而不像普通单端信号依靠高低两个阈值电压判断,因而受工艺,温度的影响小,能降低时序上的误差,同时也更适合于低幅度信号的电路。
CAN 协议中的差分信号
硬件开发
2020-02-03 17:43:00
客户端属性
共享属性
服务端属性
下面通过一个示例应用演示这个几个属性的用法
硬件开发
2020-01-25 20:37:00
在thingsboard demo网站上注册一个用户 https://demo.thingsboard.io/signup
注册完之后 ,激活注册邮箱,登录thingsboard demo网站
进入“Device”菜单 ,选中一个设备 复制设备 access token
npm install mqtt -g mkdir mqtt cd mqtt wget https://gist.githubusercontent.com/ashvayka/13ee855a1a551f4f6c24adafc834cfaa/raw/19592eb850c9c09a8b5ef9579364940dee2e64f9/demo-tool.js code .
修改 demo-tool.js 将access token改为之前复制的 access token
执行命令 node tool-demo
可以看到通过mqtt服务向服务端发送每秒发送模拟数据

然后我们可以观察到 这个设备的遥测数据每隔1秒会变动一次

选中客户端属性 ,将这些属性显示到部件上

点击 添加到仪表盘,选择创建一个新的仪表盘 输入一个仪表盘名称
进入Dashbaord 选择刚才创建的仪表盘,添加更多的部件,我们添加两个Digital gauges类型的部件和两个Charts类型部件 选好数据源,可以拖拽部件控制它的大小和位置。最终效果如下。 可以点击仪表盘卡片上的发布按钮,将该仪表盘公开,前提是这个仪表盘上的设备也必须公开。
这就是我做的仪表盘的公开地址 https://demo.thingsboard.io/dashboard/7d5580e2-3f5f-11ea-9899-833b99914e57?publicId=e760d720-ce5b-11e9-9f59-e138d3e3f517
硬件开发
2020-01-25 17:34:00
据报道三星已经成功研发出有望替代嵌入式闪存存储器(eFlash)的嵌入式磁阻随机访问内存(eMRAM),容量为1Gb,测试芯片的优良率已达90%。

随着5G物联网时代的来临,存储器领域发展快速,而在这一领域,韩系厂商拥有着比较明显的优势。

MRAM 芯片是一种以电阻为存储方式结合非易失性及随机访问两种特性,可以兼做内存以及硬盘的新型存储器介质。写入速度可达到NAND闪存的数千倍,此外其制作工艺要求低,产品良品率高,可以很好的控制成本。在寿命方面由于MRAM特殊的存储方式,产品的寿命耐久性也远远超传统RAM。


报道称三星也正在改善1Gb MRAM寿命问题,除了支持长达10年的存储年限之外,在105℃的温度也可完成1亿次读写,在85℃下则可增加至100亿次读写,在正常工作环境中,则有望达到1兆次读写。目前以MRAM为代表的新型存储已经发展到了关键阶段,是否能成为取代NAND闪存的下一代存储器介质除了材料和工艺的不断的完善之外,构建完善器件的技术生态系统同样是十分关键的。相信在市场需求的引导以及各大厂商的推动下,存储产品一定朝着性能更高以及容量更大以及成本更优的方向发展。

致力于生产MRAM存储器的 EVERSPIN 在磁存储器设计,制造和交付到相关应用中的知识和经验在半导体行业中是独一无二的。Everspin拥有超过600项有效专利和申请的知识产权产品组合,在平面内和垂直磁隧道结(MTJ)STT-MRAM位单元的开发方面处于市场领先地位。 Everspin在数据中心在汽车和运输市场中部署了超过1.2亿个MRAM和STT-MRAM的产品,为全球MRAM用户奠定了最强大,增长最快的基础。
硬件开发
2020-01-21 15:43:00
1. LCD裸机驱动
小熊派开发板使用的LCD屏幕为1.3寸的TFT彩屏,色彩深度16bit,分辨率240*240,使用 SPI 接口与 MCU 之间通信。
2. 移植LCD裸机驱动到LiteOS
复制裸机驱动文件到LiteOS工程
LCD的底层是使用SPI驱动的,那么除了 STM32CubeMX 生成的 spi.h 和 spi.c 文件,还需要自己在此基础上手写LCD屏幕的驱动文件。
在复制文件的时候,按照上一篇文章中所说的,复制 spi.h 到Inc 文件夹,复制 spi.c 到 Src 文件夹,再复制自己编写的驱动文件 lcd.c 、 lcd.h 以及字库文件 font.h 到 Hardware文件夹。
IoT-Studio中提供的默认工程已经复制好了这些文件,无需再次添加,如图:
添加驱动文件路径
因为 LiteOS 的整个项目工程使用 make 构建,所以复制驱动文件之后,需要添加驱动文件的路径到 makefile 中,加入编译。
project.mk 文件指明了工程中所有文件的路径:
在该文件中: C文件路径 HARDWARE_SRC:对应Hardware文件夹下的Src文件夹 USER_SRC:对应Src文件夹 头文件路径 HARDWARE_INC:对应Hardware文件夹下的Inc文件夹 USER_INC:对应Inc文件夹
如下,LCD驱动的底层SPI接口代码 spi.c 路径添加到USER_SRC中:
LCD驱动的底层SPI接口代码 spi.h 路径添加到USER_INC中:
基于SPI驱动的LCD屏幕驱动文件 lcd.c 添加到HARDWARE_SRC中:
基于SPI驱动的LCD屏幕驱动头文件 lcd.h 和字库文件 font.h 添加到 HARDWARE_INC 中:
至此,复制文件到LiteOS工程中,并将新复制的文件路径添加到makefile中,加入工程编译,就完成了驱动的移植。
3. LCD裸机驱动的使用
初始化LCD
在上一篇文章中详细的讲述了在LiteOS中初始化设备的两种方式: 在系统启动调度之前初始化:设备在系统中随时可被任意任务使用 在任务中初始化:设备一般只在该任务中被使用
本文中移植的LCD设备,并不需要专门的任务去操作LCD,所以应该在系统启动之前就进行初始化,然后每个任务都可以操作LCD设备进行显示。
在 main.c 中的 HardWare_Init()函数中添加 LCD 初始化代码:
这里为了不影响后面的实验,将工程中默认的字符显示代码注释掉:
操作LCD
接下来首先创建一个文件夹( 如果已有,不用再次创建 ),用于存放本系列教程实验的代码:

在该文件夹中创建一个文件:
编写代码: #include #include static int lcd_demo_entry() { //测试显示字符 POINT_COLOR = BLUE; LCD_ShowString(0, 0, 240, 32, 32, "Welcome To IoT"); POINT_COLOR = RED; LCD_ShowString(0, 32, 240, 24, 24, "I am BearPi"); POINT_COLOR = BLACK; LCD_ShowString(0, 56, 240, 16, 16, "LCD Test ......"); POINT_COLOR = GREEN; LCD_ShowString(0, 72, 240, 12, 12, "Powerd by Huawei LiteOS!"); //测试绘制矩形 POINT_COLOR = BLUE; LCD_DrawRectangle(20, 100, 120, 200); //测试绘制圆 POINT_COLOR = RED; LCD_Draw_Circle(180, 150, 50); return 0; } int standard_app_demo_main() { osal_task_create("lcd_demo",lcd_demo_entry,NULL,0x400,NULL,2); return 0; }
然后按照之前的方法,在 user_demo.mk 中将 lcd_driver_demo.c 文件添加到makefile中,加入编译:
最后在 .sdkconfig 中配置开启宏定义:
编译,烧录,即可看到LCD屏幕的显示:
关注“小熊派开源社区”微信公众号,回复“LiteOS内核实战”获取实战源代码。
小熊派开源社区,专注于IoT、AI、5G等前沿技术分享,关注“小熊派开源社区”微信公众号,获取更多资料教程。
硬件开发
2020-01-19 16:02:00

磁性随机存储器(MRAM)和集成磁(Integrated Magnetic)产品的领导厂商 everspin 科技公司16Mb MRAM,进一步强化了该公司在MRAM领域的领导地位。现在所有需要无电数据保持以及SRAM性能的应用都可使用具有非挥发性、高性能、以及高可靠性优势的MRAM技术。
MR4A16B是一款3.3V、并行I/O非挥发RAM,其超快的存取周期仅为35ns,并允许无限制的读/写循环。在每次写入后,资料能持续保存超过20年。此外与其它存储器不同,MRAM还可免除因宇宙射线所产生的软错误率(SER,softerrorrate)。这款16Mb MRAM由位宽为16的1048576个字组成。引脚和功能可与异步SRAM兼容。MR4A16B目标应用为工业自动化、机器人、网络和数据储存、多功能打印机、以及其它许多传统受限于需采用SRAM设计的系统。
MR4A16B提供小尺寸48引脚球栅阵列(BGA)封装和54引脚的薄形小尺寸(TSOPII)封装两种形式。这些封装均能与相似的低功率 SRAM 产品和其它非挥发RAM产品兼容。
16Mb MRAM系列包括商业级(0℃至+70℃)和工业级(-40℃至+85℃)两种温度范围。价格咨询请联系Everspin销售部和代理商。
Everspin的 mram芯片 技术是具备高可靠性、快速读/写、即时开启、非挥发性、和无限次擦除等特性。加入新的16Mb MRAM成员后,现在Everspin的产品组合包括提供BGA和TSOP两种可选封装、容量从256Kb到16Mb的8位和16位并行I/O产品,以及采用DFN封装、容量从256Kb到1Mb的串行I/O产品。
硬件开发
2020-01-17 15:30:00
一份新市场报告预计,从2018年到2029年,独立 MRAM 和STT-MRAM的收入将增长170倍,达到近40亿美元的收入。下一代内存技术的增长将主要由取代效率较低的内存技术(例如NOR闪存和SRAM)推动。

MRAM容量出货量预测(2017-2029,Coughlin)分析人士预计,包括DRAM,3DXpoint和NAND在内的许多存储技术将在未来几年内增长,但增长最快的将是MRAM存储器。容量方面的出货量预计将从2019年的约0.1PB增长到2029年的近100PB。

对MRAM存储器的巨大需求将刺激设备支出的稳步增长。预计MRAM设备市场将从2018年的2600万美元增长到2029年的854美元-增长33倍。

作为MRAM领先的制造商Everspin Technologies宣布已收到主要OEM的1Gb STT-MRAM设备的资格通知。该公司现在有资格为第一位客户开始生产新芯片。

EVERSPIN 进一步宣布,自从开始生产MRAM以来,它出货了120多种Toggle MRAM和STT-MRAM设备。

宣布其最新的Flash Core模块将使用Everspin的1Gb STT-MRAM芯片-因此IBM可能是主要的OEM。Everspin由于OEM尚未宣布实际产品,因此无法宣布名称。
硬件开发
2020-01-16 15:15:00
硬件平台:迅为RK3399开发板
软件系统:debian9 系统

RKTool 驱动安装
解 压 光 盘
工 具 \ 烧 写 工 具 \windows
目 录 下 的
DriverAssitant_v4.5.zip 文件,打开“DriverInstall.exe”,点击“驱动安
装”,提示安装驱动成功即可。如下图:
驱动安装成功,如下图:
注意事项:
1.目前支持的操作系统包括:XP,Win7_32,Win7_64,Win8_32,Win8_64。
2.XP 系统在驱动安装完后,若还提示“发现新设备”, 安装驱动时选择“自
动安装”。
3.若之前已经安装过老版本驱动,请先点击“驱动卸载”后再进行“驱动安
装”。
烧录 Linux 固件
解 压 光 盘
02
工 具 \ 烧 写 工 具 \windows
目 录 下 的
LinuxTool_Release_v2.54.7z 文件,如下图:
得 到
AndroidTool_Release_v2.54
文 件 夹 , 双 击 进 入
AndroidTool_Release_v2.54 文件夹,我们看到有两个文件夹,如下图:

首先拷贝我们编译生成的镜像文件,到 rockdev\Image 目录下,如下图:
然 后 返 回 到 AndroidTool_Release_v2.54 文 件 夹 目 录 下 , 进 入 到
AndroidTool_Release 目录下,鼠标双击运行 AndroidTool.exe,如下图:

这时会打开烧写工具的主界面,如下图:

点击“升级固件”,如下图:

点击“固件”选择刚才的 Linux 镜像文件 update.img 。如下图:
然后使用 Type-C 连接 iTop-3399 开发板到 PC 电脑上面,连接电源适配
器到 iTop-3399 开发板,然后首先按下 iTop-3399 开发板的 vol+按键( 按下
不要松开 ),然后按下 iTop-3399 开发版的电源按键,启动开发板,这时烧
写工具会提示发现新设备( 此时可以松开 vol+按键了 ),如下图( 如果您的
烧写工具没有发现新的设备,可以关闭烧写工具,在重新打开一遍烧写工具,
然后重复一下上面的上电步骤 ):
如果之前烧写 Android 镜像,需要先点击“擦除 flash ”,如下图:

然后点击“升级”,开始下载固件。如下图:
固件烧写完成,烧写工具右边会提示烧写成功, iTop-3399 开发板会自动
启动,如下图:

此时我们的烧写操作就完成了,如果您有购买迅为的屏幕,可以通过使
用屏幕+触摸的方式来体验 Linux 系统,如果没有购买迅为的屏幕,可以通
过 hdmi 接口连接到显示器,通过鼠标来体验 Linux 系统了。


单独烧写镜像
解 压 光 盘
02
工 具 \ 烧 写 工 具 \windows
目 录 下 的
LinuxTool_Release_v2.54.7z 文件,如下图:
得 到
AndroidTool_Release_v2.54
文 件 夹 , 双 击 进 入
AndroidTool_Release_v2.54 文件夹,我们看到有两个文件夹,如下图:


首先拷贝我们编译生成的镜像文件,到 rockdev\Image 目录下,以烧写
内核为例,如下图:

然 后 返 回 到 AndroidTool_Release_v2.54 文 件 夹 目 录 下 , 进 入 到
AndroidTool_Release 目录下,鼠标双击运行 AndroidTool.exe,如下图:

这时会打开烧写工具的主界面,如下图:
根据要单独烧写的镜像修改配置,例如单独烧写 boot.img,如下图:
然后使用 Type-C 连接 iTop-3399 开发板到 PC 电脑上面,连接电源适配
器到 iTop-3399 开发板,然后首先按下 iTop-3399 开发板的 vol+按键( 按下
不要松开 ),然后按下 iTop-3399 开发版的电源按键,启动开发板,这时烧
写工具会提示发现新设备( 此时可以松开 vol+按键了 ),如下图( 如果您的
烧写工具没有发现新的设备,可以关闭烧写工具,在重新打开一遍烧写工具,
然后重复一下上面的上电步骤 ):
然后点击“执行”按钮,开始烧写镜像,烧写过程中,烧写工具右边会
有对应的打印信息,如下图:
烧写完成,烧写工具右边会提示烧写成功,iTop-3399 开发板会自动启
动,此时我们的烧写操作就完成了。
单独烧写 uboot 和 rootfs 和烧写 boot.img 一样,只需要拷贝相应的镜
像,在烧写工具中选择要烧写的配置即可。
硬件开发
2020-01-16 14:22:00
企业为什么需要使用数据加密软件?目前企业面临的来自各方的不同层面的数据泄露危机,导致企业的数据信息安全受到威胁,因此,需要加强对企业内部的数据安全管理。互联网发展的现在,企业在现今的发展中的竞争日益激励,竞争的主要核心是对版权所有以及原创产品之间的竞争。那么企业应该如何保证自身的企业数据文件在在实际的生产、使用、流转中的安全问题?如何有效的防止企业数据文件泄露?
“信息安全”对于企业来说也愈来愈重要,“数据防泄漏系统”在互联网中也扮演者重要的角色,发挥着重要的作用,合理安全的使用企业数据加密软件,能够有效的帮助企业去构建以及保护企业的数据文件的安全,来杜绝企业因为员工离职等等内部因素,以及竞争对手窃取商业机密等等外部因素造成的数据泄露问题的发生,帮助企业构建专业安全有效的防护网络。构建企业数据防泄漏体系!
目前的发展形势,迫使企业必须采取相关的安全措施,来保证自身企业数据文件在内部以及外部环境下的数据文件,这也是企业在现阶段从自身实际出发迫切需要解决的问题,只有构建了专业安全的 数据加密软件 体系,才能帮助企业省去后顾之忧,更好的向前发展和进步!
接下来,风奥科技,作为国内优秀的数据防泄漏厂商,就根据企业现在的需求,具体分析一下,什么样的数据加密软件适合企业,什么样的加密方式能够满足企业在现阶段以及后期不断发展的需求?
1. 数据防泄漏产品如此繁多,如何在众多的产品中选择自身所需要的产品?
“驱动层加密和应用层加密”、“软件加密、硬件加密”、“强制性加密和手动加密”等等相关的问题,都是作为企业的你在选择加密软件的时候需要考察的因素,到底什么样的加密方式适合自身企业呢?
风奥科技就服务2000多家企业的经验而言,目前企业普遍采用的是驱动层透明加密,为什么呢?其产品应用在系统的底层不会影响使用者的日常操作基础上还实现对文件加密,重点是底层的加密技术的安全性具有一定的保障,不容易被破解,安全系数较高!
就使用金甲企业加密软件的相关企业,基本上采用的都是强制性加密,为什么?手动加密,不仅不能够从根源上实现对数据文件的加密管理,同时也增加了企业的办公操作流程,降低工作效率,不利于企业的长远发展!
因此对于企业来说,如果您正在选择加密软件,可以选择强制性透明加密系统的软件在企业使用,这样有利于帮助企业在根源上保证数据文件的使用安全!
2. 什么是全程加密?使用加密软件如何实现全程加密?
所谓全程加密,即是指相关的电子文件在新建产生到后面销毁的全过程都是处于加密的管控过程中.使用全程加密有什么好处?全程加密在节约人力成本的同时方便企业加强对数据文件的管控。
如何实现全程加密?这个就是根据你选择的加密软件而言了,如果您选择的是运行在底层的加密软件,只要该软件提供了相对的加密模式,即可实现全程加密。
风奥金甲企业加密软件Windows底层实现加密,提供强制性加密技术,在数据文件新建产生的时候就对文件进行加密,后期的任何操作都是处于加密的管理中,能够帮助企业轻松实现对数据文件的加密管控,同时能够对加密文件的使用操作进行详细的记录,帮助企业构建完善的加密管理系统,实现全方位加密保护!
综上所述,企业需要根据自身的需求以及了解目前市场上相关的数据文件加密方式,然后再去选择适合自己的加密方案!
合适的加密方案,能够帮助企业在后期的发展中增色不少,同时也能帮助企业更好的进行数据文件的加密管控,风奥科技基于Windows底层无感知透明加密技术,无需用户手动去操作,数据在产生的时候就能够自动的实现加密。同时金甲加密软件为企业提供“强制性加密、能打开不加密、仅控制密文”三种加密模式,企事业单位以及个人用户都可以根据自身的需求选择适合的加密模式来进行加密,安装金甲企业加密软件后,对内部流通、外发、出差等情况下的数据文件管控方案,经过金甲加密软件加密后的文件在指定的环境内正常打开使用,未获得允许脱离环境,加密文件呈现乱码或者无法打开!有效的保证数据文件多层面的使用安全!
硬件开发
2020-01-16 13:56:00
本文以在 CentOS 7.2 中的实际例子来说明如何通过 MySQL 来存储相关的 MQTT 数据。
MySQL 属于传统的关系型数据库产品,其开放式的架构使得用户的选择性很强,而且随着技术的逐渐成熟,MySQL 支持的功能也越来越多,性能也在不断地提高,对平台的支持也在增多,此外,社区的开发与维护人数也很多。当下,MySQL 因为其功能稳定、性能卓越,且在遵守 GPL 协议的前提下,可以免费使用与修改,因此深受用户喜爱。
安装与验证 MySQL 服务器
读者可以参考 MySQL 官方文档 或使用 Docker 来下载安装 MySQL 服务器,本文章使用 MySQL 5.6 版本。
为方便管理操作,可下载使用官方免费图形化管理软件 MySQL Workbeanch 。 如果读者使用的是 MySQL 8.0 及以上版本,MySQL 需按照 EMQ X 无法连接 MySQL 8.0 教程特殊配置。
准备
初始化数据表
插件运行依赖以下几张数据表,数据表需要用户自行创建,表结构不可改动。
mqtt_client 存储设备在线状态 DROP TABLE IF EXISTS `mqtt_client`; CREATE TABLE `mqtt_client` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `clientid` varchar(64) DEFAULT NULL, `state` varchar(3) DEFAULT NULL, -- 在线状态 0 离线 1 在线 `node` varchar(100) DEFAULT NULL, -- 所属节点 `online_at` datetime DEFAULT NULL, -- 上线时间 `offline_at` datetime DEFAULT NULL, -- 下线时间 `created` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `mqtt_client_idx` (`clientid`), UNIQUE KEY `mqtt_client_key` (`clientid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mqtt_sub 存储设备的主题订阅关系 DROP TABLE IF EXISTS `mqtt_sub`; CREATE TABLE `mqtt_sub` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `clientid` varchar(64) DEFAULT NULL, `topic` varchar(255) DEFAULT NULL, `qos` int(3) DEFAULT NULL, `created` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `mqtt_sub_idx` (`clientid`,`topic`(255),`qos`), UNIQUE KEY `mqtt_sub_key` (`clientid`,`topic`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mqtt_msg 存储 MQTT 消息 DROP TABLE IF EXISTS `mqtt_msg`; CREATE TABLE `mqtt_msg` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `msgid` varchar(100) DEFAULT NULL, `topic` varchar(1024) NOT NULL, `sender` varchar(1024) DEFAULT NULL, `node` varchar(60) DEFAULT NULL, `qos` int(11) NOT NULL DEFAULT '0', `retain` tinyint(2) DEFAULT NULL, `payload` blob, `arrived` datetime NOT NULL, -- 是否抵达(QoS > 0) PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mqtt_retain 存储 Retain 消息 DROP TABLE IF EXISTS `mqtt_retain`; CREATE TABLE `mqtt_retain` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `topic` varchar(200) DEFAULT NULL, `msgid` varchar(60) DEFAULT NULL, `sender` varchar(100) DEFAULT NULL, `node` varchar(100) DEFAULT NULL, `qos` int(2) DEFAULT NULL, `payload` blob, `arrived` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `mqtt_retain_key` (`topic`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mqtt_acked 存储客户端消息确认 DROP TABLE IF EXISTS `mqtt_acked`; CREATE TABLE `mqtt_acked` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `clientid` varchar(200) DEFAULT NULL, `topic` varchar(200) DEFAULT NULL, `mid` int(200) DEFAULT NULL, `created` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `mqtt_acked_key` (`clientid`,`topic`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
配置 EMQ X 服务器
通过 RPM 方式安装的 EMQ X,MySQL 相关的配置文件位于 /etc/emqx/plugins/emqx_backend_mysql.conf ,本文仅测试 MySQL 持久化的功能,大部分配置不需要做更改。填入用户名、密码、数据库即可: auth.mysql.server = 127.0.0.1:3306 auth.mysql.username = root auth.mysql.password = 123456 auth.mysql.database = mqtt
保持剩下部分的配置文件不变,然后需要启动该插件。启动插件的方式有 命令行 、 控制台 和 REST API 三种方式,读者可以任选其一。
通过命令行启动 emqx_ctl plugins load emqx_backend_mysql
通过管理控制台启动
EMQ X 管理控制台 插件 页面中,找到 emqx_backend_mysql 插件,点击 启动 。
通过 REST API 启动
使用 PUT /api/v4/nodes/:node/plugins/:plugin_name/load API 可以启动插件。
客户端在线状态存储
客户端上下线时,插件将更新在线状态、上下线时间、节点客户端列表至 MySQL 数据库。
配置项
打开配置文件,配置 Backend 规则: ## hook: client.connected、client.disconnected ## action/function: on_client_connected、on_client_disconnected ## 客户端上下线 backend.mysql.hook.client.connected.1 = {"action": {"function": "on_client_connected"}, "pool": "pool1"} backend.mysql.hook.client.disconnected.1 = {"action": {"function": "on_client_disconnected"}, "pool": "pool1"}
使用示例
浏览器打开 http://127.0.0.1:18083 EMQ X 管理控制台,在 工具 -> Websocket 中新建一个客户端连接,指定 clientid 为 sub_client,点击连接,连接成功后手动断开:
在 MySQL Workbeanch 中点击 mqtt_client 表查看,此时将写入 / 更新一条客户端上下线记录:
客户端代理订阅
客户端上线时,存储模块直接从数据库读取预设待订阅列表,代理加载订阅主题。在客户端需要通过预定主题通信(接收消息)场景下,应用能从数据层面设定 / 改变代理订阅列表。
配置项
打开配置文件,配置 Backend 规则: ## hook: client.connected ## action/function: on_subscribe_lookup backend.mysql.hook.client.connected.2 = {"action": {"function": "on_subscribe_lookup"}, "pool": "pool1"}
使用示例
当 sub_client 设备上线时,需要为其订阅 sub_client/upstream 与 sub_client/downlink 两个 QoS 1 的主题: 在 mqtt_sub 表中初始化插入代理订阅主题信息: insert into mqtt_sub(clientid, topic, qos) values("sub_client", "sub_client/upstream", 1); insert into mqtt_sub(clientid, topic, qos) values("sub_client", "sub_client/downlink", 1); EMQ X 管理控制台 WebSocket 页面,以 clientid sub_client 新建一个客户端连接,切换至 订阅 页面,可见当前客户端自动订阅了 sub_client/upstream 与 sub_client/downlink 两个 QoS 1 的主题:
切换回管理控制台 WebSocket 页面,向 sub_client/downlink 主题发布消息,可在消息订阅列表收到发布的消息。
持久化发布消息
配置项
打开配置文件,配置 Backend 规则,支持使用 topic 参数进行消息过滤,此处使用 # 通配符存储任意主题消息: ## hook: message.publish ## action/function: on_message_publish backend.mysql.hook.message.publish.1 = {"topic": "#", "action": {"function": "on_message_publish"}, "pool": "pool1"}
使用示例
在 EMQ X 管理控制台 WebSocket 页面中,向主题 upstream_topic 发布多条消息,EMQ X 将消息列表持久化至 mqtt_msg 表中:
暂只支持 QoS 1 2 的消息持久化。
Retain 消息持久化
配置项
打开配置文件,配置 Backend 规则: ## 同时开启以下规则,启用 retain 持久化三个生命周期 ## 发布非空 retain 消息时 (存储) backend.mysql.hook.message.publish.2 = {"topic": "#", "action": {"function": "on_message_retain"}, "pool": "pool1"} ## 设备订阅主题时查询 retain 消息 backend.mysql.hook.session.subscribed.2 = {"topic": "#", "action": {"function": "on_retain_lookup"}, "pool": "pool1"} ## 发布空 retain 消息时 (清除) backend.mysql.hook.message.publish.3 = {"topic": "#", "action": {"function": "on_retain_delete"}, "pool": "pool1"}
使用示例
在 EMQ X 管理控制台 WebSocket 页面中建立连接后,发布消息勾选 保留 :
发布(消息不为空)
非空的 retain 消息发布时,EMQ X 将以 topic 为唯一键,持久化该条消息至 mqtt_retain 表中,相同主题下发不同的 retain 消息,只有最后一条消息会被持久化:
订阅
客户端订阅 retain 主题后,EMQ X 将查询 mqtt_retain 数据表,执行投递 retain 消息操作。
发布(消息为空)
MQTT 协议中,发布空的 retain 消息将清空 retain 记录,此时 retain 记录将从 mqtt_retain 表中删除。
消息确认持久化
开启消息确认 (ACK) 持久化后,客户端订阅 QoS 1、QoS 2 级别的主题时,EMQ X 将在数据库以 clientid + topic 为唯一键初始化 ACK 记录。
配置项
打开配置文件,配置 Backend 规则,可使用 topic 通配符 过滤要应用的消息: ## 订阅时初始化 ACK 记录 backend.mysql.hook.session.subscribed.1 = {"topic": "#", "action": {"function": "on_message_fetch"}, "pool": "pool1"} ## 消息抵达时更新抵达状态 backend.mysql.hook.message.acked.1 = {"topic": "#", "action": {"function": "on_message_acked"}, "pool": "pool1"} ## 取消订阅时删除记录行 backend.mysql.hook.session.unsubscribed.1= {"topic": "#", "action": {"sql": ["delete from mqtt_acked where clientid = ${clientid} and topic = ${topic}"]}, "pool": "pool1"}
使用示例
在 EMQ X 管理控制台 WebSocket 页面中建立连接后,订阅 QoS > 0 的主题:
此时 mqtt_acked 表将插入初始化数据行,每向主题发布一条 QoS > 0 的消息,消息抵达后数据行 mid 将自增 1:
代理订阅中满足 QoS > 0 的 topic 也会初始化记录,客户端取消订阅后相关记录将被删除。
自定义 SQL
除去插件内置函数、表结构外,emqx_backend_mysql 还支持自定义 SQL 语句,通过使用如 ${clientid} 模板语法动态构造 SQL 语句实现如客户端连接历史、更新自定义数据表等操作。
SQL语句参数说明
hook 可用参数 示例(sql语句中${name} 表示可获取的参数) client.connected clientid insert into conn(clientid) values(${clientid})
client.disconnected clientid insert into disconn(clientid) values(${clientid})
session.subscribed clientid, topic, qos insert into sub(topic, qos) values(${topic}, ${qos})
session.unsubscribed clientid, topic delete from sub where topic = ${topic}
message.publish msgid, topic, payload, qos, clientid insert into msg(msgid, topic) values(${msgid}, ${topic})
message.acked
message.delivered
msgid, topic, clientid
msgid, topic, clientid
insert into ack(msgid, topic) values(${msgid}, ${topic})
insert into delivered(msgid, topic) values(${msgid}, ${topic})
客户端连接 log 示例
设计表结构如下: CREATE TABLE `mqtt`.`connect_logs` ( `id` INT NOT NULL AUTO_INCREMENT, `clientid` VARCHAR(255) NULL, `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, -- 记录时间 `state` INT NOT NULL DEFAULT 0, -- 记录类型: 0 下线 1 上线 PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
自定义 SQL: ## connected hook 中配置自定义 SQL ## 可以配置多条 SQL 语句 "SQL": ["sql_a", "sql_b", "sql_c"] ## 连接时 backend.mysql.hook.client.connected.3 = {"action": {"sql": ["insert into connect_logs(clientid, state) values(${clientid}, 1)"]}, "pool": "pool1"} ## 断开时 backend.mysql.hook.client.disconnected.3 = {"action": {"sql": ["insert into connect_logs(clientid, state) values(${clientid}, 0)"]}, "pool": "pool1"}
客户端上下线时将填充并执行预定的 SQL 语句,将连接记录写入 connect_logs 表。
高级选项 backend.mysql.time_range = 5s backend.mysql.max_returned_count = 500
总结
读者在理解了 MySQL 中所存储的数据结构、自定义 SQL 之后,可以结合 MySQL 拓展相关应用。 版权声明: 本文为 EMQ 原创,转载请注明出处。
原文链接: https://www.emqx.io/cn/blog/emqx-plugin-persistence-series-5-mysql-mqtt-data-storage
硬件开发
2020-01-15 15:17:00
现今,“数据泄露事件”、“企业数据信息安全”、“网络环境下数据安全”、“企业数据防泄漏”……等都成为互联网时代的相关热门话题,也是国内政企机构等重点关注的问题。为什么数据泄露事件以及信息安全保护工作得到了如此广泛的关注?近年来,可能大家多多少少都关注到互联网新闻中经常会报道出某某企业数据泄露,什么什么公司的数据泄露导致数据在网络上售卖等等,这都给互联网的企业以及个人敲响了警钟,加强了对数据安全的关注程度,想要通过寻求某种方法,来切实有效的保证数据文件在流通使用中的安全,防止自身的企业发生数据泄露事件。因此,针对目前的互联网环境, 企业文件加密 工作的进行刻不容缓!
知识经济、知识版权时代,互联网企业之间的竞争都是知识产权与版权所有之间的竞争,一旦企业在发展以及管理过程中出现纰漏,造成自身企业泄露,轻则会造成企业经济损失,重则会影响企业的形象,造成企业在后期未来市场竞争力衰退,甚至影响到企业的生死存亡。因此,企业数据防泄漏系统的使用对于企业来说尤为重要,且具有其必要性!
针对企事业单位的发展现状,目前企业所面临的数据泄露危机增多,并且泄露的根源也在不断增强,那么对于这样的情况,企业的数据防泄漏工作应该如何进行?企业文件加密软件又要如何的使用和选择?
对于目前的企事业单位来说,具备了一定的安全意识的前提下,其次就是要去选择安全实用的文件加密软件来实现对企业环境下数据文件的保护工作,如何真正做到防止数据泄露,根源保障企业数据文件的安全!
风奥科技基于目前企业的发展现状,为企业具体剖析一下企业如何选择自身实用安全的文件加密软件?
首先,加密软件选择的环节之一:注重功能
既然企业有了一定的安全意识,想要选择加密软件,必然首先在功能上是能够实现的,如果功能上都不能满足企业的需求,那么企业选择这款加密软件的意义就改变了!
金甲企业加密软件专业针对企业数据文件加密的软件,采用256位高精度的加密算法,在不影响日常使用的前提下,实现对数据文件的安全加密管控,金甲企业加密软件能够针对多类型的电子文件进行加密,同时支持自定义需要加密文件的类型,并且具有接口,可根据企业的需求进行定制开发,满足企业现今和后期发展中对于数据安全的功能需求,能够帮助企业真正的实现对企业文件的加密管理!
其次,加密软件选择环节之一:兼容性
产品的兼容性能够帮助企业多方面多平台多领域的实现对数据文件的安全管理,金甲企业加密软件能够与各类的ERP、OA等等管理软件进行兼容,实现对该类平台下数据文件的加密管控,以及使用安全!
接下来,加密软件选择环节之一:稳定性
产品使用的稳定性,能够让企业在使用加密软件的过程中,更好的来进行管理,如果产品不够稳定,容易出现卡顿、蓝屏等等现象,不仅会影响企业的日常办公,同时也会降低工作效率。金甲企业加密软件,底层加密,能够在企业局域网电脑系统层进行稳定运行,切实保证企业数据文件的安全,同时不影响员工对于软件的日常使用等等!
最后,加密软件选择环节之一:售后服务
良好的售后的服务,能够让企业在后期的使用中更好的来管理企业的加密软件,风奥金甲企业加密软件,提供专业的服务团队和技术团队来协助企业对加密软件的使用,同时用户在使用加密软件的过程中有什么问题,或者需要进一步了解咨询的,我们的技术人员都会第一时间来协助企业进行管理,帮助企业的管理技术人员更好的使用加密软件!
以上就是小编对于企业在选择加密软件的时候需要注意的相关因素,也希望对于企事业单位在后期选择和使用加密软件的时候有所帮助!
风奥科技,金甲企业加密软件能够帮助企业实现对局域网内部环境下的数据安全及用户终端中的重要信息尤其是涉密信息在存储、传输、流转和使用过程中的安全,在Windows底层实现对企业文件的全方位加密保护和使用权限管控,同时,金甲企业加密软件提供日志管理以及审批解密等功能,针对企业有需要外发出去的文件进行审批解密,然后进行外部权限使用问题,并对申请审批解密的文件进行详细的日志记录,有效的帮助企业实现实时数据记录管理!风奥科技,金甲企业加密软件的使用能够帮助企业构建适合安全专业的加密防护网,防止涉密信息的非授权访问和窃取,降低企业因敏感数据泄漏而造成的损失,极大的提高企业对敏感数据处理和管理的工作效率。
硬件开发
2020-01-15 14:49:00
10月31日,在2019年中国国际信息通信展览会上,工信部宣布:5G商用正式启动。5G商用时代来了!
5G的商用,使得数据传输速度、响应速度、连接数据、数据传输量、传输可靠性等方面都有了显著的提升,这一技术的突破才使得很多领域的应用场景得以真正的落地实施,走进普通人的生活,而这其中就包括物联网。
虽然物联网的概念很简明,就是把物品与互联网相连接并进行信息交换和通讯,从而实现万物智能化,但是由于各种原因,商业化的应用并没有大规模的落地,其中一方面是由于网络传输等原因的限制。如今,5G的到来使得物联网应用在网络层面不再受限,更好地促进了物联网的发展。对于企业来说,快速构建一个商用的物联网服务,抢占先机就显得尤为重要。
京东云Serverless服务正适应了如今企业的这种需求。Serverless一系列产品生态可以让用户以业务为导向,无需关心底层服务器部署以及承载能力,实施周期短,无预付价格按使用量付费。这些特性是适应互联网5G快速时代、快速构建的不二选择,为企业节省成本的同时解决了技术上的难题。
以下面一个车联网数据为例子,我们来看一下如何用队列服务来构建一个高可用高可靠的无服务应用。在车联网应用中客户端负载可能会在24小时内扩展/缩减3、4个数量级,这些特性天然适合Serverless服务动态扩缩,按量付费。 案例场景: 车联网中搭载数据收集传感器的汽车向云端传输行驶数据,云端利用队列服务削峰填谷、动态扩缩的能力接收数据,然后转存到Elasticsearch进行更好的数据检索和应用,为用户提供更好的服务或者为公司提供更多的商业价值。
需求: 队列服务SDK,队列服务接入点地址,Elasticsearch接入点地址(已经创建好ES实例),京东云用户AK/SK
代码语言: Go
Step1
创建队列服务客户端以及资源创建 1func CreateClient() *sqs.SQS { 2 ses, _ := session.NewSession(&aws.Config{ 3 Region: aws.String("cn-north-1"), 4 Credentials: credentials.NewStaticCredentials("your AccessKey", 5 "your SecretKey", ""), 6 Endpoint: aws.String("http://jqs.cn-north-1.jdcloud.com"), 7 DisableSSL: aws.Bool(true), 8 }) 9 _, err := ses.Config.Credentials.Get() 10 if err != nil { 11 log.Fatal("凭据创建失败", err) 12 } 13 client := sqs.New(ses) 14 return client 15} 16 17func CreateQueueTask(name string) string { 18 resp, err := sqsClient.CreateQueue(&sqs.CreateQueueInput{ 19 QueueName: aws.String(name), 20 }) 21 if err != nil { 22 log.Println("Create Queue Failed:", err) 23 return "" 24 } 25 return *resp.QueueUrl 26}
Step2
每个车辆设备发送消息 1func SendTask(url string, message interface{}) { 2 body, _ := json.Marshal(message) 3 _, err := sqsClient.SendMessage(&sqs.SendMessageInput{ 4 MessageBody: aws.String(string(body)), 5 QueueUrl: aws.String(url), 6 }) 7 if err != nil { 8 log.Println("Send Message Failed:", err) 9 return 10 } 11 return 12}
测试数据:
测试机器的配置: CPU64、内存256G、带宽100Mbps(京东云云主机)
场景: 公网;send-单条(JQS)
Step3
从队列服务中拉取消息转存到Elasticsearch中 1func ReceiveMessageTask(url string) interface{} { 2 result, err := sqsClient.ReceiveMessage(&sqs.ReceiveMessageInput{ 3 AttributeNames: aws.StringSlice([]string{"All"}), 4 MaxNumberOfMessages: aws.Int64(1), 5 MessageAttributeNames: aws.StringSlice([]string{"All"}), 6 QueueUrl: aws.String(url), 7 VisibilityTimeout: aws.Int64(30), 8 WaitTimeSeconds: aws.Int64(0), 9 }) 10 log.Println(*result.Messages[0].Body) 11 if err != nil { 12 log.Println("Receive Message Failed:", err) 13 return "" 14 } 15 16 if len(result.Messages) > 0 { 17 _, delErr := sqsClient.DeleteMessage(&sqs.DeleteMessageInput{ 18 QueueUrl: aws.String(url), 19 ReceiptHandle: result.Messages[0].ReceiptHandle, 20 }) 21 if err != nil { 22 log.Println("Delete Message Failed:", delErr) 23 } 24 25 message := new(gpsMessage) 26 Err := json.Unmarshal([]byte(*result.Messages[0].Body), message) 27 if Err != nil { 28 log.Println("Receive Message Unmarshal Failed", Err) 29 return "" 30 } 31 return message 32 } 33 return "" 34} 35 36func Build(url string, method string, body interface{}) []byte { 37 client := &http.Client{} 38 //向服务端发送get请求 39 bodyData, _ := json.Marshal(body) 40 request, _ := http.NewRequest(method, url, bytes.NewReader(bodyData)) 41 42 request.Header.Set("Accept", "application/json") 43 request.Header.Set("Content-Type", "application/json") 44 //接收服务端返回给客户端的信息 45 response, _ := client.Do(request) 46 r, _ := ioutil.ReadAll(response.Body) 47 return r 48} 49 50func PostMessageToES(p string, body interface{}) string { 51 postReturn := new(postRes) 52 postResponse := Build(p, "POST", body) 53 err := json.Unmarshal(postResponse, postReturn) 54 if err != nil { 55 log.Println("Unmarshal Failed", err) 56 } 57 jsonS, _ := json.Marshal(postReturn) 58 log.Println("postResult:", string(jsonS)) 59 return postReturn.Id 60}
Step4
从Elasticsearch按照需求索引搜索信息 1func GetMessageFromES(p string) { 2 message := new(esMessage) 3 getResponse := Build(p, "GET", nil) 4 log.Println("getPath:", p) 5 Err := json.Unmarshal(getResponse, message) 6 if Err != nil { 7 log.Println("Unmarshal Failed", Err) 8 } 9 jsonM, _ := json.Marshal(message) 10 log.Println("getResult:", string(jsonM)) 11}
结果示例:
可以按照车辆信息进行数据的检索,绘制出汽车动态地图,利用这些数据来帮助自动驾驶、动态导航、车辆健康度分析等多种场景进行实现。 京东云的队列服务作为Serverless开发中的BaaS服务,实现了中间件服务的无运维和毫秒级扩缩能力,支持京东云的合作伙伴零成本启动业务和按使用量付费的模式,帮助用户解决资源扩缩和阈值监控等复杂问题。结合函数服务FaaS使用,可以满足更丰富的场景,并且调用整个京东云Serverless生态,打造基于云原生21世纪的开放式的全新应用。 点击“ 了解 ”,快来进行体验吧!
欢迎点击“ 京东云 ”了解更多精彩内容
硬件开发
2020-01-15 10:41:02
如今的互联网时代,改变了传统的日常办公模式,给现阶段人们的生产和生活带来了巨大的改变,信息技术所带来的便捷和高效是我们不可忽视的。正是由于信息技术的发展,也给企业的发展带来了危机,企业面临着数据被第三方获取、以及竞争对手窃取商业机密等等造成企业数据丢失或泄露等相关事件,因为这个时代,对于企业来说,更是对知识产权以及版权保护的时代,由此可见,数据信息安全对于企业的发展来说至关重要。
对于类似于机械行业等设计类行业来说,一份设计图纸所承载的不仅仅是企业长期发展的结晶,同时也是企业日后发展的重要过程,一旦在某个环节出现了数据泄露,企业都将会遭受不可挽回的重要损失。因而, 设计图纸加密 保护工作刻不容缓!
相信大家多多少少都听说过不少关于某某企业数据泄露,某某数据泄露导致了什么问题这样的互联网新闻报道,那么针对这样的现状,企事业单位又该如何有效的管控,如何防止工程设计图纸、CAD设计图纸/AutoCAD图纸/solidwork等相关设计图纸在使用中的安全呢?如何保护设计图纸在外发出去时候的使用安全?
这就需要企业建立专业的数据安全防护网络,在局域网内构建数据加密系统,来保证数据文件的使用安全。企业之所以需要构建加密软件保护系统,主要是帮助企业更好的加强现阶段以后发展中避免数据泄露事件发生,防止数据泄露,保护数据文件的机密性。
针对机械行业的现状,接下来,风奥科技,金甲加密软件厂商,就设计行业的现状为大家具体分析一下,对于设计行业来说,如何构建并且部署使用企业加密软件来保护数据文件的使用安全?
首先,对公司进行市场调研,以及需求分析,然后根据具体的局域网环境来制定加密软件的部署策略和部署方案。
例如:机械设计行业需要对自身的设计部门以及市场部门的相关文件进行加密,那么就要了解设计部门需要加密的文件类型有哪些?市场部门亦是如此,然后在企业提供选择一台配置符合要求的电脑,然后安装金甲服务器端,该电脑安装金甲服务器端后需要保持长期的开机状态以及管理人员借助该电脑来进行相关的策略下发。接下来,就在企业的设计部门以及市场部门安装金甲客户端,并且每个部门的电脑在服务器端都进行部门的划分,方便企业的管理,客户端安装完成后,在金甲服务器上下发策略,看那些类型的文件需要加密,加密后的文件在外发的时候进行审批操作流程,以及不同密级的使用权限等等相关问题。
这里需要注意的是,但凡是经过金甲企业加密软件加密以后的电子文件在指定的局域网环境内能够正常的编辑、使用、流通等等,但是未获得授权的用户,将加密文件外发出去,或者通过移动存储设备拷贝带走,加密文件都是乱码的,金甲强制性加密策略是在Windows底层文件产生的时候就会被加密,不会影响使用者的日常操作的同时实现对数据文件的加密管理!
其次,在文件加密的基础上,设计相关的使用权限问题,例如对相关的加密文件设置密级管理,例如对于不同密级的加密文件其不同用户的使用权限当然也不同,低权限的人员不能越级查看密级的文件,高权限的人员,这里比如公司的领导,可以给予该权限,能够查看任意密级的文件,当然这里都是根据企业的不同需求以及环境进行自行设置的,金甲加密软件提供该项功能,可供企业单位选择使用。
最后,在所有的布局完成后,可以对安装后的加密软件进行内部的相关测试,例如测试其安全性是否有保障,例如稳定性是否合适,是否会影响相关的使用等等。这都是在使用的时候需要观察考虑的因素。
风奥科技金甲企业加密软件,Windows底层实现加密,不会影响企业员工对于日常办公软件的相关使用,也不会影响其打开速度,作为企业如果不想让员工看到文件是加密状态的,金甲企业加密软件的无感知加密,能够帮助企业有效的实现这一点,只需要企业管理员在服务器端设置客户端图标以及加密图标不显示即可实现!金甲企业加密的安全性也是具有保障的,根据不同企业的不同办公环境,采用的是高精度的256位加密算法,来实现对不同环境的文件的加密管控,防止多种数据泄露事件的上演和发生,同时金甲企业加密提供专业的技术服务以及售后服务,帮助企业更好的使用金甲加密产品来保证数据文件的安全,是企业现阶段和以后都值得信赖和使用的加密软件。
作为设计类的企业,关注企业设计图纸等原创安全问题,是值得肯定的,毕竟这个时代竞争力的核心就是版权和原创的竞争,因而企业想要加强对设计图纸类文件的保护也是势在必行的。如果您的企业是设计企业,还没有采取相关的保护策略,不妨试试风奥金甲加密软件,免费试用,支持在线申请!
硬件开发
2020-01-14 15:35:00
MQTT 协议的核心在于发布订阅模式,在本文中,我们将对这一模式进行深入的介绍。
发布订阅模式
发布订阅模式区别于传统的客户端-服务器模式,它使 发送消息的客户端(发布者)与接收消息的客户端(订阅者)分离 ,发布者与订阅者不需要建立直接联系。我们既可以让多个发布者向一个订阅者发布消息,也可以让多个订阅者同时接收一个发布者的消息,它的精髓在于由一个被称为代理的中间角色负责所有消息路由和分发的工作。传统的客户端-服务器模式可以实现类似的效果,但是无法做到像发布订阅模式这样简洁和优雅。
发布订阅模式的优点在于发布者与订阅者的解耦,这种解耦表现在以下两个方面: 空间解耦,订阅者与发布者不需要建立直接连接,新的订阅者想要加入网络时不需要修改发布者的行为。 时间解耦,订阅者和发布者不需要同时在线,即便不存在订阅者也不影响发布者发布消息。
消息路由
代理作为发布订阅模式的关键角色,它需要准确、高效地向订阅者转发其期望的消息,一般来说,比较常用的有以下两种方式: 根据主题。订阅者向代理订阅自己感兴趣的主题,发布者发布的所有消息中都会包含自己的主题,代理根据消息的主题判断需要将消息转发给哪些订阅者。 根据消息内容。订阅者定义其感兴趣的消息的条件,只有当消息的属性或内容满足订阅者定义的条件时,消息才会被投递到该订阅者。严格来讲,主题也可以算是消息内容的一种。
发布订阅模式的松耦合特性,也带来了一些副作用。由于发布者并不知晓订阅者的状态,因此发布者也无法得知订阅者是否收到了消息,或者是否正确处理了消息。这种情况下,想要保障交付往往需要更多的消息交互流程,例如,订阅者收到消息后向某个主题发送应答,发布者此时转变为订阅者等待应答。
MQTT
MQTT 协议根据主题而不是消息内容来分发消息,每个消息都包含一个主题,代理无需解析用户数据,这为实现一个通用的、与业务无关的 MQTT 代理提供了可能。用户也可以随意对自己的数据进行加密,这对于广域网通信是非常有用的。
MQTT 主题中可以有多个层级,并且允许对一个或多个层级进行模糊匹配,使客户端能够一次性订阅多个主题。关于 MQTT 主题的详细特性,我们会在后续的文章中专门进行介绍。
与消息队列相比,MQTT 并不要求发布或者订阅之前显式地创建主题,唯一可能造成的不良影响是客户端可能使用错误的主题而不自知,但显然灵活部署带来的收益更高。
既然提到了消息队列,那么正好解释一下 MQTT 与消息队列的区别。MQTT 并不是消息队列,尽管两者的很多行为和特性非常接近,比如都采用发布订阅模式等,但是他们面向的场景有着显著的不同。消息队列主要用于服务端应用之间的消息存储与转发,这类场景往往数据量大但接入量少,而 MQTT 面向的是 IoT 领域和移动互联网领域,这类场景的侧重点是海量的设备接入、管理与消息传输。在实际的场景中,两者往往被结合起来使用,譬如先由 MQTT Broker 接收物联网设备上传的数据,然后通过消息队列将这些数据转发到具体应用进行处理。
希望通过这篇简短的文章,您能够对发布订阅模式有一个直观的了解。有关 MQTT 的其他特性,我们会在后续的文章中展开介绍。 版权声明: 本文为 EMQ 原创,转载请注明出处。
原文链接: https://www.emqx.io/cn/blog/mqtt-5-introduction-to-publish-subscribe-model
硬件开发
2020-01-14 14:10:00
信息化技术的发展,影响着互联网时代的生产效率以及社会生产力方面您的发展,不可否认,电子化时代的发展给我们带来了便捷高效的体验感,信息化技术已经渗透到生活点的方方面面,并且影响着个人的日常生活以及企业的日常办公等等方面,我们在肯定互联网发展带来的改变同时,也不可忽略信息化时代所存在的数据安全危机,正是因为信息技术在社会生产和生活方面广泛的应用,容易导致个人乃至企业等层面的数据泄露问题,如何应对安全危机?如何有效的防范数据泄露问题?如何采取有效的方法和策略来保障数据安全?这也是个人、企业乃至国家层面所一直关注的安全问题。
站在企业的层面,首先你应该思考的是如何保障内部员工电脑上的图纸文档安全?文件在外发出去的时候又该如何保障数据文件的流通使用安全?这都是企业在构建数据防泄漏解决方案所需要关注的。
那么接下来,风奥科技就站在数据安全厂商的角度,具体剖析一下,企业办公文档加密方案如何部署? 办公文档加密 方法那个更好用过?
可以说,目前互联网市场上加密软件的品牌很多,加密的方式也很多,就加密采用的技术而言,可以分为应用层加密和驱动层加密;还有就是硬件加密和软件加密,免费加密和付费加密,自带加密和第三方加密工具等,那么面对这样繁杂的市场,什么样的办公文档加密软件是适合自身企业的?
对于企业而言,办公文档加密如何设置?
企业不同于个人用户的需求,企业既然想要选择加密软件,必然把安全放在首位,那么对于企业而言,什么样的加密方式和方法是安全的呢?由于国内现在Windows底层是开放的,因此加密软件在开发的时候采用底层加密技术,这也是比较安全的加密技术,为什么?基于Windows底层的加密软件,在数据文件在底层产生的时候即可实现加密,加密后的文件在指定的局域网或者允许的环境下可以正常使用,不受到影响,如何想要通过其他途径将文件外发出去,如果是没有获得授权允许的操作,加密文件都将呈现乱码。这样的加密技术和方法对于企业来说是比较安全的!
接下来,我们就基于风奥科技金甲企业加密软件来具体分析一下企业办公兔兔纸文档加密如何设置和部署?
首先,对企业做好市场调研,例如:企业的环境,公司总部、分部加密局域网设置,每个部门有哪些重要的文件需要加密?加密以后对不同部门之间是否有使用权限控制?
在做完调研以后,可以根据企事业单位的需求,部署金甲企业加密软件,准备好配置适当的一台电脑安装金甲服务器,然后再其他部门的员工电脑上安装金甲客户端,使其连接上金甲服务器,在服务器上不同部门的电脑进行划分,方便企业根据部门进行管理。
接下来,进行相关的权限以及加密策略的设置,公司审批解密流程设置等等等,设置完成后,更新策略,客户端电脑上的涉密文件类型将在新建产生的时候就一直处于加密状态,对于员工电脑上的那些原本存在的该类型文件,只需要将公司的加密策略设置为强制性加密,员工在编辑、保存、拖动该类型文件的时候都会被加密。能够有效的保证数据文件的安全,防止数据泄露!
最后,金甲企业加密软件支持对日志管理,对审批外发等多类型的电子文件的使用进行详细的记录,帮助企业进行方便快捷的管理,做到“事前防御,事中监控,事后有据可查”保证企业安全,是企业信赖首选的加密软件厂商品牌!
作为企业,如果您还在寻找企业加密软件,不妨试试这款,支持免费试用!
硬件开发
2020-01-13 16:37:00
硬件连接图
引脚图
WP:写保护位,在这里不使用写保护
A0、A1、A2:3个地址位为整个7位地址的后三个地址, 注意 这里的前四位地址已经被固定成1010了即0xa,剩下的三位由这三位控制
按字节写入数据
这里的MSB在前,表示AT24C02是高位先行的
WORD ADDRESS:选择将要写入的地址,也就是从AT24C02的哪一个位置来写,区别于前面的设备地址
当单片机的速度很快,单片机需要等待AT24C02的写入完成,这时单片机再次发送写入信号这个信号包含着AT24C02的地址,相当于询问AT24C02的写入是否完成,当完成时AT24C02的返回值为"0"时,代表上次写入工作已经完成
按页写入
相比按字节写入数据更快,不用每次都询问是否完成。
突发写入:给一次地址,连续写入多次数据
一次可以写入8个字节
读当前地址存的数值
随机指定某一个字节来读取
注意 :这里虽然是读取,但是由于前期需要寻址,所以这里的第一次产生其实起始信号是写入操作
顺序读取
这与前面的 随机指定某一个字节来读取 类似,但是后面顺序读取只要有一直有应答信号产生,AT24C02就会一直顺序发送数据,直到主机产生非应答信号
如果到了最后一位还没有产生应答信号时,AT240C2就会从首地址读取数据发送给单片机
硬件开发
2020-01-11 03:15:00
百度网络推广公司,网络推广外包服务哪家好是很多企业面临的问题,选择一家网络推广公司,可为企业宣传达到事半功倍的效果。对此,TOM品牌营销公司,在推广宣传、精准引流方面总结了一套独特的方法。
百度网络推广公司如何做节省成本还高效?
市场分析&整体规划:市场分析、竞品分析、目标受众、自有品牌及产品市场差异化分析,创新型策略分析,精选更有效营销方式
传播策略规划:根据企业需求,以用户关心的话题、产品、行业场景罗列,并结合专业分析工具,通过软性植入达到长期性宣传效应
整合传播推广:SEO排名优化、博客营销、微博营销、论坛营销、知识营销、口碑营销、H5营销、新闻软文营销、视频营销等病毒...
数据监控:热门关键词索引,排名监控、传播及访问数据分析,效果调优等
企业品牌营销策略模型,企业在营销思维模式的指导下,通过精准的用户需求分析及WHOT原则,重点找到最核心能打动消费者的一个方向,作为特点,进行快速传播蔓延。业务聚焦是互联网营销的思维下的产物,围绕1个核心品牌定位,可让消费者更快记住你!
常用的企业品牌营销渠道,线上传播具有影响力大、覆盖范围广、传播力强等优势,常见的渠道包括品牌策划、软文营销、口碑建设、产品宣传、知识营销、自媒体营销、新媒体营销、SEO等全媒体矩阵、H5营销、创意活动等。
TOM品牌营销,将企业网络营销推广方法做到极致,通过千家优质媒体资源,助力企业实现有深度、有质量的品牌营销,业务量节节增长。凭此平台看到我,可赠企业营销推广方案。黄老师,18618338257
http://www.tom.com/marketing
硬件开发
2020-01-10 17:03:00
如何的市场,伴随着信息化技术的推进,企业的日常办公都有赖于对电脑的使用,电脑成为日常数据产生,以及日常数据存储的通道之一。电子化设备的使用,不仅方便了政企机关单位,同时对人们的生产生活也造成了巨大的影响,信息化一方面给企业的办公带来了便利,另一方面也使得电脑文件在生产和使用中面临着数据泄露的风险。因而,对于现阶段的企事业单位以及国内的相关机构来说,采取必要的措施来实现对自身环境下的数据文件加密,是非常有必要的。
为什么说是 Windows系统加密 ?毕竟Windows系统底层是对外开放接口的,能够做集成,来实现加密!作为国内优秀的数据防泄漏厂商,风奥科技,采用的是Windows底层加密技术来实现对数据文件的底层透明加密管理,所谓透明化的加密,即在不影响使用者对于文件的日常使用前提下,进行的无感知加密。透明加密的特性是要求内部机器都能够打开公司的所有密文,所以目前透明加密系统只能够采用对称算法。对称算法中,也有一些非常的经典的算法。算法本身是公开的。但是算法公开并不意味着可靠性降低。非法用户即便获取了密文,也知道相应的算法,但是只要他不知道密钥也无法破解。
可能会有点人说,那我要是别的系统例如MAC怎么办呢?目前市面上的苹果系统加密软件,只是在文件的表面上加了一层壳,并不是在底层实现的加密,所以在安全性和运行方面都存在着一定的缺陷,为什么说存在着一定的不足呢?毕竟MAC系统并没有对外开放使用,因此,市面上的加密,只是在表面做了一个加壳处理,没办法实现到Windows系统加密的安全系数!
基于对互联网信息技术以及信息安全管理技术的相关分析,站在企业数据安全的角度,风奥科技小编将具体为大家分析一下,Windows透明文件加密的优势,以及公司电脑文件加密方案应该如何部署才能达到更好的加密效果?
企业在实施部署加密的时候,为什么更推荐用户选择Windows底层加密系统来实现呢?
采用Windows透明加密的软件其加密策略灵活,因为是运行在系统的底层,文件在创建、写、更名、打开的时候都会在底层被强制性加密,并且支持多种类型的文件控制使用操作,例如控制文件的打印、解屏、二次拷贝、使用时间等等,并且能够支持对多类型的文件试试加密管控,适用于现阶段的企业来使用,
风奥金甲企业加密软件,正是基于Windows底层进行开发的加密软件,配置策略灵活并且拥有安全的权限管理功能,例如:设置对那些类型的文件加密?选择适合的加密模式,以及加密文件的流通使用权限,部门之间的文件加密级别等等相关的设置……这里举例说明一下,公司要对设计部门以及市场部门的文件进行加密,设计部门加密后的文件只能在设计部门内部正常流通使用,如果想要将设计部门的文件发送到市场部门,必须获得设计部门相关管理员的审批,才能发送出去,这也就是说,每个部门之前的使用权限不一样,部门的加密文件不能再未获得允许的情况下跨部门使用,然后就是公司的管理层,能够查看不同部门的但是具体的操作使用权限等等都是自己根据自身公司的环境来决定和设置的,加密软件的使用在于保证数据文件的安全,防止数据泄露。
企业如何部署电脑文件加密软件来达到安全的加密效果?
想要部署的加密软件达到自身预期的效果,首先企事业单位在选择部署电脑文档加密解决方案的时候,需要对加密软件有一定的认知和了解,同时也要做好企业内部加密环境的规划以及企业 要对哪些方面的数据进行加密 ?
在清楚这些以后,才是选择产品的时候,基于自身了解的相关加密知识,选择适合的加密软件,了解其软件采用的加密技术,以及相关的功能,该去也发展经验等等多方面的考量!然后确定自己的选择。
找到相对比较适合的软件后,一定要在自己的环境下,安装使用,这样更能检测产品的安全性以及兼容性和操作方面的因素,是否适合于自身企业环境。最后选择具体的加密软件,来部署实施!
企业想要采用文件加密软件来实现对内部环境的安全管控,风奥科技,金甲企业加密软件是您不错的选择,具有较强的稳定性,在使用期间不会任何影响正常操作的行为,并且也不影响企业使用软件的效率等。安全性考量,经过金甲企业加密软件加密后的文件,只要是在未获得授权允许的情况下,都是无法脱离环境使用的,及时能够脱离环境也是乱码呈现,针对企业需要外发出去的文件,需要走金甲服务器的审批解密流程,同时也能控制文件的权限!功能考量,能够对企业的多种类型文件加密,支持自定义加密文件的类型,同时支持定制开发,使其更好的满足企业对于加密的需求,最后,风奥金甲加密软件具有专业的服务团队和技术团队,为您提供专业的数据防泄漏服务!
硬件开发
2020-01-10 15:47:00
针对现在企业的发展现状进行分析,互联网企事业单位的竞争主要是原创版权以及公司实力的竞争,对于这样的现状,设计行业的数据信息安全尤为重要,因此,对于很多的相关设计公司来说,都迫切的需求对公司内部的电脑三维、二维以及相关的CAD电子图纸进行加密管控。其中, 企业三维图纸加密 的重要性也突出表现为如何去通过加密软件来保证自己劳动成果的安全,是目前设计企业重点关注的层面!
如果一旦企业没有加强对图纸设计文件的保护,发生数据泄露事件,给竞争对手以可乘之机,都将会给企业造成重大的损失,图纸从产生到设计完成,凝聚的是企业长期的努力与心血,同时也直接关系着企业对于这个项目的成败以及企业后期的发展。设计图纸如此重要,如何保证自身企业原创图纸的安全呢?如何保证企业数据信息安全呢?这里的信息安全不仅仅是图纸的安全,更包含企业的核心数据文件,例如:研发文档,财务数据、客户相关数据等等,同时也包含一些相关企业的开发的源代码文件等等。因而,企业电脑文档加密工作势在必行,也是迫在眉睫需要进行的!
站在发展的角度,以及分析15年来服务于设计行业的经验,风奥科技作为专业的加密软件供应商,为大家具体分析一下,怎么给电脑三维图纸加密更安全?
市面上图纸加密的工具性软件很多,但是哪一款才是真正有用的,并且适合自己企业使用的?面对市场上数据防泄漏解决方案以及相关实施措施,企业又如何来选择?
首先,作为企业,如果已经具备了相关的数据安全措施,想要在互联网市场中寻找安全专业的图纸加密软件品牌,那么作为企业你需要清楚自身企业的环境,以及想要达到什么样的加密效果?加密后的文件使用时候有什么特殊的要求或者相关的权限问题?……等等一系列问题,都是企业在寻找加密软件的时候,现在站在自身企业的角度来思考的!
风奥科技,金甲加密软件基于Windows文件驱动技术,采用安全稳定的Miniflt技术来实现对各类型电子数据文件的加密管控工作,所谓文件驱动技术是针对操作系统的。从原理上讲,文件驱动方式的透明加密系统可以支持某一个操作系平台上的所有应用软件,因为它不关心操作系统和应用软件的会话,只关心操作系统和硬件打交道的方式。在Windows底层运行的金甲加密软件,安全系数高,能够有效的帮助企业从根源做到防止数据泄露事件的发生!能够对多种类型的CAD、二维、三维等类型的图纸软件进行安全加密,这时候,你可能会问,加密后的文件有什么不同点?在使用的时候跟没安装之前有何区别呢?金甲加密软件不对影响企业的任何办公工具软件的使用,毕竟金甲加密软件是运行在底层的,安装前后的唯一差别就是利用透明化的环境,实现了对企业的数据文件的安全管控,帮助企业在底层构建了一套专业的安全防护网络!
其次,选择加密软件最突出的就是要安排自己企业的相关技术人员进行产品的使用测试以及安全测试。
测试加密软件的时候,需要至少安装3-4台电脑进行仿局域网环境测试,可以将每台电脑设置为一个部门,然后安装服务器,进行策略设置,然后进行策略下发使用操作,检测产品的安全性能和功能!
这里以金甲企业加密软件为例,企业在安装进行测试的时候,我们的相关技术人员会指导并协助企业安装使用,在安装后,技术人员会根据企业的情况,协助企业的技术人员来就进行下发策略以及权限设置,以及同一局域网环境下的不同部门关于加密文件的权限问题等等设置,然后进行使用测试,例如:在安装了金甲加密客户端电脑上的A电脑上建一个CAD图纸文件,你会发现,文件在新建后,会显示一个八卦的加密图标,此图标显示该文件已经加密,然后电脑A直接通过聊天工具或者U盘等等将这个加密的CAD图纸文件外发出去,在没有安装金甲加密软件的电脑上使用,你会发现,这个文件是呈现加密状态,没办法打开使用的!因为,但凡是经过金甲加密软件加密后的任意图纸文件,只要是未获得授权允许的操作都是不被允许的,即使能够操作,文件带走后也是乱码呈现,实现对数据文件的全方位保护!
最后,测试通过后,就是考察企业的实力,以及售后服务了,良好的售后服务,能够帮助企业在后期更好的使用加密软件来保护企业数据文件的使用安全,防止一些有可能造成数据泄露的因素存在,杜绝数据泄露事件的发生!
风奥科技股份有限公司的具有专业的技术服务团队和售后团队,为企业提供良好的技术支持以及产品服务,作为原厂商,拥有雄厚的市场经验能够准确的把握好企业的需求,并为企业构建专属的防护加密环境。风奥科技,因为专注所有专业,今年来在市场的配额显著提升,十多年来一直都是国内企业信赖的CAD图纸加密软件供应服务商之一。
硬件开发
2020-01-09 15:54:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
READ UNCOMMITTED
SELECT语句以非锁定方式被执行,但是一个可能更早期版本的记录会被用到。因此,使用这个隔离级别,比如,读是不连贯的。这也被称为“脏读”( dirty read)。另外,这个隔离级别象READ COMMITTED一样作用;简而言之,在READ UNCOMMITTED的隔离级别下,开启事物但事物并未提交之前,对于其他的事物都是可见的,记住,从性能的角度上来说,这个级别不见得比其他隔离级别的好;一般情况下非常少用,除非特殊业务需求;
READ COMMITTED
一个有些象Oracle的隔离级别。所有SELECT ... FOR UPDATE和SELECT ... LOCK IN SHARE MOD语句仅锁定索引记录,而不锁定记录前的间隙,因而允许随意紧挨着已锁定的记录插入新记录。 UPDATE和DELETE语句使用一个带唯一搜索条件的唯一的索引仅锁定找到的索引记录,而不包括记录前的间隙。在范围类型UPDATE和DELETE语句, InnoDB必须对范围覆盖的间隙设置next-key锁定或间隙锁定以及其它用户做的块插入。这是很必要的,因为要让MySQL复制和恢复起作用, “幽灵行”必须被阻止掉;简而言之,READ COMMITTED其实是解决了READ UNCOMMITTED的可重复读问题,即READ COMMITTED的隔离级别下,一个事物的开启到结束,它的所做的修改更新删除 对于其他事物而言都是不可见的;
REPEATABLE READ
这是InnoDB的默认隔离级别。带唯一搜索条件使用唯一索引的SELECT ... FOR UPDATE, SELECT ... LOCK INSHARE MODE, UPDATE 和DELETE语句只锁定找到的索引记录,而不锁定记录前的间隙。用其它搜索条件,这些操作采用next-key锁定,用next-key锁定或者间隙锁定锁住搜索的索引范围,并且阻止其它用户的新插入。在持续读中,有一个与之前隔离级别重要的差别:在这个级别,在同一事务内所有持续读读取由第一次读所确定的同一快照。这个惯例意味着如果你在同一事务内发出数个无格式SELECT语句,这些SELECT语句对相互之间也是持续的;REPEATABLE READ解决了恶心的脏读情况,保证同一个事务在读取同样的记录的时候能够保证结果一致性;但是却没能解决幻读的问题,就是当一个事务在读取一个记录的同时,另外一个事物又在对这个记录进行插入操作,导致事物再次读取的时候产生换行
SERIALIZABLE
这个级别类似REPEATABLE READ,但是所有无格式SELECT语句被 隐式转换成SELECT ... LOCK IN SHAREMODE。最高隔离级别,强制事务串行执行,可以说在对每个行数据加行锁,所以会导致很多锁的争用或者大量超时问题,性能很差,如果不是特殊的业务需求,一般不会选择这种情况;
附个图片(来自于高性能mysql):
硬件开发
2016-10-06 20:23:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
输出的一些相关信息,只有了解这些相关信息究竟是要做什么,才能通过执行计划更加准确的明白如何去优化一个select ;
id : 标识,查询序列号;
select_type : select的类型;
SIMPLE 简单SELECT(不使用UNION或子查询)
PRIMARY 最外面的SELECT
UNION UNION中的第二个或后面的SELECT语句
DEPENDENT UNION UNION中的第二个或后面的SELECT语句,取决于外面的查询
UNION RESULT UNION的结果。
SUBQUERY 子查询中的第一个SELECT
DEPENDENT SUBQUERY 子查询中的第一个SELECT,取决于外面的查询
DERIVED 导出表的SELECT(FROM子句的子查询)
table : 输出的行所引用的表 ;
type : 联接类型;
system 表仅有一行(=系统表)。这是const联接类型的一个特例
const 表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。 const表很快,因为它们只读取一次!const用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时 ;
eq_ref 对于每个来自于前面的表的行组合,从该表中 读取一行 。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY。eq_ref可以用于使用= 操作符比较的带索引的列。比较值可以为常量或一个使用在该表前面所读取的表的列的表达式。
例如:SELECT * FROM ref_table,other_table
WHERE ref_table.key_column=other_table.column;
SELECT * FROM ref_table,other_table
WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
ref 对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀,或如果键不是UNIQUE或PRIMARY KEY(换句话说, 如果联接不能基于关键字选择单个行的话 ),则使用ref。如果使用的键仅仅匹配少量行,该联接类型是不错的。ref可以用于使用=或<=>操作符的带索引的列。
例如 : SELECT * FROM ref_table WHERE key_column = <= >=expr;
SELECT * FROM ref_table,other_table
WHERE ref_table.key_column=other_table.column;
SELECT * FROM ref_table,other_table
WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
ref_or_null 该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。
例如 : SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;
index_merge 该联接类型表示使用了索引合并优化方法。在这种情况下, key列包含了使用的索引的清单, key_len包含了使用的索引的最长的关键元素 ;
unique_subquery 该类型替换了下面形式的IN子查询的ref:value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。
例如 :value IN (SELECT key_column FROM single_table WHERE some_expr)
index_subquery 该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引
例如: value IN (SELECT key_column FROM single_table WHERE some_expr)
range 只检索给定范围的行,使用一个索引来选择行。 key列显示使用了哪个索引。 key_len包含所使用索引的最长关键元素。在该类型中ref列为NULL。当使用=、 <>、 >、 >=、 <、 <=、 IS NULL、 <=>、 BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range ;
例如 : SELECT * FROM tbl_name
WHERE key_column = 10;
SELECT * FROM tbl_name
WHERE key_column BETWEEN 10 and 20;
SELECT * FROM tbl_name
WHERE key_column IN (10,20,30);
SELECT * FROM tbl_name
WHERE key_part1= 10 AND key_part2 IN (10,20,30);
index 该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小, 当查询只使用作为单索引一部分的列时, MySQL可以使用该联接类型。
ALL 对于每个来自于先前的表的行组合,进行完整的表扫描。如果表是第一个没标记const的表,这通常不好,并且通常在它情况下很差。通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常数值或列值被检索出

possible_keys : possible_keys列指出MySQL能使用哪个索引在该表中找到行。注意,该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询 ;
key : key列显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、 USE INDEX或者IGNORE INDEX。
key_len : key_len列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。注意通过key_len值我们可以确定MySQL将实际使用一个多部关键字的几个部分
ref : ref列显示使用哪个列或常数与key一起从表中选择行
rows : rows列显示MySQL认为它执行查询时必须检查的行数
Extra : 该列包含MySQL解决查询的详细信息。下面解释了该列可以显示的不同的文本字符串
Distinct MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行
Not exists MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
例如: SELECT * 从t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;
range checked for each record (index map: #) MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。对前面的表的每个行组合, MySQL检查是否可以使用range或index_merge访问方法来索取行。 不同的是前面表的所有列值已知并且认为是常量。这并不很快,但比执行没有索引的联接要快得多 ;
Using filesort MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。然后关键字被排序,并按排序顺序检索行 ;
Using index 从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。当查询只使用作为单一索引一部分的列时,可以使用该策略 ;
Using temporary 为了解决查询, MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时。
Using where WHERE子句用于限制哪一个行匹配下一个表或发送到客户。除非你专门从表中索取或检查所有行,如果Extra值不为Using where并且表联接类型为ALL或index,查询可能会有一些错误。如果想要使查询尽可能快,应找出Using filesort 和Using temporary的Extra值 ;
sing sort_union(...), Using union(...), Using intersect(...) 这些函数说明如何为index_merge联接类型合并索引扫描
Using index for group-by 类似于访问表的Using index方式, Using index for group-by表示MySQL发现了一个索引,可以用来查询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。并且,按最有效的方式使用索引,以便对于每个组,只读取少量索引条目。
硬件开发
2016-09-30 15:24:00