Selenium WebDriver的TestNG注释完整指南

TestNG是CédricBeust创建的测试框架 ,有助于满足我们的许多测试需求。 它被广泛用于硒中。 想知道NG代表什么? 好吧,它指的是“下一代” 。 TestNG与Junit相似,但在控制程序的执行流程方面更强大。 作为框架的本质,我们倾向于使测试更加结构化,并通过使用TestNG提供更好的验证点。

TestNG的一些值得注意的功能是:

  • 功能强大且种类繁多的注释可支持您的测试用例。
  • 帮助执行并行测试,相关方法测试。
  • 通过TestNG.xml文件或通过数据提供者概念通过多组数据运行测试的灵活性。
  • 测试用例可以根据需要进行分组并确定优先级。
  • 提供对HTML报告的访问,并且可以通过各种插件进行自定义。
  • 可以跨测试生成测试日志。
  • 可以轻松地与eclipse,Maven,Jenkins等集成。

TestNG程序的基本处理流程包括以下步骤:

TestNG注释

因此,在转到TestNG for Selenium中的注释之前,最好先参考设置TestNG所需的先决条件。

先决条件

  • Java开发套件
  • 设置Eclipse或任何其他IDE。
  • 在Eclipse或任何其他IDE中安装TestNG。

注意:注释只能与Java 1.5或更高版本一起使用。

如果您不熟悉TestNG框架,请按照我们的指南使用TestNG运行您的第一个自动化脚本 。

TestNG注释

在云网格上运行TestNG Selenium脚本

那么,什么是注释?

注释是提供有关类或方法的其他信息的标签。 它由“ @”前缀表示。 TestNG使用这些注释来帮助创建一个健壮的框架。 让我们来看看用于用Selenium进行自动化测试的TestNG的这些注释。

@测试

主要业务逻辑所在的TestNG框架中最重要的注释。 所有要自动化的功能都保留在@Test批注方法中。 它具有各种属性,可以根据这些属性来重新构造和执行该方法。

以下验证url的代码段示例:

@Testpublic void testCurrentUrl() throws InterruptedException{driver.findElement(By.xpath("//*[@id='app']/header/aside/ul/li[4]/a")).click();String currentUrl= driver.getCurrentUrl();assertEquals(current_url, "https://automation.lambdatest.com/timeline/?viewType=build&page=1", "url did not matched");}

@BeforeTest

该注释在类中的第一个@Test注释方法之前运行。 您可以在TestNG for Selenium中使用此注释来设置浏览器配置文件首选项,例如以最大化模式自动打开浏览器,为浏览器设置自己的自定义配置文件等。

下面是确保测试器以最大化模式打开的BeforeTest方法的代码片段:

@BeforeTestpublic void profileSetup(){driver.manage().window().maximize();}

@AfterTest

TestNG中的此批注在您属于该类的所有测试方法运行后运行。 这是一个有用的注释,在向您的利益相关者报告自动化结果方面非常有用。 您可以使用此批注生成测试报告,并通过电子邮件将其分享给您的涉众。

下面的代码段示例:

@AfterTestpublic void reportReady(){System.out.println("Report is ready to be shared, with screenshots of tests");}

@BeforeMethod

TestNG中的此注释在每个@test注释方法之前运行。 您可以在执行测试之前使用它来签出数据库连接,或者可以说@test带注释的方法已经测试了不同的功能,该方法要求用户登录某个类。 在这种情况下,您也可以将您的登录代码放入@BeforeMethod批注方法中。

下面的代码段是一个示例,显示了LambdaTest平台的登录功能:

@BeforeMethodpublic void checkLogin(){driver.get("https://accounts.lambdatest.com/login");driver.findElement(By.xpath("//input[@name='email']")).sendKeys("sadhvisingh24@gmail.com");driver.findElement(By.xpath("//input[@name='password']")).sendKeys("XXXXX");driver.findElement(By.xpath("//*[@id='app']/section/form/div/div/button")).click();}

@AfterMethod

该注释在每个@test注释方法之后运行。 此批注可用于截取针对测试运行而运行的每个测试方法的屏幕截图。

下面的代码片段指示在Selenium的TestNG中的@AfterTest批注中截取的屏幕截图:

@AfterMethodpublic void screenShot() throws IOException{TakesScreenshot scr= ((TakesScreenshot)driver);File file1= scr.getScreenshotAs(OutputType.FILE);FileUtils.copyFile(file1, new File("C:\\Users\\navyug\\workspace\\QAPractise\\test-output\\test1.PNG"));}

@课前

该注释在当前类的第一个测试方法之前运行。 此注释可用于设置浏览器属性,初始化驱动程序,使用所需的URL打开浏览器等。

以下是BeforeClass的代码段:

@BeforeClasspublic void appSetup(){driver.get(url);}

@下课以后

该注释在当前类中的最后一个测试方法之后运行。 TestNG中的此批注可用于在测试过程中执行清理活动,例如关闭驱动程序等

以下是显示已执行的关闭活动的代码片段示例:

@AfterClasspublic void closeUp(){driver.close();}

@BeforeSuite

一个套件可以包含多个类,此批注在所有类的所有测试方法之前运行。 该注释标记了执行的入口点。 TestNG中的@BeforeSuite批注可用于执行所需的通用功能,例如设置和启动Selenium驱动程序或远程Web驱动程序等。

TestNG中@BeforeSuite批注的示例,显示了设置驱动程序的代码片段:

@BeforeSuitepublic void setUp(){System.setProperty("webdriver.chrome.driver", "path to chrome driver");driver=new ChromeDriver();}

@AfterSuite

TestNG运行中的此注释发布了所有类的所有测试方法。 当您有多个运行中的类(例如,关闭驱动程序等)时,此注释可用于在完成测试之前清理过程。

下面是TestNG for Selenium中@AfterSuite批注的代码片段:

@AfterSuitepublic void cleanUp(){System.out.println("All close up activities completed");}

@BeforeGroups

TestNG通过@Test批注中使用的属性组帮助测试人员将一组测试按组创建。 例如,如果您希望将与用户管理相关的所有相似功能组合在一起,则可以将所有测试(例如仪表板,配置文件,事务等)标记为一个组,称为“ user_management”。 TestNG中的@BeforeGroups批注有助于在指定的组之前先运行定义的测试。 如果小组专注于单个功能,如上面的示例中所述,则可以使用此注释。 BeforeGroup批注可以包含登录功能,该功能必须在用户仪表板,用户配置文件等任何其他方法之前运行。

Selenium的TestNG中@BeforeGroups批注的代码片段示例:

@BeforeGroups("urlValidation")public void setUpSecurity() {System.out.println("url validation test starting");}

@AfterGroups

TestNG中的此批注在指定组的所有测试方法执行后运行。
Selenium的TestNG中@AfterGroups批注的代码片段示例:

@AfterGroups("urlValidation")public void tearDownSecurity() {System.out.println("url validation test finished");}The below code displays an example of all annotations used along with TestNG report respectively:import static org.testng.Assert.assertEquals;import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;public class AnnotationsTestNG {public WebDriver driver;public String url="https://www.lambdatest.com/";@BeforeSuitepublic void setUp(){	System.setProperty("webdriver.chrome.driver", "C:\\Users\\navyug\\workspace\\QAPractise\\src\\ChromeDriver\\chromedriver.exe");driver=new ChromeDriver();driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);System.out.println("The setup process is completed");}@BeforeTestpublic void profileSetup(){driver.manage().window().maximize();System.out.println("The profile setup process is completed");}@BeforeClasspublic void appSetup(){driver.get(url);System.out.println("The app setup process is completed");}@BeforeMethodpublic void checkLogin(){driver.get("https://accounts.lambdatest.com/login");driver.findElement(By.xpath("//input[@name='email']")).sendKeys("sadhvisingh24@gmail.com");driver.findElement(By.xpath("//input[@name='password']")).sendKeys("activa9049");driver.findElement(By.xpath("//*[@id='app']/section/form/div/div/button")).click();System.out.println("The login process on lamdatest is completed");}@Test(groups="urlValidation")public void testCurrentUrl() throws InterruptedException{driver.findElement(By.xpath("//*[@id='app']/header/aside/ul/li[4]/a")).click();Thread.sleep(6000);String currentUrl= driver.getCurrentUrl();assertEquals(currentUrl, "https://automation.lambdatest.com/timeline/?viewType=build&page=1", "url did not matched");System.out.println("The url validation test is completed");}@AfterMethodpublic void screenShot() throws IOException{TakesScreenshot scr= ((TakesScreenshot)driver);File file1= scr.getScreenshotAs(OutputType.FILE);FileUtils.copyFile(file1, new File("C:\\Users\\navyug\\workspace\\QAPractise\\test-output\\test1.PNG"));System.out.println("Screenshot of the test is taken");}@AfterClasspublic void closeUp(){driver.close();System.out.println("The close_up process is completed");}@AfterTestpublic void reportReady(){System.out.println("Report is ready to be shared, with screenshots of tests");}@AfterSuitepublic void cleanUp(){System.out.println("All close up activities completed");}@BeforeGroups("urlValidation")public void setUpSecurity() {System.out.println("url validation test starting");}@AfterGroups("urlValidation")public void tearDownSecurity() {System.out.println("url validation test finished");}}

