物联网WEB大屏数据可视化

news2024/12/25 1:15:02

最近了解WEB大屏显示。一般像嵌入式这类的,MQTT协议会走的多一些,走订阅和发布的策略,网上走了一圈之后,目前有几个实现方案。

这里对比一下几个物联网协议,相对而言MQTT更合适物联网,其它几个协议不是干这个的,不过我推荐一下DDS,这玩意还挺好用的。

(ps:最近了解到一个团队的实现方案是tcp。。。什么魔鬼设计,想的啥呢)

  1. 大屏实现方案

1.买物联网网关,附带WEB大屏服务,这里就不打广告了,自己找一圈,蛮多有支持的。

优势是,有些基础服务是免费的,硬件是现成的,有详细的指导文件。

缺点是,高级一些的服务是要收费的,不合适大批量生产,毕竟从底层硬件到前端程序都是人家的,要找到契合自己的网关也麻烦,比如我遇到的几个,都不支持MQTT协议接入。还有就是,数据都得去人家服务器,多少有点膈应。

2.买云服务器,比如阿里云的可视化数据服务,我整了个15天试用。

优点是,数据都是自己的。

缺点是,要买一堆的配套服务,比如协议转换,服务器啥的,死贵死贵的。

3.技术牛皮,那就自己搭建服务器,然后写前端后台嵌入式,我能搞,但这玩意费劲,要时间,而且中间肯定有那么两个环节自己得摸索一段时间。

优点,啥都是自己的,可定制化程度高,省钱,只要有个服务器就行。

缺点,费时费力。

4.找个低代码平台,看了一下,网上这种公司有,只是要掏钱

优点,省时省力,不花多少钱。

缺点,难找合适的。

  1. 推荐方案

对比一圈之后,还是选择了低代码平台,仔细想想,我是干嵌入式的,后台前端这些,对我来说是行业外的东西,可以去了解,但不需要深入,关键省钱就行。

私有部署 - 使用教程-免费低代码数据可视化平台-触达云屏 (topthink.com)

上面的方案个人觉得蛮合适,哔哩哔哩有教程,作者有个群,现在对大家都有技术支持,可以部署到局域网,重点是对个人免费,我觉得不花钱就可以打败一切了,这些都是他的资料。

  1. 服务器搭建

这部分其实是抄官方资料了,自己可以去看,我就抄linux搭建部分

全新安装说明 | 免费低代码数据可视化平台-触达云屏 (chudayun.com)

1,基础环境安装

安装以下基础环境(参考各官网)

Nginx

Mysql 5.7+

2,创建/导入数据库

初始化数据库:创建数据库 chudy_data_visual,执行 chudy_visual_[版本号] /doc 目录下的 初始化SQL文件

3,创建安装目录

分别执行以下三行命令,创建安装目录

cd /
mkdir app
mkdir app/java

4,部署安装

上传以下文件夹到服务器 /app 目录下

chudy_visual_[版本号]

filesystem

chudy_designer

上传 jdk-8u221-linux-x64.tar.gz文件 到服务器 /app/java目录下,解压。

cd /app/java
tar -zxvf jdk-8u221-linux-x64.tar.gz

修改数据库连接配置文件:

/app/chudy_visual_[版本号] /mgr/config 目录下 application-dev.properties

修改 数据库端口、名称、帐号、密码 等信息。

5,配置nginx

上传 chudy_designer 目录下的 chudy_visual.conf 文件到 服务器 nginx的 conf.d 目录下(一般在 /etc/nginx/conf.d/)

重载Nginx配置使配置生效。

防火墙中配置,放行端口 18088

6,启动应用

cd /app/chudy_visual_[版本号]/mgr/
./mgr.sh start
tail -f visual_cms.out

mgr.sh 支持启动、停止、重启、查看状态

./mgr.sh start | stop | restart | status

7,访问系统

http://IP:18088/

初始帐号 sadmin 密码 111111

  1. 设备端实现

目前测试,我是找了个温湿度传感器在折腾,实现方案是

传感器->C#上位机->MQTT协议->云屏

这里放出C#的代码(ps:反正是测试玩的,不重要)

代码

using System;
using System.Text;
using System.Windows.Forms;

using System.IO.Ports;

using System.Net;
using System.Net.Sockets;

using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Protocol;
using System.Threading.Tasks;
using System.Threading;

namespace 开发快上位机
{
    public partial class Form1 : Form
    {
        public static IMqttClient _mqttClient;

