设备接入驱动编码完成后,需进行驱动的调试。调试阶段包括:编译打包、上传驱动、搭建环境、创建物模型、创建设备、部署驱动、查看调试信息、调试数据交互和本地替换更新驱动。

前提条件

在开始操作本章内容前,请您确保已根据基于Ubuntu 16.04搭建标准版环境内容完成边缘实例的创建,为C语言SDK开发的设备驱动准备运行环境。

操作步骤

  1. 编译打包。
    驱动打包相关要求,请参见本文下方驱动打包注意事项
    1. 下载示例代码。
      git clone https://github.com/aliyun/linkedge-thing-access-sdk-c.git
    2. 进入linkedge-thing-access-sdk-c目录,完成示例编译。
      cd linkedge-thing-access-sdk-c
      make prepare && make && make install
    3. 查看示例编译产物。
      cd build/bin/demo/demo_led/ && ls -l

      系统显示类似如下图表示已完成编译并打包。


      代码执行片段
  2. 上传并发布驱动,详情请参见驱动发布
    1. 物联网平台控制台,选择边缘计算 > 驱动管理,选择自研驱动页签,单击新建驱动
      根据提示设置驱动参数。
      设置自定义驱动参数

      本示例中,驱动是否内置需要选择,然后在驱动文件下,上传已完成编译并打包的demo_led.zip文件。

    2. 完成参数的设置并上传成功驱动文件后,单击确定。您可以在自研驱动列表中看到刚刚创建的驱动。
  3. 创建产品。
    1. 参考创建产品,创建一个产品。

      创建产品
    2. 参考单个添加物模型,为产品添加属性。

      添加自定义功能
    3. 参考单个添加物模型,为产品添加事件,并单击增加参数,设置输出参数。

      设置事件参数

      输出参数设置如下图所示。


      编辑事件参数
  4. 添加设备。
    参考单个创建设备,为产品添加设备。
    添加设备
  5. 部署驱动。
    部署驱动依赖边缘实例,即您在前提条件中完成的环境搭建操作。
    1. 物联网平台控制台,选择边缘计算 > 边缘实例,在已创建好的边缘实例右侧单击查看
    2. 实例详情页面,选择设备驱动配置,单击全部驱动右侧的“+”图标 。
    3. 分配驱动对话框中,选择自研驱动并在已创建的自定义驱动对应操作栏中单击分配。然后单击完成

      分配自定义驱动到实例
    4. 选择已分配的自定义驱动demo_driver,单击分配子设备,将步骤 4中新建的设备分配到边缘实例。

      分配设备到实例
    5. 分配设备到边缘实例后,单击设备名称对应操作栏中的设备配置,配置设备信息。

      设备配置

      编写JSON格式配置内容(内容不可超过1 KB),并校验格式通过后,单击确定

    6. 实例详情页面,选择消息路由,单击添加路由
    7. 添加消息路由对话框中,配置参数,您可以通过设置消息路由查看具体配置方式。

      设置消息路由
    8. 实例详情页面,右上角单击部署,部署边缘实例。部署成功后边缘实例名称后显示部署成功
  6. 查看调试信息。
    实例部署成功后,可以查看设备连接状态和运行状态,这些信息可以在阿里云物联网平台查看,也可以通过在边缘网关运行环境查看驱动运行日志。
    • 云端查看:
      1. 实例详情页面设备驱动配置页签,选择自定义驱动demo_driver,查看设备连接状态。
        子设备在线
      2. 在物联网平台,选择设备管理 > 设备,单击led_device设备右侧操作栏中的查看,进入设备详情页面,选择运行状态查看设备上报的数据。
        查看设备运行状态
      3. 在物联网平台,选择监控运维 > 日志服务,在日志服务页面,产品参数后选择led_demo产品,查看设备行为分析
        查看设备日志
      4. 日志服务页面,选择上行消息分析查看设备数据上报日志。
        分析设备上行消息
    • 本地查看:
      1. 通过./fctl show命令,可以查看到部署驱动的具体位置。
        cd /linkedge/gateway/build/bin/
        ./fctl show
        系统显示类似如下图所示。
        代码执行片段
        表 1. 参数说明
        字段名称 字段解释
        DriverName 驱动名称,该名称为在阿里云物联网平台上传驱动时填写名称。
        CodePath 驱动部署到边缘网关中的位置路径。
        Process PID 驱动启动后的进程ID。
      2. 驱动在运行过程中会产生运行日志,通过查看运行日志可以了解驱动运行状态,每个自定义驱动生成的日志文件统一放在/linkedge/run/logger/fc-base路径下。每个驱动日志文件路径为/linkedge/run/logger/fc-base/xxxx/log_xxxx.txt
        说明 驱动日志文件路径中的xxxx为在上传驱动时填写的名称。
        cd /linkedge/run/logger/fc-base/demo_driver && ls -l
        详情如下图所示。
        代码执行片段
        驱动运行日志可以查看大部分驱动的运行状态,但是有时还需要查看其它日志配合了解当前驱动的运行情况,例如设备上线异常时可以查看dimu日志,日志文件路径为/linkedge/run/logger/dimu/log_xxxxx.txt
        cd /linkedge/run/logger/dimu
        ls -l
        详情如下图所示。
        代码执行片段
        设备上线成功后,如果设备数据上报有异常,则可以查看cloud_proxy日志。cloud_proxy产生的运行日志文件路径格式和内容为/linkedge/run/logger/cloud-proxy/log_xxxxx.txt
        cd /linkedge/run/logger/cloud-proxy
        ls -ll
        详情如下图所示。
        代码执行片段
  7. 调试数据交互。
    如果设备上线成功,则可以使用阿里云物联网平台在线调试功能调试驱动和设备,该功能页面还可以实时查看该设备上报的数据信息,也可以触发对设备的方法请求调用。
    1. 在物联网平台,选择监控运维 > 在线调试,在在线调试页面,选择调试产品和调试设备。

      在线调试
    2. 选择调试设备待调功能和方法,进行调试,并查看设备实时运行日志。

      在线调试上报属性
  8. 本地替换驱动。
    如果在设备接入驱动调试过程中发现问题,需要修改驱动代码重新生成新的驱动进行调试,这时仅需要将修改编译后的驱动直接在本地替换。
    1. 找到驱动的位置,可以通过fctl命令进行查找,具体字段解释查看调试信息。
      cd /linkedge/gateway/build/bin/
      ./fctl show

      代码执行片段
    2. 根据CodePath找到驱动所在位置路径,完成替换。
    3. 根据Process PID得到驱动进程ID,使用kill -9 Pid命令重新启动驱动。
      kill -9 Pid #Pid为驱动进程ID,即通过fctl命令查看得到的Process PID
    4. 替换驱动并完成驱动调试后,可参见本文上方上传驱动步骤,将驱动发布到物联网平台控制台
    至此,您已完成驱动的调试与发布过程。

