基于STM32F103最小系统板和DL-LN33 2.4G通信 ZigBee无线串口自组网采集温湿度

文章目录

  • 前言
    • 一、组网概述
    • 二、产品特性
    • 三、电气特性
    • 四、引脚配置
    • 五、UART通信协议
      • 5.1 UART参数
      • 5.2 包分割
      • 5.3 端口
      • 5.4 举例通信
        • 5.4.1 一个节点给另一个节点发送数据
        • 5.4.2 一个节点给另一个节点的内部端口发送数据
        • 5.4.3 一个节点给自己的内部端口发送数据
        • 5.4.4 不推荐的数据传输情况
      • 5.5 内部端口
        • 5.5.1 红灯闪烁控制端口
        • 5.5.2 基本信息管理端口
        • 5.5.3 错误报告端口
    • 六 参考示例
  • 总结


前言

  DL-LN3X 系列模块是新晋推出的无线通信模块,该模块专为需要自动组网多跳传输的应用场合设计。相对于其他常见的自组网无线通信解决方案,本方案更加灵活、可靠,可长期稳定工作;用户可以抛开复杂的协议栈和芯片手册,只需要掌握简单的串口通讯便可驾驭无线多跳传输。

一、组网概述

  DL-LN3X 模块是一种自组网多跳无线通信模块。模块无线频率为 2.4GHz~2.45GHz,属于全球免费的无线频段。该模块工作时,会与周围的模块自动组成一个无线多跳网络,此网络为对等网络,不需要中心节点,网络包含以下可配置参数:
  将多个 DL-LN3X 模块配置成地址不相同,信道和网络 ID 相同的状态,模块将组成一个网络。微控制器(MCU)或者电脑通过 Uart 告诉模块目标地址和待发送的数据,模块会通过网络选择最优的路径,将信息传输给目标模块,而目标模块将通过Uart 输出源地址和上述的数据。

  DL-LN3X 模块使用定向扩散协议寻找路由,这种路由算法会记录网络的状态,每个节点平均可记录 190 个目标节点的路由,在网络建立后传输速度和传输延时可到达最优。但这种算法网络建立较慢,在节点刚刚启动时,网络需要 1~5 分钟的时间重新生成路由,在这段时间内网络使用洪泛路由进行数据通信,此时网络的传输速度较慢。

二、产品特性

  1. 定向扩散型自组网协议
     模块上电后会自动组成多跳网状网络,完全不需要用户干预。
     每个模块都可以给网络中任意一个节点发送数据。
     带有确认传输功能,无线传输使用 CRC 校验,最多重传 15 次。
     网络中任何节点故障不影响整个网络的运行,具有很强的抗毁性。
     最大可支持 190 个模块组成网络,模块地址可通过 Uart 进行修改。
     单个包长可达 63 字节,带有数据包缓冲机制。
  2. 用户接口简单易学
     使用 uart 作为交互接口。
     波特率可调。
     使用长度可变的包传输数据,使用安全的数据分包协议。
     支持端口分割机制。
  3. 程序工作稳定
     操作系统基于线程切片,工作稳定。
     使用内存池代替堆完成动态内存分配,长期工作不产生内存碎片。
  4. 带有指示灯
     模块带有收/发包指示灯。
     模块带有定位指示灯,可以远程点亮,方便寻找。

三、电气特性

参数
工作电压 / 电流2.5~3.6V / 小于30mA
无线发送功率4.5dBm
工作频率2400~2450MHz
传输速率因为发送包的路由信息会占用一定的带宽,每个包的长度越长,发送效率越高。每个包包含 3Byte 数据时,2400Bit/s。每个包包含 30Byte 数据时,10KBit/s。
天线接口板载 PCB 天线
工作信道符合 IEEE802.15.4 协议的 16 个信道划分
通信接口UART 通信(支持 8 种波特率:2400/4800/9600/14400/19200/28800/38400/57600/115200/230400/125000/250000/500000)
接收灵敏度-97dBm
组网最大跳数 / 节点数 / 包长度15 跳 / 典型值为 190 个点 / 63Byte
丢包重传次数最多 15 次,网络负载高时,最少 5 次。
空中速率 / 延时250KBit/s / 节点间单挑,小于 10ms。
工作温度-40°C~85°C
模块尺寸18*23.5mm
传输距离70 米(空旷无遮挡)