        byte[] uart_data = new byte[100];
        byte uart_addr = 0;
        byte uart_start = 0;
        byte uart_time = 0;
        float wendu, shidu;

        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }
        
        private void Form1_Load(object sender, EventArgs e)
        {
            button8.Enabled = false;
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);//必须手动添加事件处理程序
        }

        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口数据接收事件
        {
            try
            {
                uart_start = 1;
                uart_time = 0;
                int ilen = serialPort1.BytesToRead;
                byte[] bytes = new byte[ilen];
                serialPort1.Read(bytes, 0, ilen);
                for (int i = 0; i < ilen; i++)
                {
                    uart_data[uart_addr] = bytes[i];
                    uart_addr++;
                }

                /*                if (!radioButton6.Checked)//如果接收模式为字符模式
                                {
                                    int ilen = serialPort1.BytesToRead;
                                    byte[] bytes = new byte[ilen];
                                    serialPort1.Read(bytes, 0, ilen);
                                    //string str = System.Text.Encoding.Default.GetString(bytes); //xx="中文";
                                    //textBox1.AppendText(str);//添加内容
                                }
                                else
                                { //如果接收模式为数值接收
                                    byte data;
                                    data = (byte)serialPort1.ReadByte();//此处需要强制类型转换,将(int)类型数据转换为(byte类型数据,不必考虑是否会丢失数据
                                    //string str = Convert.ToString(data, 16).ToUpper();//转换为大写十六进制字符串
                                    //textBox1.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");//空位补“0”   
                                }
                */
            }
            catch
            {
                textBox1.AppendText("串口数据接收出错,请检查!\r\n");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text == "串口连接")
            {
                try
                {
                    serialPort1.PortName = comboBox1.Text;
                    serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
                    serialPort1.Open();
                    button1.Text = "断开连接";
                    button2.Enabled = false;
                    panel2.Enabled = false;
                    comboBox1.Enabled = false;
                    comboBox2.Enabled = false;
                    comboBox3.Enabled = false;
                    comboBox4.Enabled = false;
                    textBox1.AppendText("串口已连接\r\n");
                }
                catch
                {
                    if (serialPort1.IsOpen)
                        serialPort1.Close();

                    button1.Text = "串口连接";
                    button2.Enabled = true;
                    comboBox1.Enabled = true;
                    panel2.Enabled = true;
                    comboBox2.Enabled = true;
                    comboBox3.Enabled = true;
                    comboBox4.Enabled = true;
                    textBox1.AppendText("请检查串口连接\r\n");
                }
            }
            else if (button1.Text == "断开连接")
            {
                try
                {
                    serialPort1.Close();
                    button1.Text = "串口连接";
                    button2.Enabled = true;
                    comboBox1.Enabled = true;
                    comboBox2.Enabled = true;
                    comboBox3.Enabled = true;
                    panel2.Enabled = true;
                    comboBox4.Enabled = true;
                    textBox1.AppendText("串口已断开\r\n");
                }
                catch { }
            }
        }

        private void SearchAndAddSerialToComboBox(SerialPort MyPort, ComboBox MyBox)
        {                                                               //将可用端口号添加到ComboBox
            string Buffer;                                              //缓存
            string[] MyString = new string[Convert.ToInt32(comboBox3.Text)];                         //最多容纳20个,太多会影响调试效率        
            MyBox.Items.Clear();                                        //清空ComboBox内容
            for (int i = 1; i < Convert.ToInt32(comboBox3.Text); i++)                                //循环
            {
                try
                {                                   //核心原理是依靠try和catch完成遍历
                    progressBar1.Value = i * (100 / Convert.ToInt32(comboBox3.Text));
                    Buffer = "COM" + i.ToString();
                    MyPort.PortName = Buffer;
                    MyPort.Open();                                      //如果失败,后面的代码不会执行
                    MyString[i - 1] = Buffer;
                    MyBox.Items.Add(Buffer);                            //打开成功,添加至下俩列表
                    comboBox1.Text = Buffer.ToString();
                    MyPort.Close();                                     //关闭
                }
                catch { }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.AppendText("开始自动配置串口\r\n");//出错提示
            textBox1.AppendText("串口扫描\r\n");//出错提示
            SearchAndAddSerialToComboBox(serialPort1, comboBox1);       //扫描并讲课用串口添加至下拉列表
            textBox1.AppendText("端口扫描完毕\r\n");//出错提示
            textBox1.AppendText("正在配置波特率\r\n");//出错提示
            comboBox2.Text = comboBox4.Text;
            serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
            progressBar1.Value = 0;
            textBox1.AppendText("自动配置完成\r\n");//出错提示
            button1_Click(sender, e);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            textBox1.Clear();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            textBox3.Clear();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            System.IO.File.WriteAllText(@"C:\Users\Administrator\Desktop\发送区数据.txt", textBox1.Text);
            System.IO.File.WriteAllText(@"C:\Users\Administrator\Desktop\接收区数据.txt", textBox3.Text);
            textBox1.AppendText("数据保存完成!\r\n");
        }

        void uart_send(object sender, EventArgs e,string data)
        {
            byte[] Data = new byte[1];//作用同上集
            if (serialPort1.IsOpen)//判断串口是否打开,如果打开执行下一步操作
            {
                try
                {
                    if (data != "")
                    {
                        if (!radioButton6.Checked)//如果发送模式是字符模式
                        {
                            try
                            {//实现串口发送汉字
                                Encoding gb = System.Text.Encoding.GetEncoding("gb2312");
                                byte[] bytes = gb.GetBytes(data);
                                serialPort1.Write(bytes, 0, bytes.Length);
                            }
                            catch
                            {
                                textBox1.AppendText("串口数据写入错误\r\n");//出错提示
                                serialPort1.Close();
                                button1_Click(sender, e);
                            }
                        }
                        else
                        {
                            for (int i = 0; i < (data.Length - data.Length % 2) / 2; i++)//取余3运算作用是防止用户输入的字符为奇数个
                            {
                                Data[0] = Convert.ToByte(data.Substring(i * 2, 2), 16);
                                serialPort1.Write(Data, 0, 1);//循环发送(如果输入字符为0A0BB,则只发送0A,0B)
                            }
                            if (data.Length % 2 != 0)//剩下一位单独处理
                            {
                                Data[0] = Convert.ToByte(data.Substring(data.Length - 1, 1), 16);//单独发送B(0B)
                                serialPort1.Write(Data, 0, 1);//发送
                            }
                        }
                    }
                }
                catch
                {
                    textBox1.AppendText("串口数据写入错误\r\n");//出错提示
                }
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            uart_send(sender,e, textBox3.Text);
        }

        private void button9_Click(object sender, EventArgs e)
        {
            var optionsBuilder = new MqttClientOptionsBuilder()
                .WithTcpServer(textBox2.Text, Convert.ToInt16(textBox4.Text)) // 要访问的mqtt服务端的 ip 和 端口号
                .WithCredentials("admin", "123456") // 要访问的mqtt服务端的用户名和密码
                .WithClientId("testclient02") // 设置客户端id
                .WithCleanSession()
                .WithTls(new MqttClientOptionsBuilderTlsParameters
                {
                    UseTls = false  // 是否使用 tls加密
                });

            var clientOptions = optionsBuilder.Build();
            _mqttClient = new MqttFactory().CreateMqttClient();

            _mqttClient.ConnectedAsync += _mqttClient_ConnectedAsync; // 客户端连接成功事件
            _mqttClient.DisconnectedAsync += _mqttClient_DisconnectedAsync; // 客户端连接关闭事件
            _mqttClient.ApplicationMessageReceivedAsync += _mqttClient_ApplicationMessageReceivedAsync; // 收到消息事件

            _mqttClient.ConnectAsync(clientOptions);
        }

        /// <summary>
        /// 客户端连接关闭事件
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private Task _mqttClient_DisconnectedAsync(MqttClientDisconnectedEventArgs arg)
        {
            button8.Enabled = false;
            button9.Text = "连接";
            textBox6.AppendText($"客户端已断开与服务端的连接……\n");
            
            return Task.CompletedTask;
        }

        /// <summary>
        /// 客户端连接成功事件
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private Task _mqttClient_ConnectedAsync(MqttClientConnectedEventArgs arg)
        {
            button8.Enabled = Enabled;
            button9.Text = "断开";
            textBox6.AppendText($"客户端已连接服务端……\n");

            // 订阅消息主题
            // MqttQualityOfServiceLevel: (QoS):  0 最多一次,接收者不确认收到消息,并且消息不被发送者存储和重新发送提供与底层 TCP 协议相同的保证。
            // 1: 保证一条消息至少有一次会传递给接收方。发送方存储消息,直到它从接收方收到确认收到消息的数据包。一条消息可以多次发送或传递。
            // 2: 保证每条消息仅由预期的收件人接收一次。级别2是最安全和最慢的服务质量级别,保证由发送方和接收方之间的至少两个请求/响应(四次握手)。
            _mqttClient.SubscribeAsync("sub", MqttQualityOfServiceLevel.AtLeastOnce);

            return Task.CompletedTask;
        }

        /// <summary>
        /// 收到消息事件
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private Task _mqttClient_ApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs arg)
        {
            textBox6.AppendText($"Topic主题=【{arg.ApplicationMessage.Topic}】 消息={Encoding.UTF8.GetString(arg.ApplicationMessage.Payload)}");
            string str = Encoding.UTF8.GetString(arg.ApplicationMessage.Payload);
            if (str.Contains("on") || str.Contains("off"))
            {
                textBox6.AppendText("\r\n控制继电器\r\n");//出错提示
                byte[] Data = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xc4, 0x0b };//作用同上集
                if (serialPort1.IsOpen)//判断串口是否打开,如果打开执行下一步操作
                {
                    try
                    {
                        serialPort1.Write(Data, 0, 8);//循环发送(如果输入字符为0A0BB,则只发送0A,0B)
                    }
                    catch
                    {
                        textBox1.AppendText("串口数据写入错误\r\n");//出错提示
                    }
                }
            }
            //textBox6.AppendText($"ApplicationMessageReceivedAsync:客户端ID=【{arg.ClientId}】接收到消息。 Topic主题=【{arg.ApplicationMessage.Topic}】 消息=【{Encoding.UTF8.GetString(arg.ApplicationMessage.Payload)}】 qos等级=【{arg.ApplicationMessage.QualityOfServiceLevel}】");
            return Task.CompletedTask;
        }

        public void Publish(string topic,string data)
        {
            var message = new MqttApplicationMessage
            {
                Topic = topic,
                Payload = Encoding.Default.GetBytes(data),
                QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce,
                Retain = true  // 服务端是否保留消息。true为保留,如果有新的订阅者连接,就会立马收到该消息。
            };
            _mqttClient.PublishAsync(message);
        }

        private void button8_Click(object sender, EventArgs e)
        {
            if(textBox8.Text != "")
                Publish(textBox7.Text,textBox8.Text);
        }

        private void button7_Click(object sender, EventArgs e)
        {
            textBox6.Text = "";
            textBox8.Text = "";
        }

        private void button10_Click(object sender, EventArgs e)
        {
            textBox6.AppendText("\r\n读取温度\r\n");//出错提示
            byte[] Data = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xc4, 0x0b };//作用同上集
            if (serialPort1.IsOpen)//判断串口是否打开,如果打开执行下一步操作
            {
                try
                {
                    serialPort1.Write(Data, 0, 8);//循环发送(如果输入字符为0A0BB,则只发送0A,0B)
                }
                catch
                {
                    textBox1.AppendText("串口数据写入错误\r\n");//出错提示
                }
            }
        }

        string zhongliang1 = "{\"value\":";
        string zhongliang2 = ",\"unit\": \"Kg\",\"min\": 0,\"max\": 100,\"label\": \"11\"}";
        string wenshidu1 = "[{\"extObj\": {},\"value\": \"";
        string wenshidu2 = "\",\"prefixText\": \"\",\"suffixText\": \"\",\"descText\": \"\",\"backgroundColor\": \"\",\"icon\": \"\",\"color\": \"\"}]";


        private void button11_Click(object sender, EventArgs e)
        {
            string data;
            data = wenshidu1 + textBox9.Text + wenshidu2;
            Publish("wendu", data);
        }

        private void button12_Click(object sender, EventArgs e)
        {
            string data;
            data = wenshidu1 + textBox10.Text + wenshidu2;
            Publish("shidu", data);
        }

        private void button13_Click(object sender, EventArgs e)
        {
            string data;
            data = zhongliang1 + textBox11.Text + zhongliang2;
            Publish("zhongliang", data);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (uart_start == 1)
            {
                uart_time++;
                if (uart_time >= 100)
                {
                    textBox1.AppendText(uart_addr.ToString());//空位补“0”
                    for (int i = 0; i < uart_addr; i++)
                    {
                        string str = Convert.ToString(uart_data[i], 16).ToUpper();//转换为大写十六进制字符串
                        textBox1.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");//空位补“0”
                    }

                    if (uart_data[0] == 0x01 && uart_data[1] == 0x03 && uart_data[2] == 0x04)
                    {
                        shidu = uart_data[3] << 8 | uart_data[4];
                        wendu = uart_data[5] << 8 | uart_data[6];
                        shidu = shidu / 10;
                        wendu = wendu / 10;

                        string str1,str2;
                        textBox9.Text = wendu.ToString();
                        textBox10.Text = shidu.ToString();
                        button11_Click(sender,  e);
                        button12_Click(sender,  e);
                    }

                    uart_start = 0;
                    uart_time = 0;
                    uart_addr = 0;
                }
            }
        }
    }
}
  1. 测试效果

