加速工业物联网应用开发 - 第 1 部分:模拟物联网设备数据

作者:Stephen Evanczuk

投稿人:DigiKey 北美编辑

编者按:由于开发人员需要等待新设备的硬件实施,因此嵌入式应用开发项目通常会出现延迟。工业物联网 (IIoT) 应用开发面临类似的瓶颈,需要等待基于机器学习方法的工业预测维护系统或设施自动化系统等应用所需的传感器数据。本系列文章由两部分组成,将会探讨哪些替代方法能提供所需的早期数据流,以加速工业物联网应用开发。本文是第 1 部分,介绍了如何使用模拟方法生成那些数据流。第 2 部分讨论了有哪些选项可用于对传感器系统进行快速原型开发,以生成数据。

大规模工业物联网 (IIoT) 应用带来了诸多挑战,这些挑战可能会使部署停滞,并让公司对所需要的众多实施资源的投资回报率产生质疑。为防止此类情况并帮助开发人员更快地明确工业物联网部署的优势,就需要即时访问数据进行部署模拟。

若使用模拟方法生成现实的数据流,开发人员在物联网网络部署之前就可以顺利开始工业物联网应用开发,甚至可以完善工业物联网传感器网络本身的定义。

本文将说明各种物联网云平台如何提供数据模拟,并将介绍 Multi-Tech Systems Inc. 的示例网关,这些产品有助于进一步加快部署。

工业物联网数据的模拟案例

当然,使用模拟数据来推动应用和系统开发并不是什么新鲜事物。数十年来,开发人员一直使用系统级模拟方法对计算基础设施和连接服务进行压力测试。这些测试在验证静态配置的稳健性方面起着重要的作用。在云服务平台中,这些测试提供了一种相对简单的方法,来验证虚拟机和其他云资源的弹性伸缩功能。

工业物联网应用具有相同甚至更多的需求。除了帮助进行负载测试和弹性伸缩外,数据模拟还提供了一个重要工具,可用于验证许多不同服务和资源的集成,而这些服务和资源需要用于实现像企业级工业物联网应用这样复杂的软件。除了这些更基本的实践之外,对于基于领先云提供商的复杂服务平台构建的复杂工业物联网应用,数据模拟还可以加快相关开发工作。

软件角度

工业物联网应用在复杂的架构上运行,这种架构在应用软件开发人员与传感器和执行器系统开发人员看来明显不同。对于后者,大规模的工业物联网架构是传感器和执行器的庞大组合,它们与作为整个应用主体的物理过程相交互。对于应用软件开发人员而言,企业级工业物联网架构包含许多服务,这些服务的协调活动最终可以提供应用的功能。

从应用软件的角度来看,Microsoft 的 Azure 物联网参考架构提供了典型工业物联网应用(和一般物联网应用)的代表性视图。此视图总结了多种功能性服务,典型应用在云中将这些服务聚合在一起,以基于来自端点和外围边缘设备的数据提供见解和操作(图 1)。

Microsoft 的 Azure 物联网参考架构示意图(单击放大)图 1:Microsoft 的 Azure 物联网参考架构说明了工业物联网应用通常需要多种类型的云服务和资源,以根据外围设备网络生成的数据提供有用的见解和操作。(图片来源:Microsoft Corp.)

特定的应用解决方案以适当的组合部署这些云资源,通过标准化的交换机制在功能上进行连接,并按应用逻辑进行协调。例如,在联网汽车解决方案中,Amazon Web Services (AWS) 显示了如何在负责提供不同应用功能的模块中混合搭配云服务(图 2)。

AWS 联网汽车解决方案示意图图 2:AWS 联网汽车解决方案提供一个代表性视图,显示了典型大规模物联网应用如何协调云服务来提供所需的功能。(图片来源:Amazon Web Services)

正如这些代表性架构所示,创建工业物联网应用所需的软件开发工作与实施传感器和执行器系统的外围网络一样具有挑战性和广泛性。很少有组织可以等到设备网络能够生成足够数据后,再开始延迟开发此复杂软件。实际上,随着分析专家和机器学习专家开始处理应用结果,设备网络的部署可能需要等待进一步的定义和完善。在最坏的情况下,设备网络部署和软件开发会陷入僵局:彼此依赖于对方的结果。

幸运的是,这一难题的解决方案在于物联网架构的本质。除了一些广泛的相似性之外,云服务架构(例如上面来自 Microsoft 和 AWS 的图示架构)一定在细节上会有所不同。尽管如此,它们都展示了通常在物联网云平台中所见的类似架构特征:定义明确的接口服务模块或层功能,可将物联网设备的外围网络与基于云的软件应用分开。除了提供统一的连接性之外,对于设备管理和安全性以及大规模工业物联网应用所需的其他关键功能,这些接口服务也至关重要。

