笔记wife_assistant

一、wifi_spi_init

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     WiFi 模块初始化
// 参数说明     *wifi_ssid      目标连接的 WiFi 的名称 字符串形式
// 参数说明     *pass_word      目标连接的 WiFi 的密码 字符串形式
// 返回参数     uint8           模块初始化状态 0-成功 1-错误
// 使用示例     wifi_spi_init("SEEKFREE", "SEEKFREE123");
// 备注信息     wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点
//-------------------------------------------------------------------------------------------------------------------
uint8 wifi_spi_init (char *wifi_ssid, char *pass_word)
{uint8 return_state = 0;fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE);spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化gpio_init(WIFI_SPI_CS_PIN,  GPO, 1, GPO_PUSH_PULL);gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL);gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN);// 复位gpio_set_level(WIFI_SPI_RST_PIN, 0);system_delay_ms(10);gpio_set_level(WIFI_SPI_RST_PIN, 1);// 等待模块初始化system_delay_ms(100);wifi_spi_mutex = WIFI_SPI_IDLE;do{// 固件版本信息以字符串形式保存在wifi_spi_version数组中return_state = wifi_spi_get_version();if(return_state){break;}// MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中wifi_spi_get_mac_addr();return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word);if(return_state){break;}#if(1 == WIFI_SPI_AUTO_CONNECT)return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT);if(return_state){break;}#endif#if(2 == WIFI_SPI_AUTO_CONNECT)return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT);if(return_state){break;}#endif}while(0);return return_state;
}

1、fifo_init

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     FIFO 初始化 挂载对应缓冲区
// 参数说明     *fifo               FIFO 对象指针
// 参数说明     type                FIFO 数据位数
// 参数说明     *buffer_addr        要挂载的缓冲区
// 参数说明     size                缓冲区大小
// 返回参数     fifo_state_enum     操作状态
// 使用示例     fifo_init(&user_fifo, user_buffer, 64);
// 备注信息     
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size)
{zf_assert(NULL != fifo);fifo_state_enum return_state = FIFO_SUCCESS;do{fifo->buffer    = buffer_addr;fifo->execution = FIFO_IDLE;fifo->type      = type;fifo->head      = 0;fifo->end       = 0;fifo->size      = size;fifo->max       = size;}while(0);return return_state;
}

①、fifo_state_enum

 C(和许多其他编程语言)中的枚举用于定义一组命名整数常量。枚举中的每个常量都表示一个不同的值。

typedef enum
{FIFO_SUCCESS,                                                               // FIFO 操作成功FIFO_RESET_UNDO,                                                            // FIFO 重置操作未执行FIFO_CLEAR_UNDO,                                                            // FIFO 清空操作未执行FIFO_BUFFER_NULL,                                                           // FIFO 用户缓冲区异常FIFO_WRITE_UNDO,                                                            // FIFO 写入操作未执行FIFO_SPACE_NO_ENOUGH,                                                       // FIFO 写入操作 缓冲区空间不足FIFO_READ_UNDO,                                                             // FIFO 读取操作未执行FIFO_DATA_NO_ENOUGH,                                                        // FIFO 读取操作 数据长度不足
}fifo_state_enum;  

此枚举用于为涉及 FIFO(先进先出)数据结构的操作提供清晰且有意义的状态代码。fifo_state_enum 通过用作fifo_init等函数的返回类型,这些函数的调用者可以根据返回的枚举值轻松了解操作的结果。枚举中的每个常量都对应于与 FIFO 操作相关的特定状态或条件。

②、zf_assert(NULL != fifo);

该行是一个宏,通常用于嵌入式系统或其他资源受限环境中的错误检查和调试目的。

fifo在继续进行FIFO初始化过程之前,此特定行可确保指针不是NULL(即,fifo它指向有效的内存位置)。如果确实是 NULL,则会触发断言失败,表示编程错误或意外情况。

