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)
                    }
                }
            }
        })
    }
}
相关推荐
软件技术NINI21 分钟前
html css 网页制作成品——HTML+CSS非遗文化扎染网页设计(5页)附源码
前端·css·html
fangcaojushi22 分钟前
npm常用的命令
前端·npm·node.js
阿丽塔~34 分钟前
新手小白 react-useEffect 使用场景
前端·react.js·前端框架
鱼樱前端1 小时前
Rollup 在前端工程化中的核心应用解析-重新认识下Rollup
前端·javascript
m0_740154671 小时前
SpringMVC 请求和响应
java·服务器·前端
加减法原则1 小时前
探索 RAG(检索增强生成)
前端
禁止摆烂_才浅2 小时前
前端开发小技巧 - 【CSS】- 表单控件的 placeholder 如何控制换行显示?
前端·css·html
烂蜻蜓2 小时前
深度解读 C 语言运算符:编程运算的核心工具
java·c语言·前端
PsG喵喵2 小时前
用 Pinia 点燃 Vue 3 应用:状态管理革新之旅
前端·javascript·vue.js
鹏仔工作室2 小时前
vue h5实现车牌号输入框
前端·javascript·vue.js