四、引脚配置


五、UART通信协议

5.1 UART参数

DL-LN3X 模块使用 Uart 接口作为数据交互接口,接口的参数如下:
数据位    8 位
起始位    1 位
停止位    1 位
校验位    无校验
Uart 接口的波特率可以被用户设置为以下值:UART
  2400 4800 9600 14400 19200 28800 38400 57600 115200 230400 125000 250000 500000
几乎任何单片机的 Uart 输出都可以和 DL-LN3X 模块的 UART 进行通讯,电脑串口则可以使用 MAX3232 芯片转换为 UART 与 DL-LN3X 进行通信。

5.2 包分割

在通信过程中,最常见的场合是单片机通过UART告诉模块这样的信息:
“将数据 00 AE 13 33 发往地址为 0003 的模块,目标端口为 90,源端口为 91。”
对于单片机,需要将这些信息整理成一个包,通过UART发给模块:FE 08 91 90 03 00 00 AE 13 33 FF
此包的说明如下表:
  远程地址长度为 2byte,使用小端模式进行传输,即先传输低 8 位,再传输高 8 位。
  传输过程中如果遇到数据部分、地址或者端口号中出现 FF,则使用 FE FD 来代替;如果出现 FE,则用 FE FC 来代替。以免传输过程中出现的包头和包尾,使接收方误判断。在传输中这种替换称为“转义”。
  包长度不会受到转义的影响,例如发送的数据为 09 FF 时,替换为 09 FE FD,但包头中的数据长度仍然按照 2+4来计算,这样,发送的包如下:FE 06 91 90 03 00 09 FE FD FF
  虽然一共传输了 7 个字节,但包长为 6。如果地址、端口号中出现了 FF、FE 也需要进行转义。

5.3 端口

  DL-LN3X 模块设计了端口的概念,接收方收到一个包时,会根据包的端口号,选择对应的程序处理包。端口号的取值范围是0x00 ~ 0xFF,其中 0x00 ~ 0x7F端口由模块内部程序占用,用于调试设计, 0x80~0xFF 端口开放给 UART 连接的 MCU 或者电脑。
  当 MCU 给一个模块发送数据时,如果源端口号填写了小于 0x80 的值,则包无法发出;如果目的端口号填写了小于 0x80 的值,接收方模块的内部程序将处理这个包并执行相关的动作,而不是从 UART 发出这个包。
  例如发送这个包:FE 05 91 20 03 00 0A FF
  则会让地址为 03 00 的模块自带的红灯点亮 1 秒,而他的 UART 不会输出数据。

5.4 举例通信

5.4.1 一个节点给另一个节点发送数据

  例如将多个节点组成如下网络,在本文中节点特指 PC 或 MCU 和 DL-LN3X 模块组成的硬件设备。MCU 采集到温湿度为温度 23℃,湿度 60%,则无线传输的数据是 0x17,0x3C。节点和电脑都使用 A0 端口传输温度,A1 端口传输湿度,MCU 已知连接电脑的模块地址为 0x000F,则 MCU 发给模块的数据为:
  FE 05 A0 A0 0F 00 17 FF FE 05 A1 A1 0F 00 3C FF
则电脑串口收到的数据为:
  FE 05 A0 A0 01 00 17 FF FE 05 A1 A1 01 00 3C FF
电脑串口收到的数据中远程地址被替换为了源节点的地址。

5.4.2 一个节点给另一个节点的内部端口发送数据

寻找当前网络地址节点,如寻找地址为 0x0002 的节点时,PC 命令此模块的红灯点亮 5 秒,则 PC 发送:
  FE 05 A3 20 02 00 32 FF
