白话消息队列遥测传输协议(MQTT)

MQTT 是一种基于发布/订阅模式的轻量级通讯协议,该协议构建于 TCP/IP 协议上,由 IBM 在 1999 年发布,它是开放消息协议,简单容易实现,消息支持 Qos。MQTT 最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。这些特性,使其在物联网、小型设备、移动应用、车联网、电力能源等方面有着较为广泛的应用。 我是在看嵌入式资料时,了解到了 MQTT 协议。嵌入式还有一种协议叫 CoAP。今天主要讲下 MQTT。我们先看下 MQTT 协议的由来。 MQTT 最初是由 AndyStandford-Clark 博士和 Arlen Nipper 博士于 1999 年发明的通讯协议。他们当时是为了在狭窄的网络带宽和微小电力损耗的前提之下,提供石油管道传感器和人造卫星之间一个轻量、可靠的二进制通讯协议。2011 年,IBM 和 Eurotech 将 MQTT 协议捐赠给 Eclipse 基金会,并加入了 Eclipse M2M Industry 工作组织。2014 年 10 月,MQTT 正式成为一个开放的 OASIS 国际标准。 在看到这里的时候,我在想,如果 MQTT 不公布出来,不就是一个私有协议吗?前段时间,在学习 TCP/IP 时,我还在想一件事,TCP 连接之后,就可以发送数据,但是数据格式还需要自己进行定义,发送方和接收方都需要按照规定的格式进行发送和解析。还有就是 TCP 连接如何认证?除了 IP 白名单之外,如何在应用上实现认证?这些在看了 MQTT 规范后,这些问题都找到了答案,我不知道他们当时怎么想的,我真想掰开他们的脑子,他们是真的太厉害了。他们在 1999 年就已经完成了,现在 20 多年过去了。对于入门 TCP/IP 的我来说,这是一种精神食粮,能吃还很香。 这两天一直在看 MQTT 的相关资料,以及理解 MQTT 协议,不知道哪篇资料写的 MQTT 是基于 IP 协议的,后来才基于 TCP/IP 协议。我个人觉得基于 IP 协议反而更贴切当时的环境,肯定是后来协议优化之后选择的 TCP/IP 协议。在说 MQTT 协议之前,先说下我心中的疑惑?我是看嵌入式资料时,知道 MQTT 的,现在的物联网很火,完全可以做到通过私有协议来连接控制,为什么要 MQTT 协议?后来,看看身边的事物,例如 USB,是为了兼容和互通。我不知道为啥选择 MQTT?开源应该算一个原因吧,MQTT 协议设计非常好算另一个原因吧。我们来看下 MQTT 的特点吧。 ...

2025-01-01 · 2 min · Eagle

编程开发架构发展史

编程开发架构的发展史充满了许多重要的里程碑。以下是按时间顺序列出的编程开发架构发展史中的一些关键事件: 1940 年代 - 单机编程 早期计算机使用机器语言和汇编语言进行单机编程,程序员直接在单台计算机上编写和运行代码。 1960 年代 - 批处理系统 批处理系统允许计算机一次处理一批任务,程序员将代码提交到计算机中心,代码被集中处理后返回结果。 1960 年代 - 时分多任务操作系统 开发了时分多任务操作系统(如 IBM 的 OS/360),允许多个用户共享计算机资源,支持多任务处理。 1970 年代 - 分时系统 分时系统(如 Multics 和 UNIX)允许多个用户同时使用计算机,通过时间片轮转机制实现资源共享。 1980 年代 - 客户端/服务器架构 客户端/服务器架构(Client/Server Architecture)兴起,客户端应用程序与服务器进行通信,服务器处理数据并返回结果。 1990 年代 - 三层架构 三层架构(Three-Tier Architecture)被广泛采用,分为表示层(用户界面)、逻辑层(业务逻辑)和数据层(数据库)。 1990 年代 - Web 开发 万维网(World Wide Web)的兴起带来了 Web 开发,使用 HTML、CSS 和 JavaScript 开发网页,服务器端使用 CGI、PHP、ASP 等技术。 2000 年代 - 服务导向架构(SOA) 服务导向架构(SOA)提出,通过定义服务接口,应用程序可以相互通信和集成,促进了分布式系统的发展。 2006 年 - 云计算 亚马逊推出 AWS(亚马逊网络服务),开启了云计算时代,开发者可以按需使用计算资源,提升了应用程序的可扩展性和灵活性。 2010 年代 - 微服务架构 ...

