毕业设计

目录

运行环境

【ESP32学习】联网模块

ESP8266-01S上传数据到OneNet

参考视频

1.进入OneNet创建产品和设备(具体步骤待补充)

2.复制产品和设备的详细信息(备份)

目的是为了方便使用AT指令以及代码编写。

设备名称(clientlD) : test
产品ID (username) : F1AVyfXw7l

password: version=2018-10-31&res=products%2FF1AVyfXw71%2Fdevices%
2Ftest&et=2810313321&method=md5&sign=EfJtPPxHwMX6iWWf3YksbA%3D%3D.urI:mqtts.heclouds.com

端口号:1883

订阅: $sys/F1AVyfXw7I/test/thing/property/post/reply发布: $sys/F1AVyfXw7l/test/thing/property/post

设备密钥: cjFZSWRwUGNrazdRR2d6eTJ4Tm9YNXN5bTNuMGpMTIE=access key: vclTl19loOn7mcfdtT39l1eRfVffM6FfH8U/U3HhUQc=

res:products/F1AVyfXw7l/devices/test
et:时间戳

收藏的一些资料

OneNet云平台 OneNet云平台 OneNet云平台

2.时间戳 时间戳 时间戳

OneNet文档中心 OneNet文档中心 OneNet文档中心

最终的操作结果

结果 结果

ESP32&&ESP8266-12E连接ONeNet参考资料

代码部分唯一不同的是引用的库函数不同,

ESP8266使用的是

#include <ESP8266WiFi.h>

ESP32使用的是

#include <WiFi.h>

在使用时需要注意引用的库函数,如果库函数不匹配,可能会导致编译失败,这部分的代码以放在附件中。

  • ESP-12EConnectONenet是ESP8266-12E连接ONeNet的代码;
  • ESP32ConnectONenet 是ESP8266-12E连接ONeNet的代码。

**注意:**我提供的代码是以onejson格式上传的,而不是数据流的格式。在云平台创建产品时需要注意这点,当然代码里博主写的就是以数据流格式上传,如果你用原来博主写的,那么创建产品时就选数据流。


上面的代码只能实现数据上传,并不能实现命令控制,下面就介绍如何实现命令控制。 主要修改的地方是callback函数,当拿到topic的时候要解析拿到一段ID,具体可以看官方的资料,里面有提到命令下发的操作。 alt text alt text

ONeNet云平台报错: {“protocol”:“MQTT”,“offline_time”:“2024-07-15 16:01:49.977”,“offline_reason”:“CloseDueToProtoError”}怎么解决?

这个错误是协议格式不对,也就是用的topic不正确,通过下面的案例对这个作说明。

当我们在云平台下发命令的时候,在callback函数里使用Serial.println(topic);会打印订阅的topic,格式为:

$sys/584938/onenet_mqtt_dev1/cmd/request/c5a7e27e-05bb-41eb-972b-abce424ade8e

callback函数如下:

/********************************************************************************
函数:callback
功能:接收ONeNet传回的信息
返回值:无
参数:
    topic是消息的主题,
    payload是消息的有效载荷(数据部分),
    length是payload的长度
*********************************************************************************/
void callback(char *topic, byte *payload, unsigned int length)
{
  Serial.println("message rev:");
  Serial.println(topic);                    // 打印订阅的topic
  const char* lastSlash = strrchr(topic, '/');
  if (lastSlash != NULL) {
    
    const char* cmdId = lastSlash + 1;      // 命令ID位于最后一个'/'之后
    msgid = String(cmdId);                  //将命令ID复制给msgid,msgid定义为全局变量
  }
  Serial.println(msgid);                    // 打印拿到的ID

  if (strstr(topic, ONENET_GET_CAM_REQUEST)) //ONENET_GET_CAM_REQUEST="$sys/{产品ID}/{设备名}/cmd/request/"
  {
    DynamicJsonDocument doc(100);
    DeserializationError error = deserializeJson(doc, payload);
    if (error)
    {
      Serial.println("parse json failed");
      return;
    }
    JsonObject setAlinkMsgObj = doc.as<JsonObject>();
    serializeJsonPretty(setAlinkMsgObj, Serial);
    String cam = setAlinkMsgObj["cam"].as<String>();
    Serial.println("@"+cam);                //取出下发的命令并在前面加@

    char RESPONSE_TOPIC[100];
    sprintf(RESPONSE_TOPIC, "$sys/{产品ID}/{设备名}/cmd/response/%s",msgid.c_str());
    client.publish(RESPONSE_TOPIC, "OK");   // 向平台响应OK
  }else {
    Serial.println("GET_CAM faile!");
  }
}

