找回密码
 立即注册
123
返回列表 发新帖回复
楼主: xiejirui666

我司BQ3568-HM开发板与3861开发板实现TCP通讯

[复制链接]

3

主题

28

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2023-7-31 17:09:05 | 显示全部楼层
小问题:定时器在退出界面后还会重复发送,所以要在.onDisAppear()内加入终止定时器,达到进入界面可以同步获取温湿度,离开界面停止。
        
      .onDisAppear(()=>{

                clearInterval(this.timer2);

                clearInterval(this.timer);
              })
回复

使用道具 举报

3

主题

28

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2023-7-31 17:10:53 | 显示全部楼层
bug:在dev中的定时器和if,while语句使用总有问题,而且基本无法成功。暂不影响自己的需求。
回复

使用道具 举报

3

主题

28

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2023-8-1 17:53:38 | 显示全部楼层
今日问题:加入烟感模块,设计ui并编写hi3861代码:
hi3861代码如下:
// 烟雾传感器 语句与执行
                        if (strcmp(recvbuf, "yanwuon") == 0)
                        {
                                float  ppm;
                                Init_E53_SF1();
                                ppm = Get_MQ2_PPM();
                                char data1 [6];
                                sprintf(data1,"%.3f",ppm);
                                ret = send(new_fd, data1, strlen(data1), 0);
                                bzero(recvbuf, sizeof(recvbuf));
                        };
// 警报器 语句与执行
                        if (strcmp(recvbuf, "baojing on") == 0)
                        {
                                Beep_StatusSet(ON1);
                                sleep(2);
                                Beep_StatusSet(OFF1);
                                bzero(recvbuf, sizeof(recvbuf));
                        };
回复

使用道具 举报

3

主题

28

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2023-8-1 17:57:05 | 显示全部楼层
ui界面代码目的:烟雾传感器的实时上报,检测烟雾浓度,可以自己设定报警阈值,当烟雾浓度超过阈值,蜂鸣器警报。现基本实现,但有bug,在报警之后,烟雾传感器会有一定几率不上报值,暂未测出什么原因,ui代码如下:
import socket from '@ohos.net.socket';
import router from '@ohos.router'

@Component
struct PageTitle {
  build() {
    Row() {
      Image($r('app.media.back'))
        .width(20)
        .height(20)
        .onClick(() => {
          router.back()
        })
      Text("烟雾传感器")
        .fontSize(22)
        .margin({ left: 20 })
    }
    .padding(12)
    .width('100%')
  }
}

@Entry
@Component
struct taideng {
  @State imageBgColorA: number = 0
  @State ledon: boolean = false
  @State recv: string = '0'
  @State time: boolean = false
  @State time1: boolean = false
  @State jingbao: boolean =false
  @State timer: number = 0
  @State timer2: number = 0
  @State timer3: number = 0
  @State yanwu: number = 0
  @State yuzhi: number = 25
  @StorageProp('currentBreakpoint') currentBreakpoint: string = 'sm'
  //   tcp = socket.constructTCPSocketInstance();


