• [行业资讯] 工业物联网:工业4.0的风险、挑战和需求【转载】
    物联网正处于被采用的早期阶段,但物联网网络的有效使用可以为企业提供卓越的结果。实施像物联网这样的新技术可能充满风险、挑战和要求。然而,工业物联网是一项强大的技术,可以彻底改变业务运营。物联网是第四次工业革命的显著成果,现在正处于其初始阶段。那些能够使自己的业务适应这项技术的早期采用者,将在未来十年中获得竞争优势。随着任何新技术的出现,与采用相关的挑战必然会出现。采用物联网有它自己的一组风险、挑战和需求,组织需要知道这些。以下详细了解一下:整合工业物联网的挑战是什么?以下是企业在采用新技术时可能面临的一些潜在问题。投资成本:在工业4.0中实施物联网将需要预算来安装新硬件,升级现有硬件,招募熟练劳动力,构建基础设施等。安全性:将有大量数据通过网络连接传输或迁移到云平台或内部存储。物联网设备将把所有东西连接到互联网上,这增加了对其安全的威胁。除了入侵数据库服务器或管理计算机外,黑客还可以入侵系统本身。基础设施:获取和执行技术和通信基础设施是一项具有挑战性的任务,包括数据库、WIFI、互联网和其他旨在管理物联网的先进工具。获取硬件:企业需要选择可扩展的硬件,这些硬件必须足够灵活,以适应企业现在和未来的需求。一个开放的、集成的硬件和软件工具以及一个易于适应新技术的实时网络将有助于有效地适应业务需求。在工业4.0中实施物联网的要求是什么?以下是工业物联网的一些要求:云计算:云服务器允许企业将结构化和非结构化数据存储、处理和管理为实时数据。访问:工业物联网将要求系统随时随地可访问。安全性:安全性是实现物联网的要求之一,因为私有和机密数据在整个企业中共享。用户体验:如果用户体验流畅,团队将能够充分利用工业物联网系统。智能机器:智能机器是连接事物的初始步骤或基本组件。资产管理:如果通过基于云的服务管理资产,将简化工业物联网系统的工作和维护。大数据分析:大数据分析将为您提供有价值的业务数据实时分析,帮助企业制定战略业务决策。整合工业物联网的风险是什么?如上所述,物联网技术正处于采用的初始阶段,几乎没有明确的标准。因此,投资于它可能比投资于任何久经考验或已建立的技术风险更大。然而,物联网也是一个强大的工具,可以改变各种规模的企业,任何部门和行业,并彻底改变生活方式。这意味着实施物联网肯定会为您和您的业务带来巨大的回报。如果你成为早期采用者之一,你将占据上风,因为你有一个良好的开端。现在让我们来看看整合工业物联网的风险:实施失败物联网实施的最大风险之一是未能在您的业务中实施它。有可能企业的生产设施位于没有快速互联网连接的地区。如果没有快速可靠的互联网连接,设备之间就不可能有可靠的通信。因此,企业的设备无法有连续的数据流用于存储和分析。也可能有这样一种情况,企业的业务目标需要在短时间内完成多项任务。通过Wi-Fi收集、积累和传输数据比使用PLC或电路板要慢。然而,对于许多物联网设备来说,时间滞后并不重要。但是,如果企业的业务要求精确或需要实时操作,企业将不得不根据您的需求做出战略决策,重新考虑将物联网用于何处,如果要使用它的话。企业可能没有足够的预算来实施物联网。现在,拥有所需的所有专业知识,战略性物联网实施计划,并且您的原型交付效果显著,如预期的那样工作。但后来你意识到全面实施计划的预算,它比预期的要多。在这种情况下,将无法一次实现它。此外,选择可扩展的物联网设备以满足组织当前和未来的需求至关重要。由于无法预测您所在行业的未来需求,因此您需要确保系统无缝地适应您的业务需求并随之增长。在寻找物联网解决方案之前,您需要考虑这些可能的实施失败风险。因此,您必须获得足够的物联网知识,以了解在成本和效率方面哪些有效,哪些无效。如果您决定实施这项技术,我们建议您概述一下在工业4.0中集成物联网的最佳技巧。如果成本超出了你的预算,你需要记住你还处于原型阶段,你甚至可以把想法刮掉。因为在执行阶段跳过这个想法会让你的企业损失一大笔钱。然而,如果不尝试,就不可能知道它是否有效。网络故障互联网是工业物联网的另一个基本要素。许多人可能会说,今天的企业已经依赖于互联网来传输文件、通过中央服务器授予用户访问权限、电子商务、客户端支持和执行其他任务。如果互联网关闭,人们仍然可以执行任务,如在本地文件或服务器上工作,并继续生产。但是,如果您的生产依赖于物联网技术,那么每当互联网关闭时,您的产品就会停止。互联网的稳定性是物联网保证持续工作的基本要求之一。在考虑实施工业物联网之前,必须向互联网提供商核实互联网的稳定性。隐私和安全安全是主要问题之一,因为如果您的业务依赖于互联网,它将产生另一种被入侵的风险。这意味着,即使对您的系统进行简单的攻击也可以冻结您的产品。此外,全面的网络攻击将允许未经授权访问传感器或敏感数据库,从而使您的系统处于危险之中。安全漏洞会对您的组织及其工作流程造成毁灭性的影响。我们整理了一些过去发生的数据泄露事件:聊天机器人在没有获得正式同意的情况下记录了用户的互动,并将其分享给承包商进行人工审查。专家们回顾了这一情景,并分享了发生的事情。作为全球品牌,这引发了一场关于公民隐私和安全的辩论。以下是一些避免物联网安全风险的措施:端点安全所有收集数据的计算机都是端点。这些可能是边缘计算机,它们在被拦截后从传感器、本地系统、某些协议和计算机中实时收集数据。他们这样做是为了将信息存储在本地服务器上或将其传输到云服务器进行存储。存储系统和数据分析师使用的系统将交换来自存储的数据。端点安全性是保护系统免受攻击者攻击的重要方法之一。企业可以根据需要选择端点证券,如防病毒软件、防火墙、反恶意软件和其他。它将防止恶意攻击者到达您的设备并通过网络传播。但是,消费类产品可能不足以处理已共享、传输或处理的数据量。因为物联网设备可以快速实时共享数据,不会减慢数据传输速度。根据您的需要,您可能需要定制端点安全基础设施来保护企业的服务器。企业需要确保其在物联网网络中使用的端点安全解决方案应该实时工作,而不是停止数据流。通信协议企业需要设置有效的通信协议,以确保系统之间的所有交互都是由您公司的资产按照您设置的所有协议进行的;这就是所谓的数字官僚主义。当一个交互开始时,您的系统应该理解发起一个对话是否是一个好主意。您可以设置一系列步骤来启动或终止与另一台计算机或设备的通信。此外,企业还可以在每个连接上实现数字签名,这使有权访问它并将其实现到软件中。访问控制您必须设置访问协议并对每个用户进行身份验证。这意味着在中央服务器上创建多个用户,这些用户可以在网络上的其他计算机或位置使用。根据他们的工作角色,您可以授予或限制对用户的数据库、服务器、系统、传感器和其他设备的访问。这是防止恶意活动的完美方法,因为它不允许访问不打算访问的信息。例如,您可以实现双因素身份验证、生物识别扫描、访问卡、数字标志和强密码,以防止数据泄露。中央网络应该概述网络内的端口和数据传输,并密切关注外部通信。VPN通过对流量进行加密、屏蔽IP和拦截等功能来保护网络安全。然而,选择一个可靠的VPN提供商是必不可少的;否则,您的数据仍将处于危险之中。高端加密加密将有助于防止数据泄露,因为数据通过带有加密密钥的算法以二进制格式传输。你可以按照你想要的方式来设计算法或密钥。只有算法和数据才能衡量数据的结果。传出的数据不可读,没有明显的格式。在这里,数据通过网络传输到另一台计算机。通过另一种算法传递它和加密数据将重新创建原始数据。结语物联网正处于被采用的早期阶段,但物联网网络的有效使用可以为企业提供卓越的结果。实施像物联网这样的新技术可能充满风险、挑战和要求。然而,工业物联网是一项强大的技术,可以彻底改变业务运营。原文地址:cid:link_0
  • [技术干货] 好用的嵌入式设备日志输出模块 log.h【转载】
    有条件仿真的是更好,单是在编写嵌入式软件程序过程中,并不是所有的硬件都支持仿真或者方便仿真,这样大多数方法便是加打印信息进行找问题。相信大多数嵌入式开发者都会碰到对程序进行调试或者查找BUG的情况,常见的两种方法都是仿真和通过日志进行的。有条件仿真的是更好,单是在编写嵌入式软件程序过程中,并不是所有的硬件都支持仿真或者方便仿真,这样大多数方法便是加打印信息进行找问题。打印的接口有很多种,比如串口,网络,显示等等。简单的硬件开发串口估计是最常用的。这里简单记录下一种日志打印方法。目的:方便查找打印日志日志格式规范可以查看用户添加信息,文件信息,函数接口,以及文件所在行号支持format格式可以支持实时时间基本知识C语言中的__FILE__、LINE__和__FUNCTION:FILE 用于指示本行代码所在源文件的文件名;__LINE__用于指示本行代码所在源文件中的位置(行数);__FUNCTION__用于指示本行代码所在函数(函数名);注:"FILE "、"LINE"、"FUNCTION"等均大小写敏感支持需要添加头文件#include源码#define DEBUG_EN (1u) #if (DEBUG_EN) #define DEBUG_MAX_SIZE 512 extern char szBuf[DEBUG_MAX_SIZE]; #define DEBUG_INFO( format, ... ) do{\ u16 unLen = 0;\ unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE, "[INFO][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);\ unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen, format, ## __VA_ARGS__ );\ usart1_send_buf_with_txe((u8 *)szBuf,unLen);\ }while(0) #define DEBUG_WARN( format, ... ) do{\ u16 unLen = 0;\ unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE, "[WARN][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);\ unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen, format, ## __VA_ARGS__ );\ usart1_send_buf_with_txe((u8 *)szBuf,unLen);\ }while(0) #define DEBUG_ERR( format, ... ) do{\ u16 unLen = 0;\ unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE, "[ERR][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);\ unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen, format, ## __VA_ARGS__ );\ usart1_send_buf_with_txe((u8 *)szBuf,unLen);\ }while(0) #elif #define DEBUG_INFO(...) #define DEBUG_WARN(...) #define DEBUG_ERR(...) #endif源码主要使用宏定义的方式,为了支持文件、行号,函数等等,不能使用单独的函数进行定义。具体原因可以思考下,不过多赘述。C文件目前只有一个数组定义char szBuf[DEBUG_MAX_SIZE];。为了兼容,INFO,WARN和ERR三个共用一个buf,声明全局变量更主要的一个原因是使用了串口的中断发送函数usart1_send_buf_with_txe,而不是循环发送完成再退出,这里传输是进行指针传递的,发送使用中断的好处就是高效率,不耽误其他程序跑。当然移植的时候完全可以根据自己的接口和实现方式进行更换。原文地址:cid:link_0
  • [技术干货] COAP协议的双层模型及其传输特性【转载】
    Labs 导读作为物联网世界的主流协议之一,CoAP协议为低功耗受限设备的数据交互和网络接入提供了可能,IETF在RFC7252中对其进行了详细的定义,本文结合CoAP协议在和家亲中的应用场景对其双层模型及输特性进行介绍。和家亲是中国移动面向智慧家庭用户推出的智能连接类App,是物联网在家庭应用场景中的落地实践。物联网强调的是物与物之间的连接通信,在和家亲中实现这种物物连接的就是Andlink协议,它是对多种主流物联网协议的综合运用,其中包含CoAP、MQTT、LwM2M、HTTP等协议,他们的简单对比如下表所示。由于多个协议都涉及到CoAP,因此本文重点介绍CoAP协议双层模型及其传输特性。Part 01. 和家亲哪些场景用到了CoAP?在和家亲中,CoAP主要应用在下述2个场景中:1️⃣LPWAN网络(包括NB-IoT、LoRa、SigFox等)下,智能设备与家开平台通过LwM2M协议进行交互,LwM2M协议的底层便是基于UDP/UDP+DTLS传输层协议之上的CoAP协议。2️⃣Wi-Fi网络下,配网是实现智能设备后续注册、上线、管控的前提条件,配网过程中涉及到智能组网终端查找、发送入网请求、通知设备入网信息、设备入网成功广播、智能组网终端密码变更同步等步骤,这些步骤的交互即是通过CoAP协议完成。Part 02. 什么是CoAP协议?CoAP协议(Constrained Application Protocol,标准文档RFC7252),属于应用层协议,在M2M通信中的作用和互联网中的HTTP类似,但在定义上只是实现了REST的一个子集,更重要区别是HTTP运行于TCP之上,而CoAP运行于UDP协议之上,由于UDP建立的是非可靠连接,在网络数据传输过程中,无论是请求还是响应,均存在丢包的风险。那CoAP协议的传输如何保障可靠性呢?这就涉及到CoAP协议的双层模型:CoAP协议逻辑上分为Messaging Model和Request/Response Model,其中:Messaging Model:处理端到端之间的数据交换,并为各报文类型提供重传机制,来弥补传输过程中的不可靠性。通过CoAP消息头部的Message ID建立请求与应答消息之间的关联,实现可靠传输。Request/Response Model:定义了Client侧通过URI向服务端的资源发出操作请求和服务端响应的规则。通过CoAP消息头部的Token建立Request和Response关联,实现可靠响应。注意区分Request/Response Model中的Token和Messaging Model中的Message ID是两个不同字段,如下图[1]所示:下面分别从Request/Response Model和Messaging Model分析CoAP协议的传输特性。Part 03. Messaging Model的可靠消息传输上述介绍的中间CoAP定义了四种不同类型的报文:CON、NON、ACK、RST。其中CON报文需要接收方确认,即每一个CON报文都对应一个头部带有相同Message ID的ACK报文或RST报文,如果在规定的时间内请求方未收到ACK报文或RST报文,那么客户端将启动 “重传机制”。发送方未收到ACK/RST报文可能有两种原因:CoAP请求丢失:CoAP请求已经发出,但未到达服务端CoAP响应丢失:服务器已收到请求并返回响应信息,但响应未正确到达客户端与重传机制相关的参数包括:ACK_TIMEOUT、ACK_RANDOM_FACTOR、MAX_RETRANSMIT、MAX_TRANSMIT_SPAN、MAX_TRANSMIT_WAITACK_TIMEOUT:超时响应等待时间,默认2s。一个CON报文的初始等待时间为一个随机数,取值范围是ACK_TIMEOUT到ACK_TIMEOUT*ACK_RANDOM_FACTOR之间。随着重传次数增加,每一次的等待时间均为前一次的2倍。ACK_RANDOM_FACTOR:随机系数,默认1.5。MAX_RETRANSMIT:最大重传次数,固定值4次。MAX_TRANSMIT_SPAN:第一次发出CON报文到最后一次重新发送的最长时间间隔。MAX_TRANSMIT_WAIT:第一次发出CON报文到发送方放弃接收ACK或RST报文的最长时间间隔。为进一步说明Messaging Model重传机制,以和家亲中设备端向智能组网终端发送入网CON请求为例,假如在本次CON报文发送中ACK_TIMEOUT=2sACK_RANDOM_FACTOR=1.5首次超时响应等待时间取t1=2.5s (2s<=t1<=2*1.5s)由于网络较差尝试了4次重新发送都未收到ACK或RST响应报文,可以得到如下图所示的交互结果:需要注意的是上图只是为了说明重传机制的完整流程,只要CON消息发送后任意时刻,设备端收到来自服务端的ACK/RST消息,本次消息传送便会终止。通过这种重传机制,CoAP协议保证了端到端消息传输的可靠性。Part 04. Request/Response Model的消息传输Request/Response模型的交互方式类似于HTTP协议中的客户端和服务端交互的C/S模型。Request关注的是根据URI向服务端的资源发出操作请求,请求类型包括GET、POST、PUT 和 DELETE,但和HTTP不同的是不会先建立连接,而是通过CoAP消息进行异步交互,Request和Response之间通过CoAP消息头部的Token字段进行匹配。Response则根据Request类型和服务端当前状态的差异,分为Piggybacked Response、Separate Response、Non-confirmable Response3种不同类型:➤ Piggybacked Response(附带响应)下图[1]中展示了对于两个GET请求,服务端返回附带响应的例子,一个成功,一个导致了4.04(资源未找到)。通过ACK报文回应CON报文,是最通用的类型,属于可靠响应模式。➤ Separate Response(独立响应)假如Server由于系统繁忙等原因无法直接给出数据响应,那么它就会立即发回一个空的ACK消息,服务端在数据准备好后服务器端就会把它组装成一个新的CON类型消息(这需要客户端的ACK),进行异步响应。独立响应也属于可靠响应模式。下图[1]中可以看到两次交互中使用的Token一致,都是0x73;但是Message ID已经变掉了,从0x7a10变成了0x23bb。➤ Non-confirmable Response(无需响应)Client的请求如果是NON类型,Server一般也回NON类型消息,但服务器也有可能发送一个CON类型的消息作为响应。适用于对响应可靠性要求不高的场景。例如对温度传感器数据的重复读取,并不需要每一次都成功。图中[1]request和response使用了相同的Token:0x74。Part 05. 总结CoAP协议目前在和家亲的智能设备大网和局域网连接、管控中都起到了重要的连接作用。作为物联网的主流协议之一,CoAP协议除了本身单独使用之外,还是LwM2M协议的底层消息传递协议,和MQTT相比,CoAP更加轻量、开销更低,在诸如和家亲设备配网等场景中更加合适。在使用CoAP时结合场景选择合适的Message和Request/Response模型对保障传输可靠性,提高客户端和服务端的交互效率十分重要。原文地址:cid:link_0
  • [技术干货] 智能甲醛检测【转】
    一、 介绍本项目是基于BearPi套件开发的智能甲醛检测系统Demo,该设备硬件部分主要由小熊派单板套件和和甲醛检测传感器组成。智能甲醛检测系统可以通过云和手机建立连接,可以在手机上设置甲醛浓度阈值,传感器感知到的甲醛浓度超过阈值之后,将会通过云传给手机,并报警。交互流程智能甲醛检测-开源基础软件社区 实物简介智能甲醛检测-开源基础软件社区我们使用小熊派bearpi_hm_nano开发底板+ SGP30传感器拓展板来模拟智能甲醛检测设备。RESET按键控制设备重启;RESET按键组合控制按键可以清除已保存的配网信息,具体操作:先按下控制按键F2,然后按下RESET按键;通过NFC模块实现设备碰一碰快速配网;实物操作体验智能甲醛检测-开源基础软件社区二、快速上手1. 硬件准备小熊派nano 通用底板与SGP30传感器连接如实物图所示,具体细节如下:电源线:分别连接SGP30传感器vcc pin和bearpi开发板V3.3 pin;GND:分别连接SGP30传感器vcc pin和bearpi开发板GND pin;I2C sda:分别连接SGP30传感器sda pin和bearpi开发板GPIO_0 pin;I2C scl:分别连接SGP30传感器scl pin和bearpi开发板GPIO_1 pin。2. Linux编译服务器基础环境准备本次搭建的开发基础环境由windows 工作台和Linux 编译服务器组成。windows 工作台可以通过samba 服务或ssh 方式访问Linux编译服务器。其中windows 工作台用来烧录和代码编辑,Linux编译服务器用来编译OpenHarmony代码,为了简化步骤,Linux编译服务器推荐安装Ubuntu20.04。安装和配置Python打开Linux终端。如果使用ubuntu20.04,python版本无需切换。输入如下命令,查看python版本号,需要使用python3.7以上版本,否则参考 系统基础环境搭建。python3 --version 安装并升级Python包管理工具(pip3)。sudo apt-get install python3-setuptools python3-pip -y sudo pip3 install --upgrade pip 安装hb运行如下命令安装hbpy python3 -m pip install --user ohos-build设置环境变量vim /.bashrc将以下命令拷贝到.bashrc文件的最后一行,保存并退出。export PATH=/.local/bin:$PATH执行如下命令更新环境变量。source /.bashrc执行"hb -h",有打印以下信息即表示安装成功.usage: hb OHOS build system positional arguments: {build,set,env,clean} build Build source code set OHOS build settings env Show OHOS build env clean Clean output optional arguments: -h, --help show this help message and exit3. Hi3861开发环境准备在Linux编译服务器上搭建好基础开发环境后,需要安装OpenHarmony 编译Hi3861 平台特有的开发环境。安装编译依赖基础软件sudo apt-get install -y build-essential gcc g++ make zlib* libffi-dev安装Scons打开Linux 终端。运行如下命令,安装Scons安装包。python3 -m pip install scons运行如下命令,查看是否安装成功。如果安装成功,查询结果下图所示。scons -v安装gcc_riscv32(WLAN模组类编译工具链)下图 Scons安装成功界面,版本要求3.0.4以上智能甲醛检测-开源基础软件社区安装python模块sudo pip3 install setuptools kconfiglib pycryptodome ecdsa six --upgrade --ignore-installed six安装gcc_riscv32(WLAN模组类编译工具链)打开Linux终端。下载gcc_riscv32镜像,下载链接。设置环境变量将压缩包解压到根目录tar -xvf gcc_riscv32-linux-7.3.0.tar.gz -C ~设置环境变量。vim ~/.bashrc将以下命令拷贝到.bashrc文件的最后一行,保存并退出。export PATH=/gcc_riscv32/bin:$PATH生效环境变量。source ~/.bashrc在命令行中输入如下命令,如果能正确显示编译器版本号,表明编译器安装成功。riscv32-unknown-elf-gcc -v4. 源码下载&编译准备 1.码云工具下载 curl cid:link_1 > /usr/local/bin/repo chmod a+x /usr/local/bin/repo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests 2.代码下载 1) OpenHarmony代码下载#特别注意:请下载OpenHarmony 1.0.1 版本,后续会更新支持OpenHarmony其他版本 mkdir ~/OpenHarmony1.01 cd ~/OpenHarmony1.01 repo init -u git@gitee.com:openharmony/manifest.git -b OpenHarmony_1.0.1_release --no-repo-verify repo sync -c repo forall -c 'git lfs pull' 1. 2) 设备侧代码下载具体仓库地址:cid:link_0具体下载命令如下:git clone git@gitee.com:openharmony-sig/knowledge_demo_smart_home.git 1.3) 编译前准备代码拷贝 假设knowledge_demo_smart_home和源码OpenHarmony1.01均存放在你的ubuntu用户根目录下,命令如下: cp -rfa ~/knowledge_demo_smart_home/dev/device/bearpi ~/OpenHarmony1.01/device/ cp -rfa ~/knowledge_demo_smart_home/dev/team_x ~/OpenHarmony1.01/vendor/ cp -rfa ~/knowledge_demo_smart_home/dev/third_party/iot_link ~/OpenHarmony1.01/third_party/整合并修改完成后的目录结构如下图: 5. 编译&烧录编译命令: hb set // 如果是第一次编译,Input code path 命令行中键入"./" 指定OpenHarmony工程编译根目录后 回车, 如下图所示,使用键盘上下键选中智能甲醛检测设备hb build // 如果需要全量编译,可以添加-f 选项详细的代码编译及固件烧录步骤,请参考 编译和烧录指南6. 设备配网在设备上电前需准备好安装了数字管家应用的HarmonyOS手机,详情见数字管家应用开发, 并在设置中开启手机的NFC功能;写设备NFC标签,详细操作见设备NFC标签指导文档;烧录完成后,上电。开发者在观察开发板上状态LED灯以8Hz的频率闪烁时,将手机上半部靠近开发板NFC标签处;无需任何操作手机将自动拉起数字管家应用并进入配网状态,配网过程中无需输入热点账号密码。 具体无感配网相关流程参考7. 操作体验1)阈值设置配网完成后,数字管家应用会自动进入智能台灯的控制页面,通过控制页面设置甲醛传感器告警阈值。2)甲醛超标告警当检测到的甲醛数值,超过预先设定的阈值时,会通知数字管家应用告警,并且告警消息还会推送同一家庭账号的所有成员。原文地址 https://ost.51cto.com/posts/10901 原文作者: 奶盖
  • [技术干货] 【OpenHarmony样例】基于启航KP_IOT开发板的智能风扇模块【转】
    本示例将演示如何利用启航KP_IOT主控板和智能风扇模块进行案例开发。模块介绍智能风扇模块主要的部件有STH30温湿度传感器,一个红外传感器,一个led灯,一个按键和电机,该模块能够实现按键控制电机的启停,电机启动一共分三档,按一次按键增加一个档位,控制电机这一部分用到了pwm,和gpio的知识点。该模块上的STH30传感器可以监控环境温湿度,STH30是通过i2c进行数据交互的,采集的数据还可以显示在oled屏上,oled屏是通过spi进行数据交互。模块上的红外传感器能够实现对物体的检测,当红外传感器检测到物体时led灯会被点亮。智能风扇模块主要试验步骤我们将调用motor_demo()函数,我们就可以在motor_module.c文件中motor_demo()函数声明中完成电机的控制功能,电机控制需要用到pwm,按键需要用到一个gpio,第一步先对io口进行复用,像i2c,pwm,spi,uart等这样功能性引脚复用是在wifiiot/init/app_io_init.c文件中完成的。查看电路原理图和芯片手册中可以知道电机是使用的pwm2,知道电机使用的是pwm2之后,就要知道pwm2是哪个gpio引脚输出的,在include/hi_io.h中可以查看,每个gpio引脚可以复用的功能。gpio2管能够复用成gpio,uart1_rts,spi,pwm2_out等功能,我们需要用到的是pwm2_out,所以在wifiiot/init/app_io_init.c中将gpio_2复用成pwm2_out功能,设置引脚功能的函数hi_u32hi_io_set_func(hi_io_name id, hi_u8 val)的具体功能介绍可以在include/hi_io.h中可以查看。pwm设置完成之后在motor_module.c文件中motor_gpio_io_init()函数中对按键接入的引脚进行复用,从原理图可看到按键KEY-1是接GPIO_05。步骤1 按键对应io5之后在motor_gpio_io_init()中将io5复用成gpio/*gpio5按键控制电机速度*/ ret = hi_io_set_func(HI_IO_NAME_GPIO_5, HI_IO_FUNC_GPIO_5_GPIO); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_io_set_func ret:%d\r\n", ret); return; } printf("----- gpio5 fan set func success-----\r\n"); ret = hi_gpio_set_dir(HI_GPIO_IDX_5, HI_GPIO_DIR_IN); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_set_dir1 ret:%d\r\n", ret); return; } printf("----- gpio set dir success! -----\r\n");io设置完成之后,就可以进行功能的编写了,我们想要实现的功能是通过按键控制电机的启停,电机有三个档位,按键按一次增加一个档位,电机处于三档时再按一次按键电机将停止。首先我们要创建一个任务去实时监听按键接入io引脚的状态,OpenHarmony系统中任务的创建调用hi_u32hi_task_create(hi_u32 *taskid, const hi_task_attr attr,hi_void (*task_route)(hi_void *), hi_void *arg);步骤2 创建的电机任务的属性,包括任务优先级,任务栈的大小,任务名,在任务处理函数中去实现我们想要的功能//创建的电机任务的属性,包括任务优先级,任务栈的大小,任务名等 static unsigned int g_MonitorTask; const hi_task_attr MonitorTaskAttr = { .task_prio = 20, //优先级范围20~30之间 .stack_size = 4096, //任务大小 .task_name = "BuggyNetworkMonitorTask",//任务名称,可自行修改 }; void *MonitorOledTask(void * para) /* OLEDtask处理函数 */ { while(1){ test_led_screen(); printf("OLED task \r\n"); } return NULL; } // 电机task处理函数 void *MonitorMotorTask(void * para) { while(1){ gpio_getval(); //主要任务,对电机的控制在此函数中实现 infrared_ctrl(); //printf("fan task \r\n"); } return NULL; }步骤3 在gpio_getval()实现对电机控制;//按键控制电机程序 hi_void gpio_getval(hi_void) { hi_u32 ret; int temp; static int key = 0; //将gpio_val_1置为1,置为1是因为从原理图中可知按键默认是高电平,按下为低电平 hi_gpio_value gpio_val_1 = HI_GPIO_VALUE1; temp = infrared_ctrl(); //获取gpio5引脚电平,并赋值给gpio_val_1 ret = hi_gpio_get_input_val(HI_GPIO_IDX_5, &gpio_val_1); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_get_input_val ret:%d\r\n", ret); return; } //printf("----- gpio input val is:%d. -----\r\n", gpio_val_1); //当gpio_val_1为低电平是说明按下了按键,按1次按键增加一个档位 if(gpio_val_1 == 0){ //休眠1s是为了消除按键的抖动 sleep(1); if(gpio_val_1 == 0){ key++; } //key表示是几档,根据不同的档位再输出不同占空比的pwm波去控制电机 switch(key){ case 0: break; case 1: //电机1档,控制端口2输出1占空比的pwm波 motor_pwm_start(1); break; case 2: //电机2档,控制端口2输出2占空比的pwm波 motor_pwm_start(2); break; case 3: //电机3档,控制端口2输出3占空比的pwm波 motor_pwm_start(3); break; default: printf("invalid mode \r\n"); } //当key大于4或等于0时停止电机 if(key >= 4 || key == 0 || temp == 1){ key = 0; ret = hi_pwm_stop(HI_PWM_PORT_PWM2); if(ret != 0){ printf("hi_pwm_stop failed \r\n"); } } } //printf("key : %d \r\n",key); }pwm波控制电机输出部分程序:在使用pwm之前需要先对pwm进行初始化,初始化pwm只需要调用hi_pwm_init(parm),函数中的参数(parm)是需要初始化的端口,使用的pwm2需要填宏定义HI_PWM_PORT_PWM2,具体宏定义含义在include/hi_pwm.h中有说明。步骤4 对端口的初始化只需要完成一次,所以在创建电机任务之前调用一次motor_pwm_init()即可hi_void motor_pwm_init(hi_void) { int ret = -1; ret = hi_pwm_deinit(HI_PWM_PORT_PWM2); //初始化端口2 if(ret != 0){ printf("hi_pwm_deinit failed :%#x \r\n",ret); } ret = hi_pwm_init(HI_PWM_PORT_PWM2); //初始化端口2 if(ret != 0){ printf("hi_pwm_init failed :%#x \r\n",ret); } ret = hi_pwm_set_clock(PWM_CLK_160M); //设置端口2的时钟源频率 if(ret != 0){ printf("hi_pwm_set_clock failed ret : %#x \r\n",ret); } }对电机速度的控制实际上就是控制pwm的占空比和频率,想要输出不同占空比的pwm波调用函数hi_u32hi_pwm_start(hi_pwm_port port, hi_u16 duty, hi_u16freq);参数port表示端口号,duty占空比值,freq频率。在我们使用的模块中,时钟频率默认是160000000hz,所以可以定义一个宏去表示时钟频率,这里我们是用PWM_CLK_FREQ表示时钟频率,分频倍数165535,频率范围就是2441160000000(频率=时钟源频率/分频倍数),我们用最低频率就可以了,所以将频率用一个宏freq去表示值为2441。步骤5 motor_pwm_start(unsigned int duty)中duty就表示占空比,想让pwm2端口输出多少占空比的波形,直接在调用该函数时传入占空比值就可以了。hi_void motor_pwm_start(unsigned int duty) { int ret = 0; DBG("motor start \r\n"); if(duty == 0){ ret = hi_pwm_stop(HI_PWM_PORT_PWM2); //停止pwm2端口输出 if(ret != 0){ printf("hi_pwm_start failed ret : %#x \r\n",ret); } } ret = hi_pwm_start(HI_PWM_PORT_PWM2, duty*(PWM_CLK_FREQ/freq)/100, PWM_CLK_FREQ/freq); //输出duty占空比的pwm波 if(ret != 0){ printf("hi_pwm_start failed ret : %#x \r\n",ret); } }步骤6 motor_pwm_start(unsigned int duty)中duty就表示占空比,想让pwm2端口输出多少占空比的波形,直接在调用该函数时传入占空比值就可以了。hi_void motor_demo(hi_void) { int ret; motor_gpio_io_init(); //完成对按键所接io的复用 motor_pwm_init(); //对pwm进行初始化 //创建一个任务去专门处理电机控制任务 ret = hi_task_create(&g_MonitorTask, // task标识// &MonitorTaskAttr, MonitorMotorTask, // task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor motor task failed [%d]\r\n", ret); return; } return; }红外传感器模块红外传感器有一个发射端和一个接收端,当发射端发出的电磁波被挡住返回,接收端接收到后红外传感器接到模块上的引脚就会从低电平变成高电平,所以我们可以通过监控红外传感器的引脚电平高低来判断是否检测到物体,目前实现的现象是,当检测到物体时led就会被点亮,没检测到物体led就灭。写程序之前我们要先确定红外传感器接入的引脚和led接入的引脚,从原理图中可以看到红外传感器LED_infrared接入的引脚是GPIO_07,LED_SW1灯接入的引脚是GPIO_06。步骤1 知道红外传感器和led接入的引脚后,就需要对相应的IO进行复用,因为是同一个模块所以可以在motor_gpio_io_init()中实现io7,io8的复用。//设置io8的方向,因为led灯是输出信号,所以设置成out ret = hi_gpio_set_dir(HI_GPIO_IDX_8, HI_GPIO_DIR_OUT); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_set_dir1 ret:%d\r\n", ret); return; } /*gpio7 电机模块红外传感*/ ret = hi_io_set_func(HI_IO_NAME_GPIO_7, HI_IO_FUNC_GPIO_7_GPIO); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_io_set_func ret:%d\r\n", ret); return; } printf("----- io set func success-----\r\n"); //设置io7的方向,因为红外传感器是输入信号,所以设置成输入 ret = hi_gpio_set_dir(HI_GPIO_IDX_7, HI_GPIO_DIR_IN); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_set_dir1 ret:%d\r\n", ret); return; } printf("----- gpio set dir success! -----\r\n");步骤2对io功能复用完成后,就可以完成对led控制这一部分的功能了,首先这两引脚的默认值都是低电平,所以先将这两个引脚赋值HI_GPIO_VALUE0,然后根据gpio_val_7引脚的电平高低来判断红外传感器是否检测到物体,检测到物体是将gpio_val_8置为高电平点亮led。hi_void infrared_ctrl(hi_void) { hi_u32 ret; hi_gpio_value gpio_val_7 = HI_GPIO_VALUE0; //设置gpio_val_7默认值 hi_gpio_value gpio_val_8 = HI_GPIO_VALUE0; //设置gpio_val_8默认值 ret = hi_gpio_get_input_val(HI_GPIO_IDX_7, &gpio_val_7); //监控gpio_val_7的电平 if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_get_input_val ret:%d\r\n", ret); return; } //printf("----- gpio input val is:%d. -----\r\n", gpio_val_7); if(gpio_val_7 == 1){ hi_gpio_set_ouput_val(HI_GPIO_IDX_8,HI_GPIO_VALUE1); //gpio_val_7为高电平时,将HI_GPIO_IDX_8置为高电平输出 }else{ hi_gpio_set_ouput_val(HI_GPIO_IDX_8,HI_GPIO_VALUE0);//gpio_val_7为低电平时,将HI_GPIO_IDX_8置为低电平输出 } }步骤3 功能完成后就需要在适合的时机去调用,因为红外线监控也是需要实时监控gpio引脚,和监控按键一样所以可以在电机任务中去调用。void *MonitorMotorTask(void * para) /* 电机task处理函数 */ { while(1){ gpio_getval(); //电机按键监控 infrared_ctrl(); //红外传感器监控 } return NULL; }sht3x温湿度传感器模块SHT3x-DIS是Sensirion新一代的温湿度传感器,精度为±2%RH和±0.3℃,输入电压范围从2.4V到5.5V,采用IIC总线接口,速率可达1MHz。测量温湿度范围分别为是-40℃ ~ 125℃和0 ~ 100%。具体规格和原理参考说明手册。步骤1 初始化sth3xvoid SHT3X_init(void) { int ret = 0; unsigned short data[2] = {0}; SHT3X_SoftReset(); //软件复位SHT3X SHT3x_WriteCMD(CMD_READ_SERIALNBR); //向i2c发送读命令 SHT3x_WriteCMD(CMD_MEAS_PERI_2_M); //设置读取周期为2hz }步骤2 读取测量数据void SHT3X_ReadMeasurementVal(unsigned int para) { (void) para; static int cunt = 0; static float humidity = 0.0; static float temperature = 0.0; SHT3X_ReadMeasurementBuffer(&temperature,&humidity); //将读取数据存到temperature和humidity中 } //数据存储的具体实现 void SHT3X_ReadMeasurementBuffer(float* temperature, float* humidity) { unsigned int rawValueTemp = 0; SHT3x_WriteCMD(CMD_FETCH_DATA); //读取数据前先发送一个周期读取指令 SHT3x_Read4BytesDataAndCrc((unsigned short *)&rawValueTemp);//读取i2c上四个字节的数据 dump_buf((unsigned char *)&rawValueTemp,sizeof(rawValueTemp)); //调试打印读取的数据 *temperature = SHT3X_CalcTemperature(rawValueTemp); //将读取的数据转换成浮点型温度数据 *humidity = SHT3X_CalcHumidity(*((unsigned short *)(&rawValueTemp)+1));//将读取的数据转换成浮点型湿度数据 Temperature = *temperature; Humidity = *humidity; DBG("temp :%f,hum :%f \r\n",Temperature,Humidity); //打印读取的温湿度 } //将读取的数据转换成浮点型的温度 static float SHT3X_CalcTemperature(unsigned short rawValue) { return 175.0f * (float)rawValue / 65535.0f - 45.0f; //转换公式 } //将读取的数据转换成浮点型的湿度 static float SHT3X_CalcHumidity(unsigned short rawValue) { return 100.0f * (float)rawValue / 65535.0f; //转换公式 } //读取4字节数据的具体实现 int SHT3x_Read4BytesDataAndCrc(unsigned short *data) { int ret = -1; unsigned char sendbuf[2] = {0}; unsigned char rcvbuf[6] = {0}; hi_i2c_data sht3x_i2c_data = { 0 }; //i2c在该模块的数据收发数据都是存储在结构体中的,该结构体可以再include/hi_i2c.h中查看 sht3x_i2c_data.send_buf = sendbuf; sht3x_i2c_data.send_len = sizeof(sendbuf); sht3x_i2c_data.receive_buf = rcvbuf; sht3x_i2c_data.receive_len = sizeof(rcvbuf); if(data == NULL){ DBG("invalid para \r\n"); return ret; } ret = hi_i2c_read(0, ((unsigned char)0x44) << 1 | 0x01, &sht3x_i2c_data); //sht3x地址为0x44,读温湿度传感器中数据,数据存储在sht3x_i2c_data中 if(ret != 0){ DBG("hi_i2c_read failed ret :%#x \r\n",ret); return ret; } ret = SHT3X_CheckCrc(rcvbuf,2,rcvbuf[2]); //将读取的数据进行校验 if(ret != NO_ERROR){ DBG("read serial number crc check failed \r\n"); return ret; } ret = SHT3X_CheckCrc(&rcvbuf[3],2,rcvbuf[5]); //将读取的数据进行校验 if(ret != NO_ERROR){ DBG("read serial number crc check failed \r\n"); return ret; } data[0] = rcvbuf[0] << 8 | rcvbuf[1]; //将数据存到data数组中 data[1] = rcvbuf[3] << 8 | rcvbuf[4]; return 0; }步骤3 任务调用hi_void motor_demo(hi_void) { int ret; SHT3X_init(); //初始化SHT3X ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorSthTask, // task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor motor task failed [%d]\r\n", ret); return; } return; }到这一步温湿度传感器的程序已经编写完成了,可以将程序进行编译然后下载到模组中验证一下是否可以读取温湿度,如果能读取到温湿度,在日志中会打印出读取的数据。OLED显示模块采集完成数据之后可以在oled模块上显示,oled模块的具体开发详见oled开发流程知道,这里是直接使用oled去显示SHT3X读取的温湿度,显示温湿度首先我们要对oled进行初始化,我们使用的spi0所以初始化时spi_id=0。hi_void screen_spi_master_init(hi_spi_idx spi_id){int ret = -1;//screen_ERR;test_spi_para spi_para; //test_spi_para结构体是spi的基础属性,定义在oled_module/spi_screen.h文件中步骤1 给spi基础属性赋值spi_para.spi_id = spi_id; //spi端口号,我们是用的是0 spi_para.irq = HI_FALSE; //是否启用中断,选择否 spi_para.cfg_info.data_width = HI_SPI_CFG_DATA_WIDTH_E_8BIT; //传输数据位为8位 spi_para.cfg_info.cpha = HI_SPI_CFG_CLOCK_CPHA_0; //时钟相位0,采集第一个跳变沿数据 spi_para.cfg_info.cpol = HI_SPI_CFG_CLOCK_CPOL_0; //时钟极性0,空闲状态为低电平 spi_para.cfg_info.fram_mode = HI_SPI_CFG_FRAM_MODE_MOTOROLA; //选用的通讯协议 spi_para.cfg_info.endian = HI_SPI_CFG_ENDIAN_LITTLE; //数据传输为小段模式 spi_para.slave = HI_FALSE; //没有从机 spi_para.lb = HI_FALSE; //不设置回环测试模式 spi_para.dma_en = HI_FALSE; //不采用dma spi_para.cfg_info.freq = 2000000; //通讯频率2Mhz test_spi_printf("app_demo_spi_test_cmd_mw_sr Start"); ret = screen_spi_init(spi_para.spi_id, &(spi_para.cfg_info), spi_para.slave); //spi的系统初始化 if (ret == HI_ERR_SUCCESS) { test_spi_printf("SPI init succ!"); } else { test_spi_printf("SPI init fail! %x ", ret); return; } hi_spi_set_loop_back_mode(spi_para.spi_id, spi_para.lb); //设置回环测试模式 hi_sleep(1000); /* 1000 */ hi_spi_set_irq_mode(spi_para.spi_id, spi_para.irq); //设置中断模式 hi_spi_set_dma_mode(spi_para.spi_id, spi_para.dma_en); //设置dma模式 hi_sleep(1000); /* 1000 */ }步骤2 初始化完成之后,需要创建一个oled任务去完成显示功能ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorOledTask, // task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor oled task failed [%d]\r\n", ret); return; } void *MonitorOledTask(void * para) /* OLEDtask处理函数 */ { while(1){ test_led_screen(); //显示功能 printf("OLED task \r\n"); } return NULL; }温湿度的显示主要是由TEST_Menu2()显示的,这个oled模块显示数字有一个特点,它显示20这样的两位数时,是将这两位数分开来显示的,先显示2再显示0,我们读取的温度是一个浮点型数据,所以在显示时需要将各个位上的数字分离出来。void TEST_Menu2(void) { extern float Temperature; //Temperature的读取是在不同的文件中,所以想在这个文件中使用就需要将Temperature定义成全局变量,这边引用时加extern extern float Humidity; printf("Temperature:%f Humidity:%f \r\n",Temperature,Humidity); int a = 0; int b = 0; int c = 0; int d = 0; int e = 0; int f = 0; int g = 0; a = Temperature; b = a / 10; //整除获取十位上的数据 c = a % 10; //取余获取个位上的数据 d = (Temperature - a) * 10; //Temperature为浮点型数据,a为整形,相减之后就是小数,再乘十,获取到的就是小数后的第一位 e = Humidity; f = e / 10; //整除获取十位上的数据 g = e % 10; //取余获取各位上的数据 printf("b:%d c:%d d:%d f:%d g:%d\r\n",b,c,d,f,g); u8 i; //图形界面的绘制 GUI_DrawLine(0, 10, WIDTH-1, 10,1); GUI_DrawLine(WIDTH/2-1,11,WIDTH/2-1,HEIGHT-1,1); GUI_DrawLine(WIDTH/2-1,10+(HEIGHT-10)/2-1,WIDTH-1,10+(HEIGHT-10)/2-1,1); GUI_ShowString(0,1,"2021-08-1",8,18); GUI_ShowString(14,HEIGHT-1-10,"Cloudy",8,1); GUI_ShowString(WIDTH/2-1+2,13,"TEMP",8,1); GUI_DrawCircle(WIDTH-1-19, 25, 1,2); GUI_ShowString(WIDTH-1-14,20,"C",16,1); GUI_ShowString(WIDTH/2-1+2,39,"HUMI",8,1); GUI_DrawBMP(6,16,51,32, BMP5, 1); //温湿度的显示 GUI_ShowNum(WIDTH/2-1+9,20,b,1,16,1); //温度的十位数字显示 GUI_ShowNum(WIDTH/2-1+9+8,20,c,1,16,1); //温度的十位数字显示 GUI_ShowString(WIDTH/2-1+9+8+8,20,".",16,1); //小数点显示 GUI_ShowNum(WIDTH/2-1+9+8+16,20,d,1,16,1); //温度的小数显示 GUI_ShowNum(WIDTH/2-1+5,46,f,1,16,1); //湿度的十位显示 GUI_ShowNum(WIDTH/2-1+5+8,46,g,1,16,1); //湿度的个位显示 GUI_ShowString(WIDTH/2-1+5+8+8,46,"/rh",16,1); //湿度的单位显示 sleep(2); }步骤1 在motor_demo()中去调用hi_void motor_demo(hi_void) { int ret; motor_gpio_io_init(); //智能风扇模块gpio的初始化 SHT3X_init(); //温湿度传感器的初始化 motor_pwm_init(); //pwm的初始化 hi_spi_deinit(HI_SPI_ID_0); screen_spi_master_init(0); //spi的初始化 ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorOledTask, // oled task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor oled task failed [%d]\r\n", ret); return; } ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorMotorTask, // motor task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor motor task failed [%d]\r\n", ret); return; } ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorShtTask, // sht task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor motor task failed [%d]\r\n", ret); return; } return; }修改 applications / sample / wifi-iot / app / 路径下 BUILD.gn 文件,指定 motor_module 参与编译。"22_KP_SHT30_example:motor_module",运行结果将智能风扇模块和oled模块安装在开发板上,将上面编译好的程序下载到模组上验证温湿度的显示。原文地址:【OpenHarmony样例】基于启航KP_IOT开发板的智能风扇模块 - OpenHarmony开源社区 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com)
  • [行业资讯] 2024年物联网和智能设备的主要趋势【转载】
    物联网和智能设备格局将继续快速发展,带来令人兴奋的趋势和创新。本文将探讨2024年影响物联网和智能设备行业的主要趋势。物联网(IoT)和智能设备持续彻底改变我们的生活和工作方式。这些技术改变了我们的家庭、城市和工业,提供了前所未有的便利、效率和连通性。展望2024年,很明显,物联网和智能设备格局将继续快速发展,带来令人兴奋的趋势和创新。本文将探讨2024年影响物联网和智能设备行业的主要趋势。1、5G连接推动物联网扩展5G网络的推出将对物联网生态系统产生重大影响。凭借更快、更可靠和低延迟的连接,5G将使物联网设备大幅增加。这将为实时数据处理铺平道路,使自动驾驶汽车、远程手术和增强现实等应用更加易于访问和高效。2、人工智能和机器学习集成人工智能(AI)和机器学习(ML)将在增强物联网设备功能方面发挥关键作用。这些技术将使设备能够从用户行为中学习、适应偏好,并提出预测建议。例如,智能家居系统可能会了解用户日常生活,并相应地调整照明、供暖和安全。3、边缘计算实现更快的响应边缘计算将在2024年变得更加普遍。其涉及在更接近源(物联网设备)的地方处理数据,而不是将所有数据发送到云端。这将导致更快的响应时间和更少的延迟,使物联网应用更加高效和可靠。4、可持续发展和绿色物联网可持续发展是全球日益关注的问题,物联网可以促进更环保的实践。到2024年,预计会看到旨在优化能源消耗、减少浪费和促进可持续生活的物联网解决方案。从智能能源管理到智慧城市减少浪费,绿色物联网将获得关注。5、增强物联网安全性随着物联网设备的激增,安全仍然是重中之重。2024年,人们将更加关注强大的安全措施,包括先进的加密技术、生物识别技术和区块链技术。这将保护用户免受潜在的网络威胁和隐私泄露。6、健康与保健监测医疗保健行业将继续利用物联网进行远程患者监控和个性化医疗保健。可穿戴设备和智能设备将提供持续健康跟踪、早期疾病检测和远程医疗等功能,使医疗保健变得更加便捷和高效。7、智慧城市的发展智慧城市将在2024年进一步发展。物联网将增强城市基础设施、交通、废物管理和公共安全。智能交通管理、节能照明和改进的应急服务将成为智慧城市景观的一部分。8、语音助手和自然语言处理语音激活的智能设备将变得更加复杂。自然语言处理(NLP)和理解将实现与物联网设备的更多对话交互。虚拟助手将理解语境、语气和细微差别,使交互更加人性化。9、农业物联网到2024年,物联网对农业的影响将进一步扩大。农民将使用物联网设备来监测土壤质量、作物健康和天气状况。这些数据将有助于优化农业实践、提高产量并减少对环境的影响。10、增强现实和虚拟现实(AR/VR)集成AR和VR将在物联网领域找到更多应用。智能眼镜、头盔和可穿戴设备将为教育、培训、游戏和远程协作提供身临其境的体验。物联网设备将为这些AR/VR体验提供动力。原文地址:cid:link_0
  • [技术干货] 11月嵌入式项目合集
    基于STM32的油井数据采集与处理cid:link_2本文介绍了油井数据采集与传输的流程,并给出了相应的Python代码示例。通过实时采集油井数据,并将其传输到服务器,从而实现对油井状态的监测和维护。可作为平时训练的例子。 开天平台+鸿蒙OS小熊派打造智能大棚温控报警cid:link_0本文把华为的众多生态结合在一起运用,对于想要了解华为云iot生态的用户具有非常好的借鉴意义IoTDA设备接入服务和边缘计算的结合:构建高效的边缘物联网方案cid:link_1本文介绍了边缘计算的概念,并且提供了一些python版本的demo,可以为入门的iot的新手提供一些边缘计算方面的的帮助。STC89C52+HX711完成电子秤设计cid:link_3此文介绍了C52制作一个电子秤,可以作为学习C52单片机的入门项目,丰富嵌入式开发的经验和了解电路的整体设计。IoTDA平台OTA升级与设备远程控制:华为云物联网平台的能力介绍cid:link_3
  • [技术干货] 启航kp OpenHarmony环境搭建
    前提启航kp OpenHarmony环境搭建搭建好OpenHarmony环境未搭建好可以参考OpenHarmony docker环境搭建安装vscode下载好启航kp所需的开发包和样例下载地址搭建过程进入正确文件夹首先要进入 /home/openharmony 目录下,如果没有打开在vsc左上角找到文件,点击,然后找到打开文件夹,输入想要进入的目录。 能看到便代表成功进入。配置开发板所需要的文件在vendor文件夹内新增文件夹:isoftstone,把从gitee下载文件中vendor_isoftstone文件夹中的qihang文件夹复制到isoftstone目录下。 device/board文件夹内新增文件夹:isoftstone,在isoftstone文件夹中新建文件夹:qihang,再将附加包内的board_qihang文件夹的人内容拷贝到这个文件夹内: 检验是否安装成功输入hb set 选中启qihang输入hb build -f尝试编译 输出 qinghang build success则构建成功。制作“hello word”案例在device/board/isoftstone/qihang/app目录建一个目录:01hello,然后在这个目录下新建文件:hello.c内容如下 ```c #include "ohos_init.h"void hello_demo(void) { printf("hello word!\n") } SYS_RUN(oled_demo);2. 在hello.c同级别目录添加文件BUILD.gn,填入以下内容static_library("hello_demo"){ sources=["hello.c"] }3. 在app目录BUILD.gn添加01hello模块import("//build/lite/config/component/lite_component.gni")lite_component("app") { features = [ "01hello:hello_demo", ] }5. hb set选择启航开发板hb build -f进行编译有以下输出表示编译成功 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20230912/1694523331196418595.png) 6。 编译成功后可以在out/qihang/qihang/Hi3861_wifiiot_app_allinone.bin找到编译后的二进制文件
  • [技术干货] OpenHarmony docker环境搭建
    OpenHarmony docker环境搭建要求一台安装ubuntu的虚拟机,vscode软件安装docker在 Ubuntu 上安装 Docker 非常直接。我们将会启用 Docker 软件源,导入 GPG key,并且安装软件包。首先,更新软件包索引,并且安装必要的依赖软件,来添加一个新的 HTTPS 软件源:sudo apt update sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common使用下面的 curl 导入源仓库的 GPG key:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -将 Docker APT 软件源添加到你的系统:sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"现在,Docker 软件源被启用了,你可以安装软件源中任何可用的 Docker 版本。01.想要安装 Docker 最新版本,运行下面的命令。如果你想安装指定版本,跳过这个步骤,并且跳到下一步。sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io02.想要安装指定版本,首先列出 Docker 软件源中所有可用的版本:sudo apt update apt list -a docker-ce可用的 Docker 版本将会在第二列显示。docker-ce/focal 5:19.03.93-0ubuntu-focal amd64 通过在软件包名后面添加版本=<VERSION>来安装指定版本:sudo apt install docker-ce=<VERSION> docker-ce-cli=<VERSION> containerd.io 一旦安装完成,Docker 服务将会自动启动。你可以输入下面的命令,验证它: sudo systemctl status docker 输出将会类似下面这样:● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-05-21 14:47:34 UTC; 42s ago ...当一个新的 Docker 发布时,你可以使用标准的sudo apt update && sudo apt upgrade流程来升级 Docker 软件包。拉取镜像运行 Docker 软件,打开 CMD 命令行或者 PowerShell 终端,使用指令下载 docker 官方镜像:docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0等待下载完成之后,使用 docker images 可以查看到已下载的 docker 镜像 此时镜像名称太长不方便使用,可以使用重命名操作对镜像重命名:docker image tag swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 openharmony-docker:1.0.0此时使用 docker images 再次查看镜像,发现多出一个名为 openharmony-docker:1.0.0 的镜像 可以执行docker rmi swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0删除旧的镜像: 执行docker run -it openharmony-docker:1.0.0 指令可以运行镜像可以看到系统直接进入到了/home/openharmony,但是此时仅是容器运行成功了,还没有代码,无法完成开发,接下来需要获取代码OpenHarmony 代码获取通过git(不推荐,有时会卡死)首先要设置git用户名和邮箱,否则拉去代码时会报错git config --global user.name "Your Name" git config --global user.email "youremail@yourdomain.com"拉去代码repo init -u git@gitee.com:openharmony/manifest.git -b OpenHarmony-3.2-Release -g ohos:mini repo sync -c repo forall -c 'git lfs pull'通过httprepo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-3.2-Release -g ohos:mini repo sync -c repo forall -c 'git lfs pull'检验输入hb -v如果出现版本号代表成功Vscode 安装开发板实验需要烧录固件,所以要用到 vscode 编辑器导出固件 到该网址下载最新版的 Visual Studio Code,简称 vscode,下载完成后执行安装. 网址: cid:link_0安装 vscode 插件打开安装好的 vscode 编辑器,点击左侧插件图标,输入 remote ssh 点击安装图标,等待安装完成,安装完成之后左侧会出现下面的图标 然后重复步骤安装入 dev contains 远程连接服务器3、添加服务器连接配置 点击该选项卡,会进入SSH TARGETS的添加,如下图所示:点击添加按钮,输入远程服务器的地址,账号和ip根据自己的情况进行修改,如下图所示:保存之后,会将刚才的连接信息存储在 C:\Users\chaxun.ssh\config 中。此时就可以在SSH TARGETS中看到添加的远程服务器地址了:4、连接服务器 右键选择远程服务器,如果远程服务器能够连接成功,此时会需要你输入密码:5、基本操作例如我点击Open Folder,这里就会让你选择打开的文件目录:点击ok按钮打开 /home/zhaxun 之后,会需要再次输入密码:启动和连接镜像启动镜像的方式可以是终端命令行,如果容器已启动,可以选择 attach 连接容器 点击连接容器之后,会弹出一个新窗口,点击左侧上面第一个图标,会显示该 容器内的文件系统(需要一点缓冲时间) 如果界面同以上截图不一样,而是如下所示: 就点击打开文件夹,在上方弹出的对话框输入/home/openharmony,再点击确 定, 等待片刻就会显示出文件列表,接下来就可以像操作本地文件一样打开文件 并进行编辑,然后修改一个文件:在顶部菜单栏点击终端,再选择新建终端,可以打开终端: 注意观察弹出来的终端,工作目录是否是/home/openharmony,如果不是请检 查前面的操作是否错误或有遗漏 在终端命令行输入:hb set 指令,再输入回车,到达选择开发板的界面,用鼠标 或键盘上下键选择 qemu_mini_system_demo,再敲回车:选择好了开发板,就可以执行构建命令: hb build -f 此时系统开始构建,由于我们使用的是 docker 环境,在制作镜像的时候环境已 经准备好了,所以不需要配置其他的脚本或者工具即可以达到编译固件的目的. 最后终端会显示编译成功,我们可以在 out 相应的目录下找到对应的固件,输 入:ls out/arm_mps2_an386/qemu_mini_system_demoqemu 模拟器的运行 由于模拟器的运行不涉及到具体的硬件,所以本实验不需要烧录步骤,在 docker 控制台终端输入./qemu-run,再输入 y 就能运行 qemu 模拟器了,下面是运 行状态的截图: 在 qemu 的终端里可以输入 help 命令查看该模拟器支持运行哪些指令: 同学们可以自行尝试列出来的指令退出模拟器的运行: 按住 Ctrl+a 然后同时放开,再按一下 x 键即可退出 qemu 终端可以看出,系统此处退出了 qemu 模拟器回到了 doc
  • [问题求助] iot未来
    iot在未来仍会是一个很热门的方向吗
  • [问题求助] 物联网平台IOT与边缘计算平台IEF直接的关系是怎样的,iot平台是否已经包括了边缘计算平台的功能了?
    物联网平台IOT与边缘计算平台IEF直接的关系是怎样的,iot平台是否已经包括了边缘计算平台的功能了?
  • [课程学习] 关于基于物联网平台构建智慧路灯应用使用LoRa进行实践设计的建议
    传统的城市照明系统照明运营模式落后,监控维修不到位,难以实现按需照明,节能减排需求巨大且信息化管理缺失,而国内传统的智慧照明领域,基本采用PLC和GPRS技术,数据传输的局限性大,部署复杂,网络覆盖面临困境。如今,物联网技术快速发展,基于物联网平台构建智慧路灯应用具有令人期待的发展前景。通过华为云《基于物联网平台构建智慧路灯应用》提出的基于华为云物联网服务的解决方案和实践,学习了解到了两种实践设计方案。两种方案中,不同厂家的路灯都统一接入平台,可以屏蔽网络以及协议的差异化,解耦应用和终端,简化设备对接的难度,路灯可通过网关间接或者直接接入,兼容传统路灯,并且都利用了NB-IoT的优势——低功耗、低成本、强覆盖、大连接,提高了设备接入的效率,且基于云端构建应用,可以帮助用户简化细节,高效安全应用。在具体系统设计方面,第一种方案,设备上传到物联网平台后,由物联网平台转发数据至DIS服务,进行数据分发,然后应用获取到数据,应用可基于ECS和DevCloud简化构建流程和细节,第二种方案没有了DIS数据分发服务,但是应用可以订阅物联网平台的信息,实时监测到变化,然后下发命令到平台和应用,两种方式各有各的优点和不足,可以根据具体的适用场景选择使用。上述方案都使用了NB-IoT,虽国内NB-IoT发展势头极好,但是NB-IoT使用授权频段,而LoRa使用非授权频段,相较于NB-IoT,LoRa可以自由地实现按需部署和独立组网的需求,在实际应用中,客户对于组网有大量的需求,尤其是在局域网区域内,相比于NB-IoT,LoRa可以极大降低部署成本。此外,LoRa相比于NB-IoT具有更低的功耗,事实上一般NB-IoT的发射功耗要比LoRa的发射功耗大3倍,可以实现更远距离的传输。LoRa的抗干扰能力和抗多径特点使得基于LoRa,在低级信噪比以及复杂环境下传输和解码信号都具有较低的误码率和丢包率,所以建议不妨基于LoRa开展对比实验看可否进一步提升基于物联网平台构建智慧路灯应用性能以及制定更高效的方案。以上为个人学习感想以及实践设计改进建议。
  • [问题求助] 先楫hpm6750、飞鸿SEEK100(8541E)、小熊派这三个开发板,有什么区别,生态如何,建议使用哪一个开发板?
    先楫hpm6750、飞鸿SEEK100(8541E)、小熊派这三个开发板,有什么区别,生态如何,建议使用哪一个开发板?
  • 华为云设备接入服务优化改进最新动态,欢迎体验~
    互联网的用户,都有一个基本的认知,那就是“数据不会凭空产生”。数据都是通过采集进而上报上来的。华为云IoT设备接入服务,即是进行数据采集工作的一个工具,或者说平台。设备接入服务(IoTDA)提供海量设备连接上云、设备和云端双向消息通信、批量设备管理、远程控制和监控、OTA升级、设备联动规则等能力,并可将设备数据灵活流转到华为云其他服务,帮助物联网行业用户快速完成设备联网及行业应用集成。为提升用户体验,IoTDA设备接入服务也在持续优化当中,让我们一起看看最近都有哪些改进~控制台功能完善及体验增强控制台持续改进,从用户使用角度,对操作流程,运维能力等方面进行了优化。整合运行日志,使用可以在IoTDA控制台即可完成平台运行日志的查看及搜索。在新版的运行日志界面中,不需要用户手动进行繁琐的操作,在控制台上可根据资源空间一键完成运行日志的配置及开启。同时,在IoTDA控制台中提供定制化的搜索界面,可以通过简单的搜索过滤完成日志的查看,不需要跳转到其他云服务就可以方便的查询及搜索相关日志,极大地提升了用户运维体验及效率。新增消息下发功能,用户在控制台即可方便的完成消息的下发及查看。收到反馈,很多用户使用消息下发功能时,只能调用应用侧API或集成SDK实现消息下发及查看功能。经过优化后,在控制台的设备详情页面中,提供了系统Topic和自定义Topic两种向设备下发消息的方式,同时可实时查看消息状态。用户可以更加方便快捷的使用消息下发的功能。更详细更丰富的用户指南“设备数据上报”、“云端数据下发”章节的概述部分把文字整合为表格,对应关系清晰明了,对应的资料以链接方式承载,用户可一建跳转相关指导。章节目录内容逐层递进,“消息通信”下每个场景都按照“XX概述”、“XX使用说明”、“XX使用示例”进行分类,方便用户快速查找到对应内容。各场景概述部分总结归纳了各功能适用场景及使用限制,方便选择对应的功能。提供丰富的设备接入场景示例使用说明章节,提供丰富的设备接入场景示例,如消息下发、消息上报、属性上报、属性下发的代码示例,用户可以直接复制使用。丰富示例,提供不同场景的SDK,新增测试验证方式。新增消息下发、属性下发、命令下发等场景的SDK使用示例,从设备侧到应用侧代码、流程、样例、测试验证方法及参数说明,一一俱全。消息下发使用示例:cid:link_2属性下发使用示例:cid:link_3命令下发使用示例:cid:link_3 文档图文结合,描述方式更加准确,使用户更快更好的理解与使用。丰富接口资料调用请求示例当接口在不同场景请求入参有变化的时候,产品帮助文档提供多样化的请求示例,帮助用户理解使用方式。如用户需要创建设备时,文档根据不同认证类型(密钥认证、证书认证、非直连设备)提供了对应的请求示例。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     更全面的API指导提供了丰富的(核心业务、高频场景)API场景代码示例,用户可以直接下载使用>>前往体验 在进行API调用时,API Explorer界面也可以方便找到并使用相关API场景示例代码。如创建设备时,需要对设备生命周期进行管理,可直接获取API场景示例,前往体验>>帮助文档中,应用层API参考中新增了基本概念章节。方便用户更容易理解API的资源内容。对API各特性下的参数描述优化,取值范围描述更清晰,对应的资料链接方式承载,用户可一建跳转相关指导。IoTDA设备接入服务仍在持续优化改进,请您持续关注~如果您对IoTDA设备接入服务以及文档有任何建议,欢迎评论区留言或微信IoT小助手(hwc-iot)进行反馈交流,让我们共同促进IoTDA设备接入服务的进步~
  • [热门活动] 【云咖问答】共话IoT Edge云边端协同,打通物联网最后一公里,回帖提问与建议赢开发者定制礼品~
    本期我们邀请了华为云IoT Edge产品专家郭老师坐阵,和大家一起探讨关于IoT边缘的话题。如果您对产品使用及帮助文档有任何建议欢迎一起讨论。郭老师华为云IoT边缘产品总监       负责华为云IoT边缘产品规划,商业模式等设计:推动工业物联网方案的产品规划设计和产品落地,支撑50+个项目落地,项目覆盖园区、城市、工业、交通等物联网场景;推动数字工厂、工业物联网方案的产品规划设计和产品落地,在煤矿、钢铁、水泥、玻璃、珠宝加工等领域都有项目孵化落地。【问题参考】(不限于)1、IoT Edge如何解决运维和数据协同实现难度高的痛点?2、IoT Edge支持哪些运行环境?3、IoT Edge开放哪些生态对接?……除了提问,如果您对产品使用及帮助文档有哪些优化建议,也可提出【活动时间】2023年11月7日-11月23日【获奖规则】优质问题奖与积极互动奖不叠加​【参与方式】直接在此活动帖cid:link_0下方回帖提问即可。