断言通常用于开发和调试期间,以在程序执行的早期捕获逻辑错误或无效状态。在生产环境中部署软件后,通常会禁用断言检查以提高性能并减少内存占用。

③、do{}while(0)构造

2、spi_init

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     SPI 接口初始化
// 参数说明     spi_n           SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
// 参数说明     mode            SPI 模式 参照 zf_driver_spi.h 内 spi_mode_enum 枚举体定义
// 参数说明     baud            设置 SPI 的波特率 不超过系统时钟的一半 部分速率会被适配成相近的速率
// 参数说明     sck_pin         选择 SCK 引脚 参照 zf_driver_spi.h 内 spi_sck_pin_enum 枚举体定义
// 参数说明     mosi_pin        选择 MOSI 引脚 参照 zf_driver_spi.h 内 spi_mosi_pin_enum 枚举体定义
// 参数说明     miso_pin        选择 MISO 引脚 参照 zf_driver_spi.h 内 spi_miso_pin_enum 枚举体定义
// 参数说明     cs_pin          选择 CS 引脚 参照 zf_driver_spi.h 内 spi_cs_pin_enum 枚举体定义
// 返回参数     void
// 使用示例     spi_init(SPI_1, 0, 1*1000*1000, SPI1_SCK_D12, SPI1_MOSI_D14, SPI1_MISO_D15, SPI1_CS0_D13);
// 备注信息     
//-------------------------------------------------------------------------------------------------------------------
void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin)
{zf_assert(spi_n == (sck_pin / 16));                                         // sck_pin  与 spi_n 匹配zf_assert(spi_n == (mosi_pin / 16));                                        // mosi_pin 与 spi_n 匹配zf_assert(spi_n == (miso_pin / 16) || (miso_pin == SPI_MISO_NULL));         // miso_pin 与 spi_n 匹配zf_assert(spi_n == (cs_pin / 16) || (cs_pin == SPI_CS_NULL));               // cs_pin   与 spi_n 匹配if(SPI_CS_NULL == cs_pin){spi_cs_index[spi_n] = 0;}else{spi_cs_index[spi_n] = cs_pin;}lpspi_master_config_t masterConfig;uint32 src_clock;spi_iomuxc(spi_n, sck_pin, mosi_pin, miso_pin, cs_pin);CLOCK_SetMux(kCLOCK_LpspiMux, LPSPI_CLK_SRC);    //选择PLL2作为LPSPI时钟源CLOCK_SetDiv(kCLOCK_LpspiDiv, LPSPI_CLK_DIV);LPSPI_MasterGetDefaultConfig(&masterConfig);masterConfig.baudRate = baud;masterConfig.bitsPerFrame = 8;masterConfig.whichPcs = (lpspi_which_pcs_t)(cs_pin%14/2-3);switch(mode){case SPI_MODE0:{masterConfig.cpol = kLPSPI_ClockPolarityActiveHigh; masterConfig.cpha = kLPSPI_ClockPhaseFirstEdge; }break;case SPI_MODE1:{masterConfig.cpol = kLPSPI_ClockPolarityActiveHigh; masterConfig.cpha = kLPSPI_ClockPhaseSecondEdge; }break;case SPI_MODE2:{masterConfig.cpol = kLPSPI_ClockPolarityActiveLow; masterConfig.cpha = kLPSPI_ClockPhaseFirstEdge; }break;case SPI_MODE3:{masterConfig.cpol = kLPSPI_ClockPolarityActiveLow; masterConfig.cpha = kLPSPI_ClockPhaseSecondEdge; }break;}masterConfig.pcsToSckDelayInNanoSec = 1000000000 / masterConfig.baudRate;masterConfig.lastSckToPcsDelayInNanoSec = 1000000000 / masterConfig.baudRate;masterConfig.betweenTransferDelayInNanoSec = 1000000000 / masterConfig.baudRate;src_clock = (CLOCK_GetFreq(kCLOCK_SysPllClk) / (LPSPI_CLK_DIV + 1U));LPSPI_MasterInit(spi_index[spi_n], &masterConfig, src_clock);//第一次初始化便于打开时钟LPSPI_Reset(spi_index[spi_n]);                               //复位外设LPSPI_MasterInit(spi_index[spi_n], &masterConfig, src_clock);//重新初始化设置正确的参数LPSPI_Enable(spi_index[spi_n], false);spi_index[spi_n]->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK);LPSPI_Enable(spi_index[spi_n], true);LPSPI_FlushFifo(spi_index[spi_n], true, true);                       //刷新FIFOLPSPI_ClearStatusFlags(spi_index[spi_n], kLPSPI_AllStatusFlag);      //清除状态标志LPSPI_DisableInterrupts(spi_index[spi_n], kLPSPI_AllInterruptEnable);//关闭中断
}

