ESP32物联网智能硬件开发实战(李永华版)-课后习题及答案_第1页
ESP32物联网智能硬件开发实战(李永华版)-课后习题及答案_第2页
ESP32物联网智能硬件开发实战(李永华版)-课后习题及答案_第3页
ESP32物联网智能硬件开发实战(李永华版)-课后习题及答案_第4页
ESP32物联网智能硬件开发实战(李永华版)-课后习题及答案_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ESP32物联网智能硬件开发实战习题及答案

第1章

1.什么是SOC系统?

答案:SystemonChip(SoC),即片上系统,是嵌入式系统发展到高级阶段的结果,技

术上领先,性能上优越。

2.SoC系统设计包括哪些步骤?

答案:(1)功能设计;(2)设计描述和行为验证;(3)逻辑综合;(4)门级验证;(5)

布局和布线。

3.SoC系统的基本组成有哪些?

答案:在SoC系统硬件组成中,包括微处理器CPU,一般采用精简指令集;存储器包含

缓存、主存储器和辅助存储器;通用设备接口和I/O接口。在SoC系统软件组成中,包括中

间层,是设备驱动程序和板级支持包:系统层,是实时操作系统;应用层,是具体的应用程

序。

4.SoC系统有哪些基本特点?

答案:内核小、专用性、集成化、实时性、多任务、可测性、长期性、可靠性、可裁剪。

5.ESP32系统主要功能有哪些?

答案:Wi-Fi、蓝牙、CPU和存储、时钟和定时器、高级外设接口、安全机制。

第2章

1.ESP32系列芯片采用什么结构?两个CPU名称及意义是什么?

答:采用两个哈佛结构XtensaLX6CPU构成双核系统。两个CPU的名称分别是“PR0_CPU”

和“APP_CPU"。PRO代表protocol(协议)”,APP代表“application(应用)”。

2.请画出ESP32系列芯片的系统结构?

3.ESP32系统的地址范围是什么?

答案:数据总线与指令总线分别有4GB(32位)地址空间,从0x0000^0000~0xFFFF_FFFF»

4.请画图描述ESP32的WROVER一模组功能?

ESP32-WROVER-E

Antenna

5.ESP32系统提供哪三种级别的复位方式,每种复位对数据的影响?

答案:分别是CPU复位、内核复位、系统复位。所有的复位都不会影响存储器中的数据。

整个系统的结构以及每种复位方式如下:CPU复位,只复位CPU的所有寄存器。内核复位,

除了RTC,所有数字寄存器全部复位,包括CPU、数字GPIO和外设。系统复位,会复位整个

芯片所有的寄存器,包括RTC。

6.ESP32的时钟源分别来自那里?

答案:外部晶振、内部PLL或震荡电路。

7.画图描述单任务与多任务系统区别?

政代先城便务

低优先级任务

高优先级任务

大循环(后台)

Taskl

Task2-

ere.

JffF

et]中断(前台)|

ISR中断嵌套(前台)

ISR低优先级任务

Task4

第3章

1.请描述ESP32开发流程?

2.什么是ESP-IDF?

答案:ESPTDF是乐鑫官方的物联网开发框架,适用于ESP32和ESP32-S系列SoC。它

基于C/C++语言提供了SDK,方便用户在这些平台上开发通用应用程序。

3.ESPTDF有哪些功能?

ESP-IDF

NetworkProvisioningOTAupgradeLibraryManufactunngUtiifUesCommonNetworkingProtocolsExamples

FieSystemsObjectStoragePOS1XandC++SuwxwtNetworkSecuntyCryptoLtbraiyIDEPlugms

1BluetootrvBluetoothLE|

wm&BluetoomLE

PerpheralsDnversPowerManagementTCP/IPStackBu*lSystem

MeshNetwortcingStack

1

?|BluetoothControner|

RTOSKernelSoCSupportSoftwareBootloaderW»-FiMACLibraryDevetopetTools

4.如何安装ESP-IDF开发环境?

