APM32芯得EP.49|探索使用以太网(ETH),搭建一个简单的本地HTTP服务器

极海Geehy 2024-12-23 18:01


《APM32芯得》系列内容为用户使用APM32系列产品的经验总结,均转载自21ic论坛极海半导体专区,全文未作任何修改,未经原文作者授权禁止转载。




最近在学习 ETH 模块,ETH 模块具有 HTTP 服务的功能,我将在本帖中探讨如何使用 HTTP 服务搭建一个本地 Web网站,并分享一些我所获得的经验。


1. HTTP介绍:

HTTP是超文本传输协议(Hypertext Transfer Protocol)的缩写,它是用于传输超文本(如 HTML)数据的应用层协议。HTTP是万维网上数据通信的基础,它被用于在Web浏览器和Web服务器之间传输信息。


HTTP是一个无状态协议,这意味着每个单独的请求都是独立的,服务器不会在多个请求之间保留任何数据。每个HTTP请求从客户端(例如Web浏览器)发送到服务器,然后服务器返回一个响应。这种请求-响应模型使得客户端可以从服务器获取各种信息,如网页、图像、视频等。


HTTP通常使用TCP作为其传输层协议,通过使用标准端口号80进行通信(HTTPS使用端口号443)。近年来,随着对安全性的需求增加,基于HTTP的加密版本HTTPS也变得越来越普遍,它通过使用SSL/TLS协议来加密数据传输,确保数据的机密性和完整性。


HTTP服务特点:

HTTP服务具有以下几个主要特点:


1. 无连接:HTTP是一种无连接的协议,即每个请求和响应之间都是独立的,服务器不会保留关于客户端的任何状态信息。这种无连接的特性使得服务器能够更有效地处理大量的并发请求。

2. 无状态:HTTP是一种无状态的协议,即服务器不会在请求之间保留任何状态信息。每个请求都是独立的,服务器不会记住之前的请求信息。这种设计简化了服务器的管理和维护,但也意味着服务器无法跟踪客户端的状态,需要使用其他机制来实现状态管理,如使用Cookies或Session。

3. 简单灵活:HTTP的设计简单且灵活,易于实现和使用。它使用文本格式的请求和响应消息,易于调试和理解。同时,HTTP也支持多种不同的请求方法(如GET、POST、PUT、DELETE等),以及多种不同的内容类型(如文本、图像、音频、视频等),使得其适用于各种不同的应用场景。

4. 基于请求-响应模型:HTTP是基于请求-响应模型的协议,即客户端发送一个请求给服务器,服务器处理请求并返回一个响应给客户端。这种模型使得客户端能够从服务器获取各种信息,如网页、图像、视频等。

5. 支持多媒体内容:HTTP不仅可以传输文本数据(如HTML),还可以传输图像、视频、音频等多媒体内容。这使得互联网上的各种资源可以通过HTTP服务进行传输和访问。

6. 基于TCP协议:HTTP通常使用TCP作为其传输层协议,通过使用标准端口号80进行通信(HTTPS使用端口号443)。TCP协议提供了可靠的数据传输机制,确保数据的可靠性和完整性。

综上所述,HTTP服务具有无连接、无状态、简单灵活等特点,适用于各种不同的应用场景,是互联网上数据通信的基础。


LWIP1.4.1的HTTP服务介绍


lwIP(lightweight IP)是一个轻量级的开源TCP/IP协议栈,用于嵌入式系统和小型设备。lwIP1.4.1版本中包含了一个简单的HTTP服务器,可以用于在嵌入式设备上搭建基本的Web服务器。

lwIP1.4.1版本的HTTP服务器具有以下特点:

1.轻量级:lwIP是一个轻量级的TCP/IP协议栈,适用于资源受限的嵌入式系统和小型设备。其HTTP服务器也是精简设计,适合在资源有限的环境下运行。

2.基于C语言:lwIP的HTTP服务器是用C语言编写的,易于移植和集成到各种嵌入式系统中。

3.支持基本功能:lwIP的HTTP服务器支持基本的HTTP功能,如处理GET请求、发送静态内容(如HTML页面、图像等)、处理简单的动态内容等。

4.定制化:虽然lwIP的HTTP服务器功能相对简单,但可以根据需要进行定制和扩展,以满足特定应用场景的需求。

5.适用性:lwIP的HTTP服务器适用于嵌入式设备上需要提供简单Web服务的场景,如远程监控、配置管理、固件升级等。