简化操作,直接搞了几个按键去发

当然实际项目不会这么干,实际项目的构成应该是

  1. 单片机接传感器,以MODBUS/无线等方式提供数据访问接口

  1. linux网关实现数据转发,比如NXP的IMX6,上面实现MQTT客户端

  1. 云服务器做MQTT服务器,实现数据转发

  1. WEB云屏/微信小程序/桌面应用等订阅MQTT数据

上面是我的微信和QQ群,欢迎新朋友的加入。

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

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

相关文章

ChatGPT解答:安卓APP耗电量测试方案和源码,用Android代码实现

ChatGPT解答&#xff1a;安卓APP耗电量测试方案和源码&#xff0c;用Android代码实现 安卓APP耗电量测试方案和源码&#xff0c;用Android代码实现 作为一名AI助手&#xff0c;我不会编写代码&#xff0c;但我可以为您提供一些关于安卓APP耗电量测试方案和源码的信息和建议。 …

Web前端:2023年React最佳实践

大多数前端开发人员都希望React JS能成为他们的武器库&#xff0c;来创建独特的、前沿的用户界面。1.重要文件组织服务于相似功能并且被设计为使用某一特征的文件应该被保存在一起。例如&#xff0c;与单个组件相关的所有样式文件和其他文件应该位于同一位置。在这种做法的帮助…