3、wifi_spi_get_version

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     WIFI SPI 固件版本获取
// 参数说明     void            端口号
// 返回参数     uint8           状态 0-成功 1-错误
// 使用示例     
// 备注信息     调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中
//-------------------------------------------------------------------------------------------------------------------
static uint8 wifi_spi_get_version (void)
{uint8 return_state;wifi_spi_packets_struct temp_packets;return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT);if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)){memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length);}return return_state;
}

4、wifi_spi_get_mac_addr

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     WIFI SPI MAC地址获取
// 参数说明     void            端口号
// 返回参数     uint8           状态 0-成功 1-错误
// 使用示例     
// 备注信息     调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中
//-------------------------------------------------------------------------------------------------------------------
static uint8 wifi_spi_get_mac_addr (void)
{uint8 return_state;wifi_spi_packets_struct temp_packets;return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT);if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)){memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length);}return return_state;
}

5、wifi_spi_wifi_connect

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     WIFI SPI 设置连接的WiFi信息并尝试连接WiFi
// 参数说明     *wifi_ssid      WIFI名称
// 参数说明     *pass_word      WIFI密码
// 返回参数     uint8           状态 0-成功 1-错误
// 使用示例     wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123");
// 备注信息     wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点
//-------------------------------------------------------------------------------------------------------------------
uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word)
{uint8 return_state;uint8 temp_buffer[64];uint16 length;if(NULL != pass_word){// WIFI热点有密码发送热点名称与密码length = sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word);}else{// WIFI热点没有密码只需要发送热点名称length = sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid);}return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT);// 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中wifi_spi_get_ip_addr_port();return return_state;
}

二、wifi_spi_socket_connect 

// 函数简介     WIFI SPI 设置连接的Socket信息并尝试连接Socket
// 参数说明     *transport_type 传输类型
// 参数说明     *ip_addr        IP地址
// 参数说明     *port           目标端口号
// 参数说明     *local_port     本机端口号
// 返回参数     uint8           状态 0-成功 1-错误
// 使用示例     wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060");
// 备注信息     
//-------------------------------------------------------------------------------------------------------------------
uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port)
{uint8 return_state;uint8 temp_buffer[41];uint16 length;length = sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port);return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT);// 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中wifi_spi_get_ip_addr_port();return return_state;
}

