HarmonyOS-订阅网络状态变化&RCP访问网络

订阅网络状态变化

网络状态主要包含:

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

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

创建网络对象

typescript 复制代码
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 网络类型参数说明:

示例代码:

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

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

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

可订阅事件

typescript 复制代码
netConnection.on('事件类型',()=>{})
  • netAvailable 网络可用事件:当设备连接到可用网络时触发

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

  • netCapabilitiesChange 网络能力变化事件:当网络能力(如类型、带宽等)发生变化时触发

  • netConnectionPropertiesChange 网络连接信息变化事件:当网络连接的信息(如IP地址、网关等)发生变化时触发

  • netLost 网络丢失事件:当设备失去网络连接时触发

  • netUnavailable 网络不可用事件:当设备处于网络状态或网络不可用时触发

常见事件订阅场景如下

使用RCP访问网络

RCP业务流程

1.创建会话

2.发起请求

  • get请求
typescript 复制代码
    get(url:URLOrString,destination?:ResponseBodyDestination):Promise<Response>;

请求示例

typescript 复制代码
    let getPromise=session.get(
        EXAMPLE_URL,
        'array-buffer'
    );

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

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

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

请求示例

typescript 复制代码
 let postPromise=session.post(
        EXAMPLE_URL,
        CONTENT,
        'array-buffer'
    );

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

3.处理响应

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

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

RCP请求开发流程

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

typescript 复制代码
//module.json5
"module":{
    "requestPermissions":[
        {
            "name":"ohos.permission.INTERNET"
        }
    ]
}

在ets文件中导入rcp模块

typescript 复制代码
//RcpUtils.ets
import {rcp} from '@kit.RemoteCommunicationKit';

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

typescript 复制代码
//RcpUtils.ets
export class RCPUtils{
    rcpSession:rcp.Session;
    
    constructor(){
        this.rcpSession=rcp.createSession();
    }
}

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

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

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

typescript 复制代码
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方法主动释放与此会话关联的资源

typescript 复制代码
//销毁数据请求对象
destroySession(){
    this.rcpSession.close();
}

页面渲染

typescript 复制代码
//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();
}
typescript 复制代码
build(){
    List(){
        ForEach(this.sourceTwo,(item:ListInfo)=>{
            ListItem(){
                Row(){
                    Cloumn(){
                        Text(this.sourceOne)
                        Text(item)
                    }
                }
            }
        })
    }
}
相关推荐
定栓7 分钟前
Webpack迁到Vite第一节:模块系统迁移:require → import
运维·前端·webpack
小熊在忙fpga17 分钟前
N32G430芯片的flash表示
前端·javascript·html
Data analyse45622 分钟前
App埋点版本兼容的字段迁移校验
大数据·运维·服务器·前端·数据库·数据分析
todoitbo28 分钟前
本来只想给内网开个口子,Natapp 却多给了一道防护
前端·javascript·vue.js·内网穿透·网络防护·natapp
会灭火的程序员34 分钟前
SuperMap AgentX Server智能体接入WEB应用技术文档
前端·supermap·agentx·agentx server
CRMEB38 分钟前
商品 SKU 设计,从简单规格到多规格踩过什么
java·前端·数据库·开源
Chloe.Zz40 分钟前
一篇入门Agent
开发语言·前端·javascript
java1234_小锋1 小时前
【技术专题】HTML5 网页技术 - HTML5 表格标签
前端·html·html5
雪芽蓝域zzs1 小时前
JS 项目转 TS 项目(Vue3 + 若依这类后台项目)完整改造清单
前端·vue.js