iphone备忘录删除怎么恢复?分享苹果数据找回办法

手机备忘录上写记录&#xff0c;这是不少上班族的小习惯。因为它可以先记录紧急事务&#xff0c;然后再慢慢的解决。也可以把我们一些重要的账号密码存在备忘录里&#xff0c;方便在何时何地直接登入使用。那么如果我们不小心删除了iphone备忘录呢?碰到这种事该怎么办呢?有没…

Vue中二级菜单的实现

在不使用ElementUi等框架的情况下&#xff0c;制作一个二级菜单&#xff0c;网上搜寻很多资料&#xff0c;但部分要不只显示HTML结构&#xff0c;不显示CSS样式&#xff0c;要不就是复杂的让人无法理解。效果图&#xff1a;针对菜单做了CSS样式修饰&#xff0c;给一级二级菜单都…

基于STM32+CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试(下篇)

四、移植FATFS文件系统 前面第3章&#xff0c;完成了SD NAND的驱动代码编写&#xff0c;这一章节实现FATFS文件的移植。 4.1 FATFS文件系统介绍 &#xff08;1&#xff09;介绍 FatFs 是一种完全免费开源的 FAT 文件系统模块&#xff0c;专门为小型的嵌入式系统而设计。它完…

07--组件

一、小程序组件分类微信团队为开发者提供了一系列基础组件&#xff0c;开发者可以通过组合这些基础组件进行快速开发。小程序中的组件也是非常丰富的&#xff0c;开发者可以基于组件快速搭建出漂亮的页面结构。小程序中的组件其实相当于网页中的HTML标签&#xff0c;只不过标签…

