ZigBee案例笔记 - 无线点灯
文章目录
- 无线点灯实验概述
- 工程关键字
- 工程文件夹介绍
- Basic RF软件设计框图简单说明
- 工程操作
- Basic RF启动流程
- Basic RF发送流程
- Basic RF接收流程
- 无线点灯案例
- 无线点灯现象
无线点灯实验概述
ZigBee无线点灯实验(即Basic RF工程),由TI公司提供的学习例程,是入门ZigBee无线通讯的经典实验,暂时没有用到协议栈,但实验所体现出来的数据发送、接收和使用协议栈的数据通讯模式是差不多的,而且 TI 公司的 Basic RF 工程代码段都有进行注释容易看懂及运用,将这个实验掌握后,将可以更好的过渡到协议栈的内容学习
工程关键字
学习无线控制实验需要线简单了解以下几个关键字
- CCM - Counter with CBC-MAC (mode of operation)
- HAL - Hardware Abstraction Layer (硬件抽象层)
- PAN - Personal Area Network (个人局域网)
- RF - Radio Frequency (射频)
- RSSI - Received Signal Strength Indicator (接收信号强度指示)
实验中用到的Basic RF 工程源码CC2530 BasicRF.rar需要用户到TI官网注册下载,所下载的案例源码仅针对TI公司的ZigBee开发板进行配置的,烧录到其他ZigBee开发板需要修改配置后才能正常使用
工程文件夹介绍
Basic RF工程下载连接 TI官网Basic RF工程压缩包下载
拿到工程源码CC2530 BasicRF.rar解压后可以看到目录下有3个文件夹,如图分别是docs文件夹、ide文件夹和source文件夹
将docs文件夹、ide文件夹和source文件夹展开后如下
docs文件夹
打开文件夹里面仅有一个名为 CC2530_Software_Examples 的 PDF 文档,文档的主要内容是介绍 BasicRF 的特点、结构及使用,如果使用 TI 的开发板的话阅读这个文档就可以做 Basic RF 里面的实验了,阅读文档可以知道,Basic RF工程包含三个实验例程:无线点灯、传输质量检测、谱分析应用。
ide文件夹
打开文件夹后会有三个文件夹和一个 cc2530_sw_examples.eww 工程,这个工程是上面提及的三个实验例程工程的集合,也包含了无线点灯的实验工程,在IAR 环境中打开,在 workspace 看到3个实验工程如图
ide\settings文件夹
在每个基础实验的文件夹里面都会有的,主要保存用户工程的 IAR 环境配置
ide\srf05_cc2530\iar文件夹
这里放有三个工程,light_switch.eww、per_test.eww、spectrum_analyzer.eww,如果不习惯cc2530_sw_examples.eww 工程中几个工程集合在一起看,可以在这里直接对应的实验工程
source文件夹
文件夹里面有 apps 文件夹和 components 文件夹
source\apps文件夹
存放 Basic RF 三个实验(light_switch、per_test、spectrum_analyzer)的应用实现的源代码,即用户代码存放的地方
source\components文件夹
包含 BasicRF 的应用程序使用不同组件的源代码
Basic RF软件设计框图简单说明
Hardware layer
硬件层,在最底下,是实现数据传输的基础
Hardware Abstraction layer
它提供了一种接口来访问 TIMER,GPIO,UART,ADC 等硬件资源,这些接口都通过相应的函数进行实现
Basic RF layer
为双向无线传输提供一种简单的协议,Basic RF 由 TI 公司提供,它包含了 IEEE 802.15.4 标准的数据包的收发功能但并没有使用到协议栈,它仅仅是是让两个结点进行简单的通信,也就是说Basic RF 仅仅是包含着 IEEE 802.15.4 标准的一小部分而已。其主要特点有:
- 不会自动加入协议、也不会自动扫描其他节点也没有组网指示灯(LED3)。
- 没有协议栈里面所说的协调器、路由器或者终端的区分,节点的地位都是相等的。
- 没有自动重发的功能。
Basic RF layer 为双向无线通信提供了一个简单的协议,通过这个协议能够进行数据的发送和接收
Application layer
是用户应用层,它相当于用户使用 Basic RF 层和 HAL 的接口,也就是说我们通过在 Application layer 就可以使用到封装好的 Basic RF 和 HAL 的函数
工程操作
TI的Basic RF工程目录下CC2530 BasicRF\ide\srf05_cc2530\iar\light_switch.eww打开无线点灯工程
Basic RF 还提供了安全通信所使用的 CCM-64 身份验证和数据加密,它的安全性可以通过在工程文件里面定义 SECURITY_CCM,右键工程列表打开Option,如图工程中不需要启用安全通信加密,在SECURITY_CCM前面加上x,取消加密
Basic RF启动流程
确保外围器件没有问题,创建一个 basicRfCfg_t 的数据结构,并初始化其中的成员,在basic_rf.h 代码中可以找到结构体定义
/***********************************************************************************
* TYPEDEFS
*/typedef struct {uint16 myAddr; //16 位的短地址(就是节点的地址) uint16 panId; //节点的 PAN IDuint8 channel; //RF 通道(必须在 11-26 之间)uint8 ackRequest; //目标确认就置 true
#ifdef SECURITY_CCM //是否加密,预定义里取消了加密uint8* securityKey;uint8* securityNonce;
#endif
} basicRfCfg_t;
调用 basicRfInit()函数进行RF无线通信协议的初始化,在 basic_rf.c 代码中可以找到函数定义,函数对 Basic RF 的数据结构初始化,设置节点的传输通道,短地址,PAN ID
uint8 basicRfInit(basicRfCfg_t* pRfConfig)
{if (halRfInit()==FAILED)return FAILED;halIntOff();// Set the protocol configurationpConfig = pRfConfig;rxi.pPayload = NULL;txState.receiveOn = TRUE;txState.frameCounter = 0;// Set channelhalRfSetChannel(pConfig->channel);// Write the short address and the PAN ID to the CC2520 RAMhalRfSetShortAddr(pConfig->myAddr);halRfSetPanId(pConfig->panId);// if security is enabled, write key and nonce#ifdef SECURITY_CCMbasicRfSecurityInit(pConfig);#endif// Set up receive interrupt (received data or acknowlegment)halRfRxInterruptConfig(basicRfRxFrmDoneIsr);halIntOn();return SUCCESS;
}
Basic RF发送流程
创建一个buffer存放无线发送的指令,调用 basicRfSendPacket()函数发送,并查看其返回值,在 basic_rf.c 中可以找到函数定义,其中传参为目标节点的短地址 destAddr
,发送的buffer指针 pPayload
和buffer长度 length
,调用函数给目的短地址发送指定长度的数据,发送成功时返回 SUCCESS,失败则返回 FAILED
uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length)
{uint8 mpduLength;uint8 status;// Turn on receiver if its not onif(!txState.receiveOn) {halRfReceiveOn();}// Check packet lengthlength = min(length, BASIC_RF_MAX_PAYLOAD_SIZE);// Wait until the transceiver is idlehalRfWaitTransceiverReady();// Turn off RX frame done interrupt to avoid interference on the SPI interfacehalRfDisableRxInterrupt();mpduLength = basicRfBuildMpdu(destAddr, pPayload, length);#ifdef SECURITY_CCMhalRfWriteTxBufSecure(txMpdu, mpduLength, length, BASIC_RF_LEN_AUTH, BASIC_RF_SECURITY_M);txState.frameCounter++; // Increment frame counter field#elsehalRfWriteTxBuf(txMpdu, mpduLength);#endif// Turn on RX frame done interrupt for ACK receptionhalRfEnableRxInterrupt();// Send frame with CCA. return FAILED if not successfulif(halRfTransmit() != SUCCESS) {status = FAILED;}// Wait for the acknowledge to be received, if anyif (pConfig->ackRequest) {txState.ackReceived = FALSE;// We'll enter RX automatically, so just wait until we can be sure that the ack reception should have finished// The timeout consists of a 12-symbol turnaround time, the ack packet duration, and a small marginhalMcuWaitUs((12 * BASIC_RF_SYMBOL_DURATION) + (BASIC_RF_ACK_DURATION) + (2 * BASIC_RF_SYMBOL_DURATION) + 10);// If an acknowledgment has been received (by RxFrmDoneIsr), the ackReceived flag should be setstatus = txState.ackReceived ? SUCCESS : FAILED;} else {status = SUCCESS;}// Turn off the receiver if it should not continue to be enabledif (!txState.receiveOn) {halRfReceiveOff();}if(status == SUCCESS) {txState.txSeqNumber++;}#ifdef SECURITY_CCMhalRfIncNonceTx(); // Increment nonce value
#endifreturn status;
}
Basic RF接收流程
调用basicRfPacketIsReady()函数检测节点是否准备好读取新的数据包,在 basic_rf.c 中可以找到函数定义,如果准备好则返回TURE
uint8 basicRfPacketIsReady(void)
{return rxi.isReady;
}
调用 basicRfReceive()函数,把收到的数据复制到接收节点的buffer 中,代码可以在 basic_rf.c 中可以找到函数定义,函数接收来自 Basic RF 层的数据包,并为所接收的数据和 RSSI 值配置缓冲区
uint8 basicRfReceive(uint8* pRxData, uint8 len, int16* pRssi)
{// Accessing shared variables -> this is a critical region// Critical region starthalIntOff();memcpy(pRxData, rxi.pPayload, min(rxi.length, len));if(pRssi != NULL) {if(rxi.rssi < 128){*pRssi = rxi.rssi - halRfGetRssiOffset();}else{*pRssi = (rxi.rssi - 256) - halRfGetRssiOffset();}}rxi.isReady = FALSE;halIntOn();// Critical region endreturn min(rxi.length, len);
}
无线点灯案例
上面的配置流程了解了无线点灯的代码配置流程后,开始修改工程源码,无线点灯实验需要用到2块ZigBee节点板,一块作为ZigBee无线发送节点(按键发送无线指令),另一块作为ZigBee无线接收节点(接收无线指令控灯),在Basic RF工程中功能实现的代码都在light_switch.c文件中,开头用宏定义配置了节点主要参数,包含发送节点和接收节点的16位短地址、RF通道、PAN ID等关键参数
/***********************************************************************************
* CONSTANTS
*/
// Application parameters
#define RF_CHANNEL 25 // 2.4 GHz RF channel// BasicRF address definitions
#define PAN_ID 0x2007
#define SWITCH_ADDR 0x2520
#define LIGHT_ADDR 0xBEEF
#define APP_PAYLOAD_LENGTH 1
#define LIGHT_TOGGLE_CMD 0// Application states
#define IDLE 0
#define SEND_CMD 1// Application role
#define NONE 0
#define SWITCH 1
#define LIGHT 2
#define APP_MODES 2
创建发送节点和接收节点的buffer,创建节点结构体
/***********************************************************************************
* LOCAL VARIABLES
*/
static uint8 pTxData[APP_PAYLOAD_LENGTH];
static uint8 pRxData[APP_PAYLOAD_LENGTH];
static basicRfCfg_t basicRfConfig;
在main函数里有很多配置是实验中用不到的,比如LCD屏幕显示、遥感按键操作等,可以直接屏蔽不需要的代码部分,修改后的main函数如下(屏蔽部分已删除,详细可自行查看工程),main函数中配置了发送节点/接收节点的结构体共同部分(PAN_ID、RF_CHANNEL、TRUE),初始化板级硬件和RF无线功能、关闭板载LED,然后是按照不同节点进入不同的节点函数进行循环(发送节点进入appSwitch()函数,屏蔽appLight()函数,接收节点进入appLight()函数,屏蔽appSwitch()函数),工程不会运行到HAL_ASSERT(FALSE)函数,以下为发送节点的main函数
void main(void)
{// Config basicRFbasicRfConfig.panId = PAN_ID;basicRfConfig.channel = RF_CHANNEL;basicRfConfig.ackRequest = TRUE;
#ifdef SECURITY_CCMbasicRfConfig.securityKey = key;
#endif// Initalise board peripheralshalBoardInit();// Initalise hal_rfif(halRfInit()==FAILED) {HAL_ASSERT(FALSE);}// Indicate that device is poweredhalLedClear(1);halLedClear(2);//无线点灯核心函数appSwitch();
// appLight();// Role is undefined. This code should not be reachedHAL_ASSERT(FALSE);
}
发送节点函数appSwitch(),将点灯指令放到pTxData发送数组中,配置发送节点短地址后初始化节点结构体,发送节点不需要做无线接收调用basicRfReceiveOff()函数关闭无线接收功能;在while循环中判断按键是否按下,按下则调用basicRfSendPacket()函数发送无线信息,LED2闪烁提示无线信息已发送,随后进入低功耗模式等待按键再次按下
static void appSwitch()
{
#ifdef ASSY_EXP4618_CC2420halLcdClearLine(1);halLcdWriteSymbol(HAL_LCD_SYMBOL_TX, 1);
#endifpTxData[0] = LIGHT_TOGGLE_CMD;// Initialize BasicRFbasicRfConfig.myAddr = SWITCH_ADDR;if(basicRfInit(&basicRfConfig)==FAILED) {HAL_ASSERT(FALSE);}// Keep Receiver off when not needed to save powerbasicRfReceiveOff();// Main loop
while (TRUE) {
// 按键判断if( halButtonPushed() == HAL_BUTTON_1 ) {basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);HAL_LED_TGL_2();halMcuWaitMs(50);HAL_LED_TGL_2();// Put MCU to sleep. It will wake up on joystick interrupthalIntOff();halMcuSetLowPowerMode(HAL_MCU_LPM_3); // Will turn on global// interrupt enablehalIntOn();}}
}
接收节点函数appLight()(需要屏蔽main函数中的appSwitch()),配置接收节点短地址后初始化节点结构体,basicRfReceiveOn()函数打开无线接收功能,在while循环中检测接收节点是否做好接收无线数据包的准备,然后判断是否收到数据包;在收到数据包后判断无线指令是否为点灯指令,是的话闪烁LED2提示成功接收无线消息,将LED1状态进行反转完成控灯操作
static void appLight()
{
// halLcdWriteLine(HAL_LCD_LINE_1, "Light");
// halLcdWriteLine(HAL_LCD_LINE_2, "Ready");#ifdef ASSY_EXP4618_CC2420halLcdClearLine(1);halLcdWriteSymbol(HAL_LCD_SYMBOL_RX, 1);
#endif// Initialize BasicRFbasicRfConfig.myAddr = LIGHT_ADDR;if(basicRfInit(&basicRfConfig)==FAILED) {HAL_ASSERT(FALSE);}basicRfReceiveOn();// Main loopwhile (TRUE) {while(!basicRfPacketIsReady());if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) {if(pRxData[0] == LIGHT_TOGGLE_CMD) {HAL_LED_TGL_2();halMcuWaitMs(50);HAL_LED_TGL_2();halLedToggle(1);}}}
}
如果所用到的ZigBee开发板并不是TI公司的开发板,需要检查工程中的按键引脚和LED引脚定义是否可以直接应用到所用的ZigBee开发板上,在hal_board.h文件中找到LED和按键的端口引脚宏定义,按照ZigBee开发板原理图做对应修改
// LEDs
#define HAL_BOARD_IO_LED_1_PORT 1 // Green
#define HAL_BOARD_IO_LED_1_PIN 0
#define HAL_BOARD_IO_LED_2_PORT 1 // Red
#define HAL_BOARD_IO_LED_2_PIN 1
#define HAL_BOARD_IO_LED_3_PORT 1 // Yellow
#define HAL_BOARD_IO_LED_3_PIN 4
#define HAL_BOARD_IO_LED_4_PORT 0 // Orange
#define HAL_BOARD_IO_LED_4_PIN 1// Buttons
#define HAL_BOARD_IO_BTN_1_PORT 1 // Button S1 by YUAN
#define HAL_BOARD_IO_BTN_1_PIN 2
无线点灯现象
工程编译成功后分别上传至ZigBee发送节点和ZigBee接收节点
按下发送节点的按键进行控制指令发送,观察接收节点板的LED1状态
相关文章:
ZigBee案例笔记 - 无线点灯
文章目录 无线点灯实验概述工程关键字工程文件夹介绍Basic RF软件设计框图简单说明工程操作Basic RF启动流程Basic RF发送流程Basic RF接收流程 无线点灯案例无线点灯现象 无线点灯实验概述 ZigBee无线点灯实验(即Basic RF工程),由TI公司提供…...
Debezium日常分享系列之:向 Debezium 连接器发送信号
Debezium日常分享系列之:向 Debezium 连接器发送信号 一、概述二、激活源信号通道三、信令数据集合的结构四、创建信令数据集合五、激活kafka信号通道六、数据格式七、激活JMX信号通道八、自定义信令通道九、Debezium 核心模块依赖项十、部署自定义信令通道十一、信…...
《C#程序设计教程》总复习
一、单项选择题 1.short 类型的变量在内存中占据的位数是 ( )。 A. 8 B. 16 C. 32 D. 64 2.对千 int[ 4,5]型的数组 a, 数组元素 a[2,3] 存在数组第 ( )个位置上。 A. 11 B. 12 C. 14 D. 15 3.设 int 类型变量 x,y,z 的值分别是2、3、6 , 那么…...
为什么ChatGPT选择了SSE,而不是WebSocket?
我在探索ChatGPT的使用过程中,发现了一个有趣的现象:ChatGPT在实现流式返回的时候,选择了SSE(Server-Sent Events),而非WebSocket。 那么问题来了:为什么ChatGPT选择了SSE,而不是We…...
appium入门基础
介绍 appium支持在不同平台的UI自动化,如web,移动端,桌面端等。还支持使用java,python,js等语言编写自动化代码。主要用于自动化测试脚本,省去重复的手动操作。 Appium官网 安装 首先必须环境有Node.js用于安装Appium。 总体来…...
jsp介绍
JSP 一种编写动态网页的语言,可以嵌入java代码和html代码,其底层本质上为servlet,html部分为输出流,编译为java文件 例如 源jsp文件 <% page contentType"text/html; charsetutf-8" language"java" pageEncoding&…...
Debian安装k8s记录
Debian安装k8s记录 在master和node上安装kube安装master安装node遇到的问题汇总1、kubelet.service报错 failed to pull image "registry.k8s.io/pause:3.6"2、node重启后报错,failed: open /run/flannel/subnet.env: no such file or directory 在master…...
第6课 用window API捕获麦克风数据并加入队列备用
今天是2024年1月1日,新年的第一缕阳光已经普照大地,祝愿看到这篇文章的所有程序员或程序爱好者都能在新的一年里持之以恒,事业有成。 今天也是我加入CSDN的第4100天,但回过头看一看,这么长的时间也没有在CSDN写下几篇…...
图片预览 element-plus 带页码
vue3、element-plus项目中,点击预览图片,并显示页码效果如图 安装 | Element Plus <div class"image__preview"><el-imagestyle"width: 100px; height: 100px":src"imgListArr[0]":zoom-rate"1.2":max…...
【小白专用】winform启动界面+登录窗口 更新2024.1.1
需求场景:先展示启动界面,然后打开登录界面,如果登录成功就跳转到主界面 首先在程序的入口路径加载启动界面,使用ShowDialog显示界面, 然后在启动界面中添加定时器,来实现显示一段时间的效果,等…...
自动化网络故障修复管理
什么是故障管理 故障管理是网络管理的组成部分,涉及检测、隔离和解决问题。如果实施得当,网络故障管理可以使连接、应用程序和服务保持在最佳水平,提供容错能力并最大限度地减少停机时间。专门为此目的设计的平台或工具称为故障管理系统。 …...
Git:常用命令(二)
查看提交历史 1 git log 撤消操作 任何时候,你都有可能需要撤消刚才所做的某些操作。接下来,我们会介绍一些基本的撤消操作相关的命令。请注意,有些操作并不总是可以撤消的,所以请务必谨慎小心,一旦失误,…...
Oracle 12c rac 搭建 dg
环境 rac 环境 (主)byoradbrac 系统版本:Red Hat Enterprise Linux Server release 6.5 软件版本:Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1:172.17.38.44 byoradb2:…...
Cisco模拟器-交换机端口的隔离
设计要求将某台交换机的端口划分在不同的VLAN。以实现连接在相同VLAN端口上的计算机可以通信,而连接在不同VLAN端口上的计算机无法通信的目的。 通过设计,一方面可以加强计算机网络的安全,另一方面通过隔绝不同VLAN间的广播包也可以提高网络…...
zdppy_api框架快速入门
概述 zdppy_api是一款为了快速开发而生的,基于异步的,使用简单的Python后端API接口开发框架。 本框架的目标是让Python后端开发变得越来越简单,直到发现原来还可以更简单! 一切都是为了提高开发效率!!&…...
https证书配置过程
相关网址: FreeSSL首页 - FreeSSL.cn一个提供免费HTTPS证书申请的网站 ACME v2证书自动化快速入门 acme.sh简单教程-CSDN博客...
如何用C语言程序生成任意手性(即具有任意m和n值),任意长度的碳纳米管,并输出三维空间坐标呢?
如何用C语言程序生成任意手性(即具有任意m和n值),任意长度的碳纳米管,并输出三维空间坐标呢? 生成任意手性、任意长度的碳纳米管可以使用 Chirality Vector 和 Unit Vector 的概念来表示。Chirality Vector (n, m) 描述…...
C++每日一练(8):图像相似度
题目描述 给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。 说明:若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。…...
C++面试宝典第12题:数组元素相除
题目 从控制台输入若干个整数作为数组,将数组中每一个元素除以第一个元素的结果,作为新的数组元素值。比如:可以先输入3,作为数组元素的个数;然后输入3个整数,作为数组元素的值。 解析 这道题本身并不复杂,但里面隐藏了不少“坑点”和“雷区”,主要考察应聘者全面思考问…...
oCPC实践录 | 目标ROI的出价与转化回传调控算法
这篇文章我们聊聊广告主在oCPC下,怎么调控自己的出价或者回传转化优化自己的ROI。 ROI是广告主最关心的指标了,根据oCPC出价的基本原理ocpc_bid pcvr * given_cpa * k, 广告主在整个出价中有两个可以控制的变量来影响出价,一个是直接的give…...
百倍量化之Dbcd-v2中性策略
Dbcd-v2中性策略 1. 指标含义 该指标主要是计算偏置的因子,并根据偏置的平均来分析这个股票的稳定性。相比于v1,策略是更换了dbcd的计算方式 第一步主要操作就是计算当前值和前段时间的平均值的偏置 ma = bt.indicators.SimpleMovingAverage(self.data, period=self.p.peri…...
系统学习Python——装饰器:函数装饰器-[装饰器状态保持方案:函数属性]
分类目录:《系统学习Python》总目录 如果我们没有在使用Python3.X并因此无法利用一条nonlocal语句,或者我们希望代码具有可移植性,能在Python3.X和Python2.X上同时工作一一我们仍然能够针对某些可改变的状态使用函数属性来避免使用全局变量和…...
逻辑卷学习后续----------缩容
一、缩容:缩减大小 ext4可以 , xfs无法缩减,缩减会影响业务 1.解挂载 2.检查文件系统完整性 3.缩减文件系统 4.缩减逻辑卷上下一致 5.再挂载回去 添加磁盘 文件系统只能装ext4 缩减文件系统 resize2fs 挂载失败需要重新安装文件系统…...
15-网络安全框架及模型-BLP机密性模型
目录 BLP机密性模型 1 背景概述 2 模型原理 3 主要特性 4 优势和局限性 5 困难和挑战 6 应用场景 7 应用案例 BLP机密性模型 1 背景概述 BLP模型,全称为Bell-LaPadula模型,是在1973年由D.Bell和J.LaPadula在《Mathematical foundations and mod…...
[C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
源码地址: github地址:https://github.com/Ahmednull/L2CS-Net L2CS-Net介绍: 眼睛注视(eye gaze) 是在各种应用中使用的基本线索之一。 它表示用户在人机交互和开放对话系统中的参与程度。此外,它还被用…...
[2024区块链开发入门指引] - 比特币与区块链诞生
一份为小白用户准备的免费区块链基础教程 工欲善其事,必先利其器 Web3开发中,各种工具、教程、社区、语言框架.。。。 种类繁多,是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役? 参见另一篇博文👉 2024最全面…...
【大数据面试知识点】Spark中的累加器
Spark累加器 累加器用来把Executor端变量信息聚合到Driver端,在driver程序中定义的变量,在Executor端的每个task都会得到这个变量的一份新的副本,每个task更新这些副本的值后,传回driver端进行merge。 累加器一般是放在行动算子…...
深度学习核心技术与实践之深度学习基础篇
非书中全部内容,只是写了些自认为有收获的部分 神经网络 生物神经元的特点 (1)人体各种神经元本身的构成很相似 (2)早期的大脑损伤,其功能可能是以其他部位的神经元来代替实现的 (3&#x…...
Kafka安装及简单使用介绍
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
20231229在Firefly的AIO-3399J开发板的Android11使用挖掘机的DTS配置单前后摄像头ov13850
20231229在Firefly的AIO-3399J开发板的Android11使用挖掘机的DTS配置单前后摄像头ov13850 2023/12/29 11:10 开发板:Firefly的AIO-3399J【RK3399】 SDK:rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.…...
潍坊专业技术人员继续教育/百度笔记排名优化
蛙蛙还是给你带来了礼物。但它有个小小的要求,那就是你得在石头剪刀布上赢过它才能拿到礼物哦! 现在根据你的观察,你已经知道了蛙蛙心想的出拳顺序,你需要安排自己的出拳顺序,使得你能在每一局中都获胜。 输入描述…...
网站备案后 换服务器/企业网站建设制作
(1).Ansible具有如下特点: 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作; 默认使用SSH协议对设备进行管理; 主从集中化管理; 配置简单、功能强大、扩展性强; 支持AP…...
做第三方网站注意什么意思/seo排名优化软件价格
在局域网中,因没有校时服务器,系统时间会逐渐变慢。因此如何将电脑的时间与使用的重要系统的时间保持一致非常重要。下面是学习啦小编给大家整理的一些有关局域网中设置系统时间与服务器同步的方法,希望对大家有帮助!局域网中设置系统时间与服…...
企业网站建设 详细方案/百度热搜大数据
作者:北南南北来自:LinuxSir.Org提要:目前xen虚拟Linux、BSD及其它类Unix系统正火之时,趁热打铁,本人也在Fedora Core 5.0 上虚拟安装了Slackware 10.2;Xen 是一种基于内核的虚拟程序,所以Xen虚…...
惠州的企业网站建设/seo企业推广案例
HTML5 的 FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。FileReader 事件FileReader.onabort 处理abort事件。该事件在读取操作被中断时触发。Fi…...
毫州网站建设/口碑营销方案怎么写
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); //设置全屏this.requestWindowFeature(Window.FEATURE_NO_TITLE); //设置没有标题一些术语Screen Size 屏幕尺寸:实际的物理尺寸,以屏幕…...