  build() {
    Scroll() {
      Column() {
        PageTitle()
        Stack({ alignContent: Alignment.BottomStart }) {
          Image(this.ledon ? $r("app.media.icon_fraction_smoke_online") : $r("app.media.icon_fraction_smoke_offline"))
            .backgroundColor(`rgba(255, 255, 255, ${this.imageBgColorA})`)
            .objectFit(ImageFit.Contain)
        }
        .height(this.currentBreakpoint == 'lg' ? 166 : 280)

        List() {

          ListItem() {
            Column() {
              Button({ type: ButtonType.Normal, stateEffect: false }) {
                Row() {
                  Text(this.ledon ? "已打开" : "已关闭")
                  .fontSize(25)
                  .margin({ left: 15, right: 15 })
                  .fontWeight(FontWeight.Bold)
                  .align(Alignment.Center)
                  .width('50%')

                  Image(this.ledon ? $r("app.media.icon_switch_on") : $r("app.media.icon_switch_off"))
                    .objectFit(ImageFit.Contain)
                    .align(Alignment.Center)
                    .width('50%')
                    .onClick(() => {
                      if (!this.ledon) {
                          clearInterval(this.timer2)
                      this.timer2 = setInterval(() => {
                        globalThis.tcp.connect({ address: globalThis.mixeraddr, timeout: 6000 }, () => {
                          //     电脑ip
                          //     tcp.connect({ address: { address: '192.168.2.125', port: 3861, family: 1 }, timeout: 6000 }, () => {
                          console.log('connect success');
                          globalThis.tcp.send({
                            data: 'yanwuon'
                            //此处省略encoding, 默认为utf-8编码格式
                          }, err => {
                            if (err) {
                              console.log('send fail' + JSON.stringify(err));
                              return;
                            }
                            console.log('send  yanwuon success');
                          })
                        })
                        globalThis.tcp.on('message', value => {
                          console.log("on message")
                          let buffer = value.message
                          let dataView = new DataView(buffer)
                          let str = ""
                          for (let i = 0; i < dataView.byteLength; ++i) {
                            str += String.fromCharCode(dataView.getUint8(i))
                          }
                          console.log("on connect received:" + str)
                          this.yanwu = Number(str)
                        });
                      }, 1500)
                      }
                      else {
//                        clearInterval(this.timer2);
                      }
                    })
                }
              }
              .borderRadius(8)
              .backgroundColor('#ffeee1e1')
              .width('95%')
              .height('12%')
              .margin({ left: 15, right: 15 })

              Divider().color(Color.White).strokeWidth(5)

              Row(){
                Text("烟雾浓度:")
                  .height('15%')
                  .fontSize(25)
                  .fontWeight(FontWeight.Bold)
                  .layoutWeight(1)
                  .align(Alignment.Center)
                  .width('50%')

                Text(this.yanwu.toString()+"ppm")
                  .height('15%')
                  .fontSize(25)
                  .fontWeight(FontWeight.Bold)
                  .layoutWeight(1)
                  .align(Alignment.Center)
                  .width('50%')
                  .onAreaChange(()=>{
                    if(this.yanwu >= this.yuzhi){
                      this.jingbao= true;

                      //

                      globalThis.tcp.connect({ address: globalThis.mixeraddr, timeout: 6000 }, () => {
                        //     电脑ip
                        //     tcp.connect({ address: { address: '192.168.2.125', port: 3861, family: 1 }, timeout: 6000 }, () => {
                        console.log('connect success');
                        globalThis.tcp.send({
                          data: 'baojing on'
                          //此处省略encoding, 默认为utf-8编码格式
                        }, err => {
                          if (err) {
                            console.log('send fail' + JSON.stringify(err));
                            return;
                          }
                          console.log('send baojing on success');
                        })
                      })
                      clearInterval(this.timer3)
                      this.timer3 = setTimeout(() => {

                        this.jingbao= false
                      }, 2000)
                    }
                  })

/*                clearInterval(this.timer2)
                this.timer2 = setInterval(() => {
                }, 1500)*/
              }
              .backgroundColor('#ffeee1e1')
              .width('95%')
              Divider().color(Color.White).strokeWidth(5)
              Row(){
                Text("报警阈值:")
                  .fontSize(25)
                  .fontWeight(FontWeight.Bold)
                  .layoutWeight(1)
                  .align(Alignment.Center)
                  .width('50%')

                TextInput({
                  placeholder: "请输入监控值",
                })
                  .width('40%')
                  .onChange((value)=>{
                      this.yuzhi = Number(value)
                  })
              }
              .borderRadius(8)
              .backgroundColor('#ffeee1e1')
              .width('95%')
              .height('12%')
              .margin({ left: 15, right: 15 })
              .align(Alignment.Center)

              Image(this.jingbao? $r("app.media.icon_device_alert") : null)
              .height('15%').align(Alignment.Center).objectFit(ImageFit.Contain)


            }
          }
        }
      }
      .alignItems(HorizontalAlign.Center)
    }
    .backgroundColor('#EDF2F5')
    .height('100%')
    .align(Alignment.Top)
  }
}