总的来说,lwIP1.4.1版本的HTTP服务器是一个简单而实用的工具,适合在资源受限的嵌入式系统中搭建基本的Web服务器功能。


2. 本地 Web 服务器搭建的步骤

1.新建工程,移植lwip库,并包含其所需要的组件。


2.准备一些html文件,用于界面显示和控制。


3. 使用makefsdata将html 文件转化为c语言数组形式。(附件含 makefsdata工具)

首先打开makefsdata目录,新建fs文件夹。

把准备好的文件复制到fs文件夹中。

退回上一级目录,即makefsdata根目录下,打开cmd,输入“makefsdata“,即可把fs文件夹中的html文件转化为fsdata.c文件,该文件包含了其转化后的c语言数组。

生成的 fsdata.c 文件,就是我们需要的源文件。

这样我们的基础文件数据就准备好了。


4. 编写httpd_cgi_ssi.c文件

HTTP的SSI和CGI介绍:


当涉及到 Web 服务器上的动态内容处理时,两种常见的方法是Server Side Includes (SSI) 和 Common Gateway Interface(CGI)。


### 1. Server Side Includes (SSI):

SSI 是一种简单的动态内容生成技术,它允许在 HTML 页面中嵌入动态内容。SSI 在 HTML 文件中通过特殊的标签实现,服务器在响应客户端请求时动态地处理这些标签。


#### 如何使用SSI:

- SSI 标签通常以 结束。

- 常见的SSI指令包括:

- #include:包含其他文件的内容。

- #echo:输出环境变量或者其他值。

- #exec:执行外部命令并将结果输出。

- SSI 通常在服务器配置中启用,并且需要指定哪些文件扩展名应该被解析为SSI。


#### 优点:

- 简单易用,无需编写额外的代码。

- 可以直接在 HTML 文件中嵌入动态内容,方便快捷。


#### 缺点:

- 功能有限,主要用于简单的动态内容生成。

- 对服务器性能有一定影响,因为需要在每个请求中动态解析处理SSI标签。


### 2. Common Gateway Interface (CGI):

CGI 是一种更为灵活和强大的动态内容生成技术。它允许服务器调用外部程序来处理客户端请求,并生成动态内容。CGI程序可以用任何编程语言编写,只要能够通过标准输入和输出与 Web 服务器通信即可。


#### 如何使用CGI:

- CGI 程序通常位于 Web 服务器的特定目录中(如`cgi-bin` 目录)。

- 当服务器收到客户端请求时,会调用相应的 CGI 程序来处理请求,并将结果返回给客户端。

- CGI 程序通过环境变量获取客户端请求信息,并通过标准输出返回动态生成的内容。


#### 优点:

- 灵活多样,可以使用各种编程语言编写CGI 程序。

- 可以处理复杂的动态内容生成需求,如表单处理、数据库查询等。


#### 缺点:

- 比较复杂,需要编写额外的程序。

- 对服务器性能影响较大,每个 CGI请求都需要启动一个新的进程来处理。

综上所述,SSI 适用于简单的动态内容生成需求,而CGI 则更适合处理复杂的动态内容生成任务。选择哪种方法取决于具体的需求和服务器环境。

在了解这些之后,我们看看下面编写的httpd_cgi_ssi.c文件源码。


#include "lwip/debug.h"

#include "httpd.h"

#include "lwip/tcp.h"

#include "fs.h"

#include "main.h"

#include "Board.h"

#include

#include

tSSIHandler ADC_Page_SSI_Handler;

uint32_t ADC_not_configured=1;

/* we will use character "t" as tag for CGI */

char const* TAGCHAR="t";

char const** TAGS=&TAGCHAR;

/* CGI handler for LED control */

const char * LEDS_CGI_Handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]);

/* Html request for "/leds.cgi" will start LEDS_CGI_Handler */

const tCGI LEDS_CGI={"/leds.cgi", LEDS_CGI_Handler};

/* Cgi call table, only one CGI used */

tCGI CGI_TAB[1];

/**

* [url=home.php?mod=space&uid=247401]@brief[/url]  Configures the ADC.

* @param None

* @retval None

*/

static void ADC_Configuration(void)

{

ADC_Config_T adcConfig;

ADC_CommonConfig_T adcCommonConfig;

GPIO_Config_T gpioConfig;

RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC3);

RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOF);

gpioConfig.pin = GPIO_PIN_9;

gpioConfig.mode = GPIO_MODE_AN;

gpioConfig.pupd = GPIO_PUPD_NOPULL;

GPIO_Config(GPIOF,&gpioConfig);

