#DAYU200#DAYU + Neptune 双核出击,Open Harmony 3.2灵光初现? 原创 精华

入门大师小波哥
发布于 2022-5-23 14:47
浏览
4收藏

老子过去曰

上善若水,无为而治

而鸿蒙开发却洪水滔天,津波浸地,
究竟谁可挺身而出,谁迎战流年水逆?


今天的主角:DAYU + Neptune
大禹 + 海王
终极治水王霸 or 摸鱼吹水冠军?
5月末,Open Harmony 3.2发布,随我一探深浅!


话说到我的自制无线遥控打蒜器实现以后,一直被HarmonyOS蜗牛般的发布节奏以及Java与JS的繁琐互动所限,表面看起来挺好玩,实则技术债苦不堪言,深感无奈。

51CTO和润和软件的老师们很贴心,荣幸当上==Dayu200体验官==,硬件到手,不过一直对配套的OH3.1的api 8心存疑虑,根据以往的经验,大的改进上没有吹水,但是api本身存在各种bug,就我这个小项目而言极有可能又遭遇大困难,所以一直在看大佬们的文章学习。

好在皇天不负有心人,就在前天,试探性地刷了下新出炉的Open Harmony 3.2 beta,尝试了下测试中的api
9,惊喜来了,成果请看视频:智能打蒜器

Neptune的嵌入和编码,以及HarmonyOS上基于JS的App开发不再重复,请看自制无线遥控打蒜器

Open Harmony的版本的变化是App上的,从之前的Java和JS桥接,差不多近200多行非常费解的代码。自从3.2大部分实现Socket协议后,减少到不到20行以内,无需再写任何Java的Ability。

App只有一个页面,index.ets,代码如下:

import socket from '@ohos.net.socket'
import wifi from '@ohos.wifi';
import { resolveIP } from './util'
import prompt from '@ohos.prompt';

let udp = socket.constructUDPSocketInstance()
let port = 63060


let localAddr = {
  address: resolveIP(wifi.getIpInfo().ipAddress),
  port: port
}

let mixerAddr = {
//  address: '255.255.255.255', //局域网关播地址
  address: '192.168.2.6', //打蒜器地址
  port: port
}


@Entry
@Component
struct Index {
  @State connected: boolean = false
  @State on: boolean = false

  build() {
    Stack() {
      Column() {
        Column().height(100)
        Text('智能打蒜器')
          .fontSize(60)
          .fontWeight(FontWeight.Lighter)
          .fontColor(Color.White)
        Text(this.connected ? '已连接' : '未连接')
          .fontSize(30)
          .fontWeight(FontWeight.Lighter)
          .fontColor(Color.White)
        Text(this.on ? '运行中' : '')
          .fontSize(30)
          .fontWeight(FontWeight.Lighter)
          .fontColor(Color.White)
        Blank()

        Stack() {
          Image($r("app.media.panel2"))
            .height('100%')
            .width('100%')
            .objectFit(ImageFit.Fill)
          Image(this.connected ?
          $r("app.media.switch_red") :
          $r("app.media.switch_blue"))
            .width(120)
            .objectFit(ImageFit.Contain)
            .aspectRatio(1)
        }
        .height(180)
        .width('100%')

      }
      .width('100%')
      .height('100%')
      .backgroundColor(this.connected ? '#F2A6A6' : '#71A9FE')

      Image(this.on ? $r("app.media.on") : $r("app.media.off"))
        .objectFit(ImageFit.Contain)
        .onClick(() => {
          this.sendData()
        })
    }
    .width('100%')
    .height('100%')
    .onAppear(() => {
      this.bindOptions()
    })
  }

  bindOptions() {
    console.log('==Init,local IP is:' + JSON.stringify(localAddr))

    udp.bind(localAddr, e => {
      if (e) {
        console.log('==bind error')
        return
      }
      console.log('==bind ok')

      udp.setExtraOptions({
        broadcast: true
      }, e => {
        if (e) {
          console.log('==set extra option broadcast failed:' + JSON.stringify(e))
          return
        }

        console.log('setExtraOptions success');
      })

    })

    udp.on('listening', () => {
      console.log("==on listening success");
    })

    udp.on('message', data => { //收到指定端口来的消息
      this.connected = true //连接成功!
      console.log("==on message!")

      let dataView = new DataView(data.message)

      let str = ""
      for (let i = 0;i < dataView.byteLength; ++i) {
        let c = String.fromCharCode(dataView.getUint8(i))
        if (c !== "\n") {
          str += c
        }
      }
      console.log("==message:" + str + "From:" + data.remoteInfo.address)
      mixerAddr.address = data.remoteInfo.address //更新打蒜器的地址

    })
  }

  async checkOnline(){
    try {
      await udp.send({ data: 'check',address: mixerAddr})
      this.connected = true

      console.log(`==Send check ok >:  + ${mixerAddr.address}`)

    } catch (e){
      console.log('==Error send: ' + e)
    }
  }

  async sendData() {
    await this.checkOnline()
    if (!this.connected) {
      prompt.showToast({
        message: '暂未连接!'
      })
      return
    }
    let order = '' //开关指令
    if (this.on) { //如果是开,则发送关;
      order = 'of'
    } else {
      order = 'on'//关则发送开。
    }

    try {

      await udp.send({ data: order,address: mixerAddr})
      this.on = !this.on

      console.log(`==Send ${order} >:  + ${mixerAddr.address}`)

    } catch (e){
      console.log('==Error send: ' + e)
    }

  }
}

辅助工具类 util.ets:

export function resolveIP(ip) {
  if(ip < 0 || ip > 0xFFFFFFFF){
    throw ("The number is not normal!");
  }
  return (ip>>>24) + "." + (ip>>16 & 0xFF) + "." + (ip>>8 & 0xFF) + "." + (ip & 0xFF);
}

其中需要注意的是, 目前Open Harmony 3.2中的Socket并不支持发送数据广播,而且也无法收到广播信息,应该是从api上内部屏蔽了或者有bug,我没看源码,懂的大佬还请指正。

这个过程最愉快的是,Open Harmony支持Dayu200这样的富设备后,可以随心所欲的进行修改、优化,不再有任何HarmonyOS上那样的限制,更新速度按周计算,大大提升了迭代速度,测试速度更快。真正成为了一套普通开发者也可以比较容易轻松定制的全能OS。 也期待润和和其他生态厂商能带给我们更快、更小的各种开发板,


有了Dayu200和Open Harmony 3.2,我不是要想说Java要如何结束,

而是告诉你如何开始,一个没有边界、没有限制,一个有任何可能的鸿蒙世界。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-5-23 17:19:18修改
10
收藏 4
回复
举报
1条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

为老师的创意点赞

回复
2022-5-23 15:49:58
回复
    相关推荐