2025-01-01 · 1 min · Eagle

编程语言发展史

编程开发的发展史充满了许多重要的里程碑。以下是按时间顺序列出的编程开发史中的一些关键事件: 1940 年代 - 机器语言 机器语言是计算机的最基本的编程语言,直接用二进制代码来控制计算机硬件。 1950 年代 - 汇编语言 汇编语言(Assembly Language)引入了助记符,简化了编程过程,使程序员能够更容易地编写代码。 1957 年 - Fortran IBM 发布了 Fortran(Formula Translation),这是第一个高层次编程语言,主要用于科学和工程计算。 1959 年 - COBOL COBOL(Common Business-Oriented Language)被开发出来,主要用于商业数据处理。 1960 年 - LISP 由 John McCarthy 开发的 LISP(LISt Processing)语言,成为人工智能研究的主要语言之一。 1964 年 - BASIC 约翰·肯尼和托马斯·库尔茨开发了 BASIC(Beginner’s All-purpose Symbolic Instruction Code),旨在为初学者提供简单的编程语言。 1970 年 - Pascal Niklaus Wirth 开发了 Pascal 语言,主要用于教学和系统编程。 1972 年 - C 语言 Dennis Ritchie 在贝尔实验室开发了 C 语言,它结合了高效和灵活性,成为系统编程的标准语言。 1980 年 - Ada ...

2025-01-01 · 1 min · Eagle

豆子碎片文章内容无法查看解决方法

当我的点数为 0 时,发现点击文章列表,进入到文章详情,无法查看文章内容。 以前没有发现这个问题,是因为我的账户中有点数。 造成的原因是加锁文章逻辑问题。 原来的代码为: if u.Points < 1 { return nil, errors.New("点数不足") } 优化后的代码为: // 判断是否加锁文章 if b.IsLock == 1 { // 只有不是自己的文章才计算点数 if bopenid != openid { if u.Points < 1 { return nil, errors.New("点数不足") } // 给文章作者奖励 VTransAddPoints(bopenid, global.ViewLockArtA, 1, uuid) // 扣减读者 VTransSubPoints(openid, global.ViewLockArtD, 1, uuid) } }

2025-01-01 · 1 min · Eagle

豆子碎片小程序项目介绍

豆子碎片是展示和搜索文章的微信小程序。它的项目名称是 visit,该项目经历多个版本迭代。现在已经成熟和稳定。 visit 项目在小程序端的二维码: Visit 项目地址 https://gitee.com/littletow/visit 云环境版本 visit 项目使用小程序云环境,在云存储中存放文章的 markdown 文件,然后小程序调用云函数获取使用 towxml 包转换后的 json 数据,在小程序端进行渲染。新的 towxml 组件必须使用微信小程序基础库 2.9.4 版本以上,才能正常显示。该项目在搜索时,是根据文章标题和关键字进行模糊查询检索匹配的。在云环境开始收费后,转为服务器版本。服务器灵活性强,可操作空间大,可以有多种用途。 服务器版本 visit 项目当前使用服务器版本,在服务器使用数据库存储 markdown 文件的数据。小程序调用 API 开放接口从后台获取文件的数据,在前端使用 towxml 组件进行渲染。 注意:小程序端只有文章显示和搜索功能。 主要是方便上架审核。上传和管理文章等通过后台接口或工具完成,文章使用 Markdown 格式。 当制作好文档后,需要使用工具或者 API 开放接口上传到后台。 使用工具上传,工具请使用开源项目 upart-go 项目 使用 API 开放接口上传,API 接口文档请访问开放接口 项目介绍 visit 项目主要是为了在小程序端记录和分享技术文章,也是学习小程序的入门项目。上传的文章以编程技术或技术相关经验为主题。小程序包含首页和我的两个栏目,首页显示公开的和自己上传的文章,可通过关键字搜索文章,搜索文章时,是通过文章标题或关键字进行模糊查询检索匹配。也可以使用快捷按钮检索文章,快捷按钮目前包含 3 个:最新,最近上传的文章;最火,浏览量最高的文章;最冷,浏览量最低的文章。我的页面只有两个功能,一个是获取我的识别码,使用工具,或者开放接口时需要用到此识别码,用作 API 接口认证。另一个是看广告获取点数。上传文章是需要豆子点数的。加入广告,是为了希望获取一点收益,承担一点我的服务器支出。文章可通过工具上传,工具可使用 upart-go 开源项目。如果要公开文章,那么公开的文章需要后台审核。文章也可以加锁,当加锁后,其它用户访问你的文章,你将获得豆子点数奖励。 直接在 Markdown 文件中添加的图片链接在小程序端是无法打开的。如果确实需要在文章中显示图片,可以将图床域名地址告知我,添加到小程序域名白名单中。 目前有一个方案是微信公众号图片小程序不会过滤,可以将您的图片上传到微信公众号,然后获取图片链接,添加到 markdown 文件中。 在 Markdown 文件中添加的 HTTP 和 HTTPS 链接在小程序端无法打开。 豆子碎片完整使用由四部分应用组成:小程序端,上传文章工具,Web 审核后台,以及后台接口服务。 小程序端,用来显示和搜索文章。 上传文章工具,用于上传文章,以及管理文章。 Web 审核后台,用来管理待审核的文章。 后台接口服务,为上面三个终端提供服务,将数据存储在服务器,并处理数据。 其中,小程序端和上传文章工具已开源,其它两项也将以教程的方式持续的发布在豆子笔记中。 ...