回复

使用道具 举报

3

主题

28

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2023-8-1 17:59:20 | 显示全部楼层
在移植hi3861代码时,出现结构体定义重复,定义了两次on与off,最后将一个on改为on1,off同理。
回复

使用道具 举报

3

主题

28

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2023-8-2 17:31:23 | 显示全部楼层
今日任务:解决bug,在报警之后,烟雾传感器会有一定几率不上报值,只能在hi3861处改代码,设定阈值,准备使用多线程解决此问题:
if (strcmp(recvbuf, "yanwuon") == 0)
                        {
                                float ppm;
                                Init_E53_SF1();
                                /****传感器校准****/
                                usleep(1000000); // 开机1s后进行校准
                                MQ2_PPM_Calibration();
                                ppm = Get_MQ2_PPM();
                               
                                char data1[6];
                                sprintf(data1, "%.3f", ppm);
                                ret = send(new_fd, data1, strlen(data1), 0);
                                if (ppm > 21)
                                {
                                        Beep_StatusSet(ON);
                                }
                                else
                                {
                                        Beep_StatusSet(OFF);
                                }
                               
                                bzero(recvbuf, sizeof(recvbuf));
                        };
                }
回复

使用道具 举报

3

主题

28

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2023-8-2 17:33:50 | 显示全部楼层
学习多线程代码:
void thread1(void)
{
    int sum=0;
    while (1)
    {
        /* code */
        printf("This is BearPi-HM_Nano Thread1----%d\r\n",sum++);
        usleep(1000000);
    }
}

void thread2(void)
{
    int sum=0;
    while (1)
    {
        /* code */
        printf("This is BearPi-HM_Nano Thread2----%d\r\n",sum++);
        usleep(500000);
    }   
}

static void Thread_example(void)
{
    osThreadAttr_t attr;

    attr.name = "thread1";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024*4;
    attr.priority = 25;

    if (osThreadNew((osThreadFunc_t)thread1, NULL, &attr) == NULL) {
        printf("Falied to create thread1!\n");
    }

    attr.name = "thread2";
   
    if (osThreadNew((osThreadFunc_t)thread2, NULL, &attr) == NULL) {
        printf("Falied to create thread2!\n");
    }
}
回复

使用道具 举报

3

主题

28

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2023-8-2 17:55:41 | 显示全部楼层
烟感系统暂时告一段落最终代码:
import socket from '@ohos.net.socket';
import router from '@ohos.router'

@Component
struct PageTitle {
  build() {
    Row() {
      Image($r('app.media.back'))
        .width(20)
        .height(20)
        .onClick(() => {
          router.back()
        })
      Text("烟雾传感器")
        .fontSize(22)
        .margin({ left: 20 })
    }
    .padding(12)
    .width('100%')
  }
}

@Entry
@Component
struct taideng {
  @State imageBgColorA: number = 0
  @State ledon: boolean = false
  @State recv: string = '0'
  @State time: boolean = false
  @State time1: boolean = false
  @State jingbao: boolean =false
  @State timer: number = 0
  @State timer2: number = 0
  @State timer3: number = 0
  @State timer4: number = 0
  @State yanwu: number = 0
  @State yuzhi: number = 25
  @StorageProp('currentBreakpoint') currentBreakpoint: string = 'sm'
  //   tcp = socket.constructTCPSocketInstance();


