往期鸿蒙全套实战文章必看:(附带鸿蒙全栈学习资料)


开发无UI界面基础驱动

基本概念

  • DriverExtensionAbility

    DriverExtensionAbility是Driver类型的ExtensionAbility组件,提供驱动相关扩展框架能力。对于部分设备,支持插入外接的硬件模块来扩展设备能力, 此时可以以应用方式安装该硬件模块的驱动程序。DriverExtensionAbility可以通过DriverExtensionManager被应用绑定,并根据应用的请求信息在后台处理相关事务。

    每个类型的ExtensionAbility都有自己的Context,DriverExtensionAbility通过DriverExtensionContext提供相关能力。

环境搭建

请参考环境准备完成开发前的准备工作。

开发步骤

开发者在实现一个驱动时,需要在DevEco Studio工程中手动新建一个DriverExtensionAbility,具体步骤如下:

  1. 创建新工程,请参考创建一个新的工程,创建一个HarmonyOS工程。(如果在开发带UI界面基础驱动已经创建,则此处不需要创建。)

  2. 在新创建的工程对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为driverextability。

  3. 在driverextability目录,右键选择“New > ArkTS File”,新建一个文件并命名为DriverExtAbility.ets。

  4. 在文件中导入相关Kit,并定义请求Code。

    import { DriverExtensionAbility } from '@kit.DriverDevelopmentKit';
    import { Want } from '@kit.AbilityKit';
    import { rpc } from '@kit.IPCKit';
    
    
    const REQUEST_CODE = 99; // 与扩展外设客户端约定请求码。
  5. 打开DriverExtAbility.ets文件,导入RPC通信模块,重载onRemoteMessageRequest()方法,接收应用传递过来的消息,并将处理的结果返回给应用。REQUEST_CODE用于校验应用发送的服务请求码。

    class StubTest extends rpc.RemoteObject {
      // 接收应用传递过来的消息处理,以及将处理的结果返回给客户端。
      onRemoteMessageRequest(code: number, data: rpc.MessageSequence, reply: rpc.MessageSequence,
        option: rpc.MessageOption) {
        if (code === REQUEST_CODE) {
          // 接收应用传递过来的数据。
          // 应用使用多次调用data.writeString()写入多个数据时,驱动可以通过多次调用data.readString()方法接收对应的数据。
          let optFir: string = data.readString();
          // 驱动将数据的处理结果返回给应用。
          // 示例中为接收了"Hello",并将"Hello World"返回给应用。
          reply.writeString(optFir + ` World`);
        }
        return true;
      }
    }
  6. 在DriverExtAbility.ets文件中,增加导入DriverExtensionAbility的依赖包,该包提供了onInit()、onRelease()、onConnect()和onDisconnect()生命周期回调,自定义类继承DriverExtensionAbility并根据需要重写需要的生命周期回调。

    export default class DriverExtAbility extends DriverExtensionAbility {
      onInit(want: Want) {
        console.info('testTag', `onInit, want: ${want.abilityName}`);
      }
    
    
      onRelease() {
        console.info('testTag', `onRelease`);
      }
    
    
      onConnect(want: Want) {
        console.info('testTag', `onConnect, want: ${want.abilityName}`);
        return new StubTest("test");
      }
    
    
      onDisconnect(want: Want) {
        console.info('testTag', `onDisconnect, want: ${want.abilityName}`);
      }
    
    
      onDump(params: Array<string>) {
        console.info('testTag', `onDump, params:` + JSON.stringify(params));
        return ['params'];
      }
    }
  7. 在工程Module对应的module.json5配置文件中注册DriverExtensionAbility,type标签需要设置为“driver”,srcEntry标签表示当前ExtensionAbility组件所对应的代码路径。

    {
      "module": {
        "name": "entry",
        "type": "entry",
        "description": "$string:module_desc",
        "mainElement": "EntryAbility",
        "deviceTypes": [
          "default",
          "tablet"
        ],
        "requestPermissions": [
          {
            "name": "ohos.permission.ACCESS_EXTENSIONAL_DEVICE_DRIVER" // 此处为扩展外设相关权限,必须配置。
          },
          {
            "name": "ohos.permission.ACCESS_DDK_DRIVERS" // 此处为允许该扩展外设应用访问扩展外设驱动的权限,API verison 18及以上版本,必须配置。
          }
        ],
        "deliveryWithInstall": true,
        "installationFree": false,
        "pages": "$profile:main_pages",
        "abilities": [
          {
            "name": "EntryAbility",
            "srcEntry": "./ets/entryability/EntryAbility.ets",
            "description": "$string:EntryAbility_desc",
            "icon": "$media:startIcon",
            "label": "$string:EntryAbility_label",
            "startWindowIcon": "$media:startIcon",
            "startWindowBackground": "$color:start_window_background",
            "exported": true,
            "skills": [
              {
                "entities": [
                  "entity.system.home"
                ],
                "actions": [
                  "ohos.want.action.home"
                ]
              }
            ]
          }
        ],
        "extensionAbilities": [
          {
            "name": "DriverExtAbility",
            "icon": "$media:startIcon",
            "description": "driver",
            "type": "driver",
            "exported": true,
            "srcEntry": "./ets/driverextability/DriverExtAbility.ets",
            "metadata": [
              {
                "name": "bus", // 必填项,所属总线。
                "value": "USB"
              },
              {
                "name": "desc", // 选填项,必要的驱动描述。
                "value": "the sample of driverExtensionAbility"
              },
              {
                "name": "vendor", // 选填项,驱动厂商名称。
                "value": "string"
              },
              {
                "name": "vid", // 支持 USB vendor id 列表,填写16进制,此处为4817的16进制。
                "value": "0x12D1"
              },
              {
                "name": "pid", // 支持的 USB product id 列表,填写16进制,此处为4258的16进制。
                "value": "0x10A2"
              },
              {
                "name": "launchOnBind", // 选填项,延迟拉起驱动。此处“true”表示延迟拉起,“false”表示即时拉起,配置错误或不配置,默认为“false”。
                "value": "true"
              },
              {
                "name": "ohos.permission.ACCESS_DDK_ALLOWED", // 选填项,允许应用访问。此处“true”表示允许访问,“false”表示不允许访问,配置错误或不配置,默认为“false”。
                "value": "true"
              }
            ]
          }
        ]
      }
    }
  8. 完成客户端和驱动示例代码开发后,请参考使用本地真机运行应用/元服务,将Hap导入设备中,并点击hap中的Hello,查看是否会转变为Hello world,即实现ipc通信功能。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