STM32通过ESP8266利用机智云平台实现手机远程操作

2023-11-16

STM32通过ESP8266利用机智云平台实现手机远程操作

将STM32作为主控芯片,ESP8266作为外设,利用串口传递信息,通过机智云平台实现STM32与手机之间的数据传输!之所以选择机智云平台,是因为机智云平台相关配套的软件工具非常齐全,而且和正点合作,按照原子哥的精神推出有详细的基于STM32的教程,非常适合对云服务的认知处于一脸懵的人对其进行初步的探索。
其实原子哥的东西很详细,但是总得自己亲身经历一番,才知道这条路上有哪些自己没有注意的坑,同一个地方摔倒一次就好!正点原子以及其他开发板资料下载链接:开发板资料下载链接
准备工作:
(1)STM32板子和ESP8266模块必不可少,下载机智云的DEMO APP,链接:机智云DEMO APP
(2)ESP8266的固件,链接:GAgent for ESP8266 04020034
(3)串口调试工具,链接:机智云串口调试助手 for win7\win8\win10 v2.3.5
(4)使用MCU代码自动生成工具,自动生成MCU代码,使用方法链接:MCU代码生成工具介绍
(5)这个链接包含乐鑫官方烧录工具,机智云串口调试工具,ESP8266固件,以及原子哥详细的机智云教程的PDF资料;提取码为:txs8:工具
步骤有四:
(1)注册机智云,创建新产品,使用MCU代码生成工具自动生成代码;
(2)刷ESP8266固件,并在机智云的串口助手上进行调试;
(3)将生成的代码移植到自己的工程;
(4)联网,调试;

1、创建产品,生成代码

1.1 创建产品简介

创建产品的过程中要弄明白几个关键要素之间的关系,Product Key,Product Secret,以及数据点所包含的内容!
首先Product Key和Product Secret可以理解为你所创建产品的登录账号和密码,后面自动生成的代码会把这个写进协议里面,这样的话后期把程序烧录进MCU入网之后,手机会通过这个获取你所创建的产品信息!
接下来以最简单的控制LED为例!
比如:实现的目标既可以在MCU开发板控制三个LED的亮灭,又可以在手机上控制,而且在开发板上控制时手机上可以显示当前LED的亮灭状态!那么你可以创建一个产品,然后产品里面有三个数据点!这三个数据点就是指这三个LED!然后三个LED中每一个又包含“亮”“灭”两种状态!
这里的产品就像是用MDK写STM32点亮发光二极管的时候要建立的工程类似!然后因为三个LED有且只有两种状态所以我们设置的数据包类型为布尔值!然后我们希望手机端和开发板上都可以控制所以数据读写类型设置为可写!
关于数据类型和读写类型解释如下图: 数据类型
读写类型
关于数据点的其他介绍可以点如下链接:数据点概述
创建后的产品界面和数据点界面如下图:产品
数据点

1.2 MCU代码自动生成服务简介

可以根据自己使用的开发板的不同生成对应的代码,在此生成的是通用版,生成流程如下图:
代码生成流程
生成的两个文件回头要移到自己创建的工程中,不需要理解具体的代码流程,只要知道4个特定的API函数,将他们像STM32封装好的库函数一样调用即可!简单介绍一下这四个函数的功能,具体的内容修改会在下文说明,详细的介绍点如下链接:移植说明
在这里插入图片描述
(1)void gizwitsInit (void):相关协议的初始化函数;
(2)void gizwitsSetMode (uint8_t mode):配置入网方式函数;
(3) void gizwitsHandle(dataPoint_t *dataPoint):对当前数据点的内容进行处理和上传;
(4)int8_t gizwitsEventProcess(eventInfo_t info, uint8_t data, uint32_t len):事件处理函数,类似于MCU的中断函数,发生了什么事件,对应的处理相应的内容
这部分其实就是一个准备工作,以及建立对机智云的大致的了解,了解了这四个函数的大概描述建立一个概念就行,详细的代码移植会在后面说明!

2、刷ESP8266固件,并进行调试

