#DAYU200#DAYU + Neptune 双核出击,Open Harmony 3.2灵光初现? 原创 精华
老子过去曰
上善若水,无为而治
而鸿蒙开发却洪水滔天,津波浸地,
究竟谁可挺身而出,谁迎战流年水逆?
今天的主角: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要如何结束,
而是告诉你如何开始,一个没有边界、没有限制,一个有任何可能的鸿蒙世界。
为老师的创意点赞