TestNG报告:

TestNG注释

控制台输出:

TestNG注释
TestNG注释

硒中TestNG中注释的执行顺序

上述所有注释均按以下顺序在运行时执行:

  • 之前的套房
  • 测试前
  • 课前
  • 团体前
  • 方法前
  • 测试
  • 后方法
  • 后组
  • 下课以后
  • 事后测试
  • AfterSuite

这是这些注释的基本工作流程的图像:

TestNG注释

TestNG中与注释一起使用的属性

TestNG中的这些测试注释具有可用于我们的测试方法的多个属性。 这些属性还有助于定义我们的测试,并有助于提供在TestNG类中使用的不同测试方法的执行流程方面的清晰度。 在下面列出它们:

  • 说明:它定义了测试方法。 可以通过描述定义方法的作用。 例如,@ @Test(description=”this test validates the login functionality”)
  • alwaysRun:此属性与测试方法一起使用时,即使该方法所依赖的参数失败,也可以确保它始终运行而不管事实。 当该值设置为true时,此方法将始终执行。 例如,@Test(alwaysRun = true)。
  • dataProvider:此属性设置为从带数据提供者注释的测试向使用此属性提供的测试提供数据。 例如,假设您打算在多个跨浏览器上运行测试,其中编写了一个带数据提供者注释的测试,其中包含浏览器及其相应版本的多个输入。 在这种情况下,包含此属性的测试将使用这些数据输入在多个浏览器上运行测试。 相同的语法是@Test(dataProvider =“跨浏览器测试”)。
  • dependsOnMethods:此属性提供执行流程的详细信息,其中仅当执行属性中提到的依赖方法时,才执行测试。 如果该方法所依赖的测试失败或未执行,则从执行中跳过该测试。 例如,@Test(dependsOnmethod =“ Login”)。
  • 组:此属性有助于将专注于单个功能的测试方法分组。 例如@Test(groups =“ Payment_Module”)。 当一个人可以选择在执行周期中忽略几个组并选择其他组时,此属性还有助于延长运行时间。 所有需要做的就是在include标记中提及TestNG.xml文件中的包含组,而可以使用xml文件中的exclude标记来定义被排除的组。
  • dependsOnGroups:此属性按排序规则执行上述两个属性功能,即,使用属性“ dependsOn”定义已定义的组来定义测试方法。 一旦运行了那组测试,就只能发布该带注释的方法将要执行的信息。 例如,@Test(dependsOnMethods =“ Payment_Module”)。
  • 优先级:此属性有助于我们定义测试方法的优先级。 当TestNG执行@Test带注释的方法时,它可能以随机顺序执行。 在您希望您的@Test带注释的方法按所需顺序运行的情况下,可以使用priority属性。 所有测试方法的默认优先级均为0。升序排列的优先级首先被安排执行,例如@Test(priority = 1),@ Test(priority = 2),在这种情况下,将执行优先级等于1的测试首先,然后是优先级为2的测试。
  • enabled:当您打算忽略特定的测试方法并且不想执行它时,此属性会出现。 您需要做的就是将此属性设置为false。 例如,@Test(enabled = false)。
  • 超时:此属性有助于定义特定测试应执行的时间,如果超出该属性定义的时间,则测试方法将终止并失败,并带有标记为org.testng.internal.thread.ThreadTimeoutException的异常。 例如,@ Test(timeOut = 500)。 请注意,指定的时间以毫秒为单位。
  • InvocationCount:此属性的工作原理与循环类似。 基于测试方法中设置的属性,它将多次执行该方法。 例如,@Test(invocationCount = 5),它将执行5次测试。
  • InvocationTimeOut:此属性与上面的invocationCount属性一起使用。 基于此属性的设置值以及invocationCount,这可以确保测试在由invocationTimeOut属性设置的定义时间内运行根据invocationCount指定的次数。 例如,@Test(invocationCount = 5,invocationTimeOut = 20)。
  • ExpectedExceptions:此属性有助于处理测试方法预期引发的异常。 如果属性中定义的一个被测试方法设置并抛出,则传递该属性,否则属性中未声明并由测试方法抛出的任何其他异常将使测试方法失败。 例如,@Test(expectedExceptions = {ArithmeticException.class})。

