一、文档资料

添加链接描述

二、整体流程

  1. 引脚
  2. 命令列表(注意\r结尾)

其中,restore 用于重新配置模组,类似于出厂了,出厂后,设备进入ap模式

arch
ble_config
ble_event
ble_fastpair
ble_linkage
call
config_router
country_code
echo
error
event
event_occured
factory
get_down
getwifi
help
json_ack
json_get_down
json_send
log
mac
mcu_version
model
net
properties_changed
props
reboot
restore
result
set_mcu_auto_ota
setwifi
store
time
update_me
version
  1. 上电先发送model
  2. 周期性发送get_down
    属性格式如下:uid pid 数据
    注意布尔类型,是 true 和 flse,字符串类型,需要加上 “”

设置属性:这里一共有2个属性
第一个是 1 1 ,数值是10
第二个是 1 88 ,数值是 字符串数据

对于下发的数据,必须回复 result
格式:result uid pid 返回码(0为成功)

  ↑ get_down  ↓ down set_properties 1 1 10 1 88  "str_value"     ↑ result 1 1 0 1 88 -4003

获取属性:
第一个是 1 2
第二个是 1 3

必须回复 result
格式:result uid pid 返回码(0为成功) 数值

    ↑ get_down  ↓ down get_properties 1 2 1 3                        ↑ result 1 2 0 10 1 3 0 "str_value"

上报属性:

  ↑properties_changed 1 1 10↓ok
  1. 周期性通过 net 查询当前网络状态,也可以通过 get_down返回的mii状态判断、

三、整体测试代码(含串口逻辑)