必须调试!必须调试!必须调试!重要的事情说三遍!因为烧录软件即使提示刷固件成功了,但是不清楚其他的硬件有没有问题,或者刷的固件对不对!这样刷了固件之后盲目的和单片机进行连接,后面无法通信的话就不清楚到底是程序的问题,还是硬件的问题又或者是ESP8266以及其固件的问题了!如下图原子哥的刷固件教程很详细!刷固件
我刷的固件是从机智云的官网上下载的最新固件,下载完成之后打开之前准备的串口调试助手!
机智云的串口调试助手有三大主要功能,分别对应不同的场景;以及附带的小工具
(1)串口调试助手模拟MCU:
使用场景:目前手上没有MCU或者MCU程序正在开发又或者验证ESP8266功能是否正常
(2)串口调试助手模拟WIFI模块:
使用场景:目前手上没有WIFI模块,或者调试MCU程序是否正常
(3)双串口通信:
使用场景:MCU程序正常,ESP8266功能正常,但是连接之后无法正常工作,所以用它抓取MCU和ESP8266之间的命令,帮助检查漏洞
(4)小工具:校验与计算;生成二维码;生成Signature
在这里我只使用了第一个功能,因为主要是为了熟悉通过ESP8266上云的流程,初步实现点亮LED就好了,所以代码比较简单,中间没出什么岔子,所以其他的功能没用到!
言归正传:如下图,选择模拟V4MCU,当输入Product key和Product secret之后打开串口,若8266功能正常则会在打印区域打印设备信息!设备信息
然后可以通过手机端的DEMO APP发送控制命令,在串口调试助手右边的区域会同步显示自己所建产品数据点的状态!下图1
同样改变串口调试助手上数据点的状态也可以同步到APP端,不过在改变状态之后要记得点上报数据!下图2手机发送
在这里插入图片描述

3、代码移植

如下图,原子哥的教程中将移植过程分成这样的八条,接下来将详细解释
原子哥说明
我们能够想到,若想建立手机端和设备端都可以控制且实现实时通信!以点亮一个LED为例,那么整个流程应该是这样的:
(1)ESP8266要能够正常的收发数据:因为ESP8266是设备端和云端之间信息传递的桥梁;
(2)要入网:因为就算ESP8266正常,上不了网,就像咱们手机正常,没有流量打什么王者;
(3)信息的上下传递:我按下一个按键,LED亮了,我要把这个数据上传给云端,然后云端传给APP;同理,我在APP上更改了LED的状态,我要把这个命令通过云下发给MCU让他给LED一个电平!
(4)实现MS定时器:和云端,手机端进行通信,肯定得需要一个时间作为基准!协议层是建立在以MS为单位的时间基础上的,所以需要用其他不用的定时器建立一个精准的MS级的定时器,不然通信会出现紊乱
(5)日志打印,设备重启:倘若设备通过云端和手机之间的通信使用一段时间出现问题,那么我们就需要检查设备的运行日志帮助我们找到问题;而且如果更严重的话,需要控制MCU重启。
捋清楚了上面的几步,那么我们就可以挨个实现程序的移植了!

3.1:收发数据代码移植

在这里,我们是将ESP8266作为一个串口设备来用!所以要初始化相应的串口,然后在接收中断函数中将通过ESP8266接收到的数据转存起来;而且也要实现将需要发送的数据通过串口发送出去!
串口初始化函数:在这里我是将ESP8266和MCU的串口2连接的,所以初始化串口2

void usart2_init(void)
{
	GPIO_InitTypeDef PA2_3;
	USART_InitTypeDef usart2;
	NVIC_InitTypeDef NVIC_initstructrue;
	//使能串口和GPIO口时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	//初始化TX端口PA2,RX端口PA3
	PA2_3.GPIO_Pin=GPIO_Pin_2;
	PA2_3.GPIO_Mode=GPIO_Mode_AF_PP;
	PA2_3.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&PA2_3);
	PA2_3.GPIO_Pin=GPIO_Pin_3;
	PA2_3.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA,&PA2_3);
	//初始化USART2
	usart2.USART_BaudRate=9600;
	usart2.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
	usart2.USART_WordLength=USART_WordLength_8b;
	usart2.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	usart2.USART_Parity=USART_Parity_No;
	usart2.USART_StopBits=USART_StopBits_1;
	USART_Init(USART2,&usart2);
	USART_Cmd(USART2,ENABLE);
	USART_ClearFlag(USART2,USART_FLAG_TC);
	USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
	//初始化USART2中断
	NVIC_initstructrue.NVIC_IRQChannel=USART2_IRQn;
	NVIC_initstructrue.NVIC_IRQChannelPreemptionPriority=3;	
	NVIC_initstructrue.NVIC_IRQChannelSubPriority=4;
	NVIC_initstructrue.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_initstructrue);
	
}