2025-01-01 · 1 min · Eagle

管理后台如何添加 IP 归属地拦截?

在使用 IP 归属地这么长时间,我发现这个作用越来越大了。今天将源文件重新维护了下,主要是规范省份名称,例如河南调整为河南省,内蒙古调整为内蒙古自治区等,调整之后,源文件明显增大了尺寸,但是为了严谨,是值得的。 因为我的后台,访问地点是固定的,通过白名单设置 IP 太麻烦,就用 IP 归属地进行拦截。 我精确到省份,其实可以精确到市,我的 IP 库精确到市。 添加还是非常简单的,利用开放接口即可。 我这里不用使用,可以直接调用函数,如果是两个服务,就需要开放接口了。 先获取归属地,归属地格式,国家|省份|城市,国外的只显示国家名,其它项为 0,返回字符串,以|分割。 取到归属地字符串后,切分字符串为数组,取出省份。 strArr := strings.Split(str, "|") n := len(strArr) // 这个情况基本不存在,源文件中以0作为占位符。 if n != 3 { return "" } return strArr[1] 归属地数组索引 0 是国家,1 是省份,2 是城市。 现在,使用获取到的省份信息比对。 以前,是直接将省份字段和“河南”比较,现在优化了一下,包含就可以。防止数据文件出现河南省这样的情况导致问题。 ok := strings.Contains(province, "河南") if !ok { c.JSON(http.StatusOK, ErrWxResp("拒绝登录-1", nil)) return } 这样,归属地不是河南将不允许登录。

2025-01-01 · 1 min · Eagle

计算机病毒发展史

网络安全的发展史充满了许多重要的里程碑。以下是按时间顺序列出的网络安全发展史中的一些关键事件: 1983 年 - 计算机病毒的概念 弗雷德·科恩(Fred Cohen)在他的论文中首次提出“计算机病毒”的概念,定义了自我复制的软件程序。 1986 年 - Brain 病毒 Brain 病毒是第一个 IBM PC 兼容机上的计算机病毒,由巴基斯坦的两个兄弟编写,它感染了引导扇区。 1988 年 - Morris 蠕虫 Robert Tappan Morris 发布了 Morris 蠕虫,这是第一个在互联网上广泛传播的蠕虫,导致了大量计算机系统的瘫痪。 1995 年 - 微软 Word 宏病毒 Concept 病毒是第一个宏病毒,感染了微软 Word 文档,标志着宏病毒时代的开始。 1999 年 - Melissa 病毒 Melissa 病毒通过电子邮件传播,迅速感染了数十万台计算机,导致企业网络瘫痪。 2000 年 - ILOVEYOU 病毒 ILOVEYOU 病毒通过电子邮件传播,造成了数十亿美元的损失,是历史上传播最快的病毒之一。 2001 年 - Code Red 蠕虫 Code Red 蠕虫攻击了微软的 IIS 服务器,感染了超过 35 万台计算机,对互联网造成了严重影响。 2003 年 - SQL Slammer 蠕虫 ...