答案:可以通过官方网站下载在线安装包、带有集成开发环境的离线安装包以及ESP-

IDF离线安装包,然后安装即可。

5.在计算机上安装上ESP32开发板后,如何查看端口?

答案:右击Windows系统桌面上的“此电脑”,依次单击“属性”、"设备管理器”、

“端口(COM和LPT)”,SiliconLabsCP210xUSBtoUARTBridge,即为ESP32开发板

所在的端口。

6.ESP-IDF运行一个工程需要哪些步骤?

答案:在命令行下完成如下步骤:⑴输入idf.pyset-targetesp32,设置目标芯片;

(2)输入:idf.pymenuconfig,进行配置;(3)输入:idf.pybuild,进行编译;(4)输

入idf.py-pcomXflash,进行烧录;(5)输入idf.py-pcomXmonitor,查看结果。

7.图示描述一个项目的目录树结构?

-myPrqject

-CNfakeLists.txt*-'

-sdkconfig^-1

-components-component1-CMakeLists.txt*-1

-Kconfig*-'

-srcl.o1

-component!-CMakeLists.txt”

-Kconfig^'

-srcl.o1

-include-component2.h-

>main-srcLc+'

-srcl.c^

-builds

8.machine模块主要包括哪几个类?

答案:Pin类,控制I/O引脚。Signal类,控制和感应外部I/O设备。UART类,双工

串行通信总线。SPI类,串行外设接口总线协议(主机)。12c类,双线串行协议。RTC类,实

时时钟。定时器类,控制硬件定时器。WDT类,看门狗定时器。

第4章

1.请画出I0_MUX、RTCI0_MUX和GPI0交换矩阵结构。

SPI,

UART,

PC.I?S,

PWM,

LEDC

andmore

2.电路如图所示,请使用Eclipse/VScode开发环境实现,LED亮1秒,灭3秒的程

序功能。

#include<stdio.h>

^include^freertos/FreeRTOS.h?,

ttinclude〃freertos/task.h〃

^include“driver/gpio.h"

^include"sdkconfig.h"

^defineLED18〃定义输出引脚

voidLED_Task(void*pvParameter)

{

gpio_pad_select_gpio(LED);〃选择芯片引脚

gpio_set_direction(LED,GPIO_MODE_OUTPUT);〃设置该引脚为输出模式

whi1e(1){

gpio_set_level(LED,0);〃电平为低

vTaskDelay(3000/portTICK_PERIOD_MS);〃延迟1S

gpio_set_level(LED,1);〃电平为高

vTaskDelay(1000/portTICK_PERIOD_MS);〃延迟1S

}

}

voidapp_main()〃主函数

xTaskCreate(&LED_Task,/lED_Task,/,configMINI\lAL_STACK_SIZE,NULL,5,NULL);〃新建一个任务

)

3.ESP32系统中断包括那几部分,画图描述中断矩阵结构?

答案:包括外设中断配置寄存器、中断源、中断矩阵和中断输出寄存器。

PRO.CPUPeripheralInterruptConfigurabonRegister

PRO.CPUNMIIntemjptMask

APP.CPUPeripheralInterruptConfigurationRegister

APP.CPUNMIInterruptMask

PRO.CPUPenplwalInterrupt

PeripheralInterruptSource

InterruptMatrix

APP.CPUPonpheralInterrupt

PRO_CPUPenpheralInterruptSourceStatusRegister

-APP:C-P-U-P-ef-lpb-e-ra-lIn-te-n-up-t-So-ur-ce-S-ta-tu-s-Re-gi-st-er►

4.根据4.2.4节中,Arduino开发环境的中断程序,实现5次计数,中断一次的程序功

能。

voidcalIBack(void)

Serial,printf(ZZGPIO4Interrupted'。”);

)

voidsetup()

Serial,begin(115200);〃设置串口监视器波特率

Serial.printlnO;

pinMode(18,OUTPUT);//GPIO18为输出模式

pinMode(4,INPUT);//GPIO4为输入模式

attachInterrupt(4,calIBack,RISING);〃上升沿触发中断

