feat: implement OneNet communication and ESP8266 integration

break: switch to c8t6
This commit is contained in:
2025-03-29 16:55:09 +08:00
parent c5f3e400ae
commit 98463aa9f1
22 changed files with 2725 additions and 190 deletions

183
Core/Inc/MqttKit.h Normal file
View File

@ -0,0 +1,183 @@
#ifndef _MQTTKIT_H_
#define _MQTTKIT_H_
#include "MqttKit/Common.h"
//=============================配置==============================
//===========可以提供RTOS的内存管理方案也可以使用C库的=========
//RTOS
#include <stdlib.h>
#define MQTT_MallocBuffer malloc
#define MQTT_FreeBuffer free
//==========================================================
#define MOSQ_MSB(A) (uint8)((A & 0xFF00) >> 8)
#define MOSQ_LSB(A) (uint8)(A & 0x00FF)
/*--------------------------------内存分配方案标志--------------------------------*/
#define MEM_FLAG_NULL 0
#define MEM_FLAG_ALLOC 1
#define MEM_FLAG_STATIC 2
typedef struct Buffer
{
uint8 *_data; //协议数据
uint32 _len; //写入的数据长度
uint32 _size; //缓存总大小
uint8 _memFlag; //内存使用的方案0-未分配 1-使用的动态分配 2-使用的固定内存
} MQTT_PACKET_STRUCTURE;
/*--------------------------------固定头部消息类型--------------------------------*/
enum MqttPacketType
{
MQTT_PKT_CONNECT = 1, /**< 连接请求数据包 */
MQTT_PKT_CONNACK, /**< 连接确认数据包 */
MQTT_PKT_PUBLISH, /**< 发布数据数据包 */
MQTT_PKT_PUBACK, /**< 发布确认数据包 */
MQTT_PKT_PUBREC, /**< 发布数据已接收数据包Qos 2时回复MQTT_PKT_PUBLISH */
MQTT_PKT_PUBREL, /**< 发布数据释放数据包, Qos 2时回复MQTT_PKT_PUBREC */
MQTT_PKT_PUBCOMP, /**< 发布完成数据包, Qos 2时回复MQTT_PKT_PUBREL */
MQTT_PKT_SUBSCRIBE, /**< 订阅数据包 */
MQTT_PKT_SUBACK, /**< 订阅确认数据包 */
MQTT_PKT_UNSUBSCRIBE, /**< 取消订阅数据包 */
MQTT_PKT_UNSUBACK, /**< 取消订阅确认数据包 */
MQTT_PKT_PINGREQ, /**< ping 数据包 */
MQTT_PKT_PINGRESP, /**< ping 响应数据包 */
MQTT_PKT_DISCONNECT, /**< 断开连接数据包 */
//新增
MQTT_PKT_CMD /**< 命令下发数据包 */
};
/*--------------------------------MQTT QOS等级--------------------------------*/
enum MqttQosLevel
{
MQTT_QOS_LEVEL0, /**< 最多发送一次 */
MQTT_QOS_LEVEL1, /**< 最少发送一次 */
MQTT_QOS_LEVEL2 /**< 只发送一次 */
};
/*--------------------------------MQTT 连接请求标志位,内部使用--------------------------------*/
enum MqttConnectFlag
{
MQTT_CONNECT_CLEAN_SESSION = 0x02,
MQTT_CONNECT_WILL_FLAG = 0x04,
MQTT_CONNECT_WILL_QOS0 = 0x00,
MQTT_CONNECT_WILL_QOS1 = 0x08,
MQTT_CONNECT_WILL_QOS2 = 0x10,
MQTT_CONNECT_WILL_RETAIN = 0x20,
MQTT_CONNECT_PASSWORD = 0x40,
MQTT_CONNECT_USER_NAME = 0x80
};
/*--------------------------------消息的packet ID可自定义--------------------------------*/
#define MQTT_PUBLISH_ID 10
#define MQTT_SUBSCRIBE_ID 20
#define MQTT_UNSUBSCRIBE_ID 30
/*--------------------------------删包--------------------------------*/
void MQTT_DeleteBuffer(MQTT_PACKET_STRUCTURE *mqttPacket);
/*--------------------------------解包--------------------------------*/
uint8 MQTT_UnPacketRecv(uint8 *dataPtr);
/*--------------------------------登录组包--------------------------------*/
uint8 MQTT_PacketConnect(const int8 *user, const int8 *password, const int8 *devid,
uint16 cTime, uint1 clean_session, uint1 qos,
const int8 *will_topic, const int8 *will_msg, int32 will_retain,
MQTT_PACKET_STRUCTURE *mqttPacket);
/*--------------------------------断开连接组包--------------------------------*/
uint1 MQTT_PacketDisConnect(MQTT_PACKET_STRUCTURE *mqttPacket);
/*--------------------------------连接响应解包--------------------------------*/
uint8 MQTT_UnPacketConnectAck(uint8 *rev_data);
/*--------------------------------数据点上传组包--------------------------------*/
uint1 MQTT_PacketSaveData(const int8 *devid, int16 send_len, int8 *type_bin_head, uint8 type, MQTT_PACKET_STRUCTURE *mqttPacket);
/*--------------------------------二进制文件上传组包--------------------------------*/
uint1 MQTT_PacketSaveBinData(const int8 *name, int16 file_len, MQTT_PACKET_STRUCTURE *mqttPacket);
/*--------------------------------命令下发解包--------------------------------*/
uint8 MQTT_UnPacketCmd(uint8 *rev_data, int8 **cmdid, int8 **req, uint16 *req_len);
/*--------------------------------命令回复组包--------------------------------*/
uint1 MQTT_PacketCmdResp(const int8 *cmdid, const int8 *req, MQTT_PACKET_STRUCTURE *mqttPacket);
/*--------------------------------订阅主题组包--------------------------------*/
uint8 MQTT_PacketSubscribe(uint16 pkt_id, enum MqttQosLevel qos, const int8 *topics[], uint8 topics_cnt, MQTT_PACKET_STRUCTURE *mqttPacket);
/*--------------------------------订阅主题回复解包--------------------------------*/
uint8 MQTT_UnPacketSubscribe(uint8 *rev_data);
/*--------------------------------取消订阅组包--------------------------------*/
uint8 MQTT_PacketUnSubscribe(uint16 pkt_id, const int8 *topics[], uint8 topics_cnt, MQTT_PACKET_STRUCTURE *mqttPacket);
/*--------------------------------取消订阅回复解包--------------------------------*/
uint1 MQTT_UnPacketUnSubscribe(uint8 *rev_data);
/*--------------------------------发布主题组包--------------------------------*/
uint8 MQTT_PacketPublish(uint16 pkt_id, const int8 *topic,
const int8 *payload, uint32 payload_len,
enum MqttQosLevel qos, int32 retain, int32 own,
MQTT_PACKET_STRUCTURE *mqttPacket);
/*--------------------------------发布消息回复解包--------------------------------*/
uint8 MQTT_UnPacketPublish(uint8 *rev_data, int8 **topic, uint16 *topic_len, int8 **payload, uint16 *payload_len, uint8 *qos, uint16 *pkt_id);
/*--------------------------------发布消息的Ack组包--------------------------------*/
uint1 MQTT_PacketPublishAck(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket);
/*--------------------------------发布消息的Ack解包--------------------------------*/
uint1 MQTT_UnPacketPublishAck(uint8 *rev_data);
/*--------------------------------发布消息的Rec组包--------------------------------*/
uint1 MQTT_PacketPublishRec(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket);
/*--------------------------------发布消息的Rec解包--------------------------------*/
uint1 MQTT_UnPacketPublishRec(uint8 *rev_data);
/*--------------------------------发布消息的Rel组包--------------------------------*/
uint1 MQTT_PacketPublishRel(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket);
/*--------------------------------发布消息的Rel解包--------------------------------*/
uint1 MQTT_UnPacketPublishRel(uint8 *rev_data, uint16 pkt_id);
/*--------------------------------发布消息的Comp组包--------------------------------*/
uint1 MQTT_PacketPublishComp(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket);
/*--------------------------------发布消息的Comp解包--------------------------------*/
uint1 MQTT_UnPacketPublishComp(uint8 *rev_data);
/*--------------------------------心跳请求组包--------------------------------*/
uint1 MQTT_PacketPing(MQTT_PACKET_STRUCTURE *mqttPacket);
#endif

