当前位置: 首页 > news >正文

Raspberry Pi 2, 2 of n - Pi 作为 IoT 消息代理

目录

介绍

环境

先决条件 - 设置静态 IP 地址

安装 Mosquitto

启动/停止 Mosquitto

配置先决条件 - 安装 mqtt_spy

配置 Mosquitto

配置 Mosquitto - 无安全性

测试 Mosquitto 配置 - 无安全性

配置 Mosquitto - 使用密码身份验证

Mosquitto 测试 - 带密码验证

概括

介绍

在本文中,这是致力于令人惊叹的 Raspberry Pi 的系列文章的第二篇文章,我们将使用 Mosquitto 将 Pi 配置为 MQTT 消息代理。Mosquitto 是一个轻量级但功能强大的发布/订阅模型消息传递系统,可以安装在各种平台上。本教程的目标是在 Rasspberry Pi 2 上安装、配置和测试软件,并且不仅能够在 Pi 上发布和订阅消息,还能够在其他计算机上发布和订阅消息。

1107378/pi2-mqtt_spy-3.png


如果您还没有阅读描述如何加载和配置操作系统的第一篇文章,您可以在Raspberry Pi 2, 1 of n - 初始设置或代码项目中找到它。虽然不是必需阅读,但如果您是 Linux 或 Pi 的新手,我鼓励您查看一下。

本文或多或少是我使用 Mosquitto 将 Raspberry Pi 设置为 MQTT 消息代理的步骤的记录。我使用 SwitchDoc Labs [3]的教程作为参考,但对其进行了修改以满足我的特定需求。在以后的文章中,我计划悬挂各种设备,例如;ESP8266-12E WiFi 模块、嵌入式处理器板(例如 Arduino UNO 以及可能的其他板)有望在今年夏天趁远足和露营天气炎热时抽出时间来做这件事。

环境

我为此项目设置的开发环境是;

  • Windows 桌面运行 64 位 Windows 7 操作系统,配备 AMD-FX-8350 8 核处理器和 32GB 内存。
  • Raspberry Pi 2,BCM2709 ARMv7 4 核,具有 1GB RAM,运行 Raspian Jesse 操作系统。下载站点上有一个新的 Raspbian Jessie Lite 版本,我最初为该项目加载和配置了该版本,但它没有 GUI,我计划在以后的文章中使用 NginX 和 WebSockets 来提供用于控制各种设备的前端所以我恢复使用完整版本并删除其中的垃圾软件。Pi 上的 WiFi 由edimax 适配器
    提供。
  • 运行 Ubuntu 12.04 LTS 的 VirtualBox VM,我的配置几乎与 Pi 相同,但修改了一些针对 Ubuntu 的项目。虽然我已经将其设置为自己使用,但我不会详细介绍我是如何做到这一点的,我会将其留给您作为额外的学分练习。祝蚱蜢好运!

先决条件 - 设置静态 IP 地址

尽管此步骤是可选的,但我强烈建议您在 Pi 上设置静态 IP 地址[8,11]。如果不这样做,Pi 可能会 在启动时选择不同的 IP 地址,并且每次启动 Pi 时都必须编辑配置文件,这将是一个 PITA。对我来说,使用廉价的edimax 加密狗, 这是一个无痛的过程。如果您愿意等待,可以通过 eBay 购买 802.11 加密狗,每件价格约为 2 美元。我订购了其中一些,它们工作得相当好,尽管我还没有确定是否会在生产环境中使用它们。

此处描述的过程使用 edimax 加密狗,但应该适用于 Pi 支持的任何兼容 WiFi 加密狗。在编辑配置网络所需的系统文件之前,我们需要收集一些信息。

<span style="color:#111111"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#fbedbb">#To display current network info type;
ifconfig</span></span></span></span>

输出应该与此类似;