上面定义的是与TestNG for Selenium中的注释一起使用的属性。 下面的代码片段展示了上述属性的用法:

import static org.testng.Assert.assertEquals;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;public class AnnotationsTest {public WebDriver driver;public String url="https://www.lambdatest.com/";@BeforeSuitepublic void setUp(){System.setProperty("webdriver.chrome.driver", "C:\\Users\\navyug\\workspace\\QAPractise\\src\\ChromeDriver\\chromedriver.exe");driver=new ChromeDriver();System.out.println("The setup process is completed");}@BeforeTestpublic void profileSetup(){driver.manage().window().maximize();System.out.println("The profile setup process is completed");}@BeforeClasspublic void appSetup(){driver.get(url);System.out.println("The app setup process is completed");}@Test(priority=2)public void checkLogin(){driver.get("https://accounts.lambdatest.com/login");driver.findElement(By.xpath("//input[@name='email']")).sendKeys("sadhvisingh24@gmail.com");driver.findElement(By.xpath("//input[@name='password']")).sendKeys("xxxxx");driver.findElement(By.xpath("//*[@id='app']/section/form/div/div/button")).click();System.out.println("The login process on lamdatest is completed");}@Test(priority=0 ,description= "this test validates the sign-up test")public void signUp() throws InterruptedException{WebElement link= driver.findElement(By.xpath("//a[text()='Free Sign Up']"));link.click();WebElement organization=driver.findElement(By.xpath("//input[@name='organization_name']"));organization.sendKeys("LambdaTest");WebElement firstName=driver.findElement(By.xpath("//input[@name='name']"));firstName.sendKeys("Test");WebElement email=driver.findElement(By.xpath("//input[@name='email']"));email.sendKeys("User622@gmail.com");WebElement password=driver.findElement(By.xpath("//input[@name='password']"));password.sendKeys("TestUser123");WebElement phoneNumber=driver.findElement(By.xpath("//input[@name='phone']"));phoneNumber.sendKeys("9412262090");WebElement termsOfService=driver.findElement(By.xpath("//input[@name='terms_of_service']"));termsOfService.click();WebElement button=driver.findElement(By.xpath("//button[text()='Signup']"));button.click();}@Test(priority=3, alwaysRun= true, dependsOnMethods="check_login", description="this test validates the URL post logging in" , groups="url_validation")public void testCurrentUrl() throws InterruptedException{driver.findElement(By.xpath("//*[@id='app']/header/aside/ul/li[4]/a")).click();String currentUrl= driver.getCurrentUrl();assertEquals(current_url, "https://automation.lambdatest.com/timeline/?viewType=build&page=1", "url did not matched");System.out.println("The url validation test is completed");}@Test(priority=1, description = "this test validates the logout functionality" ,timeOut= 25000)public void logout() throws InterruptedException{Thread.sleep(6500);driver.findElement(By.xpath("//*[@id='userName']")).click();driver.findElement(By.xpath("//*[@id='navbarSupportedContent']/ul[2]/li/div/a[5]")).click();	}@Test(enabled=false)public void skipMethod(){System.out.println("this method will be skipped from the test run using the attribute enabled=false");}@Test(priority=6,invocationCount =5,invocationTimeOut = 20)public void invocationcountShowCaseMethod(){System.out.println("this method will be executed by 5 times");}@AfterMethod()public void screenshot() throws IOException{TakesScreenshot scr= ((TakesScreenshot)driver);File file1= scr.getScreenshotAs(OutputType.FILE);FileUtils.copyFile(file1, new File("C:\\Users\\navyug\\workspace\\QAPractise\\test-output\\test1.PNG"));System.out.println("Screenshot of the test is taken");}@AfterClasspublic void closeUp(){driver.close();System.out.println("The close_up process is completed");}@AfterTestpublic void reportReady(){System.out.println("Report is ready to be shared, with screenshots of tests");}@AfterSuitepublic void cleanUp(){System.out.println("All close up activities completed");}@BeforeGroups("urlValidation")public void setUpSecurity() {System.out.println("url validation test starting");}@AfterGroups("urlValidation")public void tearDownSecurity() {System.out.println("url validation test finished");}}