串口接收中断函数:如下文,要注意最后一句【 gizPutData(&r, 1);】这句是将
接收到的数据存到缓冲区中!至于这个函数要执行什么,不必考虑,这是机智云代码生成工具自动生成的API,我们只要知道接受到了数据,然后调用这个函数存起来,就算接收成功!

void USART2_IRQHandler(void)
{
	u8 r;
	if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
	{
		
		r=USART_ReceiveData(USART2);
		gizPutData(&r, 1);
		
	}
	
}

串口发送函数:我们知道串口发送的时候其实只要执行usart_senddata然后在while循环里等待发送完成就可以了,但是针对不同的人的不同产品,平台不同,而且就算MCU都一样,ESP8266接的端口可能也不同!所以机智云的协议层在需要发送数据的时候都是调用一个发送函数 uartWrite() 所以我们只要根据自己的设备和端口将数据发送函数写在 uartWrite() 这个函数里面就可以了!如下文编码的第二个 for循环语句,至于为什么要发送0X55,我也不清楚,有知道的麻烦留言告诉我,不胜感激!

int32_t uartWrite(uint8_t *buf, uint32_t len)
{
    uint32_t i = 0;
    
    if(NULL == buf)
    {
        return -1;
    }
    
    #ifdef PROTOCOL_DEBUG
    GIZWITS_LOG("MCU2WiFi[%4d:%4d]: ", gizGetTimerCount(), len);
    for(i=0; i<len; i++)
    {
        GIZWITS_LOG("%02x ", buf[i]);
    }
    GIZWITS_LOG("\n");
    #endif

    for(i=0; i<len; i++)
    {
        USART_SendData(USART2, buf[i]);//STM32 test demo
	   while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
        if(i >=2 && buf[i] == 0xFF)
        {
					USART_SendData(USART2,0X55);
					while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
         }
    }


    
    return len;
}

至此,串口收发数据的代码移植完成

3.2: 实现入网

配置入网也就是MCU给WIFI模组发送不同的命令以实现不同的功能!只是在这里我们使用它的入网功能而已!这个命令的发送是通过调用 gizwitsSetMode() 这个API函数来实现的,如下图!
setmode
这个是自动生成的代码,而我们要做的是在什么情况下,调用这个函数来配置WIFI模组实现相应的功能!如下图
按键
这是一个按键扫描程序,只要我们按下不同的按键就可以调用 gizwitsSetMode() 函数配置WIFI模组实现不同的功能!

3.3:信息的上下传递

在移植这个之前我们要先了解自动生成的代码里面的一个结构体,如下图
数据点结构体
这个结构体里面的元素就是我们当时创建的产品里面的数据点,因为我当时只创建了一个数据点,所以这里只有一个元素!在这里生成的代码自动帮我们创建了一个全局变量,如下图!
全局变量
当我们在设备端实现LED的亮灭时,对应的就会改变这个变量的值,然后上传到云端发给APP!这个上报的过程要调用一个API函数 userHandle(); 同理,当我们在APP端改变这个值的时候也会相应的下发给MCU,然后MCU根据这个值进行相应的动作!数据的下发需要调用gizwitsEventProcess这个API函数!
我们只要对这两个API函数进行修改:
userHandle(); 中检测到LED灯状态改变就改变currentDataPoint,然后上报到云端;
gizwitsEventProcess中检测到currentDataPoint数值改变了就让MCU动作;
代码如下图:
数据上报:
数据上报
数据下发:
数据下发
至此,我们能够实现数据的上报和下发过程!

3.4:MS级定时器

实现MS级定时器,与实现串口接收一样,初始化的时候正常初始化,修改一下定时器中断函数就行了!在定时器中断函数中,触发了定时器中断的时候,调用一下 gizTimerMs(); API函数就行了,至于调用之后,协议怎么处理,我们不需要弄清楚!只要初始化的时候注意TIM_PeriodTIM_Prescaler将相应周期控制在MS级!