17
Core/Inc/MqttKit/common.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef __COMMON_H__
#define __COMMON_H__
/*---------------------------------------------------------------------------*/
/* Type Definition Macros */
/*---------------------------------------------------------------------------*/
typedef _Bool uint1;
typedef unsigned char uint8;
typedef char int8;
typedef unsigned short uint16;
typedef short int16;
typedef unsigned int uint32;
typedef int int32;
typedef unsigned int size_t;
#endif /* __COMMON_H__ */

15
Core/Inc/OneNet.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef _ONENET_H_
#define _ONENET_H_
_Bool OneNet_DevLink(void);
void OneNet_SendData(void);
void OneNet_RevPro(unsigned char* cmd);
void OneNET_Subscribe(void);
uint8_t onenet_state();
#endif

18
Core/Inc/esp8266.h Normal file
View File

@ -0,0 +1,18 @@
#ifndef _ESP8266_H_
#define _ESP8266_H_
#define REV_OK 0 //接收完成标志
#define REV_WAIT 1 //接收未完成标志
void ESP8266_Init(void);
void ESP8266_Clear(void);
void ESP8266_SendData(unsigned char* data, unsigned short len);
unsigned char* ESP8266_GetIPD(unsigned short timeOut);
#endif

View File

@ -56,6 +56,8 @@ void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void EXTI9_5_IRQHandler(void);
void USART1_IRQHandler(void);
void USART2_IRQHandler(void);
void EXTI15_10_IRQHandler(void);
/* USER CODE BEGIN EFP */