控制台输出:

TestNG注释

TestNG报告:

TestNG注释

TestNG中用于预期目的的注释

除了上面定义的注释以外,还有更多注释,这些注释仅用于所需目的。

@DataProvider

该带注释的方法用于向定义了dataProvider属性的测试方法提供数据。 此带注释的方法有助于创建一个数据驱动的框架,在该框架中可以提供多组输入值,这些输入值将返回2D数组或对象。 TestNG中的@DataProvider批注带有两个属性。

  • 名称-此属性用于为数据提供者提供名称。 如果未设置,则默认为所提供方法的名称。
  • 并行-这是一个属性,可帮助您在不同数据变化的情况下并行运行测试。 此属性是使TestNG对Junit更加强大的原因之一。 其默认值为false。

下面的代码段指示使用@DataProvider批注,并为其设置了名称和parallel属性。

@DataProvider(name="SetEnvironment", parallel=true)
public Object[][] getData(){Object[][] browserProperty = new Object[][]{{Platform.WIN8, "chrome", "70.0"},
{Platform.WIN8, "chrome", "71.0"}
};
return browserProperty;}

@厂

此批注有助于通过单个测试类运行多个测试类。 它基本上可以动态定义和创建测试。

下面的代码片段指示使用@Factory批注来帮助调用测试方法类。

package ChromeDriver;import org.testng.annotations.Test;public class FactorySimplyTest1 {@Testpublic void testMethod1() {System.out.println("This is to test for method 1 for Factor Annotation");}}package ChromeDriver;import org.testng.annotations.Test;public class FactorySimpleTest2 {@Testpublic void testMethod2() {System.out.println("This is to test for method 2 for Factor Annotation");}
}package ChromeDriver;import org.testng.annotations.Factory;
import org.testng.annotations.Test;public class FactoryAnnotation {@Factory()@Testpublic Object[] getTestFactoryMethod() {Object[] factoryTest = new Object[2];factoryTest[0] = new FactorySimplyTest1();factoryTest[1] = new FactorySimpleTest2();return factoryTest;}}

控制台输出:

TestNG注释

@参数

此注释可帮助您直接通过testNG.xml文件将参数传递给测试。 通常,当您有有限的数据集进行测试时,这是首选。 如果数据集复杂而又庞大,则@dataProvider批注为首选或优于excel。

下面的代码片段展示了相同的内容:

@Parameters({ "username", "password"})@Test()public void checkLogin(String username, String password){driver.get("https://accounts.lambdatest.com/login");driver.findElement(By.xpath("//input[@name='email']")).sendKeys(username);driver.findElement(By.xpath("//input[@name='password']")).sendKeys(password);driver.findElement(By.xpath("//*[@id='app']/section/form/div/div/button")).click();System.out.println("The login process on lamdatest is completed");}

参数值在TestNG.xml文件中定义,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite"><test thread-count="5" name="Annotations"><parameter name="username"  value="sadhvisingh24@gmail.com" /><parameter name="password"  value="XXXXX" /><classes><class name="Parameter_annotation"/></classes></test> <!-- Annotations -->
</suite> <!-- Suite -->

@Listener

该注释有助于记录和报告。 我们有多个侦听器,例如:

  • IExecutionListener
  • IAnnotationTransformer
  • ISuiteListener
  • ITestListener

但是深入了解这些听众及其用途将是另一个博客的话题。 我即将写一封,敬请期待。

这就是全部了!

使用所有这些注释和属性时要注意的关键点是您的系统应具有Java 1.5版本或更高版本,因为所有较低版本的Java都不支持这些注释,并且您可能会收到错误消息。

以上所有上述TestNG的注释和属性有助于为代码提供更好的结构和可读性。 它有助于提供详细的报告,从而使状态报告变得更加轻松和有用。 在TestNG for Selenium中使用这些注释完全取决于您的业务需求。 因此,选择正确的使用方法很重要。现在就在LambdaTest Selenium Grid的TestNG中试用这些注释!