三、mt9v03x_init()

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     MT9V03X 摄像头初始化
// 参数说明     void
// 返回参数     uint8           1-失败 0-成功
// 使用示例     zf_log(mt9v03x_init(), "mt9v03x init error");
// 备注信息     
//-------------------------------------------------------------------------------------------------------------------
uint8 mt9v03x_init (void)
{uint8 return_state = 0;soft_iic_info_struct mt9v03x_iic_struct;do{system_delay_ms(200);set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL);                        // 设置连接摄像头类型// 首先尝试SCCB通讯mt9v03x_type = MT9V03X_SCCB;soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA);if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)){// SCCB通讯失败,尝试串口通讯mt9v03x_type = MT9V03X_UART;camera_fifo_init();set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, &mt9v03x_uart_callback);  // 设置连接摄像头类型uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX);	//初始换串口 配置摄像头    uart_rx_interrupt(MT9V03X_COF_UART, 1);fifo_clear(&camera_receiver_fifo);mt9v03x_version = mt9v03x_get_version();                                // 获取配置的方式if(mt9v03x_set_config(mt9v03x_set_confing_buffer)){// 如果程序在输出了断言信息 并且提示出错位置在这里// 那么就是通信出错并超时退出了// 检查一下接线有没有问题 如果没问题可能就是坏了zf_log(0, "MT9V03X set config error.");set_camera_type(NO_CAMERE, NULL, NULL, NULL);return_state = 1;break;}// 获取配置便于查看配置是否正确if(mt9v03x_get_config(mt9v03x_get_confing_buffer)){// 如果程序在输出了断言信息 并且提示出错位置在这里// 那么就是串口通信出错并超时退出了// 检查一下接线有没有问题 如果没问题可能就是坏了zf_log(0, "MT9V03X get config error.");set_camera_type(NO_CAMERE, NULL, NULL, NULL);return_state = 1;break;}}csi_init(MT9V03X_W, MT9V03X_H, &csi_handle, mt9v03x_finished_callback, MT9V03X_VSYNC_PIN, MT9V03X_PCLK_PIN, CSI_PIXCLK_RISING);csi_add_empty_buffer(&csi_handle, mt9v03x_image1[0]);csi_add_empty_buffer(&csi_handle, mt9v03x_image2[0]);csi_start(&csi_handle);mt9v03x_image = mt9v03x_image1;// 设置初值interrupt_enable(CSI_IRQn);}while(0);return return_state;
}