这份代码是根据一位博主的代码改的(博主文章链接),取出后面的ID用如下代码即可

 const char* lastSlash = strrchr(topic, '/');
  if (lastSlash != NULL) {
    
    const char* cmdId = lastSlash + 1;      // 命令ID位于最后一个'/'之后
    msgid = String(cmdId);                  //将命令ID复制给msgid,msgid定义为全局变量
  }
  Serial.println(msgid);                    // 打印拿到的ID

而这个时候我们需要响应这个命令用的是

$sys/584938/onenet_mqtt_dev1/cmd/response/c5a7e27e-05bb-41eb-972b-abce424ade8e

一个是request,一个是response,所以在拿到下发命令的topic后要取出后面跟着的ID,然后再重新拼接在$sys/584938/onenet_mqtt_dev1/cmd/response/后面,然后用这个拼接的topic发送响应数据给云平台。

这个时候就能在云平台那看到类似如下信息:

alt text alt text

一般格式错误返回的错误码是15,原因就是格式有问题。使用如下的格式上传响应都可能有问题:

1.$sys/584938/onenet_mqtt_dev1/cmd/response/

2.$sys/584938/onenet_mqtt_dev1/cmd/response/+

3.$sys/584938/onenet_mqtt_dev1/cmd/response/+/+

以上内容仅供参考,如果你有更好的方法,请在评论区告诉我。

APP连接ONeNet

在B站上学习OKHTTP3,我把主要的核心代码放在附件里,分别是get和post的同步和异步请求,返回的结果和视频地址2里讲的一样。

在编写HTTPS网络请求(post)时需要上传一些数据,这些数据有一定的上传格式,下面的网址汇总了上传格式content参数


2024.8.19

json数据解析步骤

方法一:

1 1 2 2

方法二:

使用第三方库Gson,在使用前需要创建一个Jsonbear,就是接收Jsons数据的格式。

总结:

在Android Studio中,如果你想要生成代码,例如getter和setter方法,可以使用快捷键Alt + Insert(Windows/Linux系统)或Command + N(Mac系统) 。这个快捷操作会引导你通过一个菜单来选择想要生成的代码类型,比如构造函数、toString方法、以及各种重写方法等。

此外,如果你需要查看某个方法的参数信息,可以使用快捷键Ctrl + P(Windows/Linux系统)或Command + P(Mac系统),这将展示出当前方法的参数列表及其类型。

STM32+电脑(模拟ESP32)+ESP8266通信

STM32————电脑:串口1(PA 9 PA10),手机连接指定热点,连接成功后等待一段时间把摄像头的网址发给单片机,单片机通过串口2发给ESP8266.ESP8266再传到OneNet上。

注意:在用ESP8266最小系统通信的时,需要给板子单独供电,否则通信可能失败,原因我想可能是因为电压不够。

设备热点配网技术——WIFIManager

这个配网技术是让开发板设置热点,然后让手机连接,连接好后配置要让开发板连接的WIFI和密码,这个技术叫设备热点技术。相比于以往的一键配网技术,我个人觉得这个设备热点配网技术成功率要要一些。

缺点是这个技术不能用AT指令来实现,所以目前AT指令在不配合其他设备的情况下,通常都使用一键配网技术。

ESP32和ESP8266使用设备热点配网技术的区别

  • 区别一:使用的WiFi库不同,ESP32使用WiFi.h,而ESP8266使用ESP8266WiFi.h
  • 区别二:使用的WiFiManager.h版本不同,ESP32使用2.0.17(目前这个版本是最新的),而ESP8266使用0.16或0.15 在使用ESP32时,请使用目前最新版的wifimanage库,而使用ESP8266的话请使用0.15或0.16版本的WIFIManager,如果ESP8266使用最新版的可能会报错。报什么错呢?