intent=0;

voidloop()〃主函数

Serial,printf(,zcnt:%d\n”,cnt++);〃打印计数

digitaiWrite(18,ent%5);〃每隔5个计数,打印一次中断

delay(1000);〃延时1S

//detachinterrupt(4);〃关闭中断

)

5.ESP32系统的ADC支持多少个通道?

答案:ADC1(8个通道,连接到GPIO32~39)和ADC2(10个通道,连接到GPIO0、2、

4、12~15,25~27)。

6.请根据4.3.3节的MicroPython程序,打印ADC的值和对应的电压。

frommachineimportADC,Pin

fromtimeimportsleep_ms

adc=ADC(Pin(32))#在引脚32实例化ADC(MicroPython只支持在32~39号引脚对ADC实例化)

adc.atten(ADC.ATTN_6DB)

adc.width(ADC.WIDTH」2BIT)#12位分辨率,范围0-4095

while1:

adc.read()

sleep_ms(1000)#延时

print(adc.readO)#打印ADC的值

printADCValue:〃+str(adc.read()*2200/4096))#打印电压的值

7.DAC每个通道的输出模拟电压计算方式为DACn_OUT=VDD3P3_RTCXPDACn_DAC/256,

其中,VDD3P3_RTC为3.3V,PDACn_DAC从0-255变化,修改4.4.3节中的示例程序一,基

于VScode打印输出对应的电压。

#include<stdio.h>

^include<stdlib.h>

^include^freertos/FreeRTOS.h?,

ttinclude〃freertos/task.h〃

^includez,freertos/queue.h〃

^include〃driver/gpio.h〃

^include^driver/adc.h〃

#include〃driver/dac.h〃

#include/zesp_system.h"

#include"esp_adc_cal.h"

voidappjnain(void)

(

uint8_toutput_data=0;〃输出数据变量

esp_err_tr;〃判断结果变量

gpio_num_tdac_gpio_num;〃引脚变量

r=dac_pad_get_io_num(DAC_CHANNEL_2,&dac_gpio_num);〃获取引脚信息

assert(r==ESP_OK);〃正确与否

printffDACchannel%d@GPIO%d.\n",DAC_CHANNEL_2,dac_gpio_num);

dac_output_enable(DAC_CHANNEL_2);〃DAC输出使能

vTaskDelay(2*portTICK_PERIOD_MS);〃延时

printf("startconversion.\n");

whi1e(1){

dac_output_voltage(DAC_CHANNEL_2,output_data++);〃输出数据

printf(^output-Voltage3.3*output_data/255);

printf(z,output_data%d@GPIO%d.\n\output_data,dac_gpio_num);

vTaskDelay(10);

)

)

8.根据4.5.3节的示例一,修改定时器语句err=

esptimer_start_periodic(testphandle,1000*1000);,实现LED的亮9秒灭1秒,

并将信息打印在串口。

ttinclude<stdio.h>

#includez,esp_types.h〃

#include^freertos/FreeRTOS.h,z

/include,zfreertos/task.h〃

^include"freertos/queue.h"

#include/zsoc/timer_group_struct.h"

#include^driver/periph_ctrl.h"

^include*driver/timer.hz/

#include*driver/gpio.h〃

^defineLED2

esp_timer_handle_ttest_phandle=0;