  build() {
    Scroll() {
      Column() {
        PageTitle()
        Stack({ alignContent: Alignment.BottomStart }) {
          Image(this.ledon ? $r("app.media.icon_fraction_smoke_online") : $r("app.media.icon_fraction_smoke_offline"))
            .backgroundColor(`rgba(255, 255, 255, ${this.imageBgColorA})`)
            .objectFit(ImageFit.Contain)
        }
        .height(this.currentBreakpoint == 'lg' ? 166 : 280)

        List() {

          ListItem() {
            Column() {
              Button({ type: ButtonType.Normal, stateEffect: false }) {
                Row() {
                  Text(this.ledon ? "已打开" : "已关闭")
                  .fontSize(25)
                  .margin({ left: 15, right: 15 })
                  .fontWeight(FontWeight.Bold)
                  .align(Alignment.Center)
                  .width('50%')

                  Image(this.ledon ? $r("app.media.icon_switch_on") : $r("app.media.icon_switch_off"))
                    .objectFit(ImageFit.Contain)
                    .align(Alignment.Center)
                    .width('50%')
                    .onClick(() => {
                      if (!this.ledon) {
                        this.ledon = true
                          clearInterval(this.timer2)
                      this.timer2 = setInterval(() => {

                        globalThis.tcp.connect({ address: globalThis.mixeraddr, timeout: 6000 }, () => {
                          //     电脑ip
                          //     tcp.connect({ address: { address: '192.168.2.125', port: 3861, family: 1 }, timeout: 6000 }, () => {
                          console.log('connect success');
                          globalThis.tcp.send({
                            data: 'yanwuon'
                            //此处省略encoding, 默认为utf-8编码格式
                          }, err => {
                            if (err) {
                              console.log('send fail' + JSON.stringify(err));
                              return;
                            }
                            console.log('send  yanwuon success');
                          })
                        });
                        globalThis.tcp.on('message', value => {
                          console.log("on message")
                          let buffer = value.message
                          let dataView = new DataView(buffer)
                          let str = ""
                          for (let i = 0; i < dataView.byteLength; ++i) {
                            str += String.fromCharCode(dataView.getUint8(i))
                          }
                          console.log("on connect received:" + str)
                          this.yanwu = Number(str)
                        });
                        if(this.yanwu >= 21){
                          this.jingbao= true;
                        }
                        else
                        {this.jingbao= false;}

//                        if(this.yanwu >= this.yuzhi){
//
//                          this.jingbao= true;
//
//                          globalThis.tcp.connect({ address: globalThis.mixeraddr, timeout: 6000 }, () => {
//
//                            console.log('connect success');
//                            globalThis.tcp.send({
//                              data: 'baojing on'
//                              //此处省略encoding, 默认为utf-8编码格式
//                            }, err => {
//                              if (err) {
//                                console.log('send fail' + JSON.stringify(err));
//                                return;
//                              }
//                              console.log('send baojing on success');
//                            })
//                          })
//                        }
//                        clearInterval(this.timer4)
//                        this.timer4 = setInterval(() => {

//                          globalThis.tcp.connect({ address: globalThis.mixeraddr, timeout: 6000 }, () => {
//                            //     电脑ip
//                            //     tcp.connect({ address: { address: '192.168.2.125', port: 3861, family: 1 }, timeout: 6000 }, () => {
//                            console.log('connect success');
//                            globalThis.tcp.send({
//                              data: this.yuzhi.toString()
//                              //此处省略encoding, 默认为utf-8编码格式
//                            }, err => {
//                              if (err) {
//                                console.log('send fail' + JSON.stringify(err));
//                                return;
//                              }
//                              console.log('send  yanwuon success');
//                            })
//                          });

//
//                        }, 1500)

                      }, 2500)
                      }
                      else{
                        this.ledon =false
                        clearInterval(this.timer2);

                      }
                    })
                }
              }
              .borderRadius(8)
              .backgroundColor('#ffeee1e1')
              .width('95%')
              .height('12%')
              .margin({ left: 15, right: 15 })

              Divider().color(Color.White).strokeWidth(5)

              Row(){
                Text("烟雾浓度:")
                  .height('15%')
                  .fontSize(25)
                  .fontWeight(FontWeight.Bold)
                  .layoutWeight(1)
                  .align(Alignment.Center)
                  .width('50%')

                Text(this.yanwu.toString()+"ppm")
                  .height('15%')
                  .fontSize(25)
                  .fontWeight(FontWeight.Bold)
                  .layoutWeight(1)
                  .align(Alignment.Center)
                  .width('50%')
              }
              .backgroundColor('#ffeee1e1')
              .width('95%')
              Divider().color(Color.White).strokeWidth(5)
              Row(){
                Column(){
                  Text("实时监测:")
                    .fontSize(25)
                    .fontWeight(FontWeight.Bold)
                    .layoutWeight(1)
                    .align(Alignment.Center)
                    .width('100%')
/*                    .onChange(()=>{

//                      clearInterval(this.timer4)
//                      this.timer4 = setInterval(() => {

                        if(this.yanwu >= this.yuzhi){

                          this.jingbao= true;

                          globalThis.tcp.connect({ address: globalThis.mixeraddr, timeout: 6000 }, () => {

                            console.log('connect success');
                            globalThis.tcp.send({
                              data: 'baojing on'
                              //此处省略encoding, 默认为utf-8编码格式
                            }, err => {
                              if (err) {
                                console.log('send fail' + JSON.stringify(err));
                                return;
                              }
                              console.log('send baojing on success');
                            })
                          })
                        }
//                      }, 1500)
                    })*/
                }.width('50%')

                TextInput({
                  placeholder: "输入阈值(默认25ppm)",
                })
                  .width('50%')
                  .onChange((value)=>{
                      this.yuzhi = Number(value)
                  })
              }
              .borderRadius(8)
              .backgroundColor('#ffeee1e1')
              .width('95%')
              .height('12%')
              .margin({ left: 15, right: 15 })
              .align(Alignment.Center)

              Image(this.jingbao? $r("app.media.icon_device_alert") : null)
              .height('15%').align(Alignment.Center).objectFit(ImageFit.Contain)


            }
          }
        }
      }
      .alignItems(HorizontalAlign.Center)
    }
    .backgroundColor('#EDF2F5')
    .height('100%')
    .align(Alignment.Top)
  }
}






