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)
                    }
                }
            }
        })
    }
}
相关推荐
Mintopia19 小时前
物联网数据驱动 AIGC:Web 端设备状态预测的技术实现
前端·javascript·aigc
一个W牛19 小时前
报文比对工具(xml和sop)
xml·前端·javascript
鸡吃丸子19 小时前
浏览器是如何运作的?深入解析从输入URL到页面渲染的完整过程
前端
作业逆流成河19 小时前
🔥 enum-plus 3.0:介绍一个天花板级的前端枚举库
前端·javascript·前端框架
爱喝水的小周19 小时前
《UniApp 页面导航跳转全解笔记》
前端·uni-app
蒜香拿铁19 小时前
Angular【组件】
前端·javascript·angular.js
ByteCraze19 小时前
一文讲透 npm 包版本管理规范
前端·arcgis·npm
梵得儿SHI20 小时前
Vue 模板语法深度解析:从文本插值到 HTML 渲染的核心逻辑
前端·vue.js·html·模板语法·文本插值·v-text指令·v-html指令
浪裡遊20 小时前
HTML面试题
前端·javascript·react.js·前端框架·html·ecmascript
More more20 小时前
uniapp实时查看在线监控,JessibucaMobile实现横屏播放
前端·javascript·uni-app·jessibucamobile