鸿蒙开发(NEXT/API 12)【基础功能(USB服务开发)】USB服务

基本概念

USB服务是应用访问底层的一种设备抽象概念。开发者根据提供的USB API,可以获取设备列表、控制设备访问权限、以及与连接的设备进行数据传输、控制命令传输等。

运作机制

USB服务系统包含USB API、USB Service、USB HAL。

图1 USB服务运作机制

1

  • USB API:提供USB的基础API,主要包含查询USB设备列表、批量数据传输、控制命令传输、权限控制等。
  • USB Service:主要实现HAL层数据的接收、解析、分发以及对设备的管理等。
  • USB HAL层:提供给用户态可直接调用的驱动能力接口。

场景介绍

Host模式下,可以获取到已经连接的USB设备列表,并根据需要打开和关闭设备、控制设备权限、进行数据传输等。

接口说明

USB服务主要提供的功能有:查询USB设备列表、批量数据传输、控制命令传输、权限控制等。

表1 USB类的开放能力接口

接口名描述
hasRight(deviceName: string): boolean判断是否有权访问该设备。
requestRight(deviceName: string): Promise请求软件包的临时权限以访问设备。使用Promise异步回调。
removeRight(deviceName: string): boolean移除软件包对设备的访问权限。
connectDevice(device: USBDevice): Readonly根据getDevices()返回的设备信息打开USB设备。
getDevices(): Array<Readonly>获取接入主设备的USB设备列表。如果没有设备接入,那么将会返回一个空的列表。
setConfiguration(pipe: USBDevicePipe, config: USBConfiguration): number设置设备的配置。
setInterface(pipe: USBDevicePipe, iface: USBInterface): number设置设备的接口。
claimInterface(pipe: USBDevicePipe, iface: USBInterface, force ?: boolean): number注册通信接口。
bulkTransfer(pipe: USBDevicePipe, endpoint: USBEndpoint, buffer: Uint8Array, timeout ?: number): Promise批量传输。
closePipe(pipe: USBDevicePipe): number关闭设备消息控制通道。
releaseInterface(pipe: USBDevicePipe, iface: USBInterface): number释放注册过的通信接口。
getFileDescriptor(pipe: USBDevicePipe): number获取文件描述符。
getRawDescriptor(pipe: USBDevicePipe): Uint8Array获取原始的USB描述符。
controlTransfer(pipe: USBDevicePipe, controlparam: USBControlParams, timeout ?: number): Promise控制传输。

开发步骤

USB设备可作为Host设备连接Device设备进行数据传输。开发示例如下:

  1. 获取设备列表。
// 导入USB接口api包。
import { usbManager } from '@kit.BasicServicesKit';
// 获取设备列表。
let deviceList : Array<usbManager.USBDevice> = usbManager.getDevices();
/*
deviceList结构示例
[
  {
    name: "1-1",
    serial: "",
    manufacturerName: "",
    productName: "",
    version: "",
    vendorId: 7531,
    productId: 2,
    clazz: 9,
    subClass: 0,
    protocol: 1,
    devAddress: 1,
    busNum: 1,
    configs: [
      {
        id: 1,
        attributes: 224,
        isRemoteWakeup: true,
        isSelfPowered: true,
        maxPower: 0,
        name: "1-1",
        interfaces: [
          {
            id: 0,
            protocol: 0,
            clazz: 9,
            subClass: 0,
            alternateSetting: 0,
            name: "1-1",
            endpoints: [
              {
                address: 129,
                attributes: 3,
                interval: 12,
                maxPacketSize: 4,
                direction: 128,
                number: 1,
                type: 3,
                interfaceId: 0,
              }
            ]
          }
        ]
      }
    ]
  }
]
*/
  1. 获取设备操作权限。
import { usbManager } from '@kit.BasicServicesKit';
import { BusinessError } from '@kit.BasicServicesKit';

let deviceName : string = deviceList[0].name;
// 申请操作指定的device的操作权限。
usbManager.requestRight(deviceName).then((hasRight : boolean) => {
  console.info("usb device request right result: " + hasRight);
}).catch((error : BusinessError)=> {
  console.info("usb device request right failed : " + error);
});
  1. 打开Device设备。
// 打开设备,获取数据传输通道。
let pipe : usbManager.USBDevicePipe = usbManager.connectDevice(deviceList[0]);
let interface1 : usbManager.USBInterface = deviceList[0].configs[0].interfaces[0];
/*
 打开对应接口,在设备信息(deviceList)中选取对应的interface。
interface1为设备配置中的一个接口。
*/
usbManager.claimInterface(pipe, interface1, true);
  1. 数据传输。当前仅支持批量传输和控制传输。
  • 批量传输