报错:error: ‘wifi_country_t’ does not name a type const wifi_country_t WM_COUNTRY_US{“US”,1,11,WIFI_COUNTRY_POLICY_AUTO};

完整报错如下:

d:\Program Files (x86)\arduino\libraries\WiFiManager/wm_consts_en.h:162:7: error: 'wifi_country_t' does not name a type
 const wifi_country_t WM_COUNTRY_US{"US",1,11,WIFI_COUNTRY_POLICY_AUTO};
       ^
d:\Program Files (x86)\arduino\libraries\WiFiManager/wm_consts_en.h:163:7: error: 'wifi_country_t' does not name a type
 const wifi_country_t WM_COUNTRY_CN{"CN",1,13,WIFI_COUNTRY_POLICY_AUTO};
       ^
d:\Program Files (x86)\arduino\libraries\WiFiManager/wm_consts_en.h:164:7: error: 'wifi_country_t' does not name a type
 const wifi_country_t WM_COUNTRY_JP{"JP",1,14,WIFI_COUNTRY_POLICY_AUTO};
       ^

这个错误我目前没有解决,如果你解决了还请评论区或邮件(3256149770@qq.con)告诉我。

通信过程中遇到的问题

  • keil5中一点击下载就闪退或点击debug中的setting就闪退。参照文章

  • Keil5编程之warning: #223-D: function “xxx“ declared implicitly.参考链接

这一部分所用到的资料下载地址


2024.8.12(更新).

【实验】SPIFFS文件系统的使用

参考地址

【实验】TCP/UDP通信实验

参考地址

【STM32F4学习】摄像头

参考资料

STM32F4工程代码

使用三个ADC通道要注意按顺序去初始化,否则可能会出现问题,运营我还不知道.

【服务器】NGINX

在Linux中搭建NGINX服务器

TCP/IP协议

alt text alt text alt text alt text alt text alt text alt text alt text alt text alt text alt text alt text


[知识储备]

在线自动生成nginx配置文件的网站

  • 可以自由选择所需的应用,生成nginx配置作为参考。
  • 根据你的业务需求,自动生成复杂的nginx配置文件,提供你作为参考,非常好用

NGINX架构

NGINX中master的工作原理

alt text alt text

nginx处理HTTP请求的过程

过程 过程

安装NGINX

任务 任务

安装路径:https://blog.csdn.net/u011715638/article/details/138670319

server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    root /var/www/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

上面是配置文件的内容,下面说明一下配置时的一些注意事项:

  • 把配置文件的example.com www.example.com换成172.0.0.1,这样方便在本地测试;
  • 在Ubuntu中可以下载ifconfig来查看Ubuntu的IP地址(ip addr也可以)
  • 每次修改配置文件记sudo systemctl reload nginx

【服务器】Tomcat

1.安装Tomcat要使用哪个版本的java?

使用jdk8或更高版本,详细参考官方文档

2.如何在Ubuntu安装Tomcat?

  • 安装jdk8或更高版本
  • 安装

【服务器】ZLMedaikit流媒体服务器

需要掌握的知识点: 知识点 知识点

【第三方库】FFmpeg媒体流转码工具

【深度学习】飞桨paddlepaddle实战


2024.8.18

1.从入门到实际运用,请参考B站up主视频:点击链接

2.学完上面的视频后学习paddlepaddle的语音识别课程:

3.接着参考STM32cudeXM.AI的相关知识,把模型转换成onnx格式然后在但【单片机上运行:

3.1先用一个项目练练手:https://shequ.stmicroelectronics.cn/thread-632736-1-1.html

意外收获,这是一个学习论坛:https://www.waveshare.net/study/portal.php?mod=list&catid=38


2024.8.25

参考文献:

  • 禹鑫鹏,贺庆,王世昕,.基于STM32CubeMX AI和NanoEdge AI的眼动信号分类效果对比研究【J】.传感器世界,2024,(04):6-10.