在 Microsoft 的 Azure 云中,此接口服务称为 Azure IoT Hub(同样参见图 1);在 AWS 云中,它是 AWS IoT Core(同样参见图 2)。在 Google Cloud Platform 中,此接口是 Cloud IoT Core,在 IBM Cloud 中,则是 IBM Watson IoT Platform 服务。类似地,其他平台(如 ThingWorx 物联网平台)也通过连接服务(如 ThingWorx Edge Microserver、ThingWorx Kepware Server 或协议适配器工具包)进行连接。简而言之,任何云平台都需要提供可将数据从外设集中到云服务的一致接口服务,否则就要冒着从外设直接连接到云深处各个资源的混乱风险。

注入模拟数据

使用每个物联网平台的软件开发工具包 (SDK),开发人员可以按照验证应用功能和性能所需的数量、速度和种类,将模拟的传感器数据直接注入平台的接口服务中。以所需速率和分辨率生成的模拟数据使用 MQ 遥测传输 (MQTT)、受限应用协议 (CoAP) 等标准协议到达该接口服务。对于接口服务(和下游应用软件)而言,模拟数据流与硬件传感器系统获取的数据没有什么区别。当设备网络准备上线时,它们的传感器数据流仅需替代到达接口服务的模拟数据流。

云平台提供商通常在不同的功能级别上支持这种数据模拟方法。例如,Google 演示了一个使用参考架构和示例代码的简单仿真驱动应用,该应用实现了一个温控风扇的简单控制回路。像之前图示的架构一样,该架构利用了由 Google Cloud IoT Core 服务接口馈送的 Google Cloud Platform 服务(图 3)。

设备模拟器图使用与物理设备相同的通信协议的示意图(点击放大)图 3:在任何物联网云平台中,设备模拟器都使用物理设备所使用的相同通信协议将数据馈送到接口服务,例如此处显示的 Google Cloud Platform 应用架构的 Google Cloud IoT Core。(图片来源:Google)

在此样例应用中,温度传感器设备模拟器以选定的更新速率生成数据,并使用 MQTT 信息传输协议将数据传递到 Google Cloud IoT Core 接口服务。相应地,该接口服务使用平台的标准发布-订阅 (pub/sub) 协议将数据传递到模拟服务器,该服务器通过命令进行响应以按需打开或关闭风扇(图 4)。

Google 样例应用展示基本控制回路的示意图图 4:Google 样例应用演示了一个基本控制回路,其中包括一个模拟设备,该设备使用标准通信方法通过 Google Cloud IoT Core 将数据发送到模拟服务器。(图片来源:Google)

Google 提供了实现此基本应用的 Python 代码示例。在此代码中,Device 类实例包括一种根据模拟风扇的状态更新模拟温度的方法。主例程以指定的速率调用该方法,并使用 Eclipse paho-mqtt Python MQTT 客户端模块提供的 MQTT 连接服务发送数据(清单 1)。

复制 class Device(object):      """Represents the state of a single device."""      def __init__(self):          self.temperature = 0          self.fan_on = False          self.connected = False       def update_sensor_data(self):          """Pretend to read the device's sensor data.         If the fan is on, assume the temperature decreased one degree,         otherwise assume that it increased one degree.         """          if self.fan_on:              self.temperature -= 1          else:              self.temperature += 1 ...def main(): ...     device = Device()         client.on_connect = device.on_connect      client.on_publish = device.on_publish      client.on_disconnect = device.on_disconnect      client.on_subscribe = device.on_subscribe      client.on_message = device.on_message         client.connect(args.mqtt_bridge_hostname, args.mqtt_bridge_port)         client.loop_start()         # This is the topic that the device will publish telemetry events      # (temperature data) to.     mqtt_telemetry_topic = '/devices/{}/events'.format(args.device_id)         # This is the topic that the device will receive configuration updates on.     mqtt_config_topic = '/devices/{}/config'.format(args.device_id)         # Wait up to 5 seconds for the device to connect.     device.wait_for_connection(5)         # Subscribe to the config topic.     client.subscribe(mqtt_config_topic, qos=1)         # Update and publish temperature readings at a rate of one per second.     for _ in range(args.num_messages):          # In an actual device, this would read the device's sensors.Here,          # you update the temperature based on whether the fan is on.         device.update_sensor_data()             # Report the device's temperature to the server by serializing it          # as a JSON string.         payload = json.dumps({'temperature': device.temperature})          print('Publishing payload', payload)          client.publish(mqtt_telemetry_topic, payload, qos=1)          # Send events every second.         time.sleep(1)         client.disconnect()      client.loop_stop()      print('Finished loop successfully.Goodbye!') 