<span style="color:#111111"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#fbedbb">wlan0   Link encap:Ethernet HWaddr b8:<span style="color:#000080">27</span>:eb:a8:cf:a4inet addr:<span style="color:#000080">192</span>.<span style="color:#000080">168</span>.<span style="color:#000080">254</span>.<span style="color:#000080">20</span> Bcast:<span style="color:#000080">192</span>.<span style="color:#000080">168</span>.<span style="color:#000080">254</span>.<span style="color:#000080">255</span> Mask:<span style="color:#000080">255</span>.<span style="color:#000080">255</span>.<span style="color:#000080">255</span>.<span style="color:#000080">0</span>UP BROADCAST RUNNING MULTICAST MTU:<span style="color:#000080">1500</span> Metric:<span style="color:#000080">1</span>RX packets:<span style="color:#000080">161</span> errors:<span style="color:#000080">0</span> dropped:<span style="color:#000080">0</span> overruns:<span style="color:#000080">0</span> frame:<span style="color:#000080">0</span>TX packets:<span style="color:#000080">227</span> errors:<span style="color:#000080">0</span> dropped:<span style="color:#000080">0</span> overruns:<span style="color:#000080">0</span> carrier:<span style="color:#000080">0</span>collisions:<span style="color:#000080">0</span> txqueuelen:<span style="color:#000080">1000</span>RX bytes:<span style="color:#000080">26075</span> (<span style="color:#000080">25</span>.<span style="color:#000080">4</span> KiB) TX bytes:<span style="color:#000080">46356</span> (<span style="color:#000080">45</span>.<span style="color:#000080">2</span> KiB)</span></span></span></span>

inet addr 和 Mask 值是我们要寻找的值,在我的例子中,addr是 192.168.254.20Mask 是 255.255.255.0,在大多数情况下都是如此。接下来我们需要找到网关地址。

<span style="color:#111111"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#fbedbb">#To display network gateway address type;            
netstat -n -r</span></span></span></span>

输出应该看起来像这样;

<span style="color:#111111"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#fbedbb">Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
<span style="color:#000080">0</span>.<span style="color:#000080">0</span>.<span style="color:#000080">0</span>.<span style="color:#000080">0</span>         <span style="color:#000080">192</span>.<span style="color:#000080">168</span>.<span style="color:#000080">254</span>.<span style="color:#000080">254</span>   <span style="color:#000080">0</span>.<span style="color:#000080">0</span>.<span style="color:#000080">0</span>.<span style="color:#000080">0</span>         UG        <span style="color:#000080">0</span> <span style="color:#000080">0</span>          <span style="color:#000080">0</span> eth0
<span style="color:#000080">192</span>.<span style="color:#000080">168</span>.<span style="color:#000080">254</span>.<span style="color:#000080">0</span>     <span style="color:#000080">0</span>.<span style="color:#000080">0</span>.<span style="color:#000080">0</span>.<span style="color:#000080">0</span>         <span style="color:#000080">255</span>.<span style="color:#000080">255</span>.<span style="color:#000080">255</span>.<span style="color:#000080">0</span>   U         <span style="color:#000080">0</span> <span style="color:#000080">0</span>          <span style="color:#000080">0</span> eth0</span></span></span></span>

由此我们得到目标或网络地址是 192.168.254.0网关地址是 192.168.254.254,现在我们准备配置我们的网络。

我们需要修改的第一个文件是 wpa_supplicant [12]文件。wpa_supplicant [13]实现无线网络的安全协议。[13]

<span style="color:#111111"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#fbedbb">ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=<span style="color:#000080">1</span>
network={ssid=<span style="color:#800080">"</span><span style="color:#800080">Your SSID Here"</span>psk=<span style="color:#800080">"</span><span style="color:#800080">YourPresharedKeyHere"</span>
}</span></span></span></span>

