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

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

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

相关文章

数据二十条

"数据二十条"即中共中央、国务院关于构建数据基础制度更好发挥数据要素作用的意见&#xff0c;全文共分为五章二十条。 一、发布 2022年6月22日召开了中央全面深化改革委员会第二十六次会议。审议通过《关于构建数据基础制度更好发挥数据要素作用的意见》。 2022…

机器学习应用 | 使用 MATLAB 进行异常检测(下)

在使用MATLAB 进行异常检测&#xff08;上&#xff09;中&#xff0c;我们探讨了什么是异常值&#xff0c;简单的一维数据异常检测问题&#xff0c;针对高维数据的有监督异常检测方法。 在&#xff08;下&#xff09;篇中&#xff0c;我们将和大家一起探讨无监督异常检测。 没…

智能优化算法应用:基于金枪鱼群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于金枪鱼群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于金枪鱼群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金枪鱼群算法4.实验参数设定5.算法结果6.参考…

linux搭建nacos集群

准备 检查是否安装jdk [roothao /usr/local/software/elk/logstash]# java -version java version "1.8.0_341" Java(TM) SE Runtime Environment (build 1.8.0_341-b10) Java HotSpot(TM) 64-Bit Server VM (build 25.341-b10, mixed mode)配置nacos 去github下载…

【PTA-C语言】编程练习4 - 数组Ⅰ

如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 编程练习4 - 数组Ⅰ&#xff08;1~7&#xff09; 7-1 评委打分&#xff08;分数 10&#xff09;7-2 组合数的和&#xff08;分数 10&#xff09;7-3 找不同&#xff08;分数 15&#xff09;7-4 利用二分查找…

【Python】Python音乐网站数据+音频文件数据抓取(代码+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

数据库:JDBC编程

专栏目录 MySQL基本操作-CSDN博客 MySQL基本操作-CSDN博客 数据库的增删查改&#xff08;CRUD&#xff09;基础版-CSDN博客 数据库增删改查&#xff08;CRUD&#xff09;进阶版-CSDN博客 数据库的索引-CSDN博客 基本概念 JDBC编程就是通过Java代码来操作数据库 api 数据库是…

深入理解网络 I/O 多路复用:SELECT、POLL

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

工业4G路由器助力轨道交通城市地铁实现数字化转型

随着城市的科技不断发展&#xff0c;地铁系统的智能化程度也在不断提高。地铁闸机的网络部署已经成为地铁建设中必不可少环节。而4G路由器作为地铁闸机的网络通讯设备&#xff0c;助力轨道交通地铁闸机实现数字化转型。 工业4G路由器在地铁系统光纤宽带网络遇到故障或其他问题…

CGAL的推进前表面重建

从非结构化点云进行的曲面重建相当于生成一个合理的曲面&#xff0c;该曲面很好地近似于输入点。由于可能生成许多曲面&#xff0c;因此此问题不适合解决。已经提出了一系列广泛的方法来解决这个问题。其中包括变分方法、张量表决、隐式曲面和Delaunay三角剖分。 对于基于Delau…

gRPC三种流和消息格式

文章目录 消息格式RPC流长度前缀的消息分帧请求消息响应信息 三种流一元RPC服务流RPC客户流RPC双工流RPC 代码仓库 消息格式 RPC流 服务端实现protocol buffer定义的方法&#xff0c;客户端保留一个存根&#xff0c;提供服务端方法的抽象&#xff0c;客户端只需要调用存根中的…

【dig命令查询方法】

dig&#xff08;Domain Information Groper&#xff09;是一个用于查询DNS&#xff08;域名系统&#xff09;的命令行工具&#xff0c;它可以帮助您获取关于域名的各种信息&#xff0c;如IP地址、MX记录、NS记录等。下面是dig的详细使用教程。 基本语法&#xff1a; dig [ser…

文件被删除了怎么恢复?3个宝藏方法,快来get!

“我是一个学生党&#xff0c;期末的一些资料保存在电脑上&#xff0c;但是不知道是不是被我误删了&#xff0c;导致很多文件都找不到了。文件被删除了怎么恢复呢&#xff1f;大家帮我出出主意吧&#xff01;” 对于经常在电脑上保存各种文件的用户来说&#xff0c;文件误删除是…

IPC之五:使用 System V 信号量集解决经典的‘哲学家就餐问题‘

IPC 是 Linux 编程中一个重要的概念&#xff0c;IPC 有多种方式&#xff0c;本文主要介绍信号量集(Semaphore Sets)&#xff0c;尽管信号量集被认为是 IPC 的一种方式&#xff0c;但实际上通常把信号量集用于进程间同步或者资源访问互斥&#xff0c;信号量集和共享内存(Shared …

系列学习前端之第 2 章:一文精通 HTML

全套学习 HTMLCSSJavaScript 代码和笔记请下载网盘的资料&#xff1a; 链接: https://pan.baidu.com/s/1-vY2anBdrsBSwDZfALZ6FQ 提取码: 6666 HTML 全称&#xff1a;HyperText Markup Language&#xff08;超文本标记语言&#xff09; 1、 HTML 标签 1. 标签又称元素&#…

PR剪辑视频素材|真实胶片特效转场PR项目模板文件

Premiere转场模板&#xff0c;8个真实胶片特效转场PR项目模板视频素材。可以编辑和自定义媒体占位符。在视频的开头、中间和结尾使用。包含视频教程。 适用软件&#xff1a;PR2023及更新版本 | 分辨率&#xff1a;38402160 (4K) | 文件大小&#xff1a;16.43MB | 无需插件 来自…

AI并行计算:CUDA和ROCm

1 介绍 1.1 CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是Nvidia于2006年推出的一套通用并行计算架构&#xff0c;旨在解决在GPU上的并行计算问题。其易用性和便捷性能够方便开发者方便的进行GPU编程&#xff0c;充分利用GPU的并行能力&#xff0…

如何使用ArcGIS Pro制作类似CAD的尺寸注记

经常使用CAD制图的朋友应该比较熟悉CAD内的尺寸标注&#xff0c;这样的标注看起来直观且简洁&#xff0c;那么在ArcGIS Pro内能不能制作这样尺寸注记呢&#xff0c;答案是肯定的&#xff0c;这里为大家介绍一下制作的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所…

OpenGL ES 帧缓冲对象介绍和使用示例

一、介绍 1. 帧缓冲对象 默认情况下&#xff0c;OpenGL渲染的目标是屏幕&#xff0c;但如果你不想直接渲染到屏幕上&#xff0c;还需要对渲染结果做某些后期处理、渲染到纹理、阴影映射等操作&#xff0c;便可以使用帧缓冲对象&#xff0c;实现离屏渲染。 帧缓冲对象&#x…

JSON字符串转泛型对象

JSON字符串转泛型对象 以下问题只仅限于博主自身遇到&#xff0c;不代表绝对出现问题 相关类展示&#xff1a; 参数基类 public class BaseParams { }基类 public abstract class AbstractPush<Params extends BaseParams> {protected abstract void execute(Params…