可以看到地址为 0x0002 的模块红灯点亮 5 秒。

5.4.3 一个节点给自己的内部端口发送数据

  模块可以给自己的端口发送数据。详细说明看后面介绍。

5.4.4 不推荐的数据传输情况

使用当前节点网络,不推荐的传输情况有以下两种。

  1. 模块使用小于 80 的端口号作为源端口号,例如模块发送 FE 05 20 20 02 00 32 FF 则模块会收到一个端口号错误报告包:FE 06 22 20 02 00 E0 20 FF,实际上,模块不会传送任何数据,所以这样的传输是不推荐的。
  2. 模块给自己的某个端口传输数据。例如地址为 0x000F 的节点,传输数据给自己的 80 端口,模块发送FE 05 81 80 0F 00 32 FF,则自己会收到 FE 05 81 80 0F 00 32 FF,节点的单片机自己给自己传输了一条数据,这显然是不必要的,所以这样的传输是不推荐的。

5.5 内部端口

  模块内部已经规定的端口,包括这些端口可以接受的包,以及这些这些端口会发出的包。在对包进行说明时,仅对数据部分进行说明。例如:

  此包是一个端口 21 可以接受的包,则实际通过UART 发出的数据是:FE 07 91 21 00 00 12 98 88 FF,其中 91 可以是任意端口号,00 00 是目标地址,12 为命令,98 99 为新网络 ID。

5.5.1 红灯闪烁控制端口

  端口 0x20 用于控制模块的红色 LED 点亮,发送此包可以使模块的红色 LED 点亮一定时间。发出数据是: FE 05 80 20 00 00 01 FF,其中 20 是控制LED的端口号,00 00 是目标地址,01 为点亮时间。
此端口可接收以下包:

  发送这个数据给此模块可以点亮红色 LED,用户既可以给本地模块发送这个包,也可以给远程模块发送这个包。
这一功能用于测试一个指定地址的模块是否包含在网络中,如果想从许多节点中迅速找到某个特定地址的节点,也可以使用此功能。

5.5.2 基本信息管理端口

  端口 0x21 用于配置模块的基本参数,包括 地址,网络 ID,信道和波特率。此端口只接受远程地址填写 0x0000 的包,因此,这些信息的读取和修改只能通过本模块的 UART进行,不能远程操作。
  如果不知道模块配置的波特率,可以将 BaudReset 引脚连接到 GND,这样便可以使用 115200 波特率对模块进
行配置。
  注意: 只有使用 0x0000 作为目标地址才能与 21 端口进行通信,0x0000 即模块的本地地址。

  向模块发送配置命令后,模块会返回 FE 05 21 90 00 00 00 FF,表示配置完成,返回信息会指示发包的错误,错误信息详见响应包 。
  最后如果配置信息确认无误,向模块发送 FE 05 90 21 00 00 10 FF,模块会进行重启,然后使用新的参数进行工作。

5.5.3 错误报告端口

  端口 0x22 用于报告通信错误,用户不能向这个端口发送数据,当用户发送数据使用不合法的地址时,这个端口会发送错误报告包:

  当用户发送源地址小于 0x80 的包时,将会收到来自这个端口的错误报告

六 参考示例

  1.准备工作:两个以上DL-LN33组网模块(一主多从),两个个USB转TTL,一个DHT11温湿度传感器、STM32F103C8T6最小系统板。
  2.引脚接线

DL-LN33、DHT11USB-TTL、STM32最小系统板
LN33 / DHT11-VCC3.3V
LN33 / DHT11-GNDGND
LN33-TXUSB-TTL:RX,PB11
LN33-RXUSB-TTL:TX,PB10
DHT11-DPB8

  3.两个USB转TTL分别连接两个组网模块,通过拓扑软件观察组网情况和收发包数据,(红色节点为主节点)

   注: 组网测试拓扑,1. 拓扑软件会占用网络资源传输组网信息,会让网络传输速度变慢,适合用于检测网络连接情况,不适合长期使用;2. 拓扑软件会自动避让正常通信,让通信先进行,在网络较大时会出现拓扑获取失败,但不意味网络出现异常
  4.获取主节点地址(接USB转TTL为主节点,接最小系统板为从节点)
  5.参考例程

