feat: implement OneNet communication and ESP8266 integration
break: switch to c8t6
This commit is contained in:
1399
Core/Src/MqttKit.c
Normal file
1399
Core/Src/MqttKit.c
Normal file
File diff suppressed because it is too large
Load Diff
236
Core/Src/OneNet.c
Normal file
236
Core/Src/OneNet.c
Normal file
@ -0,0 +1,236 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include "esp8266.h"
|
||||
#include "main.h"
|
||||
#include "onenet.h"
|
||||
#include "mqttkit.h"
|
||||
#include "stm32f1xx_hal_gpio.h"
|
||||
// #include "main.h"
|
||||
|
||||
#define PRODUCT_ID "zzS53oqy5l"
|
||||
#define DEVICE_ID "ESP_67EAF3"
|
||||
#define SIGNATURE "version=2018-10-31&res=products%2FzzS53oqy5l%2Fdevices%2FESP_67EAF3&et=1766658508&method=md5&sign=r2rPhQdTZ3vpkxJTbgN5NQ%3D%3D"
|
||||
|
||||
|
||||
extern unsigned char esp8266_buf[128];
|
||||
|
||||
|
||||
//==========================================================
|
||||
// 函数名称: OneNet_DevLink
|
||||
//
|
||||
// 函数功能: 与onenet创建连接
|
||||
//
|
||||
// 入口参数: 无
|
||||
//
|
||||
// 返回参数: 1-成功 0-失败
|
||||
//
|
||||
// 说明: 与onenet平台建立连接
|
||||
//==========================================================
|
||||
_Bool OneNet_DevLink(void)
|
||||
{
|
||||
MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; //协议包
|
||||
|
||||
unsigned char* dataPtr;
|
||||
|
||||
_Bool status = 1;
|
||||
|
||||
// printf("OneNet_DevLink\r\nPROID: %s\tAUIF: %s\tDEVID:%s\r\n", PRODUCT_ID, SIGNATURE, DEVICE_ID);
|
||||
|
||||
if (MQTT_PacketConnect(PRODUCT_ID, SIGNATURE, DEVICE_ID, 256, 1, MQTT_QOS_LEVEL0, NULL, NULL, 0, &mqttPacket) == 0)
|
||||
{
|
||||
ESP8266_SendData(mqttPacket._data, mqttPacket._len); //上传平台
|
||||
|
||||
dataPtr = ESP8266_GetIPD(250); //等待平台响应
|
||||
if (dataPtr != NULL)
|
||||
{
|
||||
if (MQTT_UnPacketRecv(dataPtr) == MQTT_PKT_CONNACK)
|
||||
{
|
||||
switch (MQTT_UnPacketConnectAck(dataPtr))
|
||||
{
|
||||
case 0:
|
||||
status = 0;
|
||||
break;
|
||||
|
||||
// case 1: printf("WARN: 连接失败:协议错误\r\n");
|
||||
// break;
|
||||
// case 2: printf("WARN: 连接失败:非法的clientid\r\n");
|
||||
// break;
|
||||
// case 3: printf("WARN: 连接失败:服务器失败\r\n");
|
||||
// break;
|
||||
// case 4: printf("WARN: 连接失败:用户名或密码错误\r\n");
|
||||
// break;
|
||||
// case 5: printf("WARN: 连接失败:非法链接(比如token非法)\r\n");
|
||||
// break;
|
||||
//
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MQTT_DeleteBuffer(&mqttPacket); //删包
|
||||
}
|
||||
// else
|
||||
// printf("WARN: MQTT_PacketConnect Failed\r\n");
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
unsigned char OneNet_FillBuf(char* buf)
|
||||
{
|
||||
char text[48];
|
||||
|
||||
strcpy(buf, "{\"id\":\"1743082944\",\"params\":{");
|
||||
|
||||
memset(text, 0, sizeof(text));
|
||||
sprintf(text, "\"volt\":{\"value\":%f},", 218.3);
|
||||
strcat(buf, text);
|
||||
|
||||
memset(text, 0, sizeof(text));
|
||||
sprintf(text, "\"output\":{\"value\":%s}", HAL_GPIO_ReadPin(RELAY1_GPIO_Port, RELAY1_Pin) == GPIO_PIN_RESET ? "true" : "false");
|
||||
strcat(buf, text);
|
||||
|
||||
strcat(buf, "}}");
|
||||
return strlen(buf);
|
||||
}
|
||||
|
||||
//==========================================================
|
||||
// 函数名称: OneNet_SendData
|
||||
//
|
||||
// 函数功能: 上传数据到平台
|
||||
//
|
||||
// 入口参数: type:发送数据的格式
|
||||
//
|
||||
// 返回参数: 无
|
||||
//
|
||||
// 说明:
|
||||
//==========================================================
|
||||
|
||||
void OneNet_SendData(void)
|
||||
{
|
||||
MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; //协议包
|
||||
|
||||
char buf[128];
|
||||
|
||||
short body_len = 0, i = 0;
|
||||
memset(buf, 0, sizeof(buf)); //清空数组内容
|
||||
|
||||
body_len = OneNet_FillBuf(buf); //获取当前需要发送的数据流的总长度
|
||||
|
||||
if (body_len)
|
||||
{
|
||||
if (MQTT_PacketSaveData(DEVICE_ID, body_len, NULL, 5, &mqttPacket) == 0) //封包
|
||||
{
|
||||
for (; i < body_len; i++)
|
||||
{
|
||||
mqttPacket._data[mqttPacket._len++] = buf[i];
|
||||
}
|
||||
ESP8266_SendData(mqttPacket._data, mqttPacket._len); //上传数据到平台
|
||||
MQTT_DeleteBuffer(&mqttPacket); //删包
|
||||
}
|
||||
else;
|
||||
// printf( "WARN:EDP_NewBuffer Failed\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
void OneNET_Subscribe(void)
|
||||
{
|
||||
|
||||
MQTT_PACKET_STRUCTURE mqtt_packet = {NULL, 0, 0, 0}; //协议包
|
||||
|
||||
char topic_buf[56];
|
||||
const char *topic = topic_buf;
|
||||
|
||||
snprintf(topic_buf, sizeof(topic_buf), "$sys/%s/%s/thing/property/set", PRODUCT_ID, DEVICE_ID);
|
||||
|
||||
// printf("Subscribe Topic: %s\r\n", topic_buf);
|
||||
|
||||
if(MQTT_PacketSubscribe(MQTT_SUBSCRIBE_ID, MQTT_QOS_LEVEL0, &topic, 1, &mqtt_packet) == 0)
|
||||
{
|
||||
ESP8266_SendData(mqtt_packet._data, mqtt_packet._len); //向平台发送订阅请求
|
||||
|
||||
MQTT_DeleteBuffer(&mqtt_packet); //删包
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
// 函数名称: OneNet_RevPro
|
||||
//
|
||||
// 函数功能: 平台返回数据检测
|
||||
//
|
||||
// 入口参数: dataPtr:平台返回的数据
|
||||
//
|
||||
// 返回参数: 无
|
||||
//
|
||||
// 说明:
|
||||
//==========================================================
|
||||
void OneNet_RevPro(unsigned char *cmd)
|
||||
{
|
||||
|
||||
char *req_payload = NULL;
|
||||
char *cmdid_topic = NULL;
|
||||
|
||||
unsigned short topic_len = 0;
|
||||
unsigned short req_len = 0;
|
||||
|
||||
unsigned char qos = 0;
|
||||
static unsigned short pkt_id = 0;
|
||||
|
||||
unsigned char type = 0;
|
||||
|
||||
short result = 0;
|
||||
|
||||
char *dataPtr = NULL;
|
||||
char numBuf[10];
|
||||
int num = 0;
|
||||
type = MQTT_UnPacketRecv(cmd);
|
||||
switch(type)
|
||||
{
|
||||
case MQTT_PKT_PUBLISH: //接收的Publish消息
|
||||
|
||||
result = MQTT_UnPacketPublish(cmd, &cmdid_topic, &topic_len, &req_payload, &req_len, &qos, &pkt_id);
|
||||
// if(result == 0)
|
||||
// {
|
||||
// printf("%s\r\n", req_payload);
|
||||
// }
|
||||
break;
|
||||
|
||||
case MQTT_PKT_PUBACK: //发送Publish消息,平台回复的Ack
|
||||
|
||||
if(MQTT_UnPacketPublishAck(cmd) == 0)
|
||||
// UsartPrintf(USART_DEBUG, "Tips: MQTT Publish Send OK\r\n");
|
||||
|
||||
break;
|
||||
|
||||
case MQTT_PKT_SUBACK: //发送Subscribe消息的Ack
|
||||
|
||||
if(MQTT_UnPacketSubscribe(cmd) == 0)
|
||||
;
|
||||
// UsartPrintf(USART_DEBUG, "Tips: MQTT Subscribe OK\r\n");
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
result = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
ESP8266_Clear(); //清空缓存
|
||||
|
||||
if(result == -1)
|
||||
return;
|
||||
|
||||
if(type == MQTT_PKT_CMD || type == MQTT_PKT_PUBLISH)
|
||||
{
|
||||
MQTT_FreeBuffer(cmdid_topic);
|
||||
MQTT_FreeBuffer(req_payload);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uint8_t onenet_state(){
|
||||
return OneNet_DevLink();
|
||||
}
|
256
Core/Src/esp8266.c
Normal file
256
Core/Src/esp8266.c
Normal file
@ -0,0 +1,256 @@
|
||||
// #include "stm32f103xb.h"
|
||||
|
||||
//网络设备驱动
|
||||
#include "esp8266.h"
|
||||
|
||||
//硬件驱动
|
||||
#include "main.h"
|
||||
#include "usart.h"
|
||||
|
||||
|
||||
//C库
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
#define ESP8266_WIFI_INFO "AT+CWJAP=\"Redmi K20 Pro Premium\",\"11223344\"\r\n"
|
||||
|
||||
#define ESP8266_ONENET_INFO "AT+CIPSTART=\"TCP\",\"183.230.40.96\",1883\r\n"
|
||||
|
||||
|
||||
unsigned char esp8266_buf[128];
|
||||
unsigned short esp8266_cnt = 0, esp8266_cntPre = 0;
|
||||
|
||||
void Usart_SendString(UART_HandleTypeDef* huart, unsigned char* str, unsigned short len)
|
||||
{
|
||||
unsigned short count = 0;
|
||||
|
||||
HAL_UART_Transmit(huart, (uint8_t*)str, len, 0xffff);
|
||||
while (HAL_UART_GetState(huart) == HAL_UART_STATE_BUSY_TX);
|
||||
}
|
||||
|
||||
//==========================================================
|
||||
// 函数名称: ESP8266_Clear
|
||||
//
|
||||
// 函数功能: 清空缓存
|
||||
//
|
||||
// 入口参数: 无
|
||||
//
|
||||
// 返回参数: 无
|
||||
//
|
||||
// 说明:
|
||||
//==========================================================
|
||||
void ESP8266_Clear(void)
|
||||
{
|
||||
memset(esp8266_buf, 0, sizeof(esp8266_buf));
|
||||
esp8266_cnt = 0;
|
||||
}
|
||||
|
||||
//==========================================================
|
||||
// 函数名称: ESP8266_WaitRecive
|
||||
//
|
||||
// 函数功能: 等待接收完成
|
||||
//
|
||||
// 入口参数: 无
|
||||
//
|
||||
// 返回参数: REV_OK-接收完成 REV_WAIT-接收超时未完成
|
||||
//
|
||||
// 说明: 循环调用检测是否接收完成
|
||||
//==========================================================
|
||||
_Bool ESP8266_WaitRecive(void)
|
||||
{
|
||||
if (esp8266_cnt == 0) //如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
|
||||
return REV_WAIT;
|
||||
|
||||
if (esp8266_cnt == esp8266_cntPre) //如果上一次的值和这次相同,则说明接收完毕
|
||||
{
|
||||
esp8266_cnt = 0; //清0接收计数
|
||||
|
||||
return REV_OK; //返回接收完成标志
|
||||
}
|
||||
|
||||
esp8266_cntPre = esp8266_cnt; //置为相同
|
||||
|
||||
return REV_WAIT; //返回接收未完成标志
|
||||
}
|
||||
|
||||
//==========================================================
|
||||
// 函数名称: ESP8266_SendCmd
|
||||
//
|
||||
// 函数功能: 发送命令
|
||||
//
|
||||
// 入口参数: cmd:命令
|
||||
// res:需要检查的返回指令
|
||||
//
|
||||
// 返回参数: 0-成功 1-失败
|
||||
//
|
||||
// 说明:
|
||||
//==========================================================
|
||||
_Bool ESP8266_SendCmd(char* cmd, char* res)
|
||||
{
|
||||
unsigned char timeOut = 200;
|
||||
|
||||
Usart_SendString(&huart2, (unsigned char*)cmd, strlen((const char*)cmd));
|
||||
|
||||
while (timeOut--)
|
||||
{
|
||||
if (ESP8266_WaitRecive() == REV_OK) //如果收到数据
|
||||
{
|
||||
if (strstr((const char*)esp8266_buf, res) != NULL) //如果检索到关键词
|
||||
{
|
||||
ESP8266_Clear(); //清空缓存
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
HAL_Delay(10);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//==========================================================
|
||||
// 函数名称: ESP8266_SendData
|
||||
//
|
||||
// 函数功能: 发送数据
|
||||
//
|
||||
// 入口参数: data:数据
|
||||
// len:长度
|
||||
//
|
||||
// 返回参数: 无
|
||||
//
|
||||
// 说明:
|
||||
//==========================================================
|
||||
void ESP8266_SendData(unsigned char* data, unsigned short len)
|
||||
{
|
||||
char cmdBuf[32];
|
||||
|
||||
ESP8266_Clear(); //清空接收缓存
|
||||
sprintf(cmdBuf, "AT+CIPSEND=%d\r\n", len); //发送命令
|
||||
if (!ESP8266_SendCmd(cmdBuf, ">")) //收到‘>’时可以发送数据
|
||||
{
|
||||
Usart_SendString(&huart2, data, len); //发送设备连接请求数据
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================
|
||||
// 函数名称: ESP8266_GetIPD
|
||||
//
|
||||
// 函数功能: 获取平台返回的数据
|
||||
//
|
||||
// 入口参数: 等待的时间(乘以10ms)
|
||||
//
|
||||
// 返回参数: 平台返回的原始数据
|
||||
//
|
||||
// 说明: 不同网络设备返回的格式不同,需要去调试
|
||||
// 如ESP8266的返回格式为 "+IPD,x:yyy" x代表数据长度,yyy是数据内容
|
||||
//==========================================================
|
||||
unsigned char* ESP8266_GetIPD(unsigned short timeOut)
|
||||
{
|
||||
char* ptrIPD = NULL;
|
||||
|
||||
do
|
||||
{
|
||||
if (ESP8266_WaitRecive() == REV_OK) //如果接收完成
|
||||
{
|
||||
ptrIPD = strstr((char*)esp8266_buf, "IPD,"); //搜索“IPD”头
|
||||
if (ptrIPD == NULL) //如果没找到,可能是IPD头的延迟,还是需要等待一会,但不会超过设定的时间
|
||||
{
|
||||
//printf("\"IPD\" not found\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
ptrIPD = strchr(ptrIPD, ':'); //找到':'
|
||||
if (ptrIPD != NULL)
|
||||
{
|
||||
ptrIPD++;
|
||||
return (unsigned char*)(ptrIPD);
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
HAL_Delay(5); //延时等待
|
||||
}
|
||||
while (timeOut--);
|
||||
|
||||
return NULL; //超时还未找到,返回空指针
|
||||
}
|
||||
|
||||
//==========================================================
|
||||
// 函数名称: ESP8266_Init
|
||||
//
|
||||
// 函数功能: 初始化ESP8266
|
||||
//
|
||||
// 入口参数: 无
|
||||
//
|
||||
// 返回参数: 无
|
||||
//
|
||||
// 说明:
|
||||
//==========================================================
|
||||
void ESP8266_Init(void)
|
||||
{
|
||||
// GPIO_InitTypeDef GPIO_Initure;
|
||||
//
|
||||
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
|
||||
|
||||
// //ESP8266复位引脚
|
||||
// GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
|
||||
// GPIO_Initure.GPIO_Pin = GPIO_Pin_5; //GPIOB5-复位
|
||||
// GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
// GPIO_Init(GPIOB, &GPIO_Initure);
|
||||
//
|
||||
// GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET);
|
||||
// HAL_Delay(250);
|
||||
// GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET);
|
||||
// HAL_Delay(500);
|
||||
|
||||
// HAL_GPIO_WritePin(ESP_RST_GPIO_Port,ESP_RST_Pin,GPIO_PIN_RESET);
|
||||
// HAL_Delay(250);
|
||||
// HAL_GPIO_WritePin(ESP_RST_GPIO_Port,ESP_RST_Pin,GPIO_PIN_SET);
|
||||
// HAL_Delay(500);
|
||||
|
||||
ESP8266_Clear();
|
||||
|
||||
// printf("1. AT\r\n");
|
||||
while (ESP8266_SendCmd("AT\r\n", "OK"))
|
||||
HAL_Delay(1000);
|
||||
|
||||
// printf("2. CWMODE\r\n");
|
||||
while (ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
|
||||
HAL_Delay(1000);
|
||||
|
||||
// printf("3. CWJAP\r\n");
|
||||
while (ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
|
||||
HAL_Delay(1000);
|
||||
|
||||
// printf("4. CIPSTART\r\n");
|
||||
while (ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))
|
||||
HAL_Delay(1000);
|
||||
|
||||
// printf("5. ESP8266 Init OK\r\n");
|
||||
}
|
||||
|
||||
|
||||
//==========================================================
|
||||
// 函数名称: ESP8266_IRQHandler
|
||||
//
|
||||
// 函数功能: 串口2收发中断
|
||||
//
|
||||
// 入口参数: 无
|
||||
//
|
||||
// 返回参数: 无
|
||||
//
|
||||
|
||||
// 说明:
|
||||
//==========================================================
|
||||
//void ESP8266_IRQHandler(void)
|
||||
//{
|
||||
// if(esp8266_cnt >= sizeof(esp8266_buf))
|
||||
// {
|
||||
// esp8266_cnt = 0; //防止串口被刷爆
|
||||
// }
|
||||
// esp8266_buf[esp8266_cnt++] = USART1->DR;
|
||||
//}
|
@ -51,13 +51,16 @@ void MX_GPIO_Init(void)
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
|
||||
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(RC522_RST_GPIO_Port, RC522_RST_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(GPIOB, RC522_CS_Pin|RELAY1_Pin, GPIO_PIN_RESET);
|
||||
HAL_GPIO_WritePin(RC522_CS_GPIO_Port, RC522_CS_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(RELAY1_GPIO_Port, RELAY1_Pin, GPIO_PIN_SET);
|
||||
|
||||
/*Configure GPIO pin : LED0_Pin */
|
||||
GPIO_InitStruct.Pin = LED0_Pin;
|
||||
@ -73,12 +76,12 @@ void MX_GPIO_Init(void)
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(RC522_RST_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pins : RC522_CS_Pin RELAY1_Pin */
|
||||
GPIO_InitStruct.Pin = RC522_CS_Pin|RELAY1_Pin;
|
||||
/*Configure GPIO pin : RC522_CS_Pin */
|
||||
GPIO_InitStruct.Pin = RC522_CS_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
HAL_GPIO_Init(RC522_CS_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pins : KEY4_Pin KEY3_Pin KEY2_Pin */
|
||||
GPIO_InitStruct.Pin = KEY4_Pin|KEY3_Pin|KEY2_Pin;
|
||||
@ -92,6 +95,13 @@ void MX_GPIO_Init(void)
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pin : RELAY1_Pin */
|
||||
GPIO_InitStruct.Pin = RELAY1_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(RELAY1_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/* EXTI interrupt init*/
|
||||
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
|
||||
|
@ -73,7 +73,6 @@ void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
|
||||
*/
|
||||
GPIO_InitStruct.Pin = OLED_SCL_Pin|OLED_SDA_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
|
140
Core/Src/main.c
140
Core/Src/main.c
@ -30,6 +30,8 @@
|
||||
#include "retarget.h"
|
||||
#include "oled.h"
|
||||
#include "rc522.h"
|
||||
#include "esp8266.h"
|
||||
#include "OneNet.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
@ -50,6 +52,11 @@
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
|
||||
/* USER CODE BEGIN PV */
|
||||
extern unsigned short esp8266_cnt;
|
||||
extern unsigned char esp8266_buf[128];
|
||||
uint8_t* dataPtr;
|
||||
uint8_t UART2_RxData;
|
||||
|
||||
uint8_t rf_status;
|
||||
uint8_t rf_card_type[3];
|
||||
uint8_t rf_card_id[5];
|
||||
@ -103,28 +110,60 @@ int main(void)
|
||||
/* Initialize all configured peripherals */
|
||||
MX_GPIO_Init();
|
||||
MX_I2C1_Init();
|
||||
MX_USART1_UART_Init();
|
||||
MX_SPI1_Init();
|
||||
MX_USART1_UART_Init();
|
||||
MX_USART2_UART_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
|
||||
// Retarget uart
|
||||
RetargetInit(&huart1);
|
||||
|
||||
// Init RC522
|
||||
MFRC_Init();
|
||||
PCD_Reset();
|
||||
|
||||
// Init OLED
|
||||
OLED_Init();
|
||||
OLED_Clear();
|
||||
|
||||
OLED_ShowString(0,0,"scanning...",12);
|
||||
OLED_ShowString(0,0,"initializing...",12);
|
||||
|
||||
HAL_UART_Receive_IT(&huart2, (uint8_t *) &UART2_RxData, 1);
|
||||
ESP8266_Init();
|
||||
while (OneNet_DevLink()) {}
|
||||
OneNET_Subscribe();
|
||||
|
||||
// Init RC522
|
||||
MFRC_Init();
|
||||
PCD_Reset();
|
||||
|
||||
OLED_ShowString(0,0,"OneNet online ",12);
|
||||
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* Infinite loop */
|
||||
/* USER CODE BEGIN WHILE */
|
||||
while (1)
|
||||
{
|
||||
// if (!OneNet_DevLink())
|
||||
// {
|
||||
// OLED_ShowString(0,0,"OneNet online ",12);
|
||||
// HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
|
||||
// OneNet_SendData();
|
||||
// HAL_Delay(1000);
|
||||
// ESP8266_Clear();
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// OLED_ShowString(0,0,"OneNet offline ",12);
|
||||
// HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
|
||||
// }
|
||||
OneNet_SendData();
|
||||
HAL_Delay(1000);
|
||||
ESP8266_Clear();
|
||||
|
||||
dataPtr = ESP8266_GetIPD(0);
|
||||
if (dataPtr != NULL)
|
||||
{
|
||||
OneNet_RevPro(dataPtr);
|
||||
}
|
||||
|
||||
rf_status = PCD_Request(PICC_REQALL, rf_card_type);
|
||||
|
||||
if (!rf_status) {
|
||||
@ -135,9 +174,9 @@ int main(void)
|
||||
|
||||
if (!rf_status) {
|
||||
rf_status = PCD_ERR;
|
||||
printf(SEP);
|
||||
printf("[i] Card Type: %02X %02X %02X\r\n", rf_card_type[0], rf_card_type[1], rf_card_type[2]);
|
||||
printf("[i] Card ID : %02X-%02X-%02X-%02X\r\n", rf_card_id[0], rf_card_id[1], rf_card_id[2], rf_card_id[3]);
|
||||
// printf(SEP);
|
||||
// printf("[i] Card Type: %02X %02X %02X\r\n", rf_card_type[0], rf_card_type[1], rf_card_type[2]);
|
||||
// printf("[i] Card ID : %02X-%02X-%02X-%02X\r\n", rf_card_id[0], rf_card_id[1], rf_card_id[2], rf_card_id[3]);
|
||||
|
||||
OLED_ShowString(0, 2, "Typ:", 12);
|
||||
uint8_t card_type_buffer[9];
|
||||
@ -156,24 +195,24 @@ int main(void)
|
||||
rf_status = PCD_ERR;
|
||||
|
||||
rf_status = PCD_AuthState(PICC_AUTHENT1A, ADDR, KEY_A, rf_card_id);
|
||||
if(rf_status == PCD_OK)
|
||||
{
|
||||
printf("[*] Key A pass\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("[!] Key A verification failed\r\n");
|
||||
}
|
||||
// if(rf_status == PCD_OK)
|
||||
// {
|
||||
// printf("[*] Key A pass\r\n");
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// printf("[!] Key A verification failed\r\n");
|
||||
// }
|
||||
|
||||
rf_status = PCD_AuthState(PICC_AUTHENT1B, ADDR, KEY_B, rf_card_id);
|
||||
if(rf_status == PCD_OK)
|
||||
{
|
||||
printf("[*] Key B pass\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("[!] Key B verification failed\r\n");
|
||||
}
|
||||
// if(rf_status == PCD_OK)
|
||||
// {
|
||||
// printf("[*] Key B pass\r\n");
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// printf("[!] Key B verification failed\r\n");
|
||||
// }
|
||||
}
|
||||
|
||||
if(rf_status == PCD_OK)
|
||||
@ -181,19 +220,19 @@ int main(void)
|
||||
rf_status = PCD_ERR;
|
||||
rf_status = PCD_ReadBlock(ADDR, rf_data);
|
||||
|
||||
if(rf_status == PCD_OK)
|
||||
{
|
||||
printf("[+] Data in sector %d block %d: ", ADDR/4, ADDR%4);
|
||||
for(int i = 0; i < 16; i++)
|
||||
{
|
||||
printf("%02x", rf_data[i]);
|
||||
}
|
||||
printf("\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Read card failed\r\n");
|
||||
}
|
||||
// if(rf_status == PCD_OK)
|
||||
// {
|
||||
// printf("[+] Data in sector %d block %d: ", ADDR/4, ADDR%4);
|
||||
// for(int i = 0; i < 16; i++)
|
||||
// {
|
||||
// printf("%02x", rf_data[i]);
|
||||
// }
|
||||
// printf("\r\n");
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// printf("Read card failed\r\n");
|
||||
// }
|
||||
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
|
||||
HAL_Delay(3000);
|
||||
}
|
||||
@ -246,9 +285,30 @@ void SystemClock_Config(void)
|
||||
/* USER CODE BEGIN 4 */
|
||||
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
|
||||
{
|
||||
if(GPIO_Pin == KEY1_Pin)
|
||||
if(GPIO_Pin == KEY1_Pin || GPIO_Pin == KEY2_Pin || GPIO_Pin == KEY3_Pin || GPIO_Pin == KEY4_Pin)
|
||||
{
|
||||
OLED_Clear();
|
||||
HAL_GPIO_TogglePin(RELAY1_GPIO_Port, RELAY1_Pin);
|
||||
if(HAL_GPIO_ReadPin(RELAY1_GPIO_Port, RELAY1_Pin) == GPIO_PIN_RESET)
|
||||
{
|
||||
OLED_ShowString(0, 6, "Relay1: ON ", 12);
|
||||
}
|
||||
else
|
||||
{
|
||||
OLED_ShowString(0, 6, "Relay1: OFF", 12);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
|
||||
{
|
||||
if (huart == &huart2)
|
||||
{
|
||||
if (esp8266_cnt >= sizeof(esp8266_buf))
|
||||
{
|
||||
esp8266_cnt = 0;
|
||||
}
|
||||
esp8266_buf[esp8266_cnt++] = UART2_RxData;
|
||||
HAL_UART_Receive_IT(&huart2, (uint8_t *)&UART2_RxData, 1);
|
||||
}
|
||||
}
|
||||
/* USER CODE END 4 */
|
||||
|
@ -55,7 +55,8 @@
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/* External variables --------------------------------------------------------*/
|
||||
|
||||
extern UART_HandleTypeDef huart1;
|
||||
extern UART_HandleTypeDef huart2;
|
||||
/* USER CODE BEGIN EV */
|
||||
|
||||
/* USER CODE END EV */
|
||||
@ -212,6 +213,34 @@ void EXTI9_5_IRQHandler(void)
|
||||
/* USER CODE END EXTI9_5_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles USART1 global interrupt.
|
||||
*/
|
||||
void USART1_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN USART1_IRQn 0 */
|
||||
|
||||
/* USER CODE END USART1_IRQn 0 */
|
||||
HAL_UART_IRQHandler(&huart1);
|
||||
/* USER CODE BEGIN USART1_IRQn 1 */
|
||||
|
||||
/* USER CODE END USART1_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles USART2 global interrupt.
|
||||
*/
|
||||
void USART2_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN USART2_IRQn 0 */
|
||||
|
||||
/* USER CODE END USART2_IRQn 0 */
|
||||
HAL_UART_IRQHandler(&huart2);
|
||||
/* USER CODE BEGIN USART2_IRQn 1 */
|
||||
|
||||
/* USER CODE END USART2_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles EXTI line[15:10] interrupts.
|
||||
*/
|
||||
|
@ -113,6 +113,9 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
/* USART1 interrupt Init */
|
||||
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(USART1_IRQn);
|
||||
/* USER CODE BEGIN USART1_MspInit 1 */
|
||||
|
||||
/* USER CODE END USART1_MspInit 1 */
|
||||
@ -140,6 +143,9 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
/* USART2 interrupt Init */
|
||||
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(USART2_IRQn);
|
||||
/* USER CODE BEGIN USART2_MspInit 1 */
|
||||
|
||||
/* USER CODE END USART2_MspInit 1 */
|
||||
@ -163,6 +169,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
|
||||
|
||||
/* USART1 interrupt Deinit */
|
||||
HAL_NVIC_DisableIRQ(USART1_IRQn);
|
||||
/* USER CODE BEGIN USART1_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END USART1_MspDeInit 1 */
|
||||
@ -181,6 +189,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
|
||||
|
||||
/* USART2 interrupt Deinit */
|
||||
HAL_NVIC_DisableIRQ(USART2_IRQn);
|
||||
/* USER CODE BEGIN USART2_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END USART2_MspDeInit 1 */
|
||||
|
Reference in New Issue
Block a user