/**
******************************************************************************
* @file     main.c
* @author   AE team
* @version  V1.1.1
* @date     15/05/2019
* @brief
******************************************************************************
* @copy
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, MindMotion SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>&copy; COPYRIGHT 2019 MindMotion</center></h2>
*/
#include "HAL_device.h"
#include "HAL_conf.h"
#include "stdio.h"
#include "string.h"#define LED2_ON()  GPIO_SetBits(GPIOA,GPIO_Pin_2)  // PB4
#define LED2_OFF()  GPIO_ResetBits(GPIOA,GPIO_Pin_2)    // PB4
#define LED2_TOGGLE()  (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2))?(GPIO_ResetBits(GPIOA,GPIO_Pin_2)):(GPIO_SetBits(GPIOA,GPIO_Pin_2))   // PB4#define LED1_ON()  GPIO_SetBits(GPIOA,GPIO_Pin_1) // PB5
#define LED1_OFF()  GPIO_ResetBits(GPIOA,GPIO_Pin_1)    // PB5
#define LED1_TOGGLE()  (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1))?(GPIO_ResetBits(GPIOA,GPIO_Pin_1)):(GPIO_SetBits(GPIOA,GPIO_Pin_1))   // PB5#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)
#define KEY2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)void LED_Init(void);void Tim1_UPCount_init(u16 Prescaler, u16 Period);extern u32 SystemCoreClock;unsigned int uiCnt = 0;
u8 timeflag = 0;
uint16_t time_cont;
char printBuf[100];uint16_t uart_cont = 0;
uint8_t  uart_timeout_cont = 0;#define UART_BUFF_LEN            200                                             //定义最大接收字节数 200
uint8_t uart_buf[UART_BUFF_LEN];//单位1ms
#define WIFI_MODEL_UPLOAD_TIME  100 //电后 100ms后上报
#define WIFI_INQUIRE_PEROID  100//数据查询周期,要一直获取
#define WIFI_DATA_UPLOAD_PEROID  1000//1秒上报一次数据
#define WIFI_CHECK_PEROID  1000//1秒检测一次wifi状态#define KEY_SHORT_PRESS_TIME  30 //短按30ms
#define KEY_LONG_PRESS_TIME  2000 //长按两秒#define MI_MODEL "model 这里填模块名字" //对应项目模块名字uint8_t net_conn_flag = 0;//是否联网成功
uint16_t wifi_inquire_cont = 0,wifi_model_upload_cont = 1,wifi_check_cont = 0,wifi_data_upload_cont;uint16_t key1_cont;
uint8_t  key1_state = 0;/********************************************************************************************************
**函数信息 TIM1_BRK_UP_TRG_COM_IRQHandler(void)
**功能描述 :等待定时器溢出,产生中断
**输入参数 :无
**输出参数 :无
********************************************************************************************************/
void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) {TIM_ClearITPendingBit(TIM1, TIM_IT_Update);time_cont ++ ;if(uart_timeout_cont)uart_timeout_cont++;//串口超时计数wifi_inquire_cont++;//wifi心跳wifi_check_cont ++; //检测网络状态wifi_data_upload_cont++;//数据上报key1_cont ++ ;//按键if(wifi_model_upload_cont)wifi_model_upload_cont++;//上电后多久上报一次model 只使用一次}
}
void Tim1_Int_Enable(void)
{NVIC_InitTypeDef NVIC_StructInit;//config Tim1 interruptNVIC_StructInit.NVIC_IRQChannel = TIM1_BRK_UP_TRG_COM_IRQn;NVIC_StructInit.NVIC_IRQChannelPriority = 1;NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_StructInit);TIM_ClearFlag(TIM1, TIM_FLAG_Update);TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
}/********************************************************************************************************
**函数信息 :void Tim1_UPCount_init(u16 Period,u16 Prescaler)
**功能描述 :配置定时器1向上计数模式
**输入参数 :Period 16位计数器重载值,Prescaler 时钟预分频值
**输出参数 :无
********************************************************************************************************/
void Tim1_UPCount_init(u16 Prescaler, u16 Period)
{TIM_TimeBaseInitTypeDef TIM_StructInit;/*使能TIM1时钟,默认时钟源为PCLK2(PCLK2未分频时不倍频,否则由PCLK2倍频输出),可选其它时钟源*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);TIM_TimeBaseStructInit(&TIM_StructInit);TIM_StructInit.TIM_Period = Period;                                         //ARR寄存器值TIM_StructInit.TIM_Prescaler = Prescaler;                                   //预分频值/*数字滤波器采样频率,不影响定时器时钟*/TIM_StructInit.TIM_ClockDivision = TIM_CKD_DIV1;                            //采样分频值TIM_StructInit.TIM_CounterMode = TIM_CounterMode_Up;                        //计数模式TIM_StructInit.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM1, &TIM_StructInit);TIM_ARRPreloadConfig(TIM1, ENABLE);Tim1_Int_Enable();TIM_Cmd(TIM1, ENABLE);
}/*******************************************************************************
* @name   : GPIO_Clock_Set
* @brief  : RCC clock set
* @param  : Portx , State
* @retval : void
*******************************************************************************/
void GPIO_Clock_Set(GPIO_TypeDef* GPIOx, FunctionalState NewState)
{if(GPIOx == GPIOA) {RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, NewState);                         //GPIO clock starts}if(GPIOx == GPIOB) {RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, NewState);                         //GPIO clock starts}if(GPIOx == GPIOC) {RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, NewState);                         //GPIO clock starts}if(GPIOx == GPIOD) {RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, NewState);                         //GPIO clock starts}
}
/********************************************************************************************************
**函数信息 :LED_Init(void)
**功能描述 :LED初始化
**输入参数 :无
**输出参数 :无
********************************************************************************************************/
void LED_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;GPIO_Clock_Set(GPIOA, ENABLE);  //开启GPIOA时钟//  GPIO_Clock_Set(GPIOB, ENABLE);  //开启GPIOB时钟GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_1|GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);LED1_ON();LED2_OFF();
}void KEY_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;GPIO_Clock_Set(GPIOA, ENABLE);  //开启GPIOA时钟//  GPIO_Clock_Set(GPIOB, ENABLE);  //开启GPIOB时钟GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_4|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉GPIO_Init(GPIOA, &GPIO_InitStructure);
}/********************************************************************************************************
**函数信息 :void uart_nvic_init(u32 bound)
**功能描述 :UART端口、中断初始化
**输入参数 :bound
**输出参数 :
**    备注 :
********************************************************************************************************/
void uart_nvic_init(u32 bound)
{//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;UART_InitTypeDef UART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE);                       //使能UART1RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);                         //开启GPIOA时钟//UART1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPriority = 3;                             //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //IRQ通道使能NVIC_Init(&NVIC_InitStructure);                                             //根据指定的参数初始化VIC寄存器//UART 初始化设置GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);UART_InitStructure.UART_BaudRate = bound;                                   //串口波特率UART_InitStructure.UART_WordLength = UART_WordLength_8b;                    //字长为8位数据格式UART_InitStructure.UART_StopBits = UART_StopBits_1;                         //一个停止位UART_InitStructure.UART_Parity = UART_Parity_No;                            //无奇偶校验位UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;//无硬件数据流控制UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;                    //收发模式UART_Init(UART1, &UART_InitStructure);                                      //初始化串口1UART_ITConfig(UART1, UART_IT_RXIEN, ENABLE);                                //开启串口接受中断UART_Cmd(UART1, ENABLE);                                                    //使能串口1//UART1_TX   GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                   //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                             //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);                                      //初始化GPIOA.9//UART1_RX   GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                                  //PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                       //浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);                                      //初始化GPIOA.10}/********************************************************************************************************
**函数信息 :void UART1_IRQHandler(void)
**功能描述 :串口1中断服务程序
**输入参数 :
**输出参数 :
**    备注 :
********************************************************************************************************/
void UART1_IRQHandler(void)
{u8 Res;if(UART_GetITStatus(UART1, UART_IT_RXIEN)  != RESET) {                      //接收中断(接收到的数据必须是0x0d 0x0a结尾)UART_ClearITPendingBit(UART1, UART_IT_RXIEN);Res = UART_ReceiveData(UART1);                                          //读取接收到的数据if(uart_cont < UART_BUFF_LEN)uart_buf[uart_cont++] = Res;uart_timeout_cont = 1;}
}/********************************************************************************************************
**函数信息 :void UartSendByte(u8 dat)
**功能描述 :UART发送数据
**输入参数 :dat
**输出参数 :
**    备注 :
********************************************************************************************************/
void UartSendByte(u8 dat)
{UART_SendData(UART1, dat);while(!UART_GetFlagStatus(UART1, UART_FLAG_TXEPT));
}/********************************************************************************************************
**函数信息 :void UartSendGroup(u8* buf,u16 len)
**功能描述 :UART发送数据
**输入参数 :buf,len
**输出参数 :
**    备注 :
********************************************************************************************************/
void UartSendGroup(u8* buf, u16 len)
{while(len--)UartSendByte(*buf++);
}/*
上报model ,每次上电先传过去
*/
void mi_model_upload()
{uint8_t data[50];sprintf((char *)data,"model %s\n",MI_MODEL);UartSendGroup(data,strlen((char *)data));
}/*
数据上报
输入为2个ID和数据,注意ID和C都实用ascii码数字 例如 '1' '2',注意总长度别超过256,这里暂时没限制
*/
void mi_data_upload(uint8_t eid,uint8_t pid , uint8_t *value)
{uint8_t data[256];sprintf((char *)data,"properties_changed %c %c %s\r",eid,pid,value);UartSendGroup(data,strlen((char *)data));
}/* 周期性获取数据,类似于心跳必须发 建议 100ms */
void mi_inquire()
{UartSendGroup((uint8_t *)"get_down\r",strlen((char *)"get_down\r"));
}/* 每1秒查询一次网络状态具体可以自己来*/
void mi_net()
{UartSendGroup((uint8_t *)"net\r",strlen((char *)"nte\r"));
}/* 重置WIFI  */
void mi_restore()
{UartSendGroup((uint8_t *)"restore\r",strlen((char *)"restore\r"));
}
/*
解析串口数据
*/
void mi_data_prase(uint8_t *data)
{if(strstr((char *)data,"get_properties"))//平台获取数据 注意这个函数只支持 1-9 的eid和 1-9的pid 因为只是简单实用位置去操作{//down get_properties 1 2//p+20 = eid//p+22 = piduint8_t eid,pid;//piduint8_t res_data[50],res_value[30];//回复的串口数据memset(res_data,0,sizeof(res_data));//回复的属性数据memset(res_value,0,sizeof(res_value));memcpy(res_value,"1",1);//随便先填一个数据上去eid = data[20];pid = data[22];//针对不同的pid 需要发送特定的数据回去 如果是bool类型需要传 true等等switch(eid)//先判断eid{case '2':{if(pid == '1'){//针对不同的pid 需要发送特定的数据回去 如果是bool类型需要传 true等等strcpy((char *)res_value,"1");}else if(pid == '6')//2 - 6 {strcpy((char *)res_value,"55");}}break;case '5':{if(pid == '5'){//针对不同的pid 需要发送特定的数据回去 如果是bool类型需要传 true等等strcpy((char *)res_value,"1300");}}break;default:{}break;}sprintf((char *)res_data,"result %s 0 %s\r",data+20,res_value);UartSendGroup(res_data,strlen((char *)res_data));//回复OK//result 5 3 0 }else if(strstr((char *)data,"set_properties"))//平台设置数据{uint8_t eid,pid;uint8_t res_data[50];//回复的数据char *p;eid = data[20];pid = data[22];switch(eid)//先判断eid{case '2':{if(pid == '1'){//数据位于 data[24] 一直到结尾}else if(pid == '2'){}}break;default:{}break;}p = strchr(data+22,' ');//找到第二个iid后面的空格*p = 0;//空格给 0sprintf((char *)res_data,"result %s 0\r",data+20);UartSendGroup(res_data,strlen((char *)res_data));//回复OK}//offline-连接中(或掉线);//local-连上路由器但未连上小米云服务器;//updating-固件升级中、uap模式等待连接、unprov-关闭wifi(半小时未快连)。else if( 0 == strcmp((char *)data,"offline"))//离线状态{net_conn_flag = 0;}else if(0 == strcmp((char *)data,"uap"))//配网状态{net_conn_flag = 1;}else if(0 == strcmp((char *)data,"local"))//连接wifi成功,正在连平台{net_conn_flag = 2;}else if(0 == strcmp((char *)data,"cloud"))//检测WIFI状态{net_conn_flag = 3;}
}/********************************************************************************************************
**函数信息 :main(void)
**功能描述 :
**输入参数 :无
**输出参数 :无
********************************************************************************************************/
int main(void)
{uint8_t upload_data[50];LED_Init();uart_nvic_init(115200);//串口115200 带中断    Tim1_UPCount_init(SystemCoreClock / 10000 - 1, 10);//1mswhile(1) {/* LED处理 判断网络状态 */switch(net_conn_flag){case 0:{LED2_OFF();}break;case 1:{if(time_cont >= 1000) {LED2_TOGGLE();time_cont = 0;}}break;case 2:{if(time_cont >= 200) {LED2_TOGGLE();time_cont = 0;}}break;case 3:{LED2_ON(); }break;default:{}break;}/* 按键处理 */switch(key1_state){case 0:{if(!KEY1){if(key1_cont >= KEY_LONG_PRESS_TIME){mi_restore();key1_cont = 0;key1_state = 1;}}else {key1_cont = 0;}}break;case 1://等待松手{if(KEY1) key1_state = 0;}break;default:break;}/* 串口处理 */if(uart_timeout_cont >= 3)//串口数据30ms超时{uart_buf[uart_cont-1] = 0;//直接将 \r先干掉//  uart_buf[uart_cont] = 0;mi_data_prase(uart_buf);///>处理收到的wifi数据uart_cont = 0;uart_timeout_cont = 0;}/*wifi处理*/if(wifi_model_upload_cont > WIFI_MODEL_UPLOAD_TIME)//上报一次的model,上电后只执行一次{mi_model_upload();wifi_model_upload_cont = 0;}if(wifi_inquire_cont >= WIFI_INQUIRE_PEROID)//数据处理周期 {mi_inquire();wifi_inquire_cont = 0;}if(wifi_check_cont >= WIFI_CHECK_PEROID)//检测WIFI状态{wifi_check_cont = 0;mi_net();}if(wifi_data_upload_cont >= WIFI_DATA_UPLOAD_PEROID){wifi_data_upload_cont = 0;/* 数据上传测试uiCnt++;memset(upload_data,0,sizeof(upload_data));sprintf(upload_data,"%d",uiCnt);mi_data_upload('5','7',upload_data);*/}}
}
int fputc(int ch, FILE* stream)
{//USART_SendData(USART1, (unsigned char) ch);//while (!(USART1->SR & USART_FLAG_TXE));UART_SendData(UART1, ch);while(!UART_GetFlagStatus(UART1, UART_FLAG_TXEPT));return ch;
}/**
* @}
*//**
* @}
*//**
* @}
*//*-------------------------(C) COPYRIGHT 2019 MindMotion ----------------------*/

接入米家(通过米家购买的WIFI模组 串口方式)相关推荐

  1. 雷军宣布小米IoT全面升级:WiFi模组降到9.9 接入宜家灯泡 推门锁新品

    关注网易智能,聚焦AI大事件,读懂下一个大时代! 文/丁广胜 [网易智能讯 11月28日消息]11月28日-29日,2018小米AIoT第二届开发者大会在北京召开,大会以"万物智慧互联新时代 ...

  2. 全球80家无线通信模组企业汇总及介绍

    通信模组是将芯片.存储器.功放器件等集合在一块线路板上,并提供标准接口的功能模组.通信模组包括蜂窝通信模组(2/3/4/5G/NB-IoT等)和非蜂窝类通信模组(WiFi.蓝牙.LoRa等).每一个联 ...

  3. NB模组(BC28/NB86-G)使用域名接入华为云方法

    现象 截止目前(2020-05-21),移远NB模组BC28在使用域名的情况下无法接入华为云平台,利尔达的NB模组NB86-G使用域名接入未测试. 方法 通过AT指令进行域名解析,得到IP后使用IP接 ...

  4. 安信可EC系列模组接入OneNET物联网开放平台的多协议接入产品

    目录 前言 一.OneNET的多协议接入的创建 1. 进入到OneNET的首页:OneNET - 中国移动物联网开放平台,并进入到控制台: 2. 切换到旧版控制台:OneNET - 物联网控制台旧版 ...

  5. 中移ML302模组通过MQTT协议接入oneNT平台

    @中移ML302模组通过MQTT协议接入oneNT平台 ML302 是中国移动最新推出的 LTE Cat.1 模块. 丰富的 Internet 协议.行业标准接口和功能,支持 Windows.Linu ...

  6. 移远 EC200x/EC600x/EG912Y 4G 系列模组 AT 命令 MQTT 接入 ThingsCloud 云平台

    移远 4G 系列模组 AT 命令 MQTT 接入 移远 4G 系列模组的 AT 命令支持 MQTT,请参考以下步骤,只需几分钟就可以接入云平台并上报数据,还可以从云平台下发命令实现远程实时控制. 如果 ...

  7. 2022极米投影和米家投影哪个好 家用智能投影仪对比

    对于极米投影和米家投影,很多想要购买投影仪的新手可能会以为是一家,但其实不是,两家区别还挺大.那么对于新手来说,应该怎么来挑选投影仪呢?除了极米和小米还有哪些品牌可以选择呢?接下来就以极米投影和米家投 ...

  8. 开机 米兔积木机器人_小米之家携手米兔积木机器人 开展编程表演赛

    2018-06-01/12:12 二零一八年六一儿童节来临之际,小米公司为打造"新零售"产业格局,为孩子及家长准备了一场别开生面的儿童主题活动.小米之家线下店携米兔积木机器人等多家 ...

  9. 米家小白增强固件_中考体育:男1000米/女800米想拿满分,掌握呼吸法是关键

    更多精彩,请点击上方蓝字关注我们! 对参加初三体育测试的考生而言,耐久跑是必测项目,也是最难的一项.男生1000米跑和女生800米跑是考查考生心肺机能的项目,无论是运动员还是初练者,只要根据自己的耐力 ...

最新文章

  1. 机器学习算法进阶——决策树和随机森林
  2. Spring整合ActiveMQ接收消息
  3. 在HTML中小心使用空格和回车
  4. android 解决password过时
  5. 2009年9月等考试题及答案51CTO站第一时间发布
  6. 空调吸气和排气_吸气剂和二传手被认为有害
  7. mac配置环境变量不生效
  8. Postman中json内字符串转义问题
  9. L1-039 古风排版 (20 分)—团体程序设计天梯赛
  10. 分享5款好用到爆的软件,很多懂电脑的人都在用
  11. linux 445端口关闭,windows关闭445端口
  12. 电源硬件设计----开关电源布局设计要领
  13. 小程序进阶-用户消息通知
  14. 前端——用div画菜鸟网站首页导航条“小三角”
  15. BIM模型文件下载——三层江湖别墅
  16. m基于QPSK调制解调的无线图像传输matlab仿真,包括扩频解扩均衡等模块
  17. [转载]Linux SWAP 交换分区配置说明
  18. 对互联网行业的认知!
  19. 【Tool】项目管理:工作组规划器 Microsoft Project
  20. 一键生成所有接口的文档 Swagger + springBoot

热门文章

  1. DHT11温湿度传感器初识
  2. 开启泛在物联时代:LPWAN2.0智慧物联专委会正式成立
  3. 体质极差的人如何从头开始恢复身体素质?
  4. 《自动控制原理与设计(第5版)》读书笔记
  5. 传感器尺寸、像素、DPI分辨率、英寸、毫米的关系
  6. 关于微信小程序,云开发中云函数超时定义
  7. androidAsync fridaManager 实现某宝 sgmain 70102 rpc 远程调用
  8. 2011年上半年总结-虚惊
  9. java excel导出 jxl_Java中用JXL导出Excel代码详解
  10. Windows DIB文件操作详解-4.使用DIB Section