void time3init()
{
	TIM_TimeBaseInitTypeDef time3inittype;
	NVIC_InitTypeDef time3nvic;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	
	time3inittype.TIM_Period=9;
	time3inittype.TIM_Prescaler=7200-1;
	time3inittype.TIM_ClockDivision=TIM_CKD_DIV1;
	time3inittype.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM3,&time3inittype);
	
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 
	time3nvic.NVIC_IRQChannel=TIM3_IRQn;
	time3nvic.NVIC_IRQChannelPreemptionPriority=0;
	time3nvic.NVIC_IRQChannelSubPriority=3;
	time3nvic.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&time3nvic);
	
	TIM_Cmd(TIM3,ENABLE);
	
}

void TIM3_IRQHandler(void)   
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  ); 
		gizTimerMs();
	}
}

3.5:日志打印和设备重启

日志的打印和设备的重启其实很简单!日志打印用的就是我们经常用的Printf函数,只不过机智云的协议定义了一个变量名GIZWITS_LOG代替了Printf 函数,如下图!所以他们协议调用的是GIZWITS_LOG,但是我们只要实现printf的重定向就好了!这个重定向代码网上很多,就不在赘述!
printf
接下来是设备重启,MCU的重启有专门的代码,我们只要复制到mcuRestart函数里面,让机智云的协议能够调用就可以了!如下图
MCURESTART

4、联网测试

