在stm32f103上移植MQTT,并使用esp8266 + ov2640传输温度和jpg图片数据到阿里云服务器

张开发
2026/4/10 14:45:30 15 分钟阅读

分享文章

在stm32f103上移植MQTT,并使用esp8266 + ov2640传输温度和jpg图片数据到阿里云服务器
硬件部分正点原子f103zet6开发板正点原子esp8266模块;OV2640摄像头模块DS18B20温度传感器。软件部分裸机mqtt协议onewire协议SCCB协议AT指令一MQTT阿里云物联网平台1.连接阿里云MQTT物联网服务器的设备均要采用“一机一密”的方式即每个设备烧录其唯一的设备证书(ProductKey、DeviceName 和 DeviceSecret)。阿里云MQTT服务器的产品和设备的创建本文不再做介绍。2.连接参数查看MQTT连接参数包含了常说的“三元组”此外还有对应的阿里云MQTT服务器地址和端口。有了这些可以让你的设备在服务器端通过认证成功连接。注意目前注意到加密方式为hmacsha256正点原子给的MQTT程序中有个sha1的动态密码计算似乎并不符合。故直接用三元组的密码登录即可3.客户端要做的(1).发送connect请求并等待服务器的connack响应。(2).订阅服务端消息客户端订阅服务端消息后服务器可以通过阿里云的在线调试功能下发数据到客户端。订阅tpoic格式为/sys/${productKey}/${deviceName}/thing/service/property/set(3).向服务端发布消息客户端需要对应产品创建的物模型数据进行上报。发布topic格式为/sys/${options.productKey}/${options.deviceName}/thing/event/property/post发布消息需要Payload消息体下面是消息体格式{method:thing.event.property.post,id:1,params:{prop_float:0,prop_int16:50,prop_bool:1},version:1.0}(4).心跳机制由于MQTT服务器在一定时间内没有收到客户端的消息时会主动断开与客户端的连接。于是需要给客户端添加心跳机制具体实现为每隔一段时间向服务器发送心跳包。在调试客户端和服务端通信时还需要熟悉下表列出的报文头的值。比如发送心跳包就是简单的把报文的报头写为PINGREQ的值然后上报给服务器此时服务器就知道这条消息是客户端的心跳请求。报文有三层结构分为固定报头、可变报头和有效载荷Payload若想清楚报文原理还需要对这几层结构中的信息进行分析。MQTT报文类型介绍二ESP8266 WIFI模块要配置ESP8266模块需要先熟悉AT指令。本项目中该模块需要先通过ATCWMODE指令将WIFI工作模式配置到TCP模式然后通过ATCWJAP指令连接WIFI。WIFI连接成功后即可通过ATCIPSTART指令连接阿里云服务器了。但是想让ESP8266给MQTT服务器发送消息还需要配置模块工作在透传模式并在透传模式发送数据注意固件规定了透传模式有最大字节发送限制实测payload大于2920字节时将会发送失败。进入透传模式后AT指令将失效发送给ESP8266的数据都将直接转发给服务器。三OV2640摄像头OV2640的驱动采用SCCB协议类似于常用的IIC的协议但有细微差异。由于OV2640的寄存器众多本文不再介绍。本文通过OV2640获取到数据后通过Base64编码技术将原始数据编码后作为上传给MQTT服务器的数据这样做的好处是Base64编码后的数据可以通过网页的Base64转图片工具直接展现出来。由于前面说到的ESP8266的发送字节限制本项目对每次发送的payload字节数量做了最大限制设置为一次最大2048字节。于是对与本项目中设定像素为320x240格式的照片大概会上报2-5次才能拼成一张完整的图片。项目中控制照片的拍摄是采用通过解析服务器下发的消息进行控制的也可以改成按键或配合其他传感器进行控制。四DS18B20温度传感器采用单总线协议在连接到MQTT服务器后通过定时器定时3s上报一次温度数据。项目成果展示

更多文章