STM32+ESP01连接到机智云
机智云,全球领先的智能硬件软件自助开发及物联网(iot)云服务平台。机智云平台为开发者提供了自助式智能硬件开发工具与开放的云端服务。通过傻瓜化的自助工具、完善的SDK与API服务能力最大限度降低了物联网硬件开发的技术门槛,降低开发者的研发成本,提升开发者的产品投产速度,帮助开发者进行硬件智能化升级,更好的连接、服务最终消费者。使用机智云作为云平台可以轻松实现物联网功能。首先,我们需要注册并进入机智云官网。
一、进入开发者中心
如图,这是我的机智云。
创建一个自定义产品,如下
添加好数据节点,如下,这是一个开关一个led灯:
复制密码,以备用
二、生成代码
1、选择MCU开发其他平台,输入密钥,生成代码包。
2、生成成功,下载到本地
3、移植代码
将 Gizwits 和 Utils 一直到我们的工程中,如下图:
将它们添加进工程
修改 gizwits_product.c ,如下:
/**
************************************************************
* @file gizwits_product.c
* @brief Gizwits control protocol processing, and platform-related hardware initialization
* @author Gizwits
* @date 2017-07-19
* @version V03030000
* @copyright Gizwits
*
* @note Gizwits is only for smart hardware
* Gizwits Smart Cloud for Smart Products
* Links | Value Added | Open | Neutral | Safety | Own | Free | Ecology
* www.gizwits.com
*
***********************************************************/
#include <stdio.h>
#include <string.h>
#include "stm32f10x.h" // Device header
#include "gizwits_product.h"
#include "Serial3.h"
#include "LED.h"static uint32_t timerMsCount;/** Current datapoint */
dataPoint_t currentDataPoint;/**@} */
/**@name Gizwits User Interface
* @{
*//**
* @brief Event handling interface* Description:* 1. Users can customize the changes in WiFi module status* 2. Users can add data points in the function of event processing logic, such as calling the relevant hardware peripherals operating interface* @param [in] info: event queue
* @param [in] data: protocol data
* @param [in] len: protocol data length
* @return NULL
* @ref gizwits_protocol.h
*/
int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *gizdata, uint32_t len)
{uint8_t i = 0;dataPoint_t *dataPointPtr = (dataPoint_t *)gizdata;moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)gizdata;protocolTime_t *ptime = (protocolTime_t *)gizdata;#if MODULE_TYPEgprsInfo_t *gprsInfoData = (gprsInfo_t *)gizdata;
#elsemoduleInfo_t *ptModuleInfo = (moduleInfo_t *)gizdata;
#endifif((NULL == info) || (NULL == gizdata)){return -1;}for(i=0; i<info->num; i++){switch(info->event[i]){case EVENT_btn:currentDataPoint.valuebtn = dataPointPtr->valuebtn;GIZWITS_LOG("Evt: EVENT_btn %d \n", currentDataPoint.valuebtn);if(0x01 == currentDataPoint.valuebtn){//user handleLED1_ON();}else{//user handle LED1_OFF(); }break;case WIFI_SOFTAP:break;case WIFI_AIRLINK:break;case WIFI_STATION:break;case WIFI_CON_ROUTER:break;case WIFI_DISCON_ROUTER:break;case WIFI_CON_M2M:break;case WIFI_DISCON_M2M:break;case WIFI_RSSI:GIZWITS_LOG("RSSI %d\n", wifiData->rssi);break;case TRANSPARENT_DATA:GIZWITS_LOG("TRANSPARENT_DATA \n");//user handle , Fetch data from [data] , size is [len]break;case WIFI_NTP:GIZWITS_LOG("WIFI_NTP : [%d-%d-%d %02d:%02d:%02d][%d] \n",ptime->year,ptime->month,ptime->day,ptime->hour,ptime->minute,ptime->second,ptime->ntp);break;case MODULE_INFO:GIZWITS_LOG("MODULE INFO ...\n");
#if MODULE_TYPEGIZWITS_LOG("GPRS MODULE ...\n");//Format By gprsInfo_tGIZWITS_LOG("moduleType : [%d] \n",gprsInfoData->Type);
#elseGIZWITS_LOG("WIF MODULE ...\n");//Format By moduleInfo_tGIZWITS_LOG("moduleType : [%d] \n",ptModuleInfo->moduleType);
#endifbreak;default:break;}}return 0;
}/**
* Data point initialization function* In the function to complete the initial user-related data
* @param none
* @return none
* @note The developer can add a data point state initialization value within this function
*/
void userInit(void)
{memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t)); currentDataPoint.valuebtn = 0;currentDataPoint.valuenum = 0;
}/**
* @brief gizTimerMs* millisecond timer maintenance function ,Millisecond increment , Overflow to zero* @param none
* @return none
*/
void gizTimerMs(void)
{timerMsCount++;
}/**
* @brief gizGetTimerCount* Read system time, millisecond timer* @param none
* @return System time millisecond
*/
uint32_t gizGetTimerCount(void)
{return timerMsCount;
}/**
* @brief mcuRestart* MCU Reset function* @param none
* @return none
*/
void mcuRestart(void)
{__set_FAULTMASK(1);NVIC_SystemReset();//修改
}/**
* @brief uartWrite* Serial write operation, send data to the WiFi module* @param buf : Data address
* @param len : Data length
*
* @return : Not 0,Serial send success;
* -1,Input Param Illegal
*/int32_t uartWrite(uint8_t *buf, uint32_t len)
{uint32_t i = 0;if(NULL == buf){return -1;}#ifdef PROTOCOL_DEBUGGIZWITS_LOG("MCU2WiFi[%4d:%4d]: ", gizGetTimerCount(), len);for(i=0; i<len; i++){GIZWITS_LOG("%02x ", buf[i]);}GIZWITS_LOG("\n");#endiffor(i=0; i<len; i++){//USART_SendData(UART, buf[i]);//STM32 test demo//Serial port to achieve the function, the buf[i] sent to the moduleUSART_SendData(USART3, buf[i]);while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);if(i >=2 && buf[i] == 0xFF){//Serial port to achieve the function, the 0x55 sent to the module//USART_SendData(UART, 0x55);//STM32 test demoUSART_SendData(USART3, 0x55);while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);}}return len;
}
准备一个定时器程序,定时大约1ms,在定时器中断中调用 gizTimerMs(); 为机智云提供时钟。
void TIM2_IRQHandler()
{if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){gizTimerMs(); //为机智云提供时钟TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}
}
准备一个UART连接ESP01,并在改UART的中断函数中调用 gizPutData(&value, 1); 函数,用于接受ESP01串口中断发来的数据。
void USART3_IRQHandler(void)
{uint8_t value = 0;if(USART_GetITStatus(Serial3_UARTx, USART_IT_RXNE) != RESET){USART_ClearITPendingBit(Serial3_UARTx, USART_IT_RXNE); value = USART_ReceiveData(USART3); //读取接收到的数据gizPutData(&value, 1); }
}
同时配置好按键,在主函数中按键获取函数,并通过按键值选择调用联网和重新配置,如下图:
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "Timer.h"
#include "gizwits_product.h"
#include "Serial.h"
#include "Serial3.h"
#include "LED.h"
#include "Key.h"
#include "Delay.h" extern dataPoint_t currentDataPoint;//协议初始化
void Gizwits_Init(void)
{Timer_Init();//1msSerial_Init();Serial3_Init();//gizPutData((uint8_t *)&aRxBuffer,1);userInit();//用户信息初始化,目前只是把结构体信息复位gizwitsInit();//机智云的初始化printf("gizwitsInit智能云初始化\r\n");
}//数据采集
void userHandle(void)
{currentDataPoint.valuenum = 50;
}int main()
{uint8_t keyNum=0;LED_Init();Key_Init();Gizwits_Init();while(1){keyNum = Key_GetNum();if(keyNum==1)//按键1按下{printf("WIFI进入AirLink连接模式\r\n");gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link模式接入} if(keyNum==2)//按键2按下99{ printf("WIFI复位,请重新配置连接\r\n");gizwitsSetMode(WIFI_RESET_MODE);//WIFI复位}userHandle();//数据上行gizwitsHandle((dataPoint_t *)¤tDataPoint);}
}
至此,STM32代码移植已经完毕
三、ESP01烧入机智云固件
1、进入机智云固件下载地址,下载如下固件,地址如下
Gizwits
2、本次使用STM32F103C8T6,于是选择8M带combine的
3、打开 flash_download_tool,进行固件下载,如图:
四、APP配置机智云
1、按下按键1,进入配网模式,注意网络wifi网关不能是5GHZ的频段,建议2.4GHz,如图:
2、 点击机智云app左上角的加号,选择Airlink,输入我们的wifi名和密码,点击下一步:
选择乐鑫,然后下一步。
最后等待连接成功即可:
3、连接成功,APP出现一个叫做测试的设备,如下:
五、测试功能
1、显示测试数50,本次采用固定数字测试数字上传情况,代码如下
//数据采集
void userHandle(void)
{currentDataPoint.valuenum = 50;
}
2、按键开关灯
按下开,此时led会亮起,如下:
再次按下,led会关闭,如下:
相关文章:

STM32+ESP01连接到机智云
机智云,全球领先的智能硬件软件自助开发及物联网(iot)云服务平台。机智云平台为开发者提供了自助式智能硬件开发工具与开放的云端服务。通过傻瓜化的自助工具、完善的SDK与API服务能力最大限度降低了物联网硬件开发的技术门槛,降低开发者的研发成本,提升…...

电脑实时监控软件有哪些?七个电脑屏幕监控软件任你选择
电脑实时监控软件种类繁多,每款软件都有其独特的功能和适用场景。 以下是七个备受推荐的电脑屏幕监控软件,供您选择: 1.安企神: 功能:它是一款国内领先的企业级电脑监控解决方案, 提供实时屏幕监控、 文…...

信奥学习规划(CSP-J/S)
CSP-J组学习路线规划 CSP-S组学习规划...

【Linux取经之路】编译器gcc/g++的使用 调试器gdb的使用
目录 背景知识 编译器gcc/g的安装 编译器gcc/g的使用 调试器gdb的使用 cgdb 条件断点 背景知识 子曰:“温故而知新”。在谈gcc/g的使用之前,我们先来复习编译的4个阶段,也算是为下面的内容做一些铺垫,请看思维导图。 编译…...
自动化流程机器人(RPA)
自动化流程机器人(RPA)正逐渐成为企业提高效率和降低成本的强有力工具。 一、RPA的概念 自动化流程机器人(Robotic Process Automation,简称RPA)是一种利用软件机器人(Robot)模拟和执行复杂任务…...
Unity persistentDataPath使用案例
Unity persistentDataPath使用案例 一、Application.persistentDataPath 1、概念 persistentDataPath:此属性用于返回一个持久化数据存储目录的路径,可以在此路径下存储一些持久化的数据文件;是一个可读写的目录;此文件夹在Edi…...
Android 测试手册
1. 介绍 Android 测试是确保应用程序质量的重要步骤。它包括不同类型的测试,用于验证应用程序的功能、性能、安全性和用户体验。这个手册将指导你了解和实施 Android 测试的主要方法和工具。 2. 测试类型 2.1 单元测试 目的:验证单个组件(…...

各大平台统遭入侵??区块链市场遭攻击损失近3亿!
今年,全球发生多起骇人听闻的勒索入侵软件攻击事件,黑客组织利用各种手段和技术,不断试图突破网络安全防线,窃取敏感信息、破坏系统运行,甚至进行勒索和敲诈,使得网络安全问题日益凸显其重要性和紧迫性。 S…...

Java泛型(“代码模板”,一套代码套用各种类型)
1.什么是泛型 a.定义 i.如果不用泛型定义,在使用ArrayList时需要为每个class编写特定类型代码。 ii.泛型就是定义一种模板,既实现了编写一次,万能匹配,又通过编译器保证了类型安全。 iii.编写模板代码来适应任意…...

速响低代码平台:升级营销管理系统,开启高效无忧新体验!
当前日新月异的商业环境,企业面临着前所未有的挑战与机遇。随着市场竞争的日益加剧和企业业务的不断拓展,传统的营销方式和管理手段逐渐显露出其局限性,难以适应快速变化的市场需求。 数据收集难:传统的营销管理缺乏对客户数据的收…...
Gitlab升级14.0.12-->14.3.6遇到的gitlab-ctl reconfigure错误
问题描述 在按照官方文档升级路线11.0.2>17.2.2的过程中,升级14.0.12–》14.3.6时遇到一个错误: Running handlers: There was an error running gitlab-ctl reconfigure:rails_migration[gitlab-rails] (gitlab::database_migrations line 51) had…...

JDBC导图
思维歹徒 一、使用步骤 二、SQL注入 三、数据库查询(查询) 四、数据库写入(增删改) 五、Date日期对象处理 六、连接池使用 创建连接是从连接池拿,释放连接是放回连接池 七、事务和批次插入 八、Apache Commons DBUtil…...

飞思实验室与中飞院联合开发教学课程,校企联袂共绘教育蓝图
近日,飞思实验室与中国民用航空飞行学院(以下简称“中飞院”) 航空电子电气学院合作,共同开发《无人智能视觉导航控制技术》、《多旋翼无人飞行器集群系统》实验课程。这一举措旨在深化校企融合,学校通过引入企业带来的…...

Telephony Call
1、Telephony 架构 Telephony整体架构和Android架构一样的,包括APP层,框架层,HAL层,内核层。 其中HAL层不同平台实现方式不同,其中MTK SPRD 平台使用AT通道的方式实现,高通使用QMI方式实现。 2、通话业务介绍 APP包括Dialer.apk、TeleService.apk、Tele…...

Python--TCP/UDP通信
文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 一.客户端与服务端通信原理 1. 服务器端 服务器端的主要任务是监听来自客户端的连接请求,并与之建立连接,然后接收和发送数据。 创建套接字:首先࿰…...

【已解决】请教 “Sa-Token 集成 xxl-job,报错:非 web 上下文无法获取 HttpServletRequest” 如何解决
1. xxl-job 报错日志 2024-09-11 17:19:04 [com.xxl.job.core.thread.JobThread#run]-[133]-[xxl-job, JobThread-3-1726046344528] <br>----------- xxl-job job execute start -----------<br>----------- Param: 2024-09-11 17:19:04 [com.xxl.job.core.thread…...

Redis——常用数据类型string
目录 常用数据结构(类型)Redis单线程模型Reids为啥效率这么高?速度这么快?(参照于其他数据库) stringsetgetMSET 和 MGETSETNX,SETEX,PSETEXincr,incrby,decr…...
架构设计:负责网络、定时、坐下、站起、重连等,支持多类游戏的无锁房间
本文首发在这里 重中之重就是想实现无锁!无锁!无锁! 源码 servergolang 预计还会实现gate_server,接受并保持websocket长连接,按需双向流到game_server进行消息转发 未来上述服务均会以容器的形式由k8s自动化部署、…...

个人随想-gpt-o1大模型中推理链的一个落地实现
首先祝大家中秋节快乐。 最近openai又推出了新的模型openai o1还有它的mini版。官网的介绍,就是它的推理能力很强,比gpt-4o有很大的提升。 最近也跟同行在聊这个o1,看看落地方面有哪些可行性。在我们自己的实验上,把o1用…...
python解析ip范围,判断ip是否在ip范围内
目录 1. 背景 2. 代码使用示例 2.1 分割ip,横杠 (-) 的ip范围 2.2 判断ip在掩码(/)的范围内 2.3 判断ip在横杠(-)的范围内 2.3.1 格式:192.168.1.1-192.168.1.10 2.3.2 格式&…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...