import { usbManager } from '@kit.BasicServicesKit';
import { BusinessError } from '@kit.BasicServicesKit';
/*
  读取数据,在device信息中选取对应数据接收的endpoint来做数据传输
(endpoint.direction == 0x80);dataUint8Array是要读取的数据,类型为Uint8Array。
*/
let inEndpoint : usbManager.USBEndpoint = interface1.endpoints[2];
let outEndpoint : usbManager.USBEndpoint = interface1.endpoints[1];
let dataUint8Array : Uint8Array = new Uint8Array(1024);
usbManager.bulkTransfer(pipe, inEndpoint, dataUint8Array, 15000).then((dataLength : number) => {
if (dataLength >= 0) {
  console.info("usb readData result Length : " + dataLength);
} else {
  console.info("usb readData failed : " + dataLength);
}
}).catch((error : BusinessError) => {
console.info("usb readData error : " + JSON.stringify(error));
});
// 发送数据,在device信息中选取对应数据发送的endpoint来做数据传输。(endpoint.direction == 0)
usbManager.bulkTransfer(pipe, outEndpoint, dataUint8Array, 15000).then((dataLength : number) => {
  if (dataLength >= 0) {
    console.info("usb writeData result write length : " + dataLength);
  } else {
    console.info("writeData failed");
  }
}).catch((error : BusinessError) => {
  console.info("usb writeData error : " + JSON.stringify(error));
});
  • 控制传输
import { usbManager } from '@kit.BasicServicesKit';
import { BusinessError } from '@kit.BasicServicesKit';

/*
  构造控制传输参数
*/
let param: usbManager.USBDeviceRequestParams = {
  bmRequestType: 0x80,    //0x80指一次由设备到主机的标准请求命令
  bRequest: 0x06,    //0x06指获取描述符
  wValue:0x01 << 8 | 0,    //该值为2个字节,高字节指描述符类型,此处0x01指设备描述符;低字节指描述符索引,设备描述符不涉及,填0
  wIndex: 0,    //索引值,可填0
  wLength: 18,    //描述符的长度,此处18表示设备描述符长度,最大支持1024
  data: new Uint8Array(18)
};

usbManager.usbControlTransfer(pipe, param).then((ret: number) => {
console.info("usbControlTransfer = ${ret}");
})
  1. 释放接口,关闭设备。
usbManager.releaseInterface(pipe, interface1);
usbManager.closePipe(pipe);

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

在这里插入图片描述

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 《鸿蒙 (OpenHarmony)开发学习视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙开发实战》

在这里插入图片描述

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿
1

### Ubuntu南向开发教程和资源 #### 安装配置开发环境 对于Ubuntu系统的南向开发,首要任务是建立一个稳定的工作环境。根据已有经验,在安装Ubuntu作为操作系统的过程中遇到的问题较少,特别是版本20.04.4 LTS表现出了良好的稳定性[^1]。这为后续的开发工作奠定了坚实的基础。 为了更好地支持南向设备接入和服务部署,建议开发者熟悉Linux命令行操作以及基本的网络设置方法。此外,还需确保已正确安装必要的编译工具链和其他依赖项,比如GCC、Make等构建工具,这些可以通过包管理器apt-get轻松获取并安装。 #### 开发框架的选择 针对具体的南向应用场景,可以选择不同的API接口和技术栈来实现数据采集、协议解析等功能模块。如果目标平台涉及物联网(IoT),那么MQTT可能是较为理想的消息传输协议之一;而对于更底层硬件控制,则可能需要用到诸如libusb这样的库来进行USB通信编程。 #### 学习路径推荐 一份详尽的学习指南应当覆盖从基础概念到高级特性的各个层面。考虑到HarmonyOS NEXT所提供的全面技术支持文档涵盖了众多关键技术领域,包括但不限于ArkTS、ArkUI开发组件、Stage模型等方面的内容[^2],这对于理解如何利用Ubuntu进行跨平台应用程序的设计有着重要的指导意义。 ```bash sudo apt update && sudo apt upgrade -y sudo apt install build-essential git cmake libssl-dev -y ``` 上述脚本展示了怎样通过APT更新现有软件包列表,并安装一些常用的开发工具集,如build-essential用于提供C/C++编译环境,git便于源码管理和协作开发,cmake则是现代C++项目的自动化构建系统,而libssl-dev提供了SSL/TLS加密功能的支持。 #### 实践案例分享 实际项目实践中往往能积累更多宝贵的经验教训。参开源社区贡献代码不仅有助于个人技能提升,也能让开发者接触到最前沿的技术趋势和发展动态。例如加入OpenHarmony社区,参到具体子系统的维护工作中去,能够加深对整个生态体系的理解程度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值