ADC_CommonConfigStructInit(&adcCommonConfig);

adcCommonConfig.mode = ADC_MODE_INDEPENDENT;

adcCommonConfig.prescaler = ADC_PRESCALER_DIV6;

adcCommonConfig.accessMode = ADC_ACCESS_MODE_DISABLED;

adcCommonConfig.twoSampling = ADC_TWO_SAMPLING_5CYCLES;

ADC_CommonConfig(&adcCommonConfig);

ADC_ConfigStructInit(&adcConfig);

adcConfig.resolution = ADC_RESOLUTION_12BIT;

adcConfig.scanConvMode = DISABLE;

adcConfig.continuousConvMode = ENABLE;

adcConfig.extTrigEdge = ADC_EXT_TRIG_EDGE_NONE;

adcConfig.dataAlign = ADC_DATA_ALIGN_RIGHT;

adcConfig.nbrOfChannel = 1;

ADC_Config(ADC3,&adcConfig);

ADC_ConfigRegularChannel(ADC3,ADC_CHANNEL_7,1,ADC_SAMPLETIME_56CYCLES);

ADC_Enable(ADC3);

/* ADC3 regular Software Start Conv */

ADC_SoftwareStartConv(ADC3);

}

/**

* [url=home.php?mod=space&uid=247401]@brief[/url]  ADC_Handler : SSI handler for ADC page

*/

u16_t ADC_Handler(int iIndex, char *pcInsert, int iInsertLen)

{

/* We have only one SSI handler iIndex = 0 */

if (iIndex ==0)

char Digit1=0, Digit2=0, Digit3=0, Digit4=0;

uint32_t ADCVal = 0;

/* configure ADC if not yet configured */

if (ADC_not_configured ==1)  

{

ADC_Configuration();

ADC_not_configured=0;

}

/* get ADC conversion value */

ADCVal = ADC_ReadConversionValue(ADC3);

/* convert to Voltage,  step = 0.8 mV */

ADCVal = (uint32_t)(ADCVal * 0.8); 

printf("ADC Value: %d\r\n",ADCVal);

/* get digits to display */

Digit1= ADCVal/1000;

Digit2= (ADCVal-(Digit1*1000))/100 ;

Digit3= (ADCVal-((Digit1*1000)+(Digit2*100)))/10;

Digit4= ADCVal -((Digit1*1000)+(Digit2*100)+ (Digit3*10));

/* prepare data to be inserted in html */

*pcInsert  = (char)(Digit1+0x30);

*(pcInsert + 1) = (char)(Digit2+0x30);

*(pcInsert + 2) = (char)(Digit3+0x30);

*(pcInsert + 3) = (char)(Digit4+0x30);

/* 4 characters need to be inserted in html*/

return 4;

}

return 0;

}

/**

* [url=home.php?mod=space&uid=247401]@brief[/url]  CGI handler for LEDs control

*/

const char * LEDS_CGI_Handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[])