1399
Core/Src/MqttKit.c Normal file

File diff suppressed because it is too large Load Diff

236
Core/Src/OneNet.c Normal file
View 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
View 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;
//}

View File

@ -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);

View File

@ -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);

View File

@ -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 */

View File

@ -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.
*/

View File

@ -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 */

View File

@ -1,8 +1,8 @@
/**
*************** (C) COPYRIGHT 2017 STMicroelectronics ************************
* @file startup_stm32f103x6.s
* @file startup_stm32f103xb.s
* @author MCD Application Team
* @brief STM32F103x6 Devices vector table for Atollic toolchain.
* @brief STM32F103xB Devices vector table for Atollic toolchain.
* This module performs:
* - Set the initial SP
* - Set the initial PC == Reset_Handler,
@ -174,16 +174,16 @@ g_pfnVectors:
.word TIM1_CC_IRQHandler
.word TIM2_IRQHandler
.word TIM3_IRQHandler
.word 0
.word TIM4_IRQHandler
.word I2C1_EV_IRQHandler
.word I2C1_ER_IRQHandler
.word 0
.word 0
.word I2C2_EV_IRQHandler
.word I2C2_ER_IRQHandler
.word SPI1_IRQHandler
.word 0
.word SPI2_IRQHandler
.word USART1_IRQHandler
.word USART2_IRQHandler
.word 0
.word USART3_IRQHandler
.word EXTI15_10_IRQHandler
.word RTC_Alarm_IRQHandler
.word USBWakeUp_IRQHandler
@ -194,8 +194,8 @@ g_pfnVectors:
.word 0
.word 0
.word 0
.word BootRAM /* @0x108. This is for boot in RAM mode for
STM32F10x Low Density devices.*/
.word BootRAM /* @0x108. This is for boot in RAM mode for
STM32F10x Medium Density devices. */
/*******************************************************************************
*
@ -322,21 +322,36 @@ g_pfnVectors:
.weak TIM3_IRQHandler
.thumb_set TIM3_IRQHandler,Default_Handler
.weak TIM4_IRQHandler
.thumb_set TIM4_IRQHandler,Default_Handler
.weak I2C1_EV_IRQHandler
.thumb_set I2C1_EV_IRQHandler,Default_Handler
.weak I2C1_ER_IRQHandler
.thumb_set I2C1_ER_IRQHandler,Default_Handler
.weak I2C2_EV_IRQHandler
.thumb_set I2C2_EV_IRQHandler,Default_Handler
.weak I2C2_ER_IRQHandler
.thumb_set I2C2_ER_IRQHandler,Default_Handler
.weak SPI1_IRQHandler
.thumb_set SPI1_IRQHandler,Default_Handler
.weak SPI2_IRQHandler
.thumb_set SPI2_IRQHandler,Default_Handler
.weak USART1_IRQHandler
.thumb_set USART1_IRQHandler,Default_Handler
.weak USART2_IRQHandler
.thumb_set USART2_IRQHandler,Default_Handler
.weak USART3_IRQHandler
.thumb_set USART3_IRQHandler,Default_Handler
.weak EXTI15_10_IRQHandler
.thumb_set EXTI15_10_IRQHandler,Default_Handler
@ -346,3 +361,4 @@ g_pfnVectors:
.weak USBWakeUp_IRQHandler
.thumb_set USBWakeUp_IRQHandler,Default_Handler