清单 1:来自 Google 样例应用的这个代码片段说明了 main 例程如何定期更新 Device 类实例,该实例可存储模拟温度传感器的当前值,并提供一种根据模拟风扇的状态更新该值的方法。(代码来源:Google)

反过来,Server 类实例提供了一个模块,可根据从 Device 类实例接收到的温度数据来更新风扇状态(清单 2)。

复制 class Server(object):      """Represents the state of the server."""...     def _update_device_config(self, project_id, region, registry_id, device_id,                                data):          """Push the data to the given device as configuration."""         config_data = None          print('The device ({}) has a temperature '                'of: {}'.format(device_id, data['temperature']))          if data['temperature'] < 0:              # Turn off the fan.             config_data = {'fan_on': False}              print('Setting fan state for device', device_id, 'to off.')         elif data['temperature'] > 10:              # Turn on the fan              config_data = {'fan_on': True}              print('Setting fan state for device', device_id, 'to on.')         else:              # Temperature is OK, don't need to push a new config.             return 

清单 2:在 Google 样例应用程序的这个代码段中,Server 类中定义的 _update_device_config() 方法为应用提供了业务逻辑,当温度超过定义值时将风扇状态设置为打开,而当温度降低时将风扇状态设置为关闭。(代码来源:Google)

除了 Google 的示例代码外,开发人员还可以在 GitHub 等存储库中找到数十个开源物联网设备、系统和网络模拟器。例如,Microsoft 的开源 Raspberry Pi 系统模拟器代码包括与 Azure IoT Hub 的预置集成,用于快速开发与 Raspberry Pi 板对接的云应用。此外,Node-RED 等代码较少的编程工具也支持预置模块(节点),用于将模拟传感器数据馈送到领先的云平台物联网服务接口。使用这些方法,开发人员可以轻松生成传感器数据流。

规模运行模拟

使用设备级模拟器和相关工具的困难在于,管理数据模拟本身就会成为一个项目。像任何应用一样,要运行模拟器,开发人员需要配置和维护资源。更令人担忧的是,用于生成真实数据的设备模型会成为工业物联网应用开发流程之外的一个单独项目。随着开发的进行,开发人员需要确保设备模型在功能上与工业物联网设备网络和应用定义的任何变化保持同步。对于企业级工业物联网应用,开发人员会发现,扩展这些模拟最多可能会很困难,甚至会开始耗费开发应用所需的资源。

大型物联网云平台提供商使用物联网设备模拟解决方案来解决这些问题,这些解决方案设计为可像它们各自平台中的其他云资源一样轻松伸缩。例如,AWS IoT Device Simulator 为其 CloudFormation 配置服务提供了一个 AWS 模板,该模板可部署虚拟专用网络,用于连接在 AWS Fargate 无服务器引擎上运行的容器中实现的微服务(图 5)。

AWS IoT Device Simulator 示意图图 5:AWS IoT Device Simulator 组合了多个 AWS 服务,以将可伸缩的设备数据流提供给物理设备使用的同一 AWS IoT Core。(图片来源:Amazon Web Services)

开发人员可以通过在 Amazon S3 服务中运行的图形用户界面 (GUI) 控制台以交互方式访问模拟,也可以通过由 Amazon API Gateway 服务中的 CloudFormation 模板生成的 IoT Device Simulator 应用编程接口 (API) 以编程方式访问模拟。在模拟运行期间,IoT Device Simulator 微服务根据自身的配置项目中描述的总体模拟计划,从 Amazon DynamoDB NoSQL 数据库中提取设备配置。

这些设备配置是 JSON 记录,用于定义设备属性名称(例如温度)、数值范围(例如 -40 至 85)以及更新设备间隔和模拟持续时间等信息。开发人员可以通过控制台以交互方式或通过 API 以编程方式添加设备类型。通过使用常规 DevOps 方法,可以快速扩展设备类型、配置和基础设施,以实现到达 AWS IoT Core 和下游应用所需的数据更新率。

在 Azure 设备模拟器中,开发人员可以进一步使用模拟运行期间设备支持的一组行为,以及云应用可以直接调用的一组方法,来补充基本属性列表。

数字双胞胎

这种设备数据模拟在概念上与商业物联网云平台中兴起的数字双胞胎功能紧密相关。相比通常仅提供设备状态静态表示的设备影子,数字双胞胎可扩展虚拟设备模型,使其符合物理设备状态及其行为。