请注意,“network={”中没有空格,这是故意的。将 ssid 和 psk 值替换为您的无线网络值,保存并关闭文件。我使用nano来编辑这些文件,当要求保存文件时,保存和退出的过程是ctrl+X“Y” 。

接下来,我们将继续讨论网络接口文件,我们将在其中配置 wlan0 无线网络适配器。使用您在前面的步骤中收集的值并将它们插入文件中的适当区域,如下所示。

<span style="color:#111111"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#fbedbb">allow-hotplug wlan0
iface <span style="color:#0000ff">default</span> inet <span style="color:#0000ff">static</span>wpa-roam /etc/wpa_supplicant/wpa_supplicant.confaddress <span style="color:#000080">192</span>.<span style="color:#000080">168</span>.<span style="color:#000080">254</span>.<span style="color:#000080">20</span>netmask <span style="color:#000080">255</span>.<span style="color:#000080">255</span>.<span style="color:#000080">255</span>.<span style="color:#000080">0</span>network <span style="color:#000080">192</span>.<span style="color:#000080">168</span>.<span style="color:#000080">254</span>.<span style="color:#000080">0</span>gateway <span style="color:#000080">192</span>.<span style="color:#000080">168</span>.<span style="color:#000080">254</span>.<span style="color:#000080">254</span></span></span></span></span>

重新启动 Pi 并尝试从另一台计算机执行 ping 操作,或尝试使用您选择的浏览器访问网站。Jessie 预装了 IceWeasel,即 Firefox。如果一切按计划进行,那么您应该在线并准备好继续,如果没有重新访问前面的步骤或谷歌搜索适合您特定硬件配置的解决方案。

安装 Mosquitto

安装 Mosquitto 相当简单,我们将配置代理侦听端口 1883 进行测试,它默认为端口 80。

在 Pi 上打开一个终端并一次输入以下命令。

<span style="color:#111111"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#fbedbb">sudo wget http:<span style="color:#008000"><em>//</em></span><span style="color:#008000"><em>repo.mosquitto.org/debian/mosquitto-repo.gpg.key</em></span>
sudo apt-key <span style="color:#0000ff">add</span> mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget http:<span style="color:#008000"><em>//</em></span><span style="color:#008000"><em>repo.mosquitto.org/debian/mosquitto-jessie.list</em></span>
sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients</span></span></span></span>
  1. wget [4]代表“web get”,是一个从网站递归下载文件和目录结构的实用程序。在这种情况下,我们将获得一个 GPG(Gnu Privacy Guard Key),它允许提供商使用通用密钥系统对您的数据和通信进行加密和签名。
  2. apt-key [3]用于管理 apt(高级打包工具)用于验证包的密钥列表。
  3. 更改目录并使存储库可供 apt 使用。
  4. 获取存储库文件,其中包含指向下载包的 URL 的链接。
  5. 使用 apt-get 更新 apt 信息[5]
  6. 最后安装 Mosquitto 和客户端。客户端提供 mosquitto_pub 和 mosquitto_sub 实用程序。我们将在稍后的测试阶段使用它们!

如果一切按计划进行,Mosquitto 应该已安装,并且默认情况下将启动,由于我们需要配置它,因此我们需要停止它。请参阅下一节了解如何阻止 Mosquitto。

启动/停止 Mosquitto

当 Pi 启动时,它会自动启动 Mosquitto,因此我们想了解如何启动、停止和重新启动该应用程序。

<span style="color:#111111"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#fbedbb">#To start the Mosquitto service
sudo /etc/init.d/mosquitto start
#To stop the Mosquitto service
sudo /etc/init.d/mosquitto stop
#To restart the Mosquitto service
sudo /etc/init.d/mosquitto restart</span></span></span></span>

配置先决条件 - 安装 mqtt_spy

这也是一个可选步骤,但我发现 mqtt_spy [7]实用程序在配置/测试阶段非常有价值。mqtt-spy 是一个 JavaFX 应用程序,因此理论上应该可以在安装了适当版本的 Java 8 的任何操作系统上运行。

当 mqtt_spy 首次启动时,用户会看到以下窗口,敏锐的观察者会注意到应用程序认为我拥有的版本不是最新的,但它是吗?无论如何,显示已配置连接的部分是我们主要关心的。该应用程序预装了几种常见的配置,例如本地主机等。

1107378/pi2-mqtt_spy-0.png

要为我们的目的配置连接,请从主菜单中选择“连接”=>“新建连接”菜单项。这将显示所示的窗口并输入与您的配置相关的信息并使用适当的名称保存。

1107378/pi2-mqtt_spy-1.png

连接建立后我们就可以开始工作了。如本教程前面所述,MQTT 协议是一种发布订阅模型,因此下面显示的窗口分为 2 个部分;顶部是发布部分,底部是订阅部分。

首先,我们通过单击“新建”按钮创建一个新订阅,并在弹出的对话框中输入主题信息,输入主题后单击“订阅”按钮。

接下来,我们将向刚刚配置的主题发布一条消息,因此在发布部分中输入主题、一条消息,然后单击“发布”按钮。该消息应显示在“订阅”部分的“数据”文本框中。瞧,这就是全部了,不是很酷吗?

1107378/pi2-mqtt_spy-2.png

在本教程的其余部分中,我将参考 mqtt_spy 实用程序,如果您没有安装它,请忽略它,因为我还将提供 Mosquitto 客户端命令行命令来从 Linux 终端测试配置。配置 mqtt_spy 时,单击主窗口中的连接按钮断开连接,这将导致按钮变为红色,进行适当的更改,然后再次单击连接按钮,如果连接成功,按钮将变为绿色。

配置 Mosquitto

在下面的部分中,我们将讨论 Mosquitto 可以配置运行的各种方式以及我们将用来测试配置的技术。当 Mosquitto 启动时,它会在 /etc/mosquitto/conf.d 目录中查找任何带有 .conf 扩展名的文件[10] ,如果找到,则使用它们来配置 Mosquitto。我们将创建一个文件 /etc/mosquitto/conf.d/mosquitto.conf 并输入后面代码部分中概述的数据。

配置 Mosquitto - 无安全性

这是没有安全性的基本配置,在端口 80 上侦听 IP 地址 localhost。使用您选择的编辑器编辑 /etc/mosquitto/conf.d/mosquitto.conf 文件,保存并重新启动 Mosquitto。

<span style="color:#111111"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#fbedbb"># <span style="color:#339999">Boolean</span> <span style="color:#339999">value</span> that determines whether clients that connect without providing a username are 
# allowed to connect. If <span style="color:#0000ff">set</span> to <span style="color:#0000ff">false</span> then another means of connection should be created to 
# control authenticated client access. Defaults to <span style="color:#0000ff">true</span>. 
allow_anonymous <span style="color:#0000ff">true</span>
#
# Listen <span style="color:#0000ff">for</span> incoming network connection on the specified port. A second optional argument 
# allows the listener to be bound to a specific ip address/hostname. If <span style="color:#0000ff">this</span> variable <span style="color:#0000ff">is</span> used 
# and neither the <span style="color:#0000ff">global</span> bind_address nor port options are used then the <span style="color:#0000ff">default</span> listener will 
# not be started.
# listener port [bind address/host]
listener <span style="color:#000080">1883</span> <span style="color:#000080">192</span>.<span style="color:#000080">168</span>.<span style="color:#000080">254</span>.<span style="color:#000080">20</span></span></span></span></span>
测试 Mosquitto 配置 - 无安全性

使用 mqtt_spy 实用程序,只需在服务器 URI 文本框中输入 IP 地址,应用并连接。然后转到发布/订阅窗口并输入适当的信息。

从命令行测试时,您需要打开 2 个窗口;一个用于发布,另一个用于订阅。在端口 1883 上输入以下内容,其中 topic = 'hello/world'。

<span style="color:#111111"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#fbedbb">#In the publish terminal window
sudo mosquitto_pub -d -t hello/world -m <span style="color:#800080">'</span><span style="color:#800080">The message'</span>#In the subscribeterminal window
sudo mosquitto_sub -d -t hello/world</span></span></span></span>
配置 Mosquitto - 使用密码身份验证

为了使用密码身份验证,我们需要编辑 mosquitto.conf 文件并添加 password_file 指令以及 pwfile 的路径。

<span style="color:#111111"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#fbedbb"># <span style="color:#339999">Boolean</span> <span style="color:#339999">value</span> that determines whether clients that connect without providing a username are 
# allowed to connect. If <span style="color:#0000ff">set</span> to <span style="color:#0000ff">false</span> then another means of connection should be created to 
# control authenticated client access. Defaults to <span style="color:#0000ff">true</span>. 
allow_anonymous <span style="color:#0000ff">false</span>
#
# Listen <span style="color:#0000ff">for</span> incoming network connection on the specified port. A second optional argument 
# allows the listener to be bound to a specific ip address/hostname. If <span style="color:#0000ff">this</span> variable <span style="color:#0000ff">is</span> used 
# and neither the <span style="color:#0000ff">global</span> bind_address nor port options are used then the <span style="color:#0000ff">default</span> listener will 
# not be started.
#listener port [bind address/host]
listener <span style="color:#000080">1883</span> <span style="color:#000080">192</span>.<span style="color:#000080">168</span>.<span style="color:#000080">254</span>.<span style="color:#000080">20</span>
#
# Set the path to a password file. If defined, the contents of the file are used to control 
# client access to the broker. The file can be created <span style="color:#0000ff">using</span> the mosquitto_passwd(<span style="color:#000080">1</span>) utility.
# If mosquitto <span style="color:#0000ff">is</span> compiled without TLS support (it <span style="color:#0000ff">is</span> recommended that TLS support <span style="color:#0000ff">is</span> 
# included), then the password file should be a text file with each line <span style="color:#0000ff">in</span> the format 
# <span style="color:#800080">"</span><span style="color:#800080">username:password"</span>, <span style="color:#339999">where</span> the colon and password are optional but recommended. 
# If allow_anonymous <span style="color:#0000ff">is</span> <span style="color:#0000ff">set</span> to <span style="color:#0000ff">false</span>, only users defined <span style="color:#0000ff">in</span> <span style="color:#0000ff">this</span> file will be able to connect. 
# Setting allow_anonymous to <span style="color:#0000ff">true</span> <span style="color:#339999">when</span> password_fileis defined <span style="color:#0000ff">is</span> valid and could be used with 
# acl_file to have e.g. read only guest/anonymous accounts and defined users that can publish.
#password_file file path
password_file /etc/mosquitto/pwfile</span></span></span></span>

接下来,我们需要使用 mosquitto_passwd 实用程序创建 pwfile,方法是在终端窗口中输入以下内容。

<span style="color:#111111"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#fbedbb">sudo mosquitto_passwd -c /etc/mosquitto/pwfile username</span></span></span></span>

系统将提示您输入密码并输入另一个密码进行确认。

Mosquitto 测试 - 带密码验证

使用 mqtt_spy 选择菜单选项 Connections=>Manage Connections,然后选择 Security 选项卡、User auth。标签。选中启用用户身份验证复选框并输入配置 pwfile 时使用的用户名密码。然后连接并配置发布/订阅信息。

使用 pub/sub 终端输入以下命令;

<span style="color:#111111"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#fbedbb">#In the publish terminal window
sudo mosquitto_pub -d -t hello/world -p <span style="color:#000080">1883</span> -u <span style="color:#800080">'</span><span style="color:#800080">username'</span> -P <span style="color:#800080">'</span><span style="color:#800080">password'</span> -m <span style="color:#800080">'</span><span style="color:#800080">The message'</span>#In the subscribeterminal window
sudo mosquitto_sub -d -t hello/world -p <span style="color:#000080">1883</span> -u <span style="color:#800080">'</span><span style="color:#800080">username'</span> -P <span style="color:#800080">'</span><span style="color:#800080">password'</span></span></span></span></span>

概括

我发现 Mosquitto 易于使用,功能强大,有足够的文档和教程来帮助我入门,而且足够直观,我可以在短时间内安装和配置它。本教程已经做了好几次了,而且很简单,因此我的目的是在以后的文章和家庭物联网项目中使用它,这将是本系列的最终目标。

相关文章:

Raspberry Pi 2, 2 of n - Pi 作为 IoT 消息代理

目录 介绍 环境 先决条件 - 设置静态 IP 地址 安装 Mosquitto 启动/停止 Mosquitto 配置先决条件 - 安装 mqtt_spy 配置 Mosquitto 配置 Mosquitto - 无安全性 测试 Mosquitto 配置 - 无安全性 配置 Mosquitto - 使用密码身份验证 Mosquitto 测试 - 带密码验证 概括 介绍 在本文…...

linux服务器环境搭建(使用yum 安装mysql、jdk、redis)

一:yum的安装 1:下载yum安装包并解压 wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz tar xvf yum-3.2.28.tar.gz 2.进入yum-3.2.28文件夹中进行安装,执行安装指令 cd yum-3.2.28 sudo apt install yum 3.更新版本 yum check-update yum update yum cle…...

互联网Java工程师面试题·Spring Boot篇·第二弹

目录 8、什么是 YAML&#xff1f; 9、如何实现 Spring Boot 应用程序的安全性&#xff1f; 10、如何集成 Spring Boot 和 ActiveMQ&#xff1f; 11、如何使用 Spring Boot 实现分页和排序&#xff1f; 12、什么是 Swagger&#xff1f;你用 Spring Boot 实现了它吗&#xff1f; …...

【西南交大swjtu微机与接口技术实验】D/A变换实验实验三:波形发生器

做一个存档。实验要求与电路连接见参考指导书。 1、主程序产生锯齿波 2、按下KK1输出五个周期的三角波&#xff0c;继续输出被中断的锯齿波 3、按下KK2输出五个周期的方波&#xff0c;继续输出被中断的锯齿波 程序代码 IOY0 EQU 0600H DA EQU IOT000H*2SSTACK SEGMENT STA…...

【每日一题】从二叉搜索树到更大和树

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;中序遍历的反序方法二&#xff1a;后缀数组 写在最后 Tag 【中序遍历】【二叉树】【2023-12-04】 题目来源 1038. 从二叉搜索树到更大和树 题目解读 在二叉搜索树中&#xff0c;将每一个节点的值替换成树中大于等于该…...

@Scheduled,Quartz,XXL-JOB三种定时任务总结

Scheduled&#xff0c;Quartz&#xff0c;XXL-JOB三种定时任务总结 一、Scheduled 简介 Scheduled 是 Spring 框架中用于声明定时任务的注解。通过使用 Scheduled 注解&#xff0c;你可以指定一个方法应该在何时执行&#xff0c;无需依赖外部的调度器。 这个注解通常与Enab…...

开会做笔记的时候用什么软件比较好?

在工作生涯中&#xff0c;会经历很多大大小小的会议&#xff0c;而如何快速准确记录下会议上重要的内容&#xff0c;成了很多上班族的必修课。在会上做笔记&#xff0c;选择什么样的工具才能事半功倍&#xff0c;成了一个值得深思的问题。而经过一段时间的测评后&#xff0c;我…...

HTML CSS JavaScript的网页设计

一、网页界面效果&#xff1a; 二、HTML代码&#xff1a; <!DOCTYPE html> <!-- 声明文档类型--> <html lang"en"> …...

37.从0到上线三天搭建个人网站(第一天)

点赞收藏加关注&#xff0c;你也能住大别墅&#xff01; 挑战三天搭建个人网站 从0到上线 一、项目的主要功能 1.作为自己在网上的一个工作室。 2.发帖 3.展示个人项目连接 4.介绍自己&#xff08;没准儿还能接点活儿&#xff09; 二、UI风格参考 三、技术选型 1.前端&a…...

室内外融合便携式定位终端5G+UWB+RTK

一、介绍 便携式定位终端主要用于提供高精度的位置数据&#xff0c;支持室内UWB定位和室外北斗系统定位功能&#xff0c;支持5G公网和5G专网通信功能&#xff0c;便携式定位终端中超宽带(UWB)和实时动态(RTK)技术的集成代表了精确位置跟踪方面的重大进步。这款UWBRTK便携式定位…...

使用Java语言判断一个数据类型是奇数还是偶数

判断一个数字类型是奇数&#xff0c;还是偶数&#xff0c;只需要引入Scanner类&#xff0c;然后按照数据类型的定义方式进行定义&#xff0c;比较是按照与2进行整除后的结果&#xff1b;如果余数为零&#xff0c;则代表为偶数&#xff0c;否则为奇数。 import java.util.Scann…...

Java三种代理模式:静态代理、动态代理和CGLIB代理

Java三种代理模式&#xff1a;静态代理、动态代理和CGLIB代理 代理模式 代理模式是23种设计模式种的一种。代理模式是一种结构型设计模式&#xff0c;它允许为其他对象提供一个替代品或占位符&#xff0c;以控制对这个对象的访问。代理模式可以在不修改被代理对象的基础上&am…...

vivado实现分析与收敛技巧9-分析使用率统计数据

实现问题的常见原因之一是未考量显式和隐式物理约束。例如 &#xff0c; 管脚分配 (pinout) 在逻辑布局上变为显式物理约束。 slice&#xff08; 分片 &#xff09; 逻辑在大部分器件中都是一致的。但如下专用资源表示的是隐式物理约束 &#xff0c; 因为这些资源仅在某些位置…...

7nm项目之顶层规划——01数据导入

1.创建workspace 创建workspace后&#xff0c;在其目录下产生。 CORTEXA53.json文件是将有默认配置的文件master.json、有library的.config.json文件、tunes下CORTEXA53.tunes.json文件合并 注&#xff1a;tunes下的CORTEXA53.tunes.json文件可以覆盖一些master.json的设置…...

一键式紧急报警柱系统

随着科技的不断发展&#xff0c;一键式紧急报警柱在我们的生活和工作中扮演着越来越重要的角色。在这篇文章中&#xff0c;我们将一起探究与一键式紧急报警柱有关的知识。 一键式紧急报警柱是一种常见的安全防护设备&#xff0c;能够在紧急情况下快速发出警报&#xff0c;保护…...

4-Docker命令之docker run

1.docker run介绍 docker run命令是用来创建新的容器并运行相关命令 2.docker run用法 docker run [参数] [root@centos79 ~]# docker run --helpUsage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]Create and run a new container from an imageAliases:docker conta…...

【模电】直流通路与交流通路

直流通路与交流通路 通常&#xff0c;在放大电路中&#xff0c;直流电源的作用和交流信号的作用总是共存的&#xff0c;即静态电流、电压和动态电流、电压总是共存的。但是由于电容、电感等电抗元件的存在&#xff0c;直流量所流经的通路与交流信号所流经的通路不完全相同。因此…...

SpringBoot JprotoBuf序列化与反序列化的实现

文章目录 前言一、protobuf与JprotoBufprotobuf介绍JprotoBuf介绍protobuf与JprotoBuf的区别二、JprotoBuf特点三、类型转换对照表四、ProtobufClass编写五、序列化与反序列化测试六、使用JprotoBuf时的注意事项七、JprotoBuf与protobuf序列化反序列化结果比较前言 在软件开发…...

互联网Java工程师面试题·Spring Boot篇·第一弹

目录 1、什么是 Spring Boot&#xff1f; 2、Spring Boot 有哪些优点&#xff1f; 3、什么是 JavaConfig&#xff1f; 4、如何重新加载 Spring Boot 上的更改&#xff0c;而无需重新启动服务器&#xff1f; 5、Spring Boot 中的监视器是什么&#xff1f; 6、如何在 Sprin…...

HostHunter虚拟主机发现

HostHunter虚拟主机发现 1.HostHunter2.安装3.参数解释4.实例1.HostHunter HostHunter 一种工具,用于有效发现和提取提供大量目标 IPv4 或 IPv6 地址的主机名。HostHunter 利用简单的 OSINT 和主动协调技术将 IP 目标与虚拟主机名进行映射。这对于发现组织的真正攻击面特别有…...

鸿蒙开发:UIAbility组件间交互探索实战【鸿蒙专栏-22】

UIAbility组件间交互(设备内) 在设备内,UIAbility(用户界面能力)是系统调度的最小单元,它们负责展示用户界面和执行相关的业务逻辑。设备内的不同功能模块之间的交互是应用程序开发中的重要部分。本文将探讨设备内UIAbility之间的交互方式,包括启动应用内的UIAbility、…...

VSCode Vue 开发环境配置

Vue是前端开发中的重要工具与框架&#xff0c;可以保住开发者高效构建用户界面。 Vue2官方文档&#xff1a;https://v2.cn.vuejs.org/ Vue3官方文档&#xff1a;https://cn.vuejs.org/ Vue的安装和引用 Vue2的官方安装指南&#xff1a;https://v2.cn.vuejs.org/v2/guide/ins…...

clickhouse从mysql同步数据到clickhouse的几种方式

背景 我们的业务数据一般来说都是放在Mysql中的&#xff0c;而我们要分析的数据一般都存放在clickhouse中&#xff0c;所以如何把数据从mysql同步到ck&#xff0c;就变成了一个必须的步骤&#xff0c;本文简单记录下几种同步的方式 mysql数据同步到clickhouse 方式一&#x…...

“滑动窗口”算法实例

1 问题 给定一个字符串“S”&#xff0c;找出其中不含有重复字符的最长子串的长度。例如&#xff1a;S‘ABCABCBB’&#xff0c;则不含重复字符的最长字串长度为3.。S‘ABCDFG’,则不含重复字符的最长字串长度为6。要求设计一个Python程序实现该功能&#xff1f; 2 方法 按照一…...

分布式搜索引擎elasticsearch(一)

5.1 初始elasticsearch elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch是elastic stack的核心,负责存储、搜索、分析数据。 5.1.1正向索引 5.1.2elasticsearch采用倒排索引: 文档(document):每条数据就是一个…...

PTA 7-236 验证哥德巴赫猜想

哥德巴赫猜想之一是指一个偶数&#xff08;2除外&#xff09;可以拆分为两个素数之和。请验证这个猜想。 因为同一个偶数可能可以拆分为不同的素数对之和&#xff0c;这里要求结果素数对彼此最接近。 输入格式: 首先输入一个正整数T&#xff0c;表示测试数据的组数&#xff0…...

微信小程序 纯css画仪表盘

刚看到设计稿的时候第一时间想到的就是用canvas来做这个仪表盘&#xff0c;虽然本人的画布用的不是很好但还可以写一写&#x1f600;。话不多说直接上代码。最后有纯css方法 <!--wxml--> <canvas canvas-id"circle" class"circle" >// js dat…...

成为AI产品经理——模型稳定性评估(PSI)

一、PSI作用 稳定性是指模型性能的稳定程度。 上线前需要进行模型的稳定性评估&#xff0c;是否达到上线标准。 上线后需要进行模型的稳定性的观测&#xff0c;判断模型是否需要迭代。 稳定度指标(population stability index ,PSI)。通过PSI指标&#xff0c;我们可以获得不…...

操作系统——进程同步

目录 一、信号量相关函数 1. 创建信号量集 2. 获取信号量集 3. 等待、通知信号量集 4. 控制信号量集 二、简单进程同步 1. 创建信号量集 2. P操作 3. V操作 4. 删除信号量集 5. 测试&#xff1a; 三、生产者与消费者 1. 创建、删除共享内存及信号量集 2. 单一生产…...

如何能够对使用ShaderGraph开发的Shader使用SetTextureOffset和SetTextureScale方法

假设在ShaderGraph中的纹理的引用名称为"_BaseMap"&#xff0c;同时对这个"_BaseMap"纹理使用了采样的节点"SampleTexture2D"&#xff0c;然后该采样节点的uv接入的TilingAndOffset节点&#xff0c;此时的关键步骤是新建一个Vector4属性&#xf…...

网站建设的常见问题/谷歌推广费用

Nginx是什么&#xff1f; 开源且高性能、可靠的HTTP中间件、代理服务。 类似于nginx的&#xff1f; HTTPD-apache基金会、IIS-微软、GWS-Google 为什么使用nginx&#xff1f; IO多路复用epoll 轻量级&#xff08;功能模块少、代码模块化&#xff09; CPU亲和&#xff1a;…...

工信部网站备案系统/网站推广的渠道有

冯.诺依曼体系结构,个人的理解:物理电学补充:所有的物质,是由分子或原子组成的。分子是能保持物质化学性质不变的最小微粒。分子是由原子组成的&#xff0c;可分为单原子分子和多原子分子。原子的原子核式结构&#xff1a;原子的中心为原子核&#xff0c;电子在不同轨道上绕着原…...

网站微信开发/潍坊网站模板建站

http://sh.house.ifeng.com/detail/2015_10_20/50592267_0.shtml...

企业营销的网站/东莞seo网络营销

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01;http://www.swiper.com.cn/下载&#xff1a;…...

建设中小企业网站/精准推广引流5000客源

2019独角兽企业重金招聘Python工程师标准>>> 开源IDE,LightTable&#xff0c;比较小巧&#xff0c;居然有种完爆我大Sublime的赶脚&#xff0c;可惜全是英文的&#xff0c;特此记录一些用法。 其实就是它自带的帮助文档&#xff0c;不过全是英文&#xff0c;全当练翻…...

美国纽约网站建设费用/今日头条新闻视频

实现Servlet的三种方式&#xff1a;一个实现&#xff0c;两个继承 /* * servlet的执行过程&#xff1a; * 1.创建servlet对象&#xff08;Tomcat执行&#xff09; * 2.第一次访问servlet时执行 * init()方法 该方法只执行一次 * service()方法 * 3.之后每访问一次 就执行一次se…...