概述
EDP协议
EDP协议文档说明:https://leoeinstein.lanzous.com/ifX1Ckfkaaf
服务器登录
登录流程:
(1)客户端发送连接请求(CONN_REQ)
(2)服务器验证请求的合法性
(3)服务器发送一个回执(CONN_RESP)给客户端
Onenet 上的EDP、HTTP、MQTT服务器地址和端口号如下:
E D P: 183.230.40.39 PORT: 876
HTTP: 183.230.40.33 PORT: 80
MQTT: 183.230.40.39 PORT: 6002
其中请求包含三部分:消息头、选项和消息体。
1、消息头
包括消息的类型和剩余消息长度。
2、选项
包括协议名称、协议版本、连接标志、保持连接时间。
3、消息体
可能包含设备ID、用户ID(可选)、鉴权信息(看采取什么方式登录)。
设备ID、用户ID(可选)、鉴权信息,这三项内容都为长度+内容的字符串格式。
设备ID必须传递,若认证方式中不使用设备ID,应将设备ID长度设置为0;用户ID和鉴权信息,根据标志位若存在必须按顺序出现。
(绿色为消息头部分,黄色为可选的多个选项部分和蓝色为可选的消息体)
各部分具体如下图
登录方式
方式1:
设备ID+鉴权信息(api-key)
设备ID:申请设备时平台返回的ID; 鉴权信息:在平台申请的可以操作该设备的api-key字符串;
api-key:
方式2:
产品ID + 鉴权信息(auth_info)
产品ID:在平台添加产品时平台生成的ID;
鉴权信息:在平台申请设备时填写设备的auth_info属性(json对象字符串),该属性需要产品内具备唯一性
具体EDP协议解读可参考以下文章:
https://open.iot.10086.cn/bbs/thread-632-1-1.html
onenet初始化程序
ONENETEDP协议部分代码可参考onenet论坛的资料:
https://open.iot.10086.cn/bbs/thread-863-1-1.html
论坛里面有很详细的资料哦,几乎都是稍微修改以下就可以用的了。
OV7670摄像头模块
引脚定义及连线
ov7670 | stm32f4 |
---|---|
VCC | 3.3V |
GND | GND |
SCL | PF10 |
SDA | PF9 |
VSYNC | PB7 |
HREF | PA4 |
PCLK | PA6 |
XCLK | PA8 |
D7 | PE6 |
D6 | PE5 |
D5 | PB6 |
D4 | PE4 |
D3 | PC9 |
D2 | PC8 |
D1 | PC7 |
D0 | PC6 |
RET | PG8 |
PWDN | PG9 |
OV7670中文资料手册:
https://wenku.baidu.com/view/e60f19ea81c758f5f61f67df.html
OV7670初始化程序
ov7670.h
#ifndef _OV7670_H
#define _OV7670_H
#include "stm32f4xx.h"
#define OV7670_RST_PW_RCC RCC_AHB1Periph_GPIOG
#define OV7670_RST_PW_Pin GPIO_Pin_8|GPIO_Pin_9
#define OV7670_RST_PW_GPIO GPIOG
#define OV7670_PWDN_H GPIO_SetBits(GPIOG,GPIO_Pin_9) //POWER DOWN控制信号
#define OV7670_PWDN_L GPIO_ResetBits(GPIOG,GPIO_Pin_9) //POWER DOWN控制信号
#define OV7670_RST_H GPIO_SetBits(GPIOG,GPIO_Pin_8) //复位控制信号
#define OV7670_RST_L GPIO_ResetBits(GPIOG,GPIO_Pin_8) //复位控制信号
#define PIC_START_X 0 //起始坐标x
#define PIC_START_Y 0 //起始坐标y
#define PIC_WIDTH 320 //照片长度
#define PIC_HEIGHT 200 //照片高度
extern uint16_t camera_buffer[PIC_WIDTH*PIC_HEIGHT+27];
//
#define OV7670_MID 0X7FA2
#define OV7670_PID 0X7673
/
u8 OV7670_Init(void);
void OV7670_Light_Mode(u8 mode);
void OV7670_Color_Saturation(u8 sat);
void OV7670_Brightness(u8 bright);
void OV7670_Contrast(u8 contrast);
void OV7670_Special_Effects(u8 eft);
void OV7670_Window_Set(u16 sx,u16 sy,u16 width,u16 height);
void set_cif(void);
#endif
ov7670.c部分函数
void OV7670_RST_PW_Init(void)
{
//设置IO
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(OV7670_RST_PW_RCC, ENABLE);
//RESET,PWDN初始化设置
GPIO_InitStructure.GPIO_Pin = OV7670_RST_PW_Pin;//RESET,PWDN推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //推挽输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(OV7670_RST_PW_GPIO, &GPIO_InitStructure);//初始化
}
//初始化OV7670
//返回0:成功
//返回其他值:错误代码
u8 OV7670_Init(void)
{
u16 i=0;
u16 reg=0;
OV7670_RST_PW_Init();
OV7670_PWDN_L; //POWER ON
delay_ms(100);
OV7670_RST_L; //复位OV7670
delay_ms(100);
OV7670_RST_H; //结束复位
SCCB_Init(); //初始化SCCB 的IO口
SCCB_WR_Reg(0X12, 0x80); //软复位OV7670
delay_ms(50);
reg=SCCB_RD_Reg(0X1c); //读取厂家ID 高八位
reg<<=8;
reg|=SCCB_RD_Reg(0X1d); //读取厂家ID 低八位
if(reg!=OV7670_MID)
{
printf("rnMID:%drn",reg);
return 1;
}
reg=SCCB_RD_Reg(0X0a); //读取厂家ID 高八位
reg<<=8;
reg|=SCCB_RD_Reg(0X0b); //读取厂家ID 低八位
if(reg!=OV7670_PID)
{
printf("HID:%drnrn",reg);
return 2;
}
//初始化 OV7670,采用QVGA分辨率(320*240)
for(i=0;i<sizeof(ov7670_init_reg_tbl)/sizeof(ov7670_init_reg_tbl[0]);i++)
{
SCCB_WR_Reg(ov7670_init_reg_tbl[i][0],ov7670_init_reg_tbl[i][1]);
}
OV7670_Window_Set(PIC_START_X,PIC_START_Y,PIC_WIDTH,PIC_HEIGHT);
OV7670_Light_Mode(0);
OV7670_Color_Saturation(2);
OV7670_Brightness(1);
OV7670_Contrast(2);
My_DCMI_Init();
DCMI_DMA_Init((uint32_t)&camera_buffer+54,(sizeof(camera_buffer)-54)/4,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable);//DCMI DMA
return 0x00; //ok
}
}
ESP8266_WIFI模块
AT固件
用出厂自带的固件即可,当然已经刷过其他固件的小伙伴也可以在官网下载:
出厂默认 AT 固件
AT 指令集
官方链接:
https://docs.ai-thinker.com/esp8266/docs
WIFI模块初始化部分程序
From wifi.c
。
void WIFI_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStruct;
USART_InitTypeDef USART_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_IO_WIFI,ENABLE);
RCC_APB1PeriphClockCmd(RCC_USART_WIFI,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* USART3 GPIO口配置 */
GPIO_InitStructure.GPIO_Pin=PIN_WIFI;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIO_WIFI, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIO_WIFI,AF_WIFI_TX,GPIO_AF_USART3);
GPIO_PinAFConfig(GPIO_WIFI,AF_WIFI_RX,GPIO_AF_USART3);
//USART3 IRQ
NVIC_InitStruct.NVIC_IRQChannel = WIFI_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
USART_InitStructure.USART_BaudRate = BAUDRATE_WIFI;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(WIFI_IO, &USART_InitStructure);
USART_Cmd(WIFI_IO,ENABLE);
USART_ITConfig(WIFI_IO, USART_IT_IDLE, ENABLE);
USART_ITConfig(WIFI_IO, USART_IT_RXNE, ENABLE);
}
项目
实物&效果图
工程文件
衷心感谢smitoo大佬的博文[抱拳]
https://blog.csdn.net/smitoo/article/details/108086791?ops_request_misc=&request_id=&biz_id=102&utm_term=stm32f4%25E4%25B8%258D%25E5%25B8%25A6fifo%25E7%259A%2584ov7670&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-108086791.first_rank_v2_pc_rank_v29
工程文件:https://download.csdn.net/download/LiangWF22/15052236
对了,下面的链接为CSDN图片大小设置教程:https://blog.csdn.net/weixin_44611096/article/details/105129215
不过表格的好像没找到怎么设置列宽。
最后
以上就是超帅帆布鞋为你收集整理的STM32F407-OV7670(无FIFO)-ONENET-实现摄像头画面上传到onenet(EDP协议)EDP协议OV7670摄像头模块ESP8266_WIFI模块项目的全部内容,希望文章能够帮你解决STM32F407-OV7670(无FIFO)-ONENET-实现摄像头画面上传到onenet(EDP协议)EDP协议OV7670摄像头模块ESP8266_WIFI模块项目所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复