翻译自: https://www.javacodegeeks.com/2019/04/complete-guid-testng-annotations-selenium-webdriver.html

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

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

相关文章

NB-IoT无线通信模块与Lora无线通信协议技术分析与前景展望

物联网的快速发展对无线通信技术提出了更高的要求&#xff0c;专为低带宽、低功耗、远距离、大量连接的物联网应用而设计的LPWAN(low-power Wide-Area Network&#xff0c;低功耗广域网)也快速兴起。物联网应用需要考虑许多因素&#xff0c;例如节点成本&#xff0c;网络成本&a…

[渝粤教育] 南昌大学 高等数学(二) 参考 资料

教育 -高等数学&#xff08;二&#xff09;-章节资料考试资料-南昌大学【】 &#xff08;测验&#xff09;微分方程的基本概念&#xff1b;可分离变量的微分方程&#xff1b;齐次方程&#xff1b;一阶线性微分方程 1、【单选题】 A、 B、 C、 D、 参考资料【 】 2、【单选题】1…

飞畅科技-PoE交换机的常见问题解答

PoE供电技术的发展势头越来越好&#xff0c;凭借其简化的用电设备的安装、部署、节能和安全性等优势&#xff0c;PoE的应用也越来越广&#xff0c;很多朋友或许对poe交换机不是很了解&#xff0c;今天就由飞畅科技的小编来为大家详细介绍一下PoE交换机的常见问题&#xff0c;感…

E104-BT01超低功耗蓝牙模块BLE4.0协议的片载系统解决方案

1、E104-BT01简介 E104-BT01 是亿佰特设计生产的一款小体积的蓝牙模块&#xff0c;贴片型&#xff08;引脚间距 1.27mm&#xff09;&#xff0c;自带高性能 PCB 板载天线。支持 BluetoothV4.0 标准&#xff0c;简单配置后可与符合BLE4.0协议的主机建立蓝牙连接&#xff0c;实现…

阻碍NB-IoT技术在智能水表发展的4个原因分析

与以往的机械水表不同&#xff0c;根据设备所搭载的模块&#xff0c;智能水表分为IC卡智能表、光电直读智能表以及无线远传智能表。随着物联网技术和工业的发展&#xff0c;无线远程传输智能水表开始被水务公司广泛使用。 以往的机械水表、指针式表盘、复杂的读取值在复杂的设置…

POE供电交换机技术分析及工作过程详解

PoE供电是指在以太网中透过双绞线来将电力传输到设备的技术&#xff0c;它无需改动现有的以太网布线基础架构&#xff0c;在为一些基于IP的终端传输数据信号的同时&#xff0c;还能为此类设备提供直流供电。透过这项技术&#xff0c;可以供电给网路电话、无线、网路摄影机、集线…

LoRa和NB-IoT会长期共存吗?

物联网有很多无线通信技术&#xff0c;主要是Zigbee&#xff0c;WiFi&#xff0c;蓝牙和Z-wave等短距离通信技术&#xff0c;另一种是LPWAN。LPWAN的两种类型之一在未授权的频谱上工作。另一种是2G/3G/4G蜂窝通信技术&#xff0c;该技术在获得行政许可的频谱下工作&#xff0c;…

PoE供电交换机的五大优势详解

众所周知&#xff0c;电气设备只有通电后才能工作&#xff0c;而一些基于IP网络的各种设备也同样需要供电才能使用&#xff0c;比如说路由器、摄像头等&#xff0c;当然啦&#xff0c;自从有了PoE供电技术后&#xff0c;IP网络设备就又多了一种供电方式。POE在为一些基于IP的终…

Java是发展的垫脚石。 学习吧!

Java是世界上最常用的编程语言之一 。 尽管也有许多其他的编程语言&#xff0c;但是没有什么能比Java强。 Java是用于开发移动应用程序&#xff0c;游戏&#xff0c;Web应用程序&#xff0c;桌面应用程序和许多其他令人兴奋的事物的出色语言之一。 而且&#xff0c;事实证明&a…

蓝牙、WiFi、ZigBee三大无线通信技术协议模块哪一个是最好的?

曾经&#xff0c;在2015年极客公园创新大会上&#xff0c;小米首次在非官方平台发布了新款产品小米智能家庭套装。自此&#xff0c;Zigbee便常出现在大众视野中。 如今&#xff0c;小米在IoT物联网应用开发者平台上明确说明&#xff0c;不再推广Zigbee的接入方案。 有人猜测&…