voidtest_timer_periodic_cb(void*arg){〃回调程序

gpio_set_level(LED,0);〃电平为低

vTaskDelay(1000/portTICK_PERIOD_MS);〃延迟1S

gpio_set_level(LED,1);〃电平为高

vTaskDelay(1000/portTICK_PERIOD_MS);〃延迟1S

printf(^Hello,LED\n");

}

voidappmainO〃主程序入口

{

gpio_pad_select_gpio(LED);〃选择芯片引脚

gpio_set_direction(LED,GPIO_MODE_OUTPUT);〃设置该引脚为输出模式

〃定义一个周期重复运行的定时器结构体

esp_timer_create_args_ttest_periodic_arg={

.callback=

&test_timer_periodic_cb,〃设置回调函数

.arg=NULL,〃不携带参数

.name="TestPeriodicTimer”〃定时器名字

};

esp_err_terr=esp_timer_create(&test_periodic_arg,&test_p_handle);//仓U建定时器

err=esp_timer_start_periodic(test_p_handle,10000*1000);〃开启周期定时

if(err-0)〃判断并打印信息

printfdimerStart:ESP0K!\n");

第5章

i.什么是串口通信?

答案:UART以字符为导向的通用数据链,可以实现设备间的通信。异步传输的意思是

不需要在发送数据上添加时钟信息。这也要求发送端和接收端的速率、停止位、奇偶校验位

等都必须相同,通信才能成功。首先,一个典型的UART帧开始于一个起始位;其次,是有

效数据;再次,是奇偶校验位(可有可无);最后,是停止位。

2.ESP32的串口使用可以分那几部分?

答案:分为4部分:设置串口参数,包括波特率、奇偶校验、数据位与停止位等;设置

串口使用的GPIO引脚;安装驱动,为UART分配资源;进行串口通信。

3.不使用ESP32默认UART,通过REPL控制台,设计程序实现输入命令"consoletest”,

输出“Thisisanexamplestring,ifyoucanreadthis,theexampleisasuccess!",

否则输出错误,并通过默认的UART输出信息。

短接ESP32开发的TX引脚与GPI05引脚,RX引脚与GPI04引脚,程序如下:

#include<stdio.h>

^include,zfreertos/FreeRTOS.h,z

#include^freertos/task.h〃

#include〃driver/uart.h"

#include〃soc/uart_periph.h〃

^includez,esp_rom_gpio.h"

#include"driver/gpio.h"

#include〃hal/gpio_hal.h"

#include“sdkconfig.h〃

#include"esp_console.h"

^include"linenoise/linenoise.h"

#include<string.h>

^defineDEFAULT_UART_CHANNEL(0)

^defineCONSOLE_UART_CHANNE1.(1-DEFAULT_UART_CHANNEL)

^defineDEFAULT_UART_RX_PIN(3)

#defineDEFAULT_UART_TX_PIN(2)

^defineCONSOLESART_RX_PIN(4)

^defineCONSOLE_UART_TX_PIN(5)

^defineUARTS_BAUD_RATE(115200)

^defineTASK_STACK_SIZE(2048)

^defineREAD_BUF_SIZE(1024)

constchartest_message[]=“Thisisanexamplestring,ifyoucanreadthis,theexampleis

asuccess!

staticvoidconnect_uarts(void)

(

esp_rom_gpio_connect_out_signal(DEFAULT_UART_RX_PIN,UART_PERIPH_SIGNA1.(1,

SOC_UART_TX_PIN_IDX),false,false);

esp_rom_gpio_connect_in_sigoal(DEFAULT_UART_RX_PIN,UART一PERIPH_SIGNAL(0,

SOC_UART_RX_PIN_IDX),false);

esp_rom_gpio_connect_out_signa1(DEFAULT_UART_TX_PIN,UART_PERIPH_SIGNAL(0,

SOC_UART_TX_PIN_IDX),false,false);

esp_rom_gpio_connect_in_signal(DEFAULT_UART_TX_PIN,UART_PERIPH_SIGNAL(1,

SOC_UART_RX_PIN_IDX),false);

)

staticvoiddisconnect_uarts(void)

(

esp_rom_gpio_connect_out_signal(CONSOLE_UART_TX_PIN,UART_PERIPH_SIGNAL(1,

SOC_UART_TX_PIN_IDX),false,false);

esp_rom_gpio_connect_in_signal(CONSOLE_UART_RX_PIN,UART_PERIPH_SIGNAL(1,

SOC_UART_RX_PIN_IDX),false);

staticvoidconfigure_uarts(void)

/*ConfigureparametersofanUARTdriver,

*communicationpinsandinstallthedriver*/

uart_config_tuart_config={

.baud_rate=UARTS_BAUD_RATE,

.data_bits=UART_DATA_8_BITS,

.parity=UART_PARITY_DISABLE,

.stop_bits=UART_STOP_BITS_1,

.flow_ctrl=UART_HW_FLOWCTRL_DISABLE,

.source”Ik=UART_SCLK_APB,

};

ESP_ERROR_CHECK(uart_driver_instal1(DEFAULT_UART_CHANNEL,READ_BUF_SIZE*2,0,0,NULL,

0));

ESP_ERROR_CHECK(uart_param_config(DEFAULT_UART_CHANNEL,&uart_config));

ESP_ERROR_CHECK(uart_set_pin(DEFAULT_UART_CHANNEL,DEFAULT_UART_TX_PIN,

DEFAULT_UART_RX_PIN,

UART_PIN_NO_CHANGE,UART_PIN_NO_CHANGE));

connect_uarts();

}

staticintconsole_test(intargc,char**argv){

printf(绘s\n〃,test_message);

return0;

}

staticvoidsendcommands(void*arg){

staticchardata[READ_BUF_SIZE];

charcommand[]="consoletest\n〃;

intlen=0;

void*substring=NULL;

do{

len=uart_read_bytes(DEFAULT_UART_CHANNEL,data,READ_BUF_SIZE,100/

portTICK_RATE_MS);

}while(len==0);

if(len=="1){

gotoend;

)

len=uart_write_bytes(DEFAUI/rjJARTCHANNEL,command,sizeof(command));

if(len=T){

gotoend;

len=uart_read_bytes(DEFAULT_UART_CHANNEL,data,READ_BUF_SIZE-1,250/

portTICK_RATE_MS);

}while(len==0);

if(len=-1){

gotoend;

)

data[len]=0;

substring=strcasestr(data,test_message);

end:

disconnect_uarts();

printf("Result:%s\n〃,substring==NULL?”Failure":"Success");

vTaskDelete(NULL);

}

voidapp_main(void)

(

esp_console_repl_t*repl=NULL;

esp_console_repl_config_trepl_config=ESP_CONSOLE_REPL_CONFIG_DEFAULT();

rep1_config.prompt="repl

constesp_conso1e_cmd_tcmd={

.command="consoletest”,

.help="Testconsolebysendingamessage”,

.func=&console_test,

};

espconso1e_dev_uart_config_tuart_config={

.channel=CONSOLE_UART_CHANNEL,

.baud_rate=UARTS_BAUD_RATE,

.tx_gpio_num=CONSOLE_UART_TX_PIN,

.rx_gpio_num=CONSOLE_UART_RX_PIN,

);

1inenoiseSetDumbMode(1);

ESP_ERROR_CHECK(esp_console_new_repl_uart(&uart_config,&repl_config,&repl));

configure_uarts();

ESP_ERROR_CHECK(esp_console_cmd_register(&cmd));

xTaskCreate(sendcommands,z,send_commands_task,\TASK_STACK_SIZE,NULL,10,NULL);

ESP_ERROR_CHECK(esp_console_start_repl(repl));

)

4.使用ArduinoIDE在串口输出“HelloWorld!"及输出次数,设计并实现程序。

intcounter:。;〃计数器

voidsetup(){〃初始化串口

Serial,begin(9600);

)

void1oop(){〃每loop循环一次,计数器变量加1

counter=counter+1;〃输出变量

Serial.print(counter);〃输出字符

Serial.print(*);〃输出字符串;

Serial,printin(^HellowWorld!,z);

delay(1000);

}

5.什么是12c通信?

答案:I2C(Inter-IntegratedCircuit)是一种串行、同步、半双工通信协议,它允许

在同一总线上同时存在多个主机和从机。12c为两线总线,由SDA线和SCL线构成,这些线

设置为漏极开漏输出,两条线都需要上拉电阻。因此,12c总线上可以挂载多个外设,通常

是和一个或多个主机以及一个或多个从机,主机通过总线访问从机。

6.根据5.2.4节ArduinoIDE的12c程序得到的GY-30设备地址为0x23,请设计程序

读取GY-30传感器的值,并在串口监视器打印。

^include〈Wire.h>

^defineADDR0x23

voidsetup(){

Serial,begin(9600);

while(ISerial){

)

Wire,begin();

Wire,beginTransmission(ADDR);

Wire.write(ObOOOOOOOl);

Wire.endTransmission();

)

voidloop(){

intval=0;

Wire,beginTransmission(ADDR);

Wire.write(ObOOOOOl11);

Wire.endTransmission();

Wire,beginTransmission(ADDR);

Wire.write(0b00100000);

Wire.endTransmissionO;

delay(120);

Wire,requestFrom(ADDR,2);

for(val=0;Wire,available()>=1;){

charc=Wire,read();

//Serial.println(c,HEX);

val=(val«8)+(c&OxFF);

}

val=val/1.2;

Serial,print("BRIGHTNESS:〃);

Serial,print(val);

Serial.println(〃lux〃);

delay(100);

)

6.什么是I2S?其通信需要哪些功能引脚?

答案:I2$(InterTCSound)总线是飞利浦公司为数字音频设备之间的音频数据传输而

制定的一种总线标准,该总线专责于音频设备之间的数据传输,广泛应用于各种多媒体系统。

12s采用了独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分离,避免

了因时差诱发的失真,解决了音频抖动问题。标准的12s总线电缆是由3根串行导线组成

的:1根是时分多路复用(简称TDM)数据线;1根是字选择线;1根是时钟线。

7.使用Arduin。IDE,采用INMP441麦克风,使用“I2S_PHILIPS_M0DE”模式,输出

采样值并在串口绘图器上打印结果。

引脚连线如下:*GND-GND,3.3V-3.3V,WS-25(ESP32),CLK-5(ESP32),SD-26(ESP32).

程序实现如下:

^include<I2S.h>

voidsetup(){

Serial.begin(115200);

while(ISerial){

)

if(!I2S.begin(I2S_PHILIPSJIODE,8000,32)){

Serial,printIn(^FailedtoinitializeI2S!");

while(1);

)

)

voidloop(){

intsample=I2S.read();

if(sample&&sample!=-1&&sample!=1){

Serial.printIn(sample);

)

}

8.什么是SPI?有什么优缺点?

答案:SPI是串行外设接口(SerialPeripheralInterface)的缩写,是Motorola公司

推出的一种同步串行接口技术,是一种高速的、全双工、同步的通信总线。SPI优点是支持

全双工通信、通信简单、数据传输速率快;缺点是没有指定的流控制,没有应答机制确认是

否接收到数据,所以跟12c总线协议比较,在数据、可靠性上有一定的缺陷。

9.根据ssdl306.py文件,编写程序,使用12c引脚的OLED设备,实现信息显示。

frommachineimportSoftI2C,Pin

fromssdl306importSSD1306_I2C

i2c=SoftI2C(scl=Pin(19),sda=Pin(23))#使用19和23引脚

oled=SSD1306_I2C(128,64,i2c,addr=0x3C)#创建OLED对象,addr地址根据具体设备

oled.textCHelloWorld',0,20)#在屏幕(0,20)坐标上显示文字“HelloWorld”

oled.show()#刷新屏幕

第6章

1.ESP32WiFi连网功能支持配置哪三种模式?

答案:站点模式(即STA模式或WiFi客户端模式),此时ESP32连接到接入点(AP)或者

路由器。AP模式(即Soft-AP模式或接入点模式),也就是ESP32作为路由器,此时站点连

接到ESP32.AP-STA共存模式(ESP32既是接入点,同时又作为站点连接到另外一个接入点)。

2.在ESP-IDF开发框架中,将ESP32开发板设置为AP模式,SSID为“MyESP32",密

码为“123456789",如何修改AP示例程序?

将sdkconfig文件中修改如下字段

C0NFIG_EXAMPLE_WIFI_SSID=z,MyESP32”

C0NFIG_EXAMPLE_WIFI_PASSW0RD=,,123456789,z

3.在ArduinoIDE中,实现AP模式,SSID为“MyESP32”,密码为“123456789”,

并在串口打印相关信息。

#include<Arduino.h>

^include"WiFi.h"

voidsetup()

(

Serial,begin(115200);

WiFi.softAP(〃MyESP32〃,“123456789〃);〃设置AP参数,名称和密码

}

voidloop()

(

Serial,print(〃主机名:");

Serial.printIn(WiFi.softAPgetHostname());

Serial,print(〃主机IP:*);

Serial,printIn(WiFi.softAPIP());

Serial,print("主机IPV6:*);

Serial.printIn(WiFi.softAPIPv6());

Serial,print(“主机SSID:");

Serial,printin(WiFi.SSID());

Serial,print("主机mac地址:");

Serial.println(WiFi.softAPmacAddress());

Serial,print(〃主机连接个数:”);

Serial.printIn(WiFi,softAPgetStationNum());

Serial,print(〃主机状态:〃);

Serial.println(WiFi.status());

delay(1000);

)

4.使用microPython开发环境,实现ESP32作为站点连接WiFi时密码的动态输入功

能•

importnetwork

\mporttime

defdo_connect(essid,password):

>>>

根据给定的eddid和password连接wifi

:paramessid:wifisid

:parampassword:password

:return:None

,,,

ifessid=Noneoressid='':

raiseBaseException(,essidcannotbenull')

ifpassword==Noneorpassword

raiseBaseException(Jpasswordcannotbenull')

sta_if=network.WLAN(network.STA_IF)

ifnotsta_if.active():

print("setstaactive")

sta_if.active(True)

ifnotsta_if.isconnectedO:

print(Jconnectingtonetwork...,)

staif.connect(essid,password)

retry_times=30

whilenotsta_if.isconnectedOandretry_times>0:

printCwaitamomentiwilltry%sitems,please"%retry_times)

time,sleep⑵

retry_times-=1

print(*networkconfig/,sta_if.ifconfigO)

defdisconnect():

,,>

断开网络连接

:return:None

,,,

staif=network.WLAN(network.STAIF)

ifsta_if.isconnectedO:

sta_if.disconnect()

print(Jthenetworkhadbeendisconnect')

if_name_=="_main_":

essid=inputCpleaseinputyouressid/)

password=input(*pleaseinputyourpassword:1)

do_connect(essid,password)

whi1eTrue:

exit=input(XpressQtoexit:")

ifexit=='Q':

disconnect()

break

5.在ESP-IDF开发中,TCP服务器和客户端通信,需要哪些步骤?

TCP是面向连接的可靠服务,服务器端的步骤:(1)创建套接字socket。;(2)绑定套

接字到一个IP地址和一个端口上,bindO;(3)将套接字设置为监听模步等待连接请求,

listen。;(4)请求到来后,接收连接请求,返回一个新的对应于此次连接的套接字,accept。;

(5)用返回的套接字和客户端进行通信,send()/recv();(6)关闭套接字,close。。

客户端的步骤:(1)创建套接字,socket();(2)向服务器端发出连接请求,connect();

(3)与服务器端进行通信,sendO/recvO;(4)关闭套接字,close。。

6.使用MicroPython开发一个TCP服务器,使用网络调试助手作为TCP客户端,控制

ESP32开发板上GPI022引脚上LED的亮灭。

#ESP32上运行相关代码

importnetwork

importsocket

importtime

frommachineimportPin#导入Pin模块

fromutimeimportsleep_ms#导入延时函数

SSID二〃〃

PASSWORD二〃〃

port=10000

wlan=None

1istenSocket=None

defled(control_cmd):

LED=Pin(22,Pin.OUT)#构建LED对象,GPIO22输出

ifcontrol_cmd==T:

LED.value(1)#点亮LED

elifcontrol_cmd==〃0”:

LED.value(0)#熄灭LED

defconnectWifi(ssid,passwd):

globalwlan

wlan=network.WLAN(network.STA_IF)

wlan.active(True)

wlan.disconnect()

wlan.connect(ssid,passwd)

while(wlan.ifconfigO[0]=*0.0.0.O'):

time,sleep(l)

returnTrue

try:

connectWifi(SSID,PASSWORD)

ip=wlan.ifconfigO[0]

listenSocket=socket,socket()

1istenSocket.bind((ip,port))

listenSocket.listen(l)

listenSocket.setsockopt(socket.SOLSOCKET,socket.SOREUSEADDR,1)

print("*"*90)

print("TCP服务器开启,IP:%sPORT:%s'%(ip,port))

print(〃*〃*90)

whileTrue:

prinl(〃等待消息接收...〃)

conn,addr=1istenSocket.accept()

print(〃连接自…”,addr)

whileTrue:

data=conn,recv(1024)

if(len(data)==0):

print(〃接收完成.....〃)

conn,close()

break

message_content=data,decode()

led(message_content)

print(",\033[0;36;32m接收消息内容:[%s]\033[Om,z%message_content)

ret=conn,send(data)

except:

if(listenSocket):

listenSocket.close()

wlan.disconnect()

wlan.active(False)

7.简述UDP通信的过程。

答案:服务器端步骤:(1)使用函数socket。,生成套接字文件描述符;(2)通过Socket

结构设置服务器端地址和监听端口;(3)使用bind。函数绑定监听端口,将套接字文件描

述符和地址类型变量进行绑定;(4)接收客户端的数据,使用recvfromO函数接收客户端

的网络数据;(5)向客户端发送数据,使用sendtoO函数向服务器端主机发送数据;(6)关

闭套接字,使用close。函数释放资源。

客户端步骤:(1)使用socket。,生成套接字文件描述符;(2)通过Socket结构设置

服务器端地址和监听端口;(3)向服务器端发送数据,sendtoO;(4)接收服务器端的数据,

recvfrom0;(5)关闭套接字,close()»

8.使用ArduinoIDE构建UDP客户端,实现周期性向UDP服务器发送消息。

〃参考ArduinoIDE的示例,文件/示例/ESP32AsyncUDP/AsyncUDPClient

^include"WiFi,h”

^include“AsyncUDP.h〃

constchar*ssid=〃***********";〃修改SSID

constchar*password=〃***********〃;〃修改密码

AsyncUDPudp;

voidsetup()

(

Serial.begin(115200);

WiFi,mode(WIFLSTA);

WiFi.begin(ssid,password);

if(WiFi,waitForConnectResult()!=WL_CONNECTED){

Serial.printlnC^WiFiFailed");

whi1e(1){

delay(1000);

)

)

if(udp.connect(IPAddress(192,168,1,100),1234)){〃修改目标服务器

Serial.printin("UDPconnected'7);

udp.onPacket([](AsjrncUDPPacketpacket){

Serial,printCUDPPacketType:");

Serial,print(packet.isBroadcast()?,,Broadcast//:packet.isMulticast()?〃Multicast":"Unicast");

Serial,print(^,From:");

Serial,print(packet.remotelPO);

Serial,print(〃:");

Serial,print(packet.remotePort());

Serial,printTo:");

Serial,print(packet,localIP());

Serial,print(〃:“);

Serial,print(packet.localPort());

Serial,printLength:〃);

Serial,print(packet,length());

Serial,print(,z,Data:");

Serial,write(packet.dataO,packet,length());

Serial,printIn();

//replytotheclient

packet,printf(''Got%ubytesofdata”,packet,length());

});

//Sendunicast

udp.print("HelloServer!");

}

}

void1oop()

{

delay(1000);

//Sendbroadcastonport1234

udp.broadcastTo("Anyonehere?”,1234);

}

第7章

1.简述应用层协议层次结构。

2.HTTP请求/响应的步骤:

答案:(1)建立TCP连接。(2)客户端向服务器端发送请求。(3)客户端发送请求头信

息。(4)服务器端应答。(5)服务器端响应头信息。(6)服务器端向客户端发送数据。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论