回复

使用道具 举报

3

主题

28

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2023-8-3 18:27:40 | 显示全部楼层
今日写人体感应ui和实际功能UI代码:
import router from '@ohos.router'
import promptAction from '@ohos.promptAction'
@Component
struct PageTitle {
  build() {
    Row() {
      Image($r('app.media.back'))
        .width(20)
        .height(20)
        .onClick(() => {
          router.back()
        })
      Text("人体感应")
        .fontSize(22)
        .margin({ left: 20 })
    }
    .padding(12)
    .width('100%')
  }
}



@Component
struct oneTable {
  @State message: string = ''
  @State imageBgColorA: number = 0
  @StorageProp('currentBreakpoint') currentBreakpoint: string = 'sm'
  @State ganying: Boolean = false
  @State jingbao: Boolean = false
  @State cishu: number = 0
  private timer: number = 0
  @Builder IngredientItem() {



    Stack({ alignContent: Alignment.BottomStart }) {
      Image(this.jingbao?$r("app.media.ren_youren")r("app.media.ren_wuren0"))
        .backgroundColor(`rgba(255, 255, 255, ${this.imageBgColorA})`)
        .objectFit(ImageFit.Contain)
      Text(this.jingbao?"有人靠近":"无人靠近")
        .align(Alignment.Center).width('50%').fontSize(25).height('10%')

    }
    .height(this.currentBreakpoint == 'lg' ? 166 : 280)
    Column() {
      Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center }) {
        Column() {
          Row() {

            Text("人体感应")
              .fontSize(18)
              .fontWeight(FontWeight.Bold)
              .layoutWeight(1)
              .align(Alignment.Start)
            Row() {
              Button('开', { type: ButtonType.Normal, stateEffect: true })
                .borderRadius(8)
                .backgroundColor(0x317aff)
                .width(90)
                .onClick(() => {
                  promptAction.showToast({
                    message: '人体感应已打开',
                    duration: 1500
                  });

                  globalThis.tcp.connect({ address: globalThis.mixeraddr , timeout: 6000 }, () => {
                    //     电脑ip
                    //     tcp.connect({ address: { address: '192.168.2.125', port: 3861, family: 1 }, timeout: 6000 }, () => {
                    console.log('connect success');
                    globalThis.tcp.send({
                      data: 'rentiganyingon'
                      //此处省略encoding, 默认为utf-8编码格式
                    }, err => {
                      if (err) {
                        console.log('send fail' + JSON.stringify(err));
                        return;
                      }
                      console.log('send success');
                    })
                  })

                  globalThis.tcp.on('message', value => {
                    console.log("on message")
                    let buffer = value.message
                    let dataView = new DataView(buffer)
                    let str = ""
                    this.cishu ++
                    this.jingbao = true
                    clearInterval(this.timer)
                    this.timer = setTimeout(() => {
                      this.jingbao = false
                    }, 500)
                    for (let i = 0; i < dataView.byteLength; ++i) {
                      str += String.fromCharCode(dataView.getUint8(i))
                    }
                    console.log("on connect received:" + str)

                  });



                })
              Blank()
              Button('关', { type: ButtonType.Normal, stateEffect: true })
                .borderRadius(8)
                .backgroundColor(0x317aff)
                .width(90)
                .onClick(() => {

                  promptAction.showToast({
                    message: '人体感应已关闭',
                    duration: 1500
                  });
                  globalThis.tcp.connect({ address: globalThis.mixeraddr , timeout: 6000 }, () => {
                    //     电脑ip
                    //     tcp.connect({ address: { address: '192.168.2.125', port: 3861, family: 1 }, timeout: 6000 }, () => {
                    console.log('connect success');
                    globalThis.tcp.send({
                      data: 'rentiganyingoff'
                      //此处省略encoding, 默认为utf-8编码格式
                    }, err => {
                      if (err) {
                        console.log('send fail' + JSON.stringify(err));
                        return;
                      }
                      console.log('send success');
                    })
                  })
                })
            }
            .width('100%')
            .layoutWeight(2)
          }
          .padding(20)
          .margin({ bottom: 20 })

          Row(){
            Text('报警日志:')
              .align(Alignment.Center)
            .width('40%')
            Text(this.cishu.toString()+"次")
              .width('40%').align(Alignment.Center)
          }

        }

      }

    }.height('50%')
    .backgroundColor(Color.White)

  }

  build() {

    Column() {
      this.IngredientItem()
    }
  }
}