[渝粤教育] 山东大学 大学物理 参考 资料

教育 -大学物理-电磁学和光学-章节资料考试资料-山东大学【】 1.1 电荷和库仑定律 随堂测试 1、【多选题】下面的说法正确的是&#xff08; &#xff09; A、电荷是相对论不变量 B、电荷是量子化的 C、库仑力满足线性叠加原理&#xff0c;第三者的存在会改变两者之间的相互作用…

大功率超远距离lora无线数传电台,多级中继功能

一、在无线通信领域&#xff0c;LoRa是目前市场最被看好的技术之一。随着新一代LoRa调制技术的升级&#xff0c;市场对LoRa技术的认知、认可逐步提高&#xff0c;基于LoRa调制技术开发的产品得到更广泛的应用。受益于其超低的接收灵敏度和独特的调制方式&#xff0c;带来了超远…

POE交换机和普通交换机的区别介绍

POE交换机与普通交换机区别的话&#xff0c;POE交换机就是除了能提供普通交换机所具有的传输功能&#xff0c;还能给网线的另一端设备提供供电功能。普通的交换机主要是交换数据的功能&#xff0c;并没有具备供电的功能。接下来我们就一起来详细看看POE交换机和普通交换机的区别…

Lora无线传输技术与Lorawan无线模块的区别

有不少人分不清LoRaWAN无线模块与LoRa网关无线传输技术到底有什么区别&#xff0c;他们在物联网领域的应用到底是什么样的。 LoRaWAN指的是MAC层的组网协议&#xff0c;而LoRa是一个物理层的协议。虽然现有的LoRaWAN组网基本上都使用LoRa作为物理层&#xff0c;但是LoRaWAN的协…

飞畅科技 POE供电交换机常见问题详解

POE交换机通过网线供电的方式为标准的POE终端设备供电&#xff0c;可以免去额外的电源布线&#xff0c;在为一些基于IP的终端&#xff08;如IP电话机、无线局域网接入点AP、网络摄像机等&#xff09;传输数据信号的同时&#xff0c;还能为此类设备提供直流供电的技术。POE技术能…

[渝粤教育] 上海交通大学 制造工艺基础 参考 资料

教育 -制造工艺基础-章节资料考试资料-上海交通大学【】 第一章 机械制造系统与制造技术的发展 单元测验 1、【单选题】制造系统功能结构不仅应看到物质的流动过程&#xff0c;更应注重控制物流的&#xff08; &#xff09;。 A、能量流 B、信息流 C、物资流 D、电流 参考资料【…

【物联网串口服务器通信经验教程】Modbus网关协议转换

在前面的文章中&#xff0c;我们已经详细地介绍了Modbus网关的几种主要类型&#xff0c;今天&#xff0c;就让我们来介绍一下其中简单协议转换的处理过程。 简单协议转换是最常规、最普遍的Modbus网关功能&#xff0c;也是数据处理效率最高Modbus网关模式&#xff0c;它只是提…

一文看懂串口服务器多主机网关工作模式

多主机网关仅能工作在TCP服务器模式下&#xff0c;可同时处理多台Modbus TCP的主机请求&#xff0c;串口服务器在一个主机请求未完成时又收到了其他的主机请求此时串口服务器会在RS485总线上进行仲裁输出&#xff08;通俗地讲就是对后来的指令进行阻塞&#xff09;。 仿真软件演…

程控交换机管理与维护注意事项详解

程控交换机&#xff0c;通常专指用于电话交换网的交换设备&#xff0c;它以计算机程序控制电话的接续&#xff0c;是利用现代计算机技术&#xff0c;完成控制、接续等工作的电话交换机。那么&#xff0c;程控交换机管理与维护中有哪些事项需要注意呢&#xff1f;接下来我们就一…

[渝粤教育] 上海交通大学 理论力学 参考 资料

教育 -理论力学-章节资料考试资料-上海交通大学【】 数学基础 1、【单选题】 A、 B、 C、 D、 参考资料【 】 2、【单选题】<img src"http://edu-image.nosdn.127.net/916C09E309887D88B0901AE96FA571C3.jpg?imageView A、 B、‍ C、 D、‍ 参考资料【 】 3、【单选题…