云服务器内容精选

  • 镜像包打包 构建需要打包的项目 构建项目,此处示例,构建好的文件存放在目录 /home/ModuleSDK-Demo 下 安装docker 请确认您使用的系统已经安装Docker(Docker版本需要高于17.06,推荐18.06),安装方法可参照docker 安装教程。 制作镜像 搜索基础镜像。 docker search dotnet 根据您的工程配置,选择合适的镜像。 镜像需要集成与您的工程配置兼容的.Net运行环境,下文使用的.Net版本仅作演示。 拉取镜像。 docker pull mcr.microsoft.com/dotnet/runtime:2.1 mcr.microsoft.com/dotnet/runtime:2.1 镜像是微软提供的镜像,非IoT团队发布,且IoT团队未提供任何官方镜像。该镜像在此仅做示例,IoT团队对该镜像的安全性不作保证,强烈建议用户自己封装镜像! 编写 Dockerfile 制作镜像。 创建 Dockerfile,内容示例如下(具体可参考编写高效的Dockerfile )。 下面提供了ModuleSDK-Demo镜像构建样例,仅作示例展示,请按需修改。 # 基础镜像来源FROM mcr.microsoft.com/dotnet/runtime:2.1# 指定工作目录WORKDIR /app# 复制工程二进制文件和相关文件(即项目构建发布的产物)COPY ModuleSDK-Demo/ /appENTRYPOINT ["dotnet", "ModuleSDK-Demo.dll"] 构建镜像 docker build -t modulesdk-demo:1.0.0 -f Dockerfile . 查看打包完成的镜像 docker images 可以看到modulesdk-demo这个镜像已经制作完成。 REPOSITORY TAG IMAGE ID CREATED SIZEmodulesdk-demo 1.0.0 85ed3c3dc738 8 minutes ago 182MB 上述步骤演示的是直接复制已编译好的工程文件来构建镜像,您也可以采取在构建镜像时编译的方式,具体可参照.Net 官方文档的指引。 镜像上传 上传镜像 镜像上传需要使用镜像容器服务(SWR),首先需要开通 容器镜像服务 (SWR)。开通及使用请参照容器 镜像服务 (SWR)。 获取 SWR 登录指令 获取登录指令请参照获取指令。 访问密钥即AK/SK(Access Key ID/Secret Access Key),获取的AK/SK将用于登录。 登录 SWR 仓库 docker login -u [区域项目名]@[AK] -p [登录密钥] [镜像仓库地址] 可以直接从控制台获取登录命令,如下图。 镜像仓库地址 = swr.区域项目名称.myhuaweicloud.com 例如,华北-北京一对应的镜像仓库地址为:swr.cn-north-1.myhuaweicloud.com 修改镜像所属组织 修改镜像的组织名,以便推送到个人组织内。 docker tag [OPTIONS] [镜像名:版本号] [镜像仓库地址/所属组织/镜像名:版本号] 例如: docker tag modulesdk-demo:1.0.0 swr.cn-north-4.myhuaweicloud.com/iotedge/modulesdk-demo:1.0.0 上传镜像 docker push [镜像仓库地址/所属组织/镜像名:版本号] 例如: docker push swr.cn-north-4.myhuaweicloud.com/iotedge/modulesdk-demo:1.0.0 在我的镜像查看上传结果 上传镜像后请在 SWR 将镜像设置为公开。 查看镜像详情: 编辑镜像: 设置为公开: 这一步很重要,关系到后面能否正常部署应用。
  • edge.h的接口函数介绍 所有接口函数定义的数据结构均呈现在edge_struct.h头文件中。 1. 初始化 接口描述: int edge_init(const char* workdir) 接口功能: 初始化sdk的工作环境,加载证书、读取配置等 表13 参数说明 参数名称 类型 参数描述 示例 workdir workdir 初始化文件所在目录,conf目录所在的目录,conf是存放证书文件以及日志配置的目录 conf在/code/api_test/workdir目录下,就填写/code/api_test/workdir 2. 注册回调接口 接口描述: int edge_set_callbacks(ST_MODULE_CBS* module_cbs, ST_DEVICE_CBS* device_cbs) 接口功能: 注册回调接口,登录、子设备添加、删除、设备消息、设备命令等都是异步通知的,故需要注册对应的处理函数。 表14 参数说明 参数名称 类型 参数描述 module_cbs ST_MODULE_CBS 模块回调函数结构体 device_cbs ST_DEVICE_CBS 设备回调函数结构体 表15 ST_MODULE_CBS模块相关的回调函数说明 参数名称 类型 参数描述 pfn_shadow_cb FN_SHADOW_ARRIVED* 模块影子回调函数类型,模块的配置可以使该接口接收 pfn_command_cb FN_COMMAND_ARRIVED* 发送到模块的命令的接收函数声明, pfn_connected FN_SDK_CONNECTED SDK连接到边缘hub的回调函数声明 pfn_disconnected FN_SDK_DISCONNECTED SDK和边缘hub断链的回调函数声明 表16 ST_DEVICE_CBS子设备相关的回调函数 参数名称 类型 参数描述 pfn_device_message_cb FN_MESSAGE_ARRIVED* 子设备消息回调 pfn_device_command_cb FN_COMMAND_ARRIVED* 子设备命令回调 pfn_device_event_cb FN_DEVICE_EVENT_ARRIVED* 子设备事件回调 pfn_sub_device_add_cb FN_SUB_DEVICE_ADD_ARRIVED* 子设备添加通知回调 pfn_sub_device_deleted_cb FN_SUB_DEVICE_DELETED_ARRIVED* 子设备删除通知回调 pfn_on_start_scan_cb FN_START_SCAN_ARRIVED* 收到子设备扫描通知回调 pfn_device_properties_set_cb FN_DEVICE_PROPERTIES_SET_ARRIVED* 收到子设备属性设置通知回调 pfn_device_properties_get_cb FN_DEVICE_PROPERTIES_GET_ARRIVED* 收到子设备属性获取通知回调 pfn_device_shadow_cb FN_DEVICE_SHADOW_ARRIVED* 收到子设备影子
  • edge.h回调函数说明 模块影子数据回调 函数描述: typedef EDGE_RETCODE (FN_SHADOW_ARRIVED)(const char* shadow, unsigned int shadow_len); 函数功能: 当下发模块配置时,通过此函数通知到用户,用户应用的配置也通过此函数通知。 表2 参数说明 参数名称 类型 参数描述 示例 shadow char* 模块影子数据(json字符串),第三方应用下发用户的配置数据 { “config”:”test” } shadow_len unsigned int 影子数据的长度 - 命令下发回调 函数描述: typedef EDGE_RETCODE (FN_COMMAND_ARRIVED)(const char* command_name, const char* device_id, const char* service_id, const char* request_id, const char* body, unsigned int body_len); 函数功能: 此函数声明用户命令下发通知,设备命令下发即使用此函数声明。 表3 参数说明 参数名称 类型 参数描述 command_name char* 设备命令名称,在设备关联的产品模型中定义。 device_id char* 命令对应的目标设备ID,命令下发对应的最终目标设备 service_id char* 设备的服务ID,在设备关联的产品模型中定义 request_id char* {request_id}用于唯一标识这次请求,响应该命令时需要带上。 body char* json字符串,设备命令的执行参数,具体字段在设备关联的产品模型中定义 body_len unsigned int - 消息下发回调 函数描述: typedef EDGE_RETCODE (FN_MESSAGE_ARRIVED)(const char* message_id, const char* message_name, const char* device_id, const char* body, unsigned int body_len); 函数功能: 此函数声明用于消息下发通知,平台使用此接口承接平台下发给设备的自定义格式的数据。 表4 参数说明 参数名称 类型 参数描述 message_id char* 消息名称 message_name char* 消息的唯一标识 device_id char* 命令对应的目标设备ID,命令下发对应的最终目标设备 body char* 消息内容。 body_len unsigned int 消息长度 事件下发回调 函数描述: typedef EDGE_RETCODE (FN_DEVICE_EVENT_ARRIVED)(const char* device_id, const char* body, unsigned int body_len); 函数功能: 此函数声明用于事件下发通知,平台使用此接口承接平台下发给设备的自定义格式的数据。 表5 参数说明 参数名称 类型 参数描述 示例 device_id char* 命令对应的目标设备ID,命令下发对应的最终目标设备 - body char* 事件内容。 { "object_device_id":"deviceId", "services":[ { "service_id":"serviceTest", "event_id":"eventTest", "event_type":"eventTypeTest", "event_time":"time", "paras":{ "test":"test" } } ] } body_len unsigned int 消息长度 - 子设备添加回调 函数描述: typedef EDGE_RETCODE (FN_SUB_DEVICE_ADD_ARRIVED)(const char* addSubDeviceInfo, unsigned int body_len); 函数功能: 此函数声明用于通知子设备添加,使用此接口承接平台添加成功子设备的通知。 表6 参数说明 参数名称 类型 参数描述 示例 addSubDeviceInfo char* 添加成功的子设备信息,具体格式见示例 {"devices": [{"parent_device_id":"c6b39067b03421a48", "node_id": "subdevice11", "device_id":"2bb77-063ad2f5a6cc", "name": "subDevice11", "description": null, "product_id":"c6b3b34663d3ea42f6", "fw_version": null, "sw_version": null, "status": "ONLINE" }],"version":1} body_len unsigned int 长度 - 子设备删除回调 函数描述: typedef EDGE_RETCODE (FN_SUB_DEVICE_DELETED_ARRIVED)(const char* deleteSubDeviceInfo, unsigned int body_len); 函数功能: 此函数声明用于通知子设备删除,使用此接口承接平台删除成功子设备的通知。 表7 参数说明 参数名称 类型 参数描述 示例 deleteSubDeviceInfo char* 删除成功的子设备信息,具体格式见示例 {"devices": [{"parent_device_id":"c6b39067b03421a48", "node_id": "subdevice11", "device_id":"2bb77-063ad2f5a6cc", "name": "subDevice11", "description": null, "product_id":"c6b3b34663d3ea42f6", "fw_version": null, "sw_version": null, "status": "ONLINE" }],"version":1} body_len unsigned int 长度 - 子设备扫描回调 函数描述: typedef EDGE_RETCODE (FN_START_SCAN_ARRIVED)(const char* protocol, const char* channel, const char* parentDeviceId,const char* scan_setting, unsigned int body_len); 函数功能: 此函数声明用于通知网关扫描子设备。 表8 参数说明 参数名称 类型 参数描述 protocol char* 协议 channel char* 通道信息 parentDeviceId char* 父设备ID scan_setting char* 扫描设备 body_len unsigned int 配置长度 子设备属性设置回调 函数描述: typedef EDGE_RETCODE (FN_DEVICE_PROPERTIES_SET_ARRIVED)(ST_PROPERTY_SET* sub_device_property_set); 函数功能: 此函数声明用于接收平台对子设备的属性设置。 表9 参数说明 参数名称 类型 参数描述 示例 sub_device_property_set ST_PROPERTY_SET* 属性设置 参见edge.h 子设备属性获取回调 函数描述: typedef EDGE_RETCODE (FN_DEVICE_PROPERTIES_GET_ARRIVED)(ST_PROPERTY_GET* sub_device_property_get); 函数功能: 此函数声明用于接收平台获取子设备的属性。 表10 参数说明 参数名称 类型 参数描述 示例 sub_device_property_get ST_PROPERTY_GET* 属性设置 参见edge.h 子设备影子回调 函数描述: typedef EDGE_RETCODE (FN_DEVICE_SHADOW_ARRIVED)(ST_DEVICE_SHADOW* sub_device_shadow); 函数功能: 此函数声明用于接收平台设置子设备的影子。 表11 参数说明 参数名称 类型 参数描述 示例 sub_device_property_get ST_DEVICE_SHADOW* 属性设置 参见edge.h 自定义topic 消息通知 回调 函数描述: typedef EDGE_RETCODE (FN_CUSTOMIZED_MESSAGE_ARRIVED)(const char* topic, const char* payload, unsigned int len); 函数功能: 此函数声明用于接收平台设置子设备的影子。 表12 参数说明 参数名称 类型 参数描述 topic char* 自定义topic payload char* 消息内容 len unsigned int 消息长度
  • 如何使用 OT应用使用步骤: 将创建好的应用部署到节点。部署请参照应用部署。 添加设备进行测试(添加设备请参考设备接入边缘节点)。 可以利用MQTT.fx软件模拟设备接入调试。 驱动应用使用步骤: 将创建好的应用部署到节点。部署请参照应用部署。 添加网关。 添加设备进行测试(添加设备请参考设备接入边缘节点)。 可以利用Modbus Slave软件模拟设备接入调试。 IT应用使用步骤: 注册节点,绑定工业资源包。 创建API网关。 将apigw系统组件和创建的应用部署到节点。 使用postman进行调试验证。 父主题: 开发指导
  • 安装包部署 添加边缘应用-应用配置 部署方式选择安装包部署 添加边缘应用-软件和运行配置 ”安装包地址”为{桶名/对象名}。 如桶名为edge-monitor,对象名为monitor-app.zip, 则安装包为edge-monitor/monitor-app.zip。 添加边缘应用-端点和部署配置同容器化部署 根据需要进行配置。 输入端点输出端点与demo中的设置对应,如monitor-app中输入与输出端点设置为input和output,则配置为: 输入端点:input。 输出端点:output。 输入输出端点是非必需配置的,当有数据流转时需要配置,如OT应用(数据处理)。 驱动类应用和IT应用一般不需要配置。 建议直接勾选“立即发布”,方便后面直接部署应用的时候,能够获取到最新版本。
  • 场景说明 开发应用驱动集成ModuleSDK进行OT数采。(此示例以采集OPCUA为示例) 在节点部署集成了ModuleSDK应用驱动。 配置好数据源模板(可自定义)。 在平台进行数据源配置,以及点位配置下发。 集成ModuleSDK应用驱动对平台下发的配置进行处理。 通过下发信息获取数据源连接,以及点位信息进行数据周期采集。 最后运用ModuleSDK的客户端进行点位数据周期上报。 父主题: 集成ModuleSDK进行数据采集
  • 操作场景 开发应用驱动集成ModuleSDK进行OT数采。(此示例以采集OPCUA为示例) 在节点部署集成了ModuleSDK应用驱动。 配置好数据源模板(可自定义)。 在平台进行数据源配置,以及点位配置,下发。 集成ModuleSDK应用驱动对平台下发的配置进行处理。 通过下发信息获取数据源连接,以及点位信息进行数据周期采集。 最后运用ModuleSDK的客户端进行点位数据进行周期上报。 父主题: 集成ModuleSDK进行OT数采
  • 如何使用 OT应用使用步骤: 1. 将创建好的应用部署到节点。部署请参照应用部署。 2. 添加设备进行测试(添加设备请参考设备接入边缘节点)。 可以利用MQTT.fx软件模拟设备接入调试。 驱动应用使用步骤: 1. 将创建好的应用部署到节点。部署请参照应用部署。 2. 添加网关。 3. 添加设备进行测试(添加设备请参考设备接入边缘节点)。 可以利用Modbus Slave软件模拟设备接入调试。 IT应用使用步骤: 1.注册节点,绑定工业资源包。 2.创建API网关。 3.将apigw系统组件和创建的应用部署到节点。 4.使用postman进行调试验证。 父主题: 开发指导
  • 使用场景 场景挑战 设备采集的数据信息量庞大但只需部分有效数据。部署在节点下的设备需要在本地判断情况以及时进行控制。 设备使用的协议不能接入边缘计算。 节点下的IT子系统众多,接入时不便于管理,配置繁琐。子系统采集的数据需要传输到用户的北向应用。 解决方案 通过开发集成ModuleSDK的应用,您可以: 使用ModuleSDK提供的AppClient开发OT应用对需要上传到云端的信息进行过滤上传。OT应用可以在本地对设备进行命令的下发。 使用ModuleSDK提供的DriverClient开发驱动应用进行协议转换。 使用ModuleSDK提供的ItClient开发IT应用实现子系统与云端配置的自动同步,也可以实现云端对子系统的配置管理。云端可以通过IT应用实现对子系统数据的采集。
  • 简介 为解决用户自定义处理设备数据以及自定义协议设备快速接入IOT平台的诉求,IoT边缘提供ModuleSDK,用户可通过集成SDK让设备以及设备数据快速上云。IoT边缘平台应用功能有自定义处理设备数据(即数据处理),自定义协议设备快速接入(即协议解析),IT子系统接入(即IT应用),并且支持容器化部署和安装包部署的方式。 集成ModuleSDK开发的应用被称为插件应用,其最终将被通过云部署到边缘节点。 集成ModuleSDK的应用分为: OT应用:数据处理类型的应用,实现了总线回调接口,IoT边缘云服务为OT应用提供总线对接能力、设备反向控制(命令)能力。 驱动应用:协议转换类型的应用,可将使用自定义协议的设备接入边缘计算。 IT应用:实现工业子系统接入的应用,实现了对子系统配置同步、反向调用接口、以及数据采集能力。 集成了SDK的应用称为插件,华为云市场提供了插件上架功能。您可以将开发的集成了SDK的应用上传到华为云市场来获取收益,也可以在华为云市场下载使用第三方插件。
  • 协议转换(驱动应用) 驱动提供子设备管理和数据上报功能。 子设备管理功能包括子设备增删和配置子设备数据采集协议。设备的增删有两种形式,一是在云端增删,通过集成驱动SDK,可以接收到北向应用管理子设备的回调,即北向应用通过IoTEdge创建/删除设备时,自定义驱动应用可以接收到事件回调,在边侧进行设备接入及协议解析。二是在本地增删,自定义驱动应用也提供本地页面进行设备管理,驱动应用通过SDK上报设备添加/删除通知到云端IoTEdge,将边侧的设备管理操作同步到云端。 数据上报功能可以将设备状态和设备数据上报到云端。 驱动提供本地Portal对子设备进行管理,包括子设备数据采集协议相关配置;驱动将设备状态和设备数据上报到云端。 本地Portal增删设备时,通过子设备发现事件上报增删的设备,IoT Edge在云侧增删设备,增删的设备信息通过子设备增删事件通知到驱动 北向应用NA提供设备管理界面,调用IoTEdge接口增删设备,通过子设备增删事件通知到驱动。 北向应用在增加设备时指定设备数据采集协议相关配置。 父主题: 架构介绍
  • 证书文件 在设备和对接边缘节点场景中,需要在设备侧集成相应证书。 资源包名 描述 下载路径 ModuleSDK(java) 利用ModuleSDK开发插件在边侧进行协议转换、设备上传的数据处理、接入IT子系统。 ModuleSDK(Java版) ModuleSDK(C) Module SDK是开发边缘运行应用(插件)所必须的工具包,提供数据处理、协议转换、IT子系统接入等功能,开发完成后,通过选择打包方式来决定是容器化部署还是进程化部署。 ModuleSDK_C_latest(包括x86_64, arm32, arm64版本,下载后解压选择对应版本) ModuleSDK(C#) 利用ModuleSDK开发插件在边侧进行数据采集等功能。 ModuleSDK_ CS harp MQTT.fx MQTT.fx是MQTT设备模拟软件。 MQTT.fx下载地址 plt-device-ca 设备通过mqtts协议与边缘节点建立连接时,该证书用于校验边缘节点的身份。 证书文件 Modbus Slave Modbus Slave是Modbus Slave设备模拟软件。 Modbus Slave下载地址
  • 内部架构 模块SDK用于开发运行在边缘节点中的应用,包括数据处理应用(简称应用,例如数据清洗)和协议驱动(简称驱动,例如EdgeAccess)。 图1 边缘设备接入和应用开发能力架构图 部署在边缘节点中的第三方应用和第三方驱动使用模块SDK进行开发。 图2 模块SDK调用流程图 基本调用流程如图2所示。 基于ModuleSDK-C开发应用实现数据的云边同步,主要分为开发和使用两个部分。 开发操作 开发说明 SDK应用的开发 按照SDK提供的Demo进行自定义应用开发。 SDK应用的使用 将应用打包上传至华为云,部署到节点。连接子设备查看应用工作情况。 ModuleSDK-C提供了以下头文件,用户可根据需求引用相应的头文件: 头文件 说明 edge.h 实现基本的回调函数和接口函数 edge_daemon.h 实现所有证书、鉴权相关接口 edge_driver.h 驱动模块,用于开发驱动接入设备,驱动需实现网关回调函数 edge_error.h 错误码定义 edge_struct.h 所有可能使用到的头文件定义 edge_dc_driver.h 数采驱动模块,用于开发数采驱动接入点位数据,驱动需实现相关回调函数 父主题: 集成ModuleSDK(C)
  • 生成可执行文件 需要Linux开发环境,可利用CLion远程调试或者将工程打包到Linux服务器上编译生成可执行文件 编译生成可执行文件(MyCApp),可以通过CLion之间编译生成,也可以通过在Linux服务器上通过命令行生成。 下面提供在Linux服务器使用命令行生成的方法。 cmake -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - Unix Makefiles" ./-- The C compiler identification is GNU 4.8.5-- Detecting C compiler ABI info-- Detecting C compiler ABI info - done-- Check for working C compiler: /usr/bin/cc - skipped-- Detecting C compile features-- Detecting C compile features - done-- Configuring done-- Generating done-- Build files have been written to: /home/MyCApp makeConsolidate compiler generated dependencies of target MyCApp[100%] Built target MyCApp 可以在目录下找到生成的可执行文件,即MyCApp。 父主题: 开发指导
  • InnerClient::startModuleShadow 启动模块影子,设置收到影子回调并触发获取影子动作,该函数适用于AppClient、DriverClient、DcDriver。 函数描述 public void startModuleShadow(ModuleShadowNotificationCallback callback) throws IllegalArgumentException