5年测试路,终于爬到了半山腰,结果碰到00后入场,我该拿什么争,我不想35岁被淘汰......

软件测试是一个付出就有回报的工作&#xff0c;可能很多人会说软件测试就是吃青春饭&#xff0c;然而其他工作又何尝不是&#xff1f;没有哪一家公司养尸位素餐之人&#xff0c;大龄员工有被辞退的&#xff0c;也有没被辞退的。干任何职业&#xff0c;抱着一劳永逸的心态&#…

关于k8s集群备份和恢复工具Velero 的一些笔记整理

写在前面 分享一个k8s集群容灾备份恢复开源工具 Velero博文内容涉及&#xff1a; Velero 的简单介绍Velero 安装下载备份恢复 Demo&#xff0c;以及容灾测试 Demo恢复失败情况分析 理解不足小伙伴帮忙指正 我所渴求的&#xff0c;無非是將心中脫穎語出的本性付諸生活&#xff0…

第九届蓝桥杯省赛 C++ A/B组 - 全球变暖

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;蓝桥杯题解集合 &#x1f4dd;原题地址&#xff1a;全球变暖 &#x1f4e3;专栏定位&#xff1a;为想参加蓝桥杯的小伙伴整理常考算法题解&#xff0c;祝大家…

分布式架构设计模式