@Entry
@Component
struct fengshan {
  build() {
    Scroll() {
      Column() {
        PageTitle()
        Swiper() {
          oneTable()
        }
        .clip(new Rect().width('100%').height('100%').radiusWidth(15).radiusHeight(15))
        .itemSpace(20)
        .height(630)
        .indicatorStyle({ selectedColor: Color.Green })
        .margin({ top: 10, right: 10, left: 10 })

      }
      .alignItems(HorizontalAlign.Center)
    }
    .backgroundColor('#EDF2F5')
    .height('100%')
    .align(Alignment.Top)
  }
}









回复

使用道具 举报

3

主题

28

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2023-8-3 18:28:28 | 显示全部楼层
hi3861代码有问题:初步为:
        if (strcmp(recvbuf, "rentiganyingon") == 0)
                        {
                               
                                E53_IS1_Init();
                                E53_IS1_Read_Data(Beep_Alarm);
                                while (1)
                                {
                                        osEventFlagsWait(evt_id, FLAGS_MSK1, osFlagsWaitAny, osWaitForever);
                                        Beep_StatusSet(ON2);
                                        GpioSetOutputVal(WIFI_IOT_GPIO_IDX_2, 1);
                                        osDelay(200);
                                        Beep_StatusSet(OFF2);
                                        GpioSetOutputVal(WIFI_IOT_GPIO_IDX_2, 0);
                                        char data1[10] = "baojing";
                                    ret = send(new_fd, data1, strlen(data1), 0);
                                }
                                bzero(recvbuf, sizeof(recvbuf));
                        };
回复

使用道具 举报

123
返回列表 发新帖 回复
高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则