驱动依赖注意事项

设备接入驱动根据协议和业务场景的不同,可能会涉及第三方库依赖。Link IoT Edge针对开发设备接入驱动所用不同开发语言,分别制定了第三方库依赖规则。

  • C版本SDK:

    C语言属于编译型语言,如果编译目标环境和运行环境不一致,则很可能导致不可运行。所以对于使用设备接入C版本SDK开发驱动,需要保证开发编译目标环境和运行环境相同。

    驱动包中包含驱动程序和依赖动态库。如果该驱动依赖于第三方库,则需要将动态库和驱动程序一起打包生成最终驱动程序包。

  • Node.js版本SDK:

    使用设备接入SDK Node.js版本开发驱动时,若依赖第三方库,可在项目根目录使用如下命令安装依赖。

    npm install 第三方库名
  • Python版本SDK:

    使用设备接入SDK Python版本开发驱动时,若依赖第三方库,需要在驱动目录使用如下命令,将第三方库与驱动安装在同级目录。

    pip3 install -t . 第三方库名

驱动打包注意事项

基于Link IoT Edge提供的SDK开发驱动并完成调试后,需将产物打包为.zip包,并确保驱动Binary或index源文件在.zip包第一级目录。

每个版本SDK开发的驱动在打包时,有不同的打包规则。

  • 基于C SDK开发的驱动
    对于C语言开发的驱动,驱动包中包含驱动程序和驱动依赖的动态库。如果驱动程序包含依赖库,则需要将依赖库放置指定的位置,即在驱动程序当前路径下的lib文件夹下。具体操作步骤如下:
    1. 规定驱动程序需命名为main。
    2. 在main当前路径下创建lib文件夹。
    3. 将main依赖的动态库全部拷贝到lib文件夹下。
    4. 使用zip命令对当前路径下的main和lib进行压缩处理生成zip包。
      zip -r your_driver_name.zip main lib
  • 基于Python SDK开发的驱动

    驱动包文件中须包含index.py,并且在该文件中定义handler函数。驱动是一个在函数计算引擎中持续运行的函数,所以在驱动包中须包含index.py文件,并且在该文件中定义handler函数。

    驱动运行时,会加载index.py文件。而该文件中,函数计算定义的handler函数是不会被调用,因此驱动代码须放在handler函数外,保证加载index.py文件时能直接执行。详情请参考Python版本SDK

  • 基于Node.js SDK开发的驱动

    驱动包文件中须包含index.js,并且在该文件中定义handler函数。

    驱动运行时,会加载index.js文件。而该文件中,函数计算定义的handler函数是不会被调用,因此驱动代码须放在handler函数外,保证加载index.js文件时能直接执行。详情请参考Nodejs版本SDK