/** main.c **/
#include "led.h"
#include "lee.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "dht11.h" 	
#include "package.h"
#include "DL_LN3X.h"
#include "usart3.h"			 	 
#include "string.h"	  
#include <stdio.h>  
//温湿度采集实验
void recievePkg(sPkg* pkg);
void loopReceive(void);
void loopAll(void);
void initAll(void);
extern void uartRevieveByte(u8 data);u8 temperature;  	    u8 humidity;  
//newPkg(num)是一个宏,这个宏展开后是一个包结构体,包的数据部分长度是num
//使用下面的语句可以在RAM中生成一个带有3个数据的包
//newPkg(3) redPkg={	
//	.length = 7,
//	.src_port = 0x90,
//	.dis_port = 0x32,
//	.remote_addr = 0x0000,
//	.data = {0,10,20}
//};newPkg(3) redPkg={7,0x90,0x32,0x00,0x00,{0,10,20}};char buf1[7]={0x05,0x90,0x21,0x00,0x00,0x01,0xFF};//读取模块的地址指令,注意最前面的0xFE不加到数组里面,因为sendPkg函数里面自动会发0xfe
char buf2[7]={0x05,0x90,0x21,0x00,0x00,0x02,0xFF};//读取模块的网络ID指令
char buf3[7]={0x05,0x90,0x21,0x00,0x00,0x03,0xFF};//读取模块的信道指令
char buf4[7]={0x05,0x90,0x21,0x00,0x00,0x04,0xFF};//读取模块的波特率指令newPkg(1) THPkg={5,0x90,0x32,0xCB,0x36,{0}};//注意包格式,0xCB,0x36为主节点地址void loopAll()
{ u16 i;u8 reclen=0;  u8 m=0;while (1){DHT11_Read_Data(&temperature,&humidity);//读取温湿度值	THPkg.dis_port = 0xa0;THPkg.data[0] = temperature;sendPkg((sPkg*)(&THPkg));for(i = 0;i<100;i++){delay_ms(10);loopReceive();}		THPkg.dis_port = 0xa1;THPkg.data[0] = humidity;sendPkg((sPkg*)(&THPkg));if(USART3_RX_STA&0X8000)			//接收到一次数据了{reclen=USART3_RX_STA&0X7FFF;	//得到数据长度for(i=0;i<reclen;i++)uartRevieveByte(USART3_RX_BUF[i]);USART3_RX_STA=0;	 }for(i = 0;i<100;i++){delay_ms(10);loopReceive();}		 							}
}//这个函数需要在工作中不断被调用,它会尝试一次接收包,
//如果接收成功就交给recievePkg处理,并再次尝试,直到收不到新的包
void loopReceive(void)
{sPkg* pkg;pkg = getNextPkg();while(pkg != NULL){recievePkg(pkg);pkg = getNextPkg();}
}//收到一个包后会调用这个函数,这个函数根据包的目的端口选择相应的程序进行处理
void recievePkg(sPkg* pkg)
{//printf((char*) pkg);//通过串口1发送给电脑,用于测试switch(pkg->dis_port){case 0xb0:		if(pkg->data[0] == 0x01){//	greenTog();LED0=!LED0;//闪烁LED,提示系统正在运行.}break;default:break;		}
}void initAll()
{delay_init();	    	 //延时函数初始化	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2uart_init(115200);	 //串口1初始化为9600usart3_init(115200);//串口3初始化为9600LED_Init();		  	 //初始化与LED连接的硬件接口 
}int main(void){	initAll();loopAll();
}/** DL_LN3X.c **/ #include "lee.h"
#include "led.h"
#include "package.h"
#include "usart.h"
#include "sys.h"//接收包使用的结构体,将端口和地址都融入了data中
typedef struct sPkgBase__
{u8 length;u8 data[63];
}sPkgBase;//收到包头函数
static void recvHead(u8 totle);
//收到包尾0xff
static void recvTerminal(void);
//收到数据函数
static void recvData(u8 data);
//这个标志在上一个收到了0xfe时赋值为yes,否则为0
static u8 escape = no;//串口收到1byte数据时,中断中调用此函数
void uartRevieveByte(u8 data)
{switch(data){case 0xff://收到结束符recvTerminal();break;case 0xfe://收到转义字符escape = yes;break;default://收到一般数据if(escape == yes){//如果前一个是转义字符escape = no;if(data <=63){recvHead(data);}else{//收到转义数据的规律是0xfe后面的数据+2还原数据recvData(data+2);}}else{//前一个不是转义字符,直接收到一个数据recvData(data);}break;}
}//接收包使用的双缓冲,其中一个供程序使用,另一个用来装入下一个包.
static sPkgBase recv_temp[2];
//确定双缓冲中哪个用于接收,哪个程序分析的变量
static volatile  u8 Loading = 0;
//用于接收装入数据的缓冲
#define Load_pkg recv_temp[Loading]
//用于程序分析的缓冲
#define User_pkg recv_temp[(Loading+1)&1]//接收计数器,表示一个包收到了多少个数据
#define RS_IDLE 0XFF//表示包还没有收到包头和长度
#define RS_DONE 0xA0//表示包已经完成了接收
static volatile u8 Recv_counter = RS_IDLE;//如果User_pkg装有一个未处理的包,此变量为 yes
static volatile u8 Received = no;
//如果用户正在分析User_pkg中的数据此变量为 yes
static volatile u8 Locked = no;//调用这个函数说明上一个包已经处理完了,并尝试接收一个包,
//如果已经收到包,则返回一个指向包的指针,否则返回null
sPkg* getNextPkg(void)
{
//	cli();sPkg* rev;Locked = no;if(Received == yes){//两个缓冲区交换过,receive就是yes进入这里Received =no;Locked = yes;rev = (sPkg*)(&User_pkg);}else{//还没有交换,那么是否应该交换呢?if(Recv_counter == RS_DONE){//如果另一个缓冲已经收完了就应该交换Loading++;Loading&=1;Recv_counter = RS_IDLE;	Locked = yes;rev = (sPkg*)(&User_pkg);			}else{//否则返回空,说明没有包待处理rev = NULL;}		}	//sei();return rev;
}static void recvHead(u8 totle)
{if(Recv_counter == RS_IDLE){Load_pkg.length = totle;Recv_counter = 0;}
}static void recvData(u8 data)
{	if(Recv_counter < Load_pkg.length){		Load_pkg.data[Recv_counter] = data;Recv_counter++;}else{Recv_counter = RS_IDLE;}
}static void recvTerminal(void)
{if(Recv_counter == Load_pkg.length){//收到完成的包if(Locked == no){//调换缓冲区Loading++;Loading&=1;Received = yes;Recv_counter = RS_IDLE;} else{//不调换缓冲区Recv_counter = RS_DONE;}}else{	//收到不完成的包,需要重新收	Recv_counter = RS_IDLE;}
}

  6.测试结果

总结

  1. 网络ID和信道相同可以组成网络互相通信
  2. 两个网络信道相同,网络ID不同,则不能相互通信,如果两个网络距离较近,则两个网络共享信道,传输速率下降
  3. 两个网络信道不同,则不能相互通信、互不干扰
  4. 网络ID不可以是0x0000和0xFFFF
  5. 信道必须是0x0B到0x1A之间的一个

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

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

相关文章

气膜体育馆的安装流程—轻空间

随着人们对健康生活和高品质运动环境的追求&#xff0c;气膜体育馆因其独特的优点而逐渐受到青睐。轻空间将详细介绍气膜体育馆的安装流程&#xff0c;从实地勘测到检测&#xff0c;再到最终的清理现场&#xff0c;每一步都至关重要&#xff0c;确保体育馆的安全性和功能性。 一…

内网穿透与异地组网强强联合,这款工具屌爆了!!!

在数字化飞速发展的今天&#xff0c;远程访问的需求日益增长&#xff0c;网络已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;远程网络连接的稳定性和安全性往往是我们关注的焦点。节点小宝作为一款创新型的远程管理工具&#xff0c;凭借其使用简单&#xff0c;高速…

RabbitMQ WEB管理端介绍

页面功能概览 Overview(概述)Connections(连接)Channels(通道)Exchanges(交换器)Queues(队列)Admin(用户管理)。 1. Overview(概述) 主要分为三部分 1.1 Queued messages&#xff08;所有队列的消息情况&#xff09; Ready&#xff1a;待消费的消息总数Unacked&#xff1a;待应…

实时美颜技术解析:视频美颜SDK如何改变直播行业

实时美颜技术的出现&#xff0c;尤其是视频美颜SDK的应用&#xff0c;正逐渐改变着直播行业的生态。 一、实时美颜技术的原理 实时美颜技术利用人工智能和图像处理算法&#xff0c;对视频中的人物面部进行优化和修饰。该技术通常包含以下几个步骤&#xff1a; 1.人脸检测和识…

OpenGL->OpenGL环境搭建和配置

OpenGL概述 OpenGL&#xff1a;用于渲染2D、3D矢量图形的APIGLEW&#xff1a;是一个跨平台的C/C库&#xff0c;能够使用更高版本的OpenGL扩展特性GLFW&#xff1a;创建和管理OpenGL上下文&#xff0c;管理渲染窗口&#xff0c;处理输入事件&#xff0c;更轻量GLUT&#xff1a;…

视频格式转换方法:如何使用视频转换器软件转换视频

众所周知&#xff0c;目前存在许多不同的视频和音频格式。但我们的媒体播放器、移动设备、PC 程序等仅兼容少数特定格式。例如&#xff0c;如果不先将其转换为 MP4、MOV 或 M4V 文件&#xff0c;AVI、WMV 或 MKV 文件就无法在 iPhone 上播放。 视频转换器允许您将一种视频格式…

解决微信小程序使用textarea输入框 type=“textarea“ 文本输入限制问题

出现的问题 type"textarea" 这个限制 微信小程序使用textarea , 输入字数大于140 时就输入不进去了 加入这个就解决了 maxlength"-1" <u-inputv-model"queryParams.orderIdTxt"border"true":focus"true":auto-height&q…

【知识学习】阐述Unity3D中Stencil的概念及使用方法示例

在Unity3D中&#xff0c;Stencil&#xff08;模板&#xff09;是一种高级的图形渲染技术&#xff0c;它允许开发者对渲染过程进行精细控制。Stencil Buffer是附加在颜色缓冲区和深度缓冲区之外的另一个缓冲区&#xff0c;它可以用来存储每个像素是否应该被渲染的信息。 Stenci…

自动化物流控制系统WCS应用与异常处理

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 WCS的定义与作用&#xff1a; 物流仓储设备…

探索AIGC治愈系创作:Stable Diffusion 带你轻松复刻某书爆款动漫卡通文案!

hello&#xff0c;大家好我是安琪&#xff01; 情感治愈类一直是受众群体很高非常火爆的赛道&#xff0c;安琪也关注到在某书平台上&#xff0c;漫画治愈类风格的内容也是非常的受欢迎。先来看看以下一些案例 看看这几个账号内容的质量就可以看出该部分内容是很受欢迎的&#x…

论文阅读Vlogger: Make Your Dream A Vlog

摘要 论文介绍了一个名为“Vlogger”的通用人工智能系统&#xff0c;它能够根据用户的描述生成分钟级的视频博客&#xff08;vlog&#xff09;。与通常只有几秒钟的短视频不同&#xff0c;vlog通常包含复杂的故事情节和多样化的场景&#xff0c;这对现有的视频生成方法来说是一…

正版软件 | DupInOut Duplicate Finder:智能清理,让数据井然有序

在信息爆炸的时代&#xff0c;我们经常面临数据管理的挑战。DupInOut Duplicate Finder 是一款专为Windows 设计的重复文件查找工具&#xff0c;帮您快速识别并删除重复的文档、音乐、视频和照片&#xff0c;让您的计算环境更加清洁、有序。 精准查找&#xff0c;一键删除 DupI…

下拉选择输入框(基于elment-ui)

最近在需求中&#xff0c;需要有一个下拉选择功能&#xff0c;又得可以输入&#xff0c;在 element-ui 官网找了&#xff0c;发现没有适合的&#xff0c;然后在修炼 cv 大法的我&#xff0c;也在网上看了一下&#xff0c;但是也都感觉不合适&#xff0c;所以就自己写了一个&…

Todesk远程连接Ubuntu卡100%,以及小窗口打不开

Todesk远程连接Ubuntu卡100%&#xff0c;以及小窗口打不开 使用Todesk远程连接Ubuntu一直卡100%进不去还有todesk里的小悬浮窗打开就会小时&#xff08;小下拉框会消失&#xff09; 使用Todesk远程连接Ubuntu一直卡100%进不去 还有todesk里的小悬浮窗打开就会小时&#xff08;小…

追求准确,还是追求举一反三,聊天机器人智能程度的困境 | Chatopera

在为企业客户上线聊天机器人客服的过程中&#xff0c;总会遇到一个问题&#xff0c;这让用户和我们都感到纠结。 到底是追求让机器人能准确的回答问题&#xff0c;还是让机器人可以举一反三的回答问题。 准确的回答问题&#xff0c;就是不容许回答错了&#xff0c;但是这样机…

这5款Windows高质量软件,吊打付费,谁用谁爽

咱们话不多说&#xff0c;进入我的电脑。 一键远控 一个支持远程控制电脑、传输文件、观看视频、锁定电脑屏幕以及重启和关机的免费远程控制软件。 再输入对应的设备识别码和验证码后&#xff0c;就可以对另一台电脑进行各种操作&#xff0c;同时也支持多台设备同时也能控制。…

北京物流调度app开发,放心邮,安全到

随着交通运输的不断发展与完善&#xff0c;我国快递物流行业也不断成熟。但普通的快递所能运输的种类和数量有限&#xff0c;且可能对一些贵重、易碎的物品造成损害。为此&#xff0c;人们将目光投向了运输种类和数量更广泛的物流运输。为了让传统的物流运输能够像快递一样便捷…

本地调试时不将服务挂到nacos

本地调试的时候不将服务挂到nacos从而影响前端和测试使用&#xff0c;需要在edit Configurations...加入一句配置信息。 -Dspring.cloud.nacos.discovery.register-enabledfalse

7月开始,考研数学0️⃣基础线代30天满分规划

线代零基础&#xff1f; 那千万不要去跟李永乐老师的线代课程&#xff0c;因为李永乐老师的线代课程比较进阶&#xff0c;适合有一定基础的同学去听&#xff0c;下面这两位才是零基础线代的神&#xff01; 一个是喻老&#xff0c;另外一个是汤家凤&#xff01; 这两个老师的…

UE4_材质_水涟漪、水深制作_Ben教程

学习笔记&#xff0c;不喜勿喷&#xff01;侵权立删&#xff0c;祝愿生活越来越好&#xff01; 效果图如下&#xff1a; 创建水材质的教程&#xff0c;首先需要外出收集一些参考&#xff0c;看一看你将要做的事情很重要&#xff0c;确定将要模仿物体的关键属性&#xff0c;从这…