四、 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI);

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     逐飞助手接口 初始化
// 参数说明
// 返回参数     void
// 使用示例     seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发
// 备注         需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化
//-------------------------------------------------------------------------------------------------------------------
ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device)
{switch(transfer_device){case SEEKFREE_ASSISTANT_DEBUG_UART:{seekfree_assistant_transfer_callback = debug_send_buffer;seekfree_assistant_receive_callback = debug_read_ring_buffer;}break;case SEEKFREE_ASSISTANT_WIRELESS_UART:{seekfree_assistant_transfer_callback = wireless_uart_send_buffer;seekfree_assistant_receive_callback = wireless_uart_read_buffer;}break;case SEEKFREE_ASSISTANT_CH9141:{seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer;seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer;}break;case SEEKFREE_ASSISTANT_WIFI_UART:{seekfree_assistant_transfer_callback = wifi_uart_send_buffer;seekfree_assistant_receive_callback = wifi_uart_read_buffer;}break;case SEEKFREE_ASSISTANT_WIFI_SPI:{seekfree_assistant_transfer_callback = wifi_spi_send_buffer;seekfree_assistant_receive_callback = wifi_spi_read_buffer;}break;case SEEKFREE_ASSISTANT_CUSTOM:{         // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发}break;}
}

五、seekfree_assistant_camera_information_config(SEEKFREE_ASSISTANT_MT9V03X, image_copy[0], MT9V03X_W, MT9V03X_H);

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     逐飞助手图像信息配置函数
// 参数说明     camera_type     图像类型
// 参数说明     image_addr      图像地址    如果传递NULL参数则表示只发送边线信息到上位机
// 参数说明     width           图像宽度
// 参数说明     height          图像高度
// 返回参数     void
// 使用示例                     seekfree_assistant_camera_information_config(SEEKFREE_ASSISTANT_MT9V03X, mt9v03x_image[0], MT9V03X_W, MT9V03X_H);
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height)
{seekfree_assistant_camera_dot_data.head       = SEEKFREE_ASSISTANT_SEND_HEAD;seekfree_assistant_camera_dot_data.function   = SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION;// 写入包长度信息seekfree_assistant_camera_dot_data.length     = sizeof(seekfree_assistant_camera_dot_struct);seekfree_assistant_camera_buffer.camera_type  = camera_type;seekfree_assistant_camera_buffer.image_addr   = image_addr;seekfree_assistant_camera_buffer.width        = width;seekfree_assistant_camera_buffer.height       = height;
}

六、seekfree_assistant_camera_send

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     逐飞助手发送摄像头图像
// 参数说明     void
// 返回参数     void
// 使用示例
// 备注信息     在调用图像发送函数之前,请务必调用一次seekfree_assistant_camera_config函数,将对应的参数设置好
//-------------------------------------------------------------------------------------------------------------------
void seekfree_assistant_camera_send (void)
{// 检查图像发送缓冲区是否准备就绪zf_assert(0 != seekfree_assistant_camera_buffer.camera_type);seekfree_assistant_camera_data_send(seekfree_assistant_camera_buffer.camera_type, seekfree_assistant_camera_buffer.image_addr, seekfree_assistant_camera_dot_data.dot_type & 0x0f, seekfree_assistant_camera_buffer.width, seekfree_assistant_camera_buffer.height);if(seekfree_assistant_camera_dot_data.dot_type & 0x0f){seekfree_assistant_camera_dot_send(&seekfree_assistant_camera_buffer);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 3.x + Swagger3 踩坑实录

问题描述 维护的SpringBoot版本是3.0版本,翻教程的时候发现很多SpringBoot2.x版本用的都是springfox,但问题是在SpringBoot3.x版本后,逐渐不支持springfox,强行启动会导致异常,现阶段使用的Springdoc进行替换。 参考…

Java多线程-API

常见API一览 Thread t1 new Thread(() -> {System.out.println("我是线程t1");System.out.println("Hello, World!"); }); t1.start(); // 获取线程名称 getName() // 线程名称默认是Thread-0, Thread-1, ... System.out.println(t1.getName());// 通过…

JVM类加载基本流程及双亲委派模型

1.JVM内存区域划分 一个运行起来的Java进程就是一个JVM虚拟机,这就需要从操作系统中申请一片内存区域。JVM申请到内存之后,会把这个内存划分为几个区域,每个区域都有各自的作用。 一般会把内存划分为四个区域:方法区(也称 "…

【网站项目】党员之家服务系统小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(二)、需求分析和系统设计

本次实验(一)见博客:【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(一)、实验指导书 说明:本次实验的代码使用verilog编写,文章中为阅读方便&#xff0c…

指针的使用以及运算、二级指针、造成野指针的原因以及解决方法、指针和数组相互使用

第七章,指针的学习 目录 前言 一、指针的概念 二、指针的类型 三、野指针 四、指针的运算 五、指针和数组的关系以及使用 六、指针数组 七、二级指针 总结 前言 这章主要学习的是指针方面的知识,这节只是简单了解一下指针,并不会深…

uniapp H5项目 获取接口的二进制流转化成图片url(base64)

如果你使用的是uniapp, 并且你从接口获取下来的数据长这样: 想要把取到的数据展示成图片,那么你可以这样做: // 这是我们的项目封装的请求方法const res await this.$api.getKaptcha({originResponse: true, // 这样写是为了在request那边特…

路由器热备份

HSRP HSRP(Hot Standby Routing Protocol)热备份路由选择协议 HSRP是思科私有的协议,HSRP起到一个双网关热备份的一个目的,不考虑线路问题针对设备而言,一个设备挂了还有另外一台设备,所以双网关也叫双机…

开发手札:Unity+NetMQ集成使用注意事项

netmq docs netmq算是一个轻量级消息库,最近两天用了一下,分享一下注意事项。 1.根据topic区分通信信道,因为二进制中字母大小写值并不相同,所以topic必须区分大小写。 2.Initial强制DotNet模式:Asy…

stl_set

文章目录 set1.关联式容器2.键值对3. set3.1 set介绍3.2 set的使用3.2.1 pair3.2.2 find3.2.3 lower_bound 3.3 multiset3.3.1 multiset的介绍3.3.2 multiset的使用3.3.3 find3.3.4 equal_range3.3.5 erase set 1.关联式容器 在初阶阶段,我们已经接触过STL中的部分…

嵌入式物联网实战开发笔记-乐鑫ESP32芯片功能对比以及功能选型【doc.yotill.com】

乐鑫ESP32入门到精通项目开发参考百例下载: 链接:https://pan.baidu.com/s/1ATvRnAZvxkev-PJfd3EAPg?pwd4e33 提取码:4e33 2.1 初识 ESP32 ESP32-S3 是一款低功耗的 MCU 系统级芯片 (SoC),支持 2.4 GHz Wi-Fi 和低功耗蓝牙 (…

设计模式:访问者模式

文章目录 定义应用场景示例代码反例原则间的权衡与冲突设计模式的局限性总结与建议 定义 访问者模式(Visitor Pattern)是一种将算法与对象结构分离的设计模式。这种模式中,可以在不修改已有程序结构的前提下,通过添加额外的“访问…

强固型国产化工业电脑,在电子看板行业应用,机器视觉在汽车产线行业应用

电子看板行业应用 智能电子看板的核心是通过实现工厂的全面可视化、自动化管理,最终达到提高效率、降低成本及提高产品质量的目标。电子看板硬件主要有两部分组成:微型工业计算机,显示终端(平板电视、LCD) 方案需求 …

使用C++模板实现工厂模式

工厂模式是一种常用的设计模式,用于创建对象,而不需要指定将要创建的对象的具体类。C模板可以用来实现一个通用的工厂模式,使得工厂能够创建任何类型的对象,只要这些对象遵循了一定的创建接口。以下是使用C模板实现工厂模式的一个…

在Java中使用XxlCrawler时防止被反爬的几种方式

目录 前言 一、常见的反爬措施 1、User-Agent识别 2、Referer识别 3、频率限制 4、IP限制 二、XxlCrawer的应对之道 1、User-Agent应对 2、频率限制 3、IP限制 三、XxlCrawler执行解析 1、XxlCrawler对象 2、启动对象 3、信息爬取线程 总结 前言 众所周知&#x…

【c++】vector的使用

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,我们本篇来到一个新的容器,vector的讲解和使用 目录 1.vector简单介绍2.vector的使用2.1构造函数2.2遍历vector2.3对容量操作2.4vector的增删查改 1.v…

Java测试编程题

题目1 1.创建5个线程对象 线程名设置为(Thread01,Thread02,Thread03,Thread04,Thread05)使用 代码实现5个线程有序的循环打印,效果如下: Thread01正在打印1 Thread02正在打印2 Threa…

MYSQL 二、SQL语句总结

一、navicat 操作快捷键 一般都用naviact来操作数据库,故总结一下相关的快捷键: CTRLL 历史日志 CTRLTAB 或 SHIFTCTRLTAB 下一个窗口或选项卡 CTRLQ …

Day60 单调栈 part03

Day60 单调栈 part03 最后一天啦!完结撒花~ 84.柱状图中最大的矩形 我的思路: 感觉和接雨水差不多,只需要多考虑一些情况 双指针 lheight 和 rheight 分别是用来存储每个柱子的左边界和右边界的数组。 解答: class Solutio…

【LeetCode热题100】【图论】实现 Trie (前缀树)

题目链接:208. 实现 Trie (前缀树) - 力扣(LeetCode) 这应该和图论没啥关系,应该属于哈希和树,题目没讲前缀树到达是啥 前缀树是如何做到高效查找字符串的呢,先说单词查找树吧,一共就只有26个…