{

uint32_t i=0;

/* We have only one SSI handler iIndex = 0 */

if (iIndex==0)

{

/* All leds off */

APM_TINY_LEDOff(LED2);

APM_TINY_LEDOff(LED3);

/* Check cgi parameter : example GET /leds.cgi?led=2&led=4 */

for (i=0; i

{

/* check parameter "led" */

if (strcmp(pcParam[i] , "led")==0)  

{

/* switch led2 ON if 2 */

if(strcmp(pcValue[i], "2") ==0)

APM_TINY_LEDOn(LED2);

/* switch led3 ON if 3 */

else if(strcmp(pcValue[i], "3") ==0)

APM_TINY_LEDOn(LED3);

}

}

}

/* uri to send after cgi call*/

return "/APM32F407LED.html"; 

}

/**

* Initialize SSI handlers

*/

void httpd_ssi_init(void)

{

/* configure SSI handlers (ADC page SSI) */

http_set_ssi_handler(ADC_Handler, (char const **)TAGS, 1);

}

/**

* Initialize CGI handlers

*/

void httpd_cgi_init(void)

{

/* configure CGI handlers (LEDs control CGI) */

CGI_TAB[0] = LEDS_CGI;

http_set_cgi_handlers(CGI_TAB, 1);

}


这段代码是一个基于lwIP(LightweightIP)的HTTP服务器的实现,它允许通过网页控制单片机上的LED,并且能够实时获取ADC(模数转换器)的值并显示在网页上。让我们逐个分析每个函数及其功能:


- ADC_Configuration():

 - 这个函数配置了微控制器的ADC模块,使其准备好进行模拟信号的数字化转换。

 - 配置了ADC3通道7,并启动了ADC转换。


-ADC_Handler():

 - 这个函数是SSI(Server Side Include)的处理函数,用于处理ADC页面的SSI标签。

 - 它读取ADC转换的值,将其转换为电压值,并将其插入到HTML页面的指定位置。

 - 该函数返回要插入的字符数量。


-LEDS_CGI_Handler():

 - 这个函数是CGI(Common Gateway Interface)的处理函数,用于处理LED控制的CGI请求。

 - 它检查CGI参数,根据参数设置LED的状态(开或关)。

 - 返回一个字符串,指示CGI调用完成后应该跳转的页面。


- httpd_ssi_init():

 - 这个函数初始化SSI处理程序,将ADC页面的SSI处理函数注册到HTTP服务器。


-httpd_cgi_init():

 - 这个函数初始化CGI处理程序,将LED控制的CGI处理函数注册到HTTP服务器。


总体来说,这段代码实现了一个基本的HTTP服务器,可以通过网页界面控制LED,并实时显示ADC转换的值。通过SSI和CGI,可以动态地生成网页内容,并实现与单片机硬件的交互。


5.编写main函数


int main(void)

{

char LCDDisplayBuf[100] = {0};

struct ip_addr DestIPaddr;

uint8_t flag = 0;

USART_Config_T usartConfig;

/* User config the different system Clock */

UserRCMClockConfig();

/* Configure SysTick */

ConfigSysTick();

/* Configure USART */

usartConfig.baudRate = 115200;

usartConfig.wordLength = USART_WORD_LEN_8B;

usartConfig.stopBits = USART_STOP_BIT_1;

usartConfig.parity = USART_PARITY_NONE ;

usartConfig.mode = USART_MODE_TX_RX;

usartConfig.hardwareFlow = USART_HARDWARE_FLOW_NONE;

APM_BOARD_COMInit(COM1,&usartConfig);

/* Configures LED2 and LED3 */

APM_BOARD_LEDInit(LED2);

APM_BOARD_LEDInit(LED3);

/* KEY init*/

APM_BOARD_PBInit(BUTTON_KEY1, BUTTON_MODE_GPIO);

APM_BOARD_PBInit(BUTTON_KEY2, BUTTON_MODE_GPIO);

printf("This is a Demo!\r\n");

/* Configure ethernet (GPIOs, clocks, MAC, DMA) */

ConfigEthernet();

/* Initilaize the LwIP stack */

LwIP_Init();

httpd_init();

/* Use Com printf static IP address*/

sprintf(LCDDisplayBuf,"TINY board Static IP address \r\n");

printf("%s",LCDDisplayBuf);

sprintf(LCDDisplayBuf,"IP: %d.%d.%d.%d \r\n",

IP_ADDR0,

IP_ADDR1,

IP_ADDR2,

IP_ADDR3);

printf("%s",LCDDisplayBuf);

sprintf(LCDDisplayBuf,"NETMASK: %d.%d.%d.%d \r\n",

NETMASK_ADDR0,

NETMASK_ADDR1,

NETMASK_ADDR2,

NETMASK_ADDR3);

printf("%s",LCDDisplayBuf);

sprintf(LCDDisplayBuf,"Gateway: %d.%d.%d.%d \r\n",

GW_ADDR0,

GW_ADDR1,

GW_ADDR2,

GW_ADDR3);

printf("%s",LCDDisplayBuf);

while(1)

{

/* check if any packet received */

if (ETH_CheckReceivedFrame())

{

/* process received ethernet packet */

LwIP_Pkt_Handle();

}

/* handle periodic timers for LwIP */

LwIP_Periodic_Handle(ETHTimer);

}

}


6.配置开发板静态IP地址


3. 实验现象:

1.用以太网接口线,连接开发板与PC端,打开浏览器,输入开发板的IP地址,进入网页端。


2.在网页端点击Led control,跳转到led控制界面。


3.点击ADC StatusBar,跳转到ADC采集界面。


注:文章作者在原帖中提供了例程文件,有需要请至原文21ic论坛下载


原文地址:https://bbs.21ic.com/icview-3364404-1-1.html

或点击下方 阅读原文 跳转


↑↑↑ 点击上方卡片关注极海 ↑↑↑

极海Geehy 极海半导体是一家致力于开发工业级/车规级MCU、模拟与混合信号IC及系统级芯片的集成电路设计型企业
评论
  • 光耦固态继电器(SSR)作为现代电子控制系统中不可或缺的关键组件,正逐步取代传统机械继电器。通过利用光耦合技术,SSR不仅能够提供更高的可靠性,还能适应更加复杂和严苛的应用环境。在本文中,我们将深入探讨光耦固态继电器的工作原理、优势、挑战以及未来发展趋势。光耦固态继电器:如何工作并打破传统继电器的局限?光耦固态继电器通过光电隔离技术,实现输入信号与负载之间的电气隔离。其工作原理包括三个关键步骤:光激活:LED接收输入电流并发出与其成比例的光信号。光传输:光电传感器(如光电二极管或光电晶体管)接收
    腾恩科技-彭工 2024-12-20 16:30 110浏览
  •         在上文中,我们介绍了IEEE 802.3cz[1]协议提出背景,旨在定义一套光纤以太网在车载领域的应用标准,并介绍了XMII以及PCS子层的相关机制,在本篇中,将围绕IEEE 802.3cz-MultiGBASE-AU物理层的两个可选功能进行介绍。EEE功能        节能以太网(Energy-Efficient Ethernet)是用于在网络空闲时降低设备功耗的功能,在802.3cz的定义中,链
    经纬恒润 2024-12-19 18:47 97浏览
  • 百佳泰特为您整理2024年12月各大Logo的最新规格信息。——————————USB▶ 百佳泰获授权进行 USB Active Cable 认证。▶ 所有符合 USB PD 3.2 标准的产品都有资格获得USB-IF 认证——————————Bluetooth®▶ Remote UPF Testing针对所有低功耗音频(LE Audio)和网格(Mesh)规范的远程互操作性测试已开放,蓝牙会员可使用该测试,这是随时测试产品的又一绝佳途径。——————————PCI Express▶ 2025年
    百佳泰测试实验室 2024-12-20 10:33 147浏览
  •                                                窗        外       年底将近,空气变得格外寒冷,估计这会儿北方已经是千里
    广州铁金刚 2024-12-23 11:49 99浏览
  • Supernode与艾迈斯欧司朗携手,通过Belago红外LED实现精准扫地机器人避障;得益于Belago出色的红外补光功能,使扫地机器人能够大大提升其识别物体的能力,实现精准避障;Belago点阵照明器采用迷你封装,兼容标准无铅回流工艺,适用于各种3D传感平台,包括移动设备、物联网设备和机器人。全球领先的光学解决方案供应商艾迈斯欧司朗(瑞士证券交易所股票代码:AMS)近日宣布,与国内领先的多行业三维视觉方案提供商超节点创新科技(Supernode)双方联合推出采用艾迈斯欧司朗先进Belago红
    艾迈斯欧司朗 2024-12-20 18:55 142浏览
  • //```c #include "..\..\comm\AI8051U.h"  // 包含头文件,定义了硬件寄存器和常量 #include "stdio.h"              // 标准输入输出库 #include "intrins.h"         &n
    丙丁先生 2024-12-20 10:18 98浏览
  • 随着工业自动化和智能化的发展,电机控制系统正向更高精度、更快响应和更高稳定性的方向发展。高速光耦作为一种电气隔离与信号传输的核心器件,在现代电机控制中扮演着至关重要的角色。本文将详细介绍高速光耦在电机控制中的应用优势及其在实际工控系统中的重要性。高速光耦的基本原理及优势高速光耦是一种光电耦合器件,通过光信号传递电信号,实现输入输出端的电气隔离。这种隔离可以有效保护电路免受高压、电流浪涌等干扰。相比传统的光耦,高速光耦具备更快的响应速度,通常可以达到几百纳秒到几微秒级别的传输延迟。电气隔离:高速光
    晶台光耦 2024-12-20 10:18 186浏览
  • 汽车驾驶员监控系统又称DMS,是一种集中在车辆中的技术,用于实时跟踪和评估驾驶员状态及驾驶行为。随着汽车产业智能化转型,整合AI技术的DMS逐渐成为主流,AI模型通过大量数据进行持续训练,使得驾驶监控更加高效和精准。 驾驶员监测系统主要通过传感器、摄像头收集驾驶员的面部图像,定位头部姿势、人脸特征及行为特征,并通过各种异常驾驶行为检测模型运算来识别驾驶员的当前状态。如果出现任何异常驾驶行为(如疲劳,分心,抽烟,接打电话,无安全带等),将发出声音及视觉警报。此外,驾驶员的行为数据会被记录
    启扬ARM嵌入式 2024-12-20 09:14 108浏览
  • ALINX 正式发布 AMD Virtex UltraScale+ 系列 FPGA PCIe 3.0 综合开发平台 AXVU13P!这款搭载 AMD 16nm 工艺 XCVU13P 芯片的高性能开发验证平台,凭借卓越的计算能力和灵活的扩展性,专为应对复杂应用场景和高带宽需求而设计,助力技术开发者加速产品创新与部署。随着 5G、人工智能和高性能计算等领域的迅猛发展,各行业对计算能力、灵活性和高速数据传输的需求持续攀升。FPGA 凭借其高度可编程性和实时并行处理能力,已成为解决行业痛点的关
    ALINX 2024-12-20 17:44 134浏览
  •         不卖关子先说感受,真本书真是相见恨晚啊。字面意思,见到太晚了,我刚毕业或者刚做电子行业就应该接触到这本书的。我自己跌跌撞撞那么多年走了多少弯路,掉过多少坑,都是血泪史啊,要是提前能看到这本书很多弯路很多坑都是可以避免的,可惜这本书是今年出的,羡慕现在的年轻人能有这么丰富完善的资料可以学习,想当年我纯靠百度和论坛搜索、求助啊,连个正经师傅都没有,从软件安装到一步一布操作纯靠自己瞎摸索,然后就是搜索各种教程视频,说出来都是泪啊。  &
    DrouSherry 2024-12-19 20:00 143浏览
  • 国产数字隔离器已成为现代电子产品中的关键部件,以增强的性能和可靠性取代了传统的光耦合器。这些隔离器广泛应用于医疗设备、汽车电子、工业自动化和其他需要强大信号隔离的领域。准确测试这些设备是确保其质量和性能的基本步骤。如何测试数字隔离器测试数字隔离器需要精度和正确的工具集来评估其在各种条件下的功能和性能。以下设备对于这项任务至关重要:示波器:用于可视化信号波形并测量时序特性,如传播延迟、上升时间和下降时间。允许验证输入输出信号的完整性。频谱分析仪:测量电磁干扰(EMI)和其他频域特性。有助于识别信号
    克里雅半导体科技 2024-12-20 16:35 116浏览
  • 光耦合器,也称为光隔离器,是用于电气隔离和信号传输的多功能组件。其应用之一是测量电路中的电压。本文介绍了如何利用光耦合器进行电压测量,阐明了其操作和实际用途。使用光耦合器进行电压测量的工作原理使用光耦合器进行电压测量依赖于其在通过光传输信号的同时隔离输入和输出电路的能力。该过程包括:连接到电压源光耦合器连接在电压源上。输入电压施加到光耦合器的LED,LED发出的光与施加的电压成比例。光电二极管响应LED发出的光由输出侧的光电二极管或光电晶体管检测。随着LED亮度的变化,光电二极管的电阻相应减小,
    腾恩科技-彭工 2024-12-20 16:31 141浏览
  • 耳机虽看似一个简单的设备,但不仅只是听音乐功能,它已经成为日常生活和专业领域中不可或缺的一部分。从个人娱乐到专业录音,再到公共和私人通讯,耳机的使用无处不在。使用高质量的耳机不仅可以提供优良的声音体验,还能在长时间使用中保护使用者听力健康。耳机产品的质量,除了验证产品是否符合法规标准,也能透过全面性的测试和认证过程,确保耳机在各方面:从音质到耐用性,再到用户舒适度,都能达到或超越行业标准。这不仅保护了消费者的投资,也提升了该公司在整个行业的产品质量和信誉!客户面临到的各种困难一家耳机制造商想要透
    百佳泰测试实验室 2024-12-20 10:37 236浏览
  • 汽车行业的变革正愈演愈烈,由交通工具到“第三生活空间”。业内逐渐凝聚共识:汽车的下半场在于智能化。而智能化的核心在于集成先进的传感器,以实现高等级的智能驾驶乃至自动驾驶,以及更个性、舒适、交互体验更优的智能座舱。毕马威中国《聚焦电动化下半场 智能座舱白皮书》数据指出,2026年中国智能座舱市场规模将达到2127亿元,5年复合增长率超过17%。2022年到2026年,智能座舱渗透率将从59%上升至82%。近日,在SENSOR CHINA与琻捷电子联合举办的“汽车传感系列交流会-智能传感专场”上,艾
    艾迈斯欧司朗 2024-12-20 19:45 190浏览
我要评论
0