通过以上的步骤,基本上协议就移植成功了!然后手机端就可以控制开发板上LED灯的状态了,同时,在开发板上控制LED灯的状态也可以同步到手机端显示!如下图,点击LED测试后面的箭头会进入子页面,然后改变SWITCH的值,就可以控制LED灯了,而且在开发板上通过按键改变LED灯的状态,这里也会显示!而且在机智云的开发者中心也可以看到自己创建的产品的设备在线情况!!!至此,移植完毕!
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32通过ESP8266利用机智云平台实现手机远程操作 的相关文章

  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • ESP8266 烧录 (关于BearPi扩展Wifi模块的烧录方式)

    简介 ESP 12F 模块是BearPI IOT购买的一个套餐所带的扩展模块 用来接通网络 但是默认电路不支持重新烧录 下面就是可支持重新烧录的方式 ESP 12F 电路原理图 如上图 GPIO15 gt GND gt 高电平 GPIO2
  • ESP8266 在简单的 http 请求后崩溃

    我正在使用 NodeMCU V3 模块 每当我尝试向服务器发出 http 请求时 模块就会崩溃 这是代码 void setup WiFi begin wifi name wifi password while WiFi status WL
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • Sntp.sync() 忽略服务器

    我一直在尝试与 ntp 服务器同步时间 但是 nodemcu 似乎忽略了服务器参数 sync lua sntp sync fr pool ntp org function tm rtctime epoch2cal rtctime get p
  • KAA 0.10.0 中使用 ESP8266 SDK 编译错误

    我根据以下内容构建了ESP8266 SDK这个文件 https kaaproject github io kaa docs v0 10 0 Programming guide Using Kaa endpoint SDKs C SDK ES
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • 环形缓冲区(1)

    声明 参考韦东山视频教程 如若侵权请告知 马上删帖致歉 个人总结 如有不对 欢迎指正 环形缓冲区 环形缓冲区的几个基本操作 申请内存空间 写操作 读操作 环形缓冲区小结 判断缓冲区是否为空 判断缓冲区是否写满 构建环形缓冲区 在 h文件中声
  • 【Augmentation Zoo】RetinaNet + VOC + KITTI的数据预处理-pytorch版

    整合前段时间看的数据增强方法 并测试其在VOC和KITTI数据上的效果 我的工作是完成了对VOC和KITTI数据的预处理 RetinaNet的模型代码来自pytorch retinanet 该项目github仓库在 https github
  • 中标麒麟+达梦数据库 无效的列名[AAAAAAAAAAAAAFS]

    目录 前言 解决办法 中标麒麟 解决办法 windows 前言 今天我将项目部署到中标麒麟服务器 发现原本好使的功能 只要一做添加操作就报如下错误 虽然报错 但数据还是添加了进去 这让我十分费解 解决办法 中标麒麟 问题出现在返回新增结果时
  • Next.js中使用antd修改其组件的默认样式

    在项目中使用了next js搭配了antd 其中需要自定义antd样式 在next js中如果想定义css 我用到的有两种方式 一种是直接使用行内式 div test div 另一种就是写一个css文件后引入 定义一个test module
  • SpringBoot(5)-SpringBoot整合其他项目

    SpringBoot 5 SpringBoot整合其他项目 1 整合Druid数据库连接池 1 1学习地址 1 2application yml 1 3访问一下 1 4随便执行一下新增 2 整合Redis 2 1添加redis pom依赖
  • mimikatz

    https blog gentilkiwi com mimikatz https github com ParrotSec mimikatz
  • C++day1(笔记整理)

    一 Xmind整理 二 上课笔记整理 1 第一个c 程序 hello world include
  • docker 四种网络模型

    一 docker网络基础知识 Docker在创建容器时有四种网络模式 bridge为默认不需要用 net去指定 其他三种模式需要在创建容器时使用 net去指定 bridge模式 使用 net bridge指定 默认设置 none模式 使用
  • java各类型String,int,char,long,StringBuilder,StringBuffer,Integer之间的转换总结

    String和char类型之间的转换 1 String char 因为String是字符串 而char是单个字符 只能把String 转化为char数组 方法为 char ch str toCharArray 2 char String 方
  • cmake命令之target_include_directories

    一 介绍 命令格式 target include directories
  • 完整的芯片反向设计流程原来是这样的!(实例讲解)

    完整的芯片反向设计流程原来是这样的 实例讲解 作者 时间 2018 02 23来源 网络收藏 现代IC产业的市场竞争十分激烈 所有产品都是日新月异 使得各IC设计公司必须不断研发新产品 维持自身企业的竞争力 IC设计公司常常要根据市场需求进
  • 在JavaScript的ES5版本中Array数组的reduce方法详解

    函数声明 reduce callback initialValue 参数说明 callback 回调函数 格式为function prev next initialValue 初始值 可选参数 返回值 最后一次执行callback 回调函数
  • SOME/IP

    SOME IP 名词解释 SOME IP 全称是 Scalable service Oriented MiddlewarE over IP 也就是基于 IP 协议的面向服务的可扩展性通信中间件协议 面向服务 SOA 基于 IP 协议之上的通
  • springcloud动态加载日志路径和log.path_IS_UNDEFINED目录问题

    多模块工程中通常需要将不同模块服务的日志输出到指定的目录 日志目录结构如下 logs app1 app2 基于上述需要 需要在logback spring xml中动态读取application yml 或者application prop
  • 简单的tcpdump抓包使用总结:抓取指定ip、指定网卡、指定端口的包

    1 今天由于需要抓包研究网络问题 所以研究了一下抓取指定ip 指定网卡 指定端口的包并且输入到文件中 2 tcpdump与Wireshark介绍 在网络问题的调试中 tcpdump应该说是一个必不可少的工具 和大部分linux下优秀工具一样
  • ES使用小结

    ES使用总结 1 查询es全部索 2 根据es索引查询文档 3 查看指定索引mapping文件 4 默认查询总数10000条 5 删除指定索引文档 6 删除所有数据包括索引 7 設置窗口值 8 logstash简单配置 Logstash配置
  • 高德地图Amap常用功能总结

    设置缩放比例 1 设置缩放比例的api是 aMap moveCamera CameraUpdateFactory zoomTo 18 如果你直接设置是没用的 因为此时地图还没加载成功 所以要监听地图加载成功的事件 aMap setOnMap
  • MATLAB中均值、方差、均方差的计算方法

    1 均值 数学定义 Matlab函数 mean gt gt X 1 2 3 gt gt mean X 2 如果X是一个矩阵 则其均值是一个向量组 mean X 1 为列向量的均值 mean X 2 为行向量的均值 gt gt X 1 2 3
  • sql查询按两个字段查询重复记录

    1 sql查询按两个字段查询重复记录 代码如下 示例 select from 表名 a where a 字段1 in select 字段1 from 表名 group by 字段1 字段2 having count gt 1 and a 字
  • STM32通过ESP8266利用机智云平台实现手机远程操作

    STM32通过ESP8266利用机智云平台实现手机远程操作 将STM32作为主控芯片 ESP8266作为外设 利用串口传递信息 通过机智云平台实现STM32与手机之间的数据传输 之所以选择机智云平台 是因为机智云平台相关配套的软件工具非常齐