2025-01-01 · 1 min · Eagle

计算机发展史

计算机发展史充满了许多重要的里程碑。以下是按时间顺序列出的计算机发展史中的一些关键事件: 1941 年 - 第一台电子计算机:Z3 由德国工程师康拉德·楚泽(Konrad Zuse)发明的 Z3 被认为是世界上第一台可编程的电子计算机。 1943 年 - Colossus 英国在二战期间开发的 Colossus 计算机,用于破解德国的密码,特别是 Lorenz 密码。 1946 年 - ENIAC 美国研制的 ENIAC(Electronic Numerical Integrator and Computer)是第一台通用电子计算机。 1951 年 - UNIVAC I UNIVAC I(Universal Automatic Computer I)是第一台商用计算机,由 J. Presper Eckert 和 John Mauchly 设计。 1956 年 - 磁盘存储器 IBM 引入了第一个硬盘驱动器 IBM 305 RAMAC,它使用旋转磁盘来存储数据。 1964 年 - IBM System/360 IBM 发布的 System/360 系列计算机,成为一种标准化的计算机系统,影响深远。 1971 年 - 微处理器 英特尔发布了 4004 微处理器,这是第一款商用微处理器,标志着个人计算机时代的开始。 1973 年 - 以太网 ...

2025-01-01 · 1 min · Eagle

记录 Frp 常用配置

简单、高效的内网穿透工具。 网址:https://www.gofrp.org 通过 SSH 访问内网机器 1, 在具有公网 IP 的机器上部署 frps 部署 frps 并编辑 frps.toml 文件。以下是简化的配置,其中设置了 frp 服务器用于接收客户端连接的端口: bindPort = 7000 2, 在需要被访问的内网机器上部署 frpc 部署 frpc 并编辑 frpc.toml 文件,假设 frps 所在服务器的公网 IP 地址为 x.x.x.x。以下是示例配置: serverAddr = "x.x.x.x" serverPort = 7000 [[proxies]] name = "ssh" type = "tcp" localIP = "127.0.0.1" localPort = 22 remotePort = 6000 localIP 和 localPort 配置为需要从公网访问的内网服务的地址和端口。 remotePort 表示在 frp 服务端监听的端口,访问此端口的流量将被转发到本地服务的相应端口。 3, 通过 SSH 访问内网机器 使用以下命令通过 SSH 访问内网机器,假设用户名为 test: ssh -o Port=6000 test@x.x.x.x

2025-01-01 · 1 min · Eagle

记录 Rust 上传文章工具崩溃问题

最近,更新了上传文章工具 rust 版本,这个版本使用的库为 nwg,即 native-windows-gui 库,该库支持老的 Windows GUI。 昨天,当我准备在另一台电脑上录制视频时,发现运行不起来,GUI 界面闪现一下,就退出了。我先升级了 Rust 版本到最新版本。 rustup update 升级完成后,cargo clean ,再 cargo run 重新运行。 郁闷,还是报错。 将 main.rs 文件中该行注释,#![windows_subsystem = "windows"],可以在命令行中查看报错信息,提示是找不到文件。我想了下,只有图片是文件,然后我将图片的路径修改,发现修改之后,编辑器提示错误,找不到文件。重新改回去后,编辑器提示错误消失。说明不是这里的错误。 我真的晕了。从网上查找问题原因,没有找到此类问题的解决方法,郁闷。在查找时,发现了另一个 Windows 官方支持的 rust 库,就叫 windows,打算有时间了用这个库重写一下。 今天,我又查看了下另一台电脑上的这个项目,发现可以正常运行,将 rust 升级到最新版本后,还是可以运行。在看到配置文件后,我才恍然大悟,原来是查找这个文件。我赶紧扒拉代码确认,发现确实是这个问题。 let conf = Ini::load_from_file("conf.ini").unwrap(); 上面是使用文件的地方,找不到文件 panic。我这里优化一下,让错误提醒的更明显一些。这样我就瞬间能知道问题原因了。 优化后的代码如下: let conf = Ini::load_from_file("conf.ini").expect("please config conf.ini file");

2025-01-01 · 1 min · Eagle