咖啡不冲&#xff0c;你一定会成功 分布式架构设计模式一、什么是设计模式&#xff1f;1.1 设计模式的由来1.2 设计模式有哪些种类1.3 如何学习设计模式二、六大设计原则2.1 开闭原则2.2 单一职责原则2.3 里氏替换原则2.4 迪米特法则2.5 接口隔离原则2.6 依赖倒置原则三、创建型…

websocket原理及简单应用

websocket是什么&#xff1f; 一般做系统开发前后端交互使用最多的就是http协议&#xff0c;但http协议是无状态协议每一次前端发起的请求都认为是一次单独的请求和之前的请求无任何关系&#xff0c;所以我们需要http协议分别用户信息时&#xff0c;就需要使用cookie、session…

Rust学习总结之if,while,loop,for使用

目录 一&#xff1a;if的使用 二&#xff1a;while的使用 三&#xff1a;loop的使用 四&#xff1a;for的使用 本文总结的四种语句&#xff08;if&#xff0c;while&#xff0c;loop&#xff0c;for&#xff09;除了loop&#xff0c;其他的三个在C语言或者Python中都是常见…

DDD系列 - 第1讲 DDD相关概念入门

目录一、引言二、 统一语言Ubiquitous Language三、 三个阶段&#xff08;战略、战术、实现&#xff09;阶段1&#xff1a;战略设计阶段阶段2&#xff1a;战术设计阶段阶段3&#xff1a;技术实现阶段四、限界上下文Bounded Context五、上下文映射Context Map防腐层Anti-Corrupt…

深度学习代码怎么读-小白阶段性思路

深度学习代码怎么读-小白阶段性思路目前思路学习资料读代码工具-chatgpt目前思路 努力上路的小白一枚&#xff0c;麻烦路过的大佬指导一二&#xff0c;同时希望能和大家交流学习~ 和学长、实习老师们交流后的目前思路&#xff1a; 先找到自己研究领域的顶级期刊&#xff0c;…

21 Nacos客户端本地缓存及故障转移

Nacos客户端本地缓存及故障转移 在Nacos本地缓存的时候有的时候必然会出现一些故障&#xff0c;这些故障就需要进行处理&#xff0c;涉及到的核心类为ServiceInfoHolder和FailoverReactor。 本地缓存有两方面&#xff0c;第一方面是从注册中心获得实例信息会缓存在内存当中&a…

AGV机器人出圈:助力产线物流自动化

随着开年档电影《流浪地球2》的热映&#xff0c;里面的四足仿生机器人机械狗“笨笨”、可穿戴的外骨骼机器人等“黑科技”&#xff0c;都让人对机器人的魅力刮目相看&#xff0c;机器人成功“出圈”了&#xff0c;随着智能技术的发展与进步&#xff0c;我们常见的机器人种类越来…

Linux命令之sed

sed&#xff0c;Stream Editor&#xff08;字符流编辑器&#xff09;的缩写&#xff0c;简称流编辑器&#xff0c;是操作、过滤、转换文本内容的工具。 常用功能包括结合正则表达式对文件实现快速的增删改查。 工作原理 sed有2个空间来缓存数据&#xff0c;paattern space&am…

Qt交叉编译环境搭建

环境及版本&#xff1a;Deepin 20.3 Qt 5.12.9 arm编译工具 gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz 1.下载Qt源码&#xff1a;qt-everywhere-src-5.12.9.tar.xz&#xff0c;并解压 2.下载arm编译工具&#xff1a; gcc-linaro-7.5.0-2019.12-x86_64_arm…

央企集团是怎么设置信息化、数字化部门的?

在数字经济大潮中&#xff0c;数字化转型已不是企业的“选修课”&#xff0c;而是关乎企业生存和长远发展的“必修课”。在企业数字化转型中&#xff0c;国有企业特别是中央企业普遍将数字化转型战略作为“十四五”时期业务规划的重要内容之一&#xff0c;数字化能力也成为衡量…

代码随想录【Day31】| 455. 分发饼干、376. 摆动序列、53. 最大子数组和

455. 分发饼干 题目链接 题目描述&#xff1a; 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff…