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) } } } }) }}