在 Microsoft 的 Azure 中,Azure Digital Twins 服务允许开发人员包括用户定义的函数,以定义设备模拟期间的行为,并且仍像以前一样将结果馈送给 Azure IoT Hub。无论传入的数据是模拟数据还是真实数据,之后都将发送到事件路由服务,以在应用中进一步分发。此外,Microsoft 还会使用数字双胞胎数据创建空间图,以描述复杂分层环境(例如,包含多个网络的工业自动化系统)中元件之间的交互作用和状态(图 6)。

Microsoft 的 Azure Digital Twins 服务示意图(单击放大)图 6:Microsoft 的 Azure Digital Twins 服务使开发人员能够构建在功能和特性上与对应物理设备相符的虚拟设备,并提供复杂服务(例如复杂工业物联网层次结构的空间图)的基础。(图片来源:Microsoft)

对于工业物联网应用,数字双胞胎可以提供一种强大的机制,能够在整个生命周期中支持围绕这些功能构建的应用。在开发的早期阶段,平台的设备模拟服务可以成规模地驱动数字双胞胎。当物理工业物联网网络上线时,可以用设备数据馈送代替那些向数字双胞胎发送的模拟数据馈送。稍后,在完全部署的工业物联网应用中,开发人员可以使用在物理设备与数字双胞胎之间发现的任何差异作为预测维护算法或安全入侵检测器等的额外输入。在整个生命周期中,数字双胞胎可以保护应用免受网络中断或工业物联网设备网络配置重大变更的影响。

物联网平台中数字双胞胎的出现还带来了第二个好处,即提供一种标准化方法来描述设备模型的属性和行为。对于描述语言,Microsoft 的 Azure Digital Twins 服务使用 JSON-LD(链接数据的 JavaScript 对象表示法)。JSON-LD 背后有万维网联盟 (W3C) 支持,并基于行业标准 JSON 格式提供一种标准格式来序列化链接数据,该格式已在许多其他应用领域中使用。

随着传感器和执行器的预置数字双胞胎描述存储库的出现,标准化的数字双胞胎描述可以进一步加快开发速度。例如,Bosch 已经为几款传感器提供了以 Eclipse Vorto 语言编写的开源数字双胞胎描述,并发布在 Eclipse Vorto 存储库中。Eclipse Vorto 语言使用大多数程序员熟悉的语法,提供了一种简单的方法来描述数字双胞胎的模型和接口。以后,开发人员可以根据需要将 Vorto 语言描述转换为 JSON-LD 或其他格式。

构建工业物联网应用

无论是用分立式模拟器还是面向微服务的平台构建,设备数据模拟都可以提供基于软件的有效解决方案,以加速应用开发。对于使用多个设备网络的工业物联网应用,将设备模拟迁移到边缘可以帮助进一步简化向部署的过渡,而无需牺牲在应用开发初期对代表性数据的需求。

边缘计算系统在大规模物联网应用中扮演的角色越来越重要。这些系统提供了新兴需求所需的本地资源,范围从基本数据预处理以减少到达云的数据量,到机器学习推断模型等高级分类功能。此外,作为场域设备网络和高速回程网络之间的通信网关,边缘计算系统还起着更为基本的作用。

网关(例如 Multi-Tech Systems 的可编程 MultiConnect Conduit 系列)提供了将通信支持与边缘处理功能相结合的平台。Multi-Tech 的MTCAP-915-001A(用于 915 兆赫 (MHz) 区域)和 MTCAP-868-001A(用于 868 MHz 区域)提供了用于聚合场域网络设备数据的 LoRaWAN 连接,以及云端上的以太网或 4G-LTE 连接。基于开源的 Multi-Tech Linux (mLinux) 操作系统,这些平台还为运行设备模拟提供了熟悉的开发环境。随着独立的现场网络与物理传感器和其他设备上线,每个单元都可恢复其作为通信网关的角色,从而将处理工作的重心转为数据预处理等要求。

总结

工业物联网应用为传感器网络的现场部署,以及能够将传感器数据转换为有用结果的云应用软件的开发带来了重大挑战。传感器网络和应用软件的相互依赖关系可能导致开发陷入困境,因为传感器部署和软件实现会等待彼此达到足够的临界规模水平。

如上所述,开发人员可以通过在实际的数量、速度和种类水平模拟数据流,来打破这种僵局并加速工业物联网应用开发。

免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。

关于此作者

Stephen Evanczuk

Stephen Evanczuk 拥有 20 多年的电子行业编辑经验,主题涉猎广泛,涵盖硬件、软件、系统以及包括物联网在内的各种应用。他拥有神经网络领域的神经科学博士学位,曾经从事航空航天领域大规模分布式安全系统和算法加速方法方面的工作。目前,他不是在撰写技术和工程文章,就是在研究深度学习在识别和推荐系统方面的应用。

关于此出版商

DigiKey 北美编辑