HarmonyOS 鸿蒙Next udp数据收发心跳包问题
HarmonyOS 鸿蒙Next udp数据收发心跳包问题
问题描述
需求:单片机每3秒发送一个“WF=?”
鸿蒙APP每收到一个“WF=?”,就返回一个“WF=OK”
调试结果
一个WF=?,会收到一些列的“WF=OK”
如下图所示:
鸿蒙代码
import { Equipt } from '../Model/Model';
import socket from '@ohos.net.socket';
import util from '@ohos.util';
import { Logger } from '../common/utils/Logger'
import hilog from '@ohos.hilog';
import wifimanager from '@ohos.wifiManager'
import { DialogUtils } from '../common/utils/toastUtlils';
const TAG = '[connSocket]'
export let udp = socket.constructUDPSocketInstance();
let ipNum = wifimanager.getIpInfo().ipAddress
let localIp = (ipNum >>> 24) + '.' + (ipNum >> 16 & 0xFF) + '.' + (ipNum >> 8 & 0xFF) + '.' + (ipNum & 0xFF);
export class udpSkt {
public static msg: string;
static async setupWIFI(ssid, pwd): Promise<string> {
let padAdd: string;
let deviceConfig: wifimanager.WifiDeviceConfig = {
ssid: ssid,
preSharedKey: pwd,
isHiddenSsid: false,
securityType: 3
}
try {
wifimanager.addCandidateConfig(deviceConfig).then((value: number) => {
Logger.debug(TAG, `add config sucess`)
try {
wifimanager.connectToCandidateConfig(value);
Logger.debug(TAG, `connectToDevice success`)
if (true === wifimanager.isConnected()) {
Equipt.padIP.set(localIp)
padAdd = localIp;
return padAdd;
}
} catch (err) {
Logger.debug(TAG, `connectToDevice fail err is ${JSON.stringify(err)}`)
}
})
} catch (err) {
Logger.debug(TAG, `addDeviceConfig fail err is ${JSON.stringify(err)}`)
}
return padAdd;
}
static async creatScoket(): Promise<void> {
let selfAddress = {
address: Equipt.padIP.get(),
port: 10006,
family: 1
};
udp.bind(selfAddress, err => {
if (err) {
Equipt.loginfo.addData(Equipt.loginfo.totalCount(), "\r\nbind fail");
DialogUtils('bind fail' + Equipt.padIP.get(), "Warning", ["OK"]);
return;
}
Equipt.loginfo.addData(Equipt.loginfo.totalCount(), "\r\nbind success");
DialogUtils('bind sucess' + Equipt.padIP.get(), "Information", ["OK"]);
})
udp.on('message', value => {
let str = "";
str = this.bufToString(value.message);
if (str.indexOf("WF=?") != -1) {
this.sendMsg("WF=OK");
}
Equipt.loginfo.addData(Equipt.loginfo.totalCount(), "\r\nRX:" + str);
});
}
static newlocalip(e) {
Equipt.padIP.set(e.value);
};
static newremoteip(e) {
Equipt.serverIP.set(e.value);
};
static newMessage(e) {
this.msg = e.value;
};
static async sendMsg(msg: string) {
let promise = udp.send({
data: msg,
address: {
address: Equipt.serverIP.get(),
port: 10006,
family: 1
}
});
promise.then(() => {
Equipt.loginfo.addData(Equipt.loginfo.totalCount(), "\r\nTX:" + msg + "\r\nsend success");
Logger.info('send success');
}).catch(err => {
Equipt.loginfo.addData(Equipt.loginfo.totalCount(), "\r\nsend fail");
Logger.info('send fail');
});
}
static bufToString(buf: ArrayBuffer) {
let textDecoder = util.TextDecoder.create('utf-8')
let str = textDecoder.decodeWithStream(new Uint8Array(buf))
return str;
}
}
更多关于HarmonyOS 鸿蒙Next udp数据收发心跳包问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
修改之后。平板发起心跳包。单片机监听。算是成功了。其实程序蛮简单。只需要下面的代码就好了。但是单片机发起心跳包,平板监听为什么不行,还是不懂。
aboutToAppear() {
portraitFunc = this.onPortrait.bind(this);
this.listener.on('change', portraitFunc);
this.breakpointSystem.register();
this.pagetitle = this.title;
this.startTiming();
}
startTiming() {
this.timer = setInterval(function () {
if (Equipt.cnxtStatus === true) {
udpSkt.sendMsg(heartbeat);
}
}, 3000);
}
更多关于HarmonyOS 鸿蒙Next udp数据收发心跳包问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
发完后关闭udp连接,那样的话,只发一个WF=OK了。我设计是平板是客户端,esp32单片机是服务器端,所以平板先发起通信,随后,单片机发起心跳包。可能这个流程有问题,计划平板发起通信,心跳包也由平板发起,可能会更容易一点。
试没试过 在 sendMsg 后, 关断UDP 链接, 有没有什么输出? 借此判断是在 server端,client端那里的问题
测试一下,
在HarmonyOS鸿蒙Next中,UDP数据收发的心跳包问题主要涉及网络通信的稳定性和实时性。UDP协议本身是无连接的,不保证数据包的顺序和可靠性,因此心跳包的实现需要开发者自行处理。
-
心跳包的作用:心跳包用于检测网络连接的可用性,确保客户端与服务器之间的通信链路正常。通过定期发送心跳包,可以及时发现网络中断或服务器异常。
-
实现方式:在鸿蒙Next中,可以使用
DatagramSocket
类进行UDP数据包的发送和接收。心跳包的发送可以通过定时任务(如Timer
或TaskDispatcher
)来实现,定期向服务器发送特定的数据包。 -
数据包格式:心跳包通常包含简单的标识信息,如设备ID、时间戳等。服务器收到心跳包后,可以回复一个确认包,客户端通过接收确认包来判断连接状态。
-
异常处理:如果在一定时间内未收到服务器的确认包,可以认为网络连接异常,此时可以尝试重新发送心跳包或进行重连操作。
-
性能优化:为了减少网络负载,心跳包的发送频率应根据实际需求进行调整,避免过于频繁的发送导致网络拥塞。
在鸿蒙Next中,UDP心跳包的实现需要结合具体的应用场景和网络环境,确保通信的稳定性和实时性。
在HarmonyOS鸿蒙Next中,UDP数据收发时处理心跳包的关键在于定时发送和接收检测。可以使用@Scheduled
注解或Timer
类定时发送心跳包,并通过DatagramSocket
接收数据。若在指定时间内未收到心跳包,可判定连接异常。建议设置合理的超时时间,并处理可能的丢包和网络延迟问题,确保系统稳定性和实时性。