2024.8.26

X-CUDE—AI在线课程

参考地址

当模型验证结束后,需要修改以下内容: 修改文件 修改文件

相关论文参考

【机器学习】HMM模型(隐马尔科夫列)

隐马尔科夫列模型定义: 定义 定义

相关论文参考

-【1.基于声学的婴儿哭声识别细分市场模型】(Baby Cry Recognition Based on Acoustic) -【2.使用隐马尔可夫模型自动分割婴儿哭闹信号】(Automatic segmentation of infant cry signals using hidden Markov models)

导入库

【音视频学习】

H.264编码

所谓视频编码就是指通过特定的压缩技术,将某个视频格式文件转换成另一种视频格式文件的方式。

视频流传输中最重要的编解码标准有国际电联(TU-T,国际电信联盟)的H.261、H.263、H.264等,运动静止图像专家组(由ISO国际标准化组织与IEC国际电子委员会于1988年联合成立)的MPEG系列标准MPEG1、MPEG2、MPEG4 AVC等。

其中ITU-TH.264/MPEG-4 AVC是ITU-T与ISO/IEC连手合作制订的新标准。ITU-T方面称之为H.264。但ISOIEC的则将这个新标准归纳于MPEG系列,称为MPEG-4 AVC。

而H.265则被视为是ITU-TH.264/MPEG-4AVC标准的继任者,又称为高效率视频编码(High Efficiency VideoCoding,简称HEVC)

h264 h264

格式: h264 h264

安卓音视频实战编程

构建预览布局-使用SurfaceView或者TextureView

打开相机- Camera.open

设置参数- Camera.Parameters

设置预览数据回调- PreviewCallback

设置预览画布并启动- setPreviewTexture/startPreview

释放相机- stopPreview/release

YUV

YUV主要应用于优化彩色视频信号的传输,与RGB相比,YUV只需要占用极少的频宽(RGB需要三个独立的视频信号同时传输)。YUV中Y代表明亮度,也称灰阶值;U与V表示的则是色度(色调和饱和度)也可以记作:YCbCr。如果只有Y数据,那么表示的图像就是黑白的。

使用YUV的原因:

使用YUV格式才能极大地去除冗余信息,人眼对亮点信息更敏感,对色度敏感度不高。也就是说,可以压缩UV数据,而人眼难以发现。所以压缩算法的第一步,往往先把RGB数据转换成YUV数据。对Y少压缩一点,对UV多压缩一点,以平衡图像效果和压缩率。这也是为什么编码选择使用YUV而不是RGB。

推算公式: alt text alt text

YUV是一组数据的压缩格式,其下还有因为排列不同而衍生的不同格式名称

alt text alt text

NV21转I420 alt text alt text

MediaCode组件: alt text alt text

RTMP协议所在所在的网络层结构

alt text alt text

【第三方库】LIBRTMP

【工具】类似安卓虚拟机:Total Control

采集音频数据工具

alt text alt text

视频采集工具—MediaProjection

alt text alt text


安卓P18


2024.8.27

方法一:

安卓使用VLC库实内网播放ESPCam摄像头数据

方法二:

Mediacode编解码

【安卓APP制作】

1.安卓登录开发


2024.8.21

安卓的两种登录方式

登录可以进去就强登录,或进去后在某个页面触发登录。

对于第一个只需要在第一个页面做登录处理即可,而第二种需要Hook AMS + APT框架实现,具体看这篇博文:文章连接

安卓中集成第三方库进行登录

可以使用目前比较流行的第三方库实现:

JustAuth开源组件JustAuth是一个整合了国内外数十家知名平台的OAuth登录的开源组件,它提供了丰富的OAuth平台支持,自定义State、自定义OAuth、自定义Http接口和自定义Scope等功能,极大地简化了开发者在第三方登录功能上的工作量。


2024.8.23

2.数据显示

安卓显示ONENet提供的可视化链接

参考链接


2024.8.29

硬件系统

一、设备选型

1.空气质量模块设备选型:

(1)MQ135测量空气质量和氨气PPM的计算