##鸿蒙核心技术##AI应用开发##Network Kit(网络服务)#

适配到最新的harmonyOS5.0.5版本的API16工程,openharmony也完全兼容
AI空调主要有以下4点功能:
1.基于hi3861使用温湿度传感器和烟雾浓度传感器对室内环境进行精准监测,通过TCP服务器稳定安全的在手机应用上查看家里的环境情况
2.自己在ubuntu下搭建服务器通过公网映射过端口,应用可以随时随地的远程查看家里的环境情况
3.基于聚言投喂用户个人历史行为指定专属分析模型,智能分析的空调模式完全适应个人身体情况
4.应用界面动态的根据环境进行环境图标的变化提示,背景图片也结合温湿度两个数据变化为对应天气示意图
image.pngimage.png

功能1环境监测开发:
说明:设备端环境采集案例网上案例很多这里不做讲解,设备端主要是把采集数据定时向TCP服务器发送即可,可以使用网络调试助手客户端模拟数据。
ubuntu自己写TCP转发服务器的C语言代码运行后把设备端的数据进行转发,这里也可以使用python写转发服务器运行更方便网上很多或者AI生成即可,公网映射我这里使用的cpolar免费领的一个映射端口,这样应用端连接映射后的TCP端口和IP就可以实现远程的数据监听了。应用端因为考虑到大部分个人开发者都没有next真机,这里我使用的是DevEco Studio 5.0.5的模拟器,公网能被模拟器连接,或者使用本地IP:10.0.2.2连接运行到本机的转发服务器。
应用端功能1主要开发TCP客户端和数据解析

TCP的绑定,连接我封装了一个可以直接和本地服务器通信的类,如果需要接入自己公网服务器的就替换自己的公网IP即可

import { socket } from "@kit.NetworkKit";
import { BusinessError } from "@kit.BasicServicesKit";

export class clien {
  tcp: socket.TCPSocket = socket.constructTCPSocketInstance();
  bind(){
    let bindAddr: socket.NetAddress = {
      address: '0.0.0.0',
      port: 8080
    }
    this.tcp.bind(bindAddr, (err: BusinessError) => {
      if (err) {
        console.log('bind fail');
        return;
      }
      console.log('bind success');
    })
  }
  connect(){
    this.bind()
    let netAddress: socket.NetAddress = {
      address: '10.0.2.2',
      port: 8080
    }
    let tcpconnectoptions: socket.TCPConnectOptions = {
      address: netAddress,
      timeout: 6000
    }
    this.tcp.connect(tcpconnectoptions, (err: BusinessError) => {
      if (err) {
        console.log('connect fail');
        return;
      }
      console.log('connect success');
    })
  }
}

我在UI页面代码里进行数据监听和解析,这样可以保证监听函数一直处于工作状态,不能封装在上面的函数里,否则只能通过加循环监听实现实时监听

aboutToAppear(): void {
    this.tcpclien.connect()

    this.tcpclien.tcp.on('message', (value: socket.SocketMessageInfo) => {
      let messageView = '';
      for (let i: number = 0; i < value.message.byteLength; i++) {
        let uint8Array = new Uint8Array(value.message)
        let messages = uint8Array[i]
        let message = String.fromCharCode(messages);
        messageView += message;
      }
      this.wdu = JSON.parse(messageView).indoor
        this.sdu = JSON.parse(messageView).humi
        this.ywu = JSON.parse(messageView).gas
        this.wdu = parseFloat(this.wdu.toFixed(2));
        this.sdu = parseFloat(this.sdu.toFixed(2));
        this.ywu = parseFloat(this.ywu.toFixed(2));
      console.log('on message message: ' + JSON.stringify(messageView));
      console.log('remoteInfo: ' + JSON.stringify(value.remoteInfo));
    });
  }

只做应用开发的伙伴可以使用网络模拟器发送模拟的环境数据,看看是否能成功被解析环境数据

image.png

功能2 AI分析模型开发
这里我使用的是聚言训练的模型,因为 我不是专业的模型训练师,百度这些的模型训练我看了一下操作挺麻烦的,动不动就要开通各种付费权限才能使用基础功能部署起来,聚言有免费的调用次数,然后训练的时候只需要自己丢文档去学习即可,教程如下:
进入聚言官网聚言,创建项目

image.png

将我们的个人历史操作行为整理成表格最好投喂给AI,只投喂这部分知识

image.png

然后问答风格训练,将我们提问的方式以json格式提交一些例子,给出类似答案的中文版本问题方便AI看懂问题,同理答案也给案例按照json格式回复,这样才能被软硬件提取数据。

image.png

然后我们可以在项目里看到自己项目的APIkey,应用端开发HTTP接口去调用封装这个AI模型

import { http } from '@kit.NetworkKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

//AI机器人调用
export class deviceAI {
  text: string = ''

  request(question: string) {
    let httpRequest = http.createHttp();
    const body = JSON.stringify({
      "query_text": question,
      "session_id": "test_id",
      "enable_citation": "0",
      "enable_followup": "0",
      "stream": "0",
    });

    // 2 发起请求
    httpRequest.request(
      // 请求地址
      "https://openapi.chatmax.net/v1/ctai/query_text_chat",
      {
        method: http.RequestMethod.POST,
        header: {
          'Content-Type': 'application/json',
          'Accept': 'application/json',
          'orionstar-api-key': 'api-keyxxxx',
        },
        extraData: body
      }, (err, data: http.HttpResponse) => {
      if (err) {
        hilog.error(0x0000, 'testTag', 'Failed to request BaiDu. Cause: %{public}s', JSON.stringify(err) ?? '');
        httpRequest.destroy();
      } else {
        this.text =  JSON.parse(data.result.toString()).data.answer_text
        hilog.error(0x0000, 'testTag', 'Request BaiDu success. data: %{public}s', this.text);
        httpRequest.destroy();
      }
    })
  }


}

调用封装好的模型接口,发送温度给它,就会给出推测的空调温度和工作模式,因为是json格式的,我们可以直接通过json解析函数提前温度和工作模式

this.AI.request(JSON.stringify({
              "indoor": parseInt(this.temp)
            }))
            let intervalId = setInterval(()=>{
              if(this.AI.text.length > 0){
                this.mode = JSON.parse(this.AI.text).mode
                this.set = JSON.parse(this.AI.text).set
                clearInterval(intervalId)
              }
            },100)

注意因为免费的问答次数只有300次,所以别收到环境数据就去推测,避免浪费次数,我加了个按钮,只有点击推测按钮才去调用推理模型。这个模型有个好处就是现在自带常用大模型,问问题的只要不按照json格式问,就可以正常聊天使用,也就意味着推理的数据更加智能。
功能3 动态环境背景和图标
我的温湿度和有毒气体浓度的自动变化图标去是阿里巴巴图标库里配套下载的,这样能保证图标看起来只是变色,不会变形。而天气背景图,现在的AI绘图都能画的比较符合要求且好看形象。通过条件判断来改变背景图的图片,这个功能逻辑比较简单,就看个人的UI设计能力了

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