HarmonyOS 鸿蒙Next udp数据收发心跳包问题

发布于 1周前 作者 phonegap100 来自 鸿蒙OS

HarmonyOS 鸿蒙Next udp数据收发心跳包问题

问题描述

需求:单片机每3秒发送一个“WF=?”
鸿蒙APP每收到一个“WF=?”,就返回一个“WF=OK”

调试结果

一个WF=?,会收到一些列的“WF=OK”
如下图所示:

image

鸿蒙代码

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

6 回复

修改之后。平板发起心跳包。单片机监听。算是成功了。其实程序蛮简单。只需要下面的代码就好了。但是单片机发起心跳包,平板监听为什么不行,还是不懂。

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协议本身是无连接的,不保证数据包的顺序和可靠性,因此心跳包的实现需要开发者自行处理。

  1. 心跳包的作用:心跳包用于检测网络连接的可用性,确保客户端与服务器之间的通信链路正常。通过定期发送心跳包,可以及时发现网络中断或服务器异常。

  2. 实现方式:在鸿蒙Next中,可以使用DatagramSocket类进行UDP数据包的发送和接收。心跳包的发送可以通过定时任务(如TimerTaskDispatcher)来实现,定期向服务器发送特定的数据包。

  3. 数据包格式:心跳包通常包含简单的标识信息,如设备ID、时间戳等。服务器收到心跳包后,可以回复一个确认包,客户端通过接收确认包来判断连接状态。

  4. 异常处理:如果在一定时间内未收到服务器的确认包,可以认为网络连接异常,此时可以尝试重新发送心跳包或进行重连操作。

  5. 性能优化:为了减少网络负载,心跳包的发送频率应根据实际需求进行调整,避免过于频繁的发送导致网络拥塞。

在鸿蒙Next中,UDP心跳包的实现需要结合具体的应用场景和网络环境,确保通信的稳定性和实时性。

在HarmonyOS鸿蒙Next中,UDP数据收发时处理心跳包的关键在于定时发送和接收检测。可以使用@Scheduled注解或Timer类定时发送心跳包,并通过DatagramSocket接收数据。若在指定时间内未收到心跳包,可判定连接异常。建议设置合理的超时时间,并处理可能的丢包和网络延迟问题,确保系统稳定性和实时性。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!