> 技术文档 > HarmonyOS NEXT-订阅网络状态变化&RCP访问网络_harmony os rcp

HarmonyOS NEXT-订阅网络状态变化&RCP访问网络_harmony os rcp


订阅网络状态变化

网络状态主要包含:

  • 连接状态(是否成功连接网络)
  • 网络类型(蜂窝网络、Wi-Fi网络、蓝牙网络、以太网网络、VPN网络)
  • 网络拥堵
  • 信号强度
  • 网络速度

上述任一指标变化均可视为网络状态的改变

创建网络对象

connection.createNetConnection(netSpecifier?:NetSpecifier,timeout?:number):NetConnection//创建网络对象

参数说明:

  • netSpecifier: 可选,NetSpecifier类型,指定网络的各项特征
  • timeout:可选,获取netSpecifier指定网络时的超时时间

NetSpecifier参数说明:
netCapabilities:必填,NetCapabilities类型,存储数据网络的传输能力和承载类型,即网络能力集
bearerPrivateldentifier:可选,string类型,网络标识符,如Wi-Fi网络标识符为“wifi”

NetCapabilities参数说明:
linkUpBandwidthKbps:可选,string类型,上行(设备到网络)带宽
linkDownBandwidthKbps:可选,string类型,下行(网络到设备)带宽
networkCap:可选,Array类型,网络具体能力,如网络流量是否被计费、网络是否具有访问Internet的能力等
bearerTypes:必填,Array类型,网络类型

NetBearType网络类型参数说明:
在这里插入图片描述

示例代码:

//关注默认网络let netConnection=connection.createNetConnection()//关注蜂窝网络let netConnection=connection.createNetConnection({ netCapabilities:{ bearerTypes:[connection.NetBearType.BEARER_CELLULAR] }},0)

获取默认激活网络及其能力

connection.getDefaultNet().then((netHandle:connection.NetHandle)=>{ //获取默认激活网络 if(netHandle.netId===0){ //当前无默认网络时,获取的netHandler的netid为0 return } connection.getNetCapabilities(netHandle,(error:BusinessError,data:connection.NetCapabilities)=>{});//获取网络能力})

可订阅事件

netConnection.on(\'事件类型\',()=>{})

在这里插入图片描述

  • netAvailable网络可用事件:当设备连接到可用网络时触发
    在这里插入图片描述

  • netBlockStatusChange网络阻塞状态事件:当建立网络连接超时、传输数据包丢失或网络带宽不足、负载过高时触发
    在这里插入图片描述

  • netCapabilitiesChange网络能力变化事件:当网络能力(如类型、带宽等)发生变化时触发
    在这里插入图片描述

  • netConnectionPropertiesChange网络连接信息变化事件:当网络连接的信息(如IP地址、网关等)发生变化时触发
    在这里插入图片描述

  • netLost网络丢失事件:当设备失去网络连接时触发
    在这里插入图片描述

  • netUnavailable网络不可用事件:当设备处于网络状态或网络不可用时触发
    在这里插入图片描述

常见事件订阅场景如下

在这里插入图片描述

使用RCP访问网络

RCP业务流程

在这里插入图片描述

1.创建会话

在这里插入图片描述

2.发起请求

在这里插入图片描述

  • get请求
 get(url:URLOrString,destination?:ResponseBodyDestination):Promise<Response>;

请求示例

 let getPromise=session.get( EXAMPLE_URL, \'array-buffer\' );

ResponseBodyDestination类型指定了响应的目标位置或目的地,指示HTTP客户端应该将响应数据发送到那个位置

该类支持的值的类型有:array-buffer、IncomingDataCallback、DownloadToFile、DownloadToStream、INetworkOutputQueue

  • post请求
 post(url:URLOrString,content?:RequestContent,destination?:ResponseBodyDestination):Promise<Response>;

请求示例

 let postPromise=session.post( EXAMPLE_URL, CONTENT, \'array-buffer\' );

RequestContent是HTTP模块中的一种类型,代表HTTP请求的内容。例如,登录功能中的用户名和密码

3.处理响应

 let promise=session.get(...); promise.then((value)=>{ //value为请求的返回值 ... })

value包含:request(收到此响应的相关HTTP请求内容)、statusCode(HTTP请求的结果代码)、header(响应头)、effectiveUrl(重定向后请求的有效URL)

在这里插入图片描述

RCP请求开发流程

在这里插入图片描述

1.导入rcp模块
应用需要访问网络时,需要在module.json5文件中添加INTERNET权限,允许应用使用网络

//module.json5\"module\":{ \"requestPermissions\":[ { \"name\":\"ohos.permission.INTERNET\" } ]}

在ets文件中导入rcp模块

//RcpUtils.etsimport {rcp} from \'@kit.RemoteCommunicationKit\';

2.创建Session对象
定义一个类RCPUtils,实现rcp相关方法,创建session对象

//RcpUtils.etsexport class RCPUtils{ rcpSession:rcp.Session; constructor(){ this.rcpSession=rcp.createSession(); }}

3.发起请求、处理响应
定义一个getRCPRequest方法,通过Session对象调用get方法发起请求,传入请求资源的url

async getRCPRequest():Promise<string>{ let responseData:string=\'\'; await this.rcpSession.get(this.url) //处理响应保存资源 .then((res)=>{ ... responseData=... }) .catch((err)=>{ ... }) return responseData}

定义一个postRCPRquest方法,将请求的内容配置到requestContent字段中,传入请求资源的url和requestContent

async postRCPRequest():Promise<ListInfo[]>{ let responseData:Array<listInfo>=[]; let requestContent:rcp.RequestContent={...} await this.rcpSession.post(this.url,requestContent) //处理响应保存资源 .then((res)=>{ ... responseData=... }) .catch((err)=>{ ... }) return responseData}

4.销毁对象
当请求使用完毕时,须调用close方法主动释放与此会话关联的资源

//销毁数据请求对象destroySession(){ this.rcpSession.close();}

页面渲染

//Mypage.ets@State sourceOne:string=\'\'@State sourceTwo:Array<ListInfo>=[]async aboutToAppear():Promise<void>{ let rcpUtil:RCPUtils=new RCPUtils(); await rcpUtil.getRCPRequest().then((value:string)=>{ this.sourceOne=value }); await rcpUtil.postRCPRequest().then((value:Array<ListInfo>)=>{ this.sourceTwo=value }); rcpUtil.destroySession();}
build(){ List(){ ForEach(this.sourceTwo,(item:ListInfo)=>{ ListItem(){ Row(){  Cloumn(){ Text(this.sourceOne) Text(item)  } } } }) }}