使用mqtt协议 硬件对接_mqtt怎么对接硬件-程序员宅基地

技术标签: mosquitto  mqqt  websocket  linux  

Shaocheng.Li
Toggle main menu visibility
首页
关于
MQTT 协议和 mosquitto
2015-08-11 Network 12792

  1. MQTT 介绍
  2. Mosquitto
  3. 安全性
    3.1. SSL/TLS
    3.2. WebSockets with SSL/TLS
  4. libmosquitto 库
    4.1. 获取库版本
    4.2. 初始化和清除
    4.3. 构建和释放客户端
    4.4. 验证和编码
    4.5. 发布
    4.6. 订阅
    4.7. 遗嘱
    4.8. 连接和断开
    4.9. 网络循环
    4.10. 回调函数
    确认连接回调函数
    断开连接回调函数
    消息回调函数
    订阅回调函数
    取消订阅回调函数
    日志回调函数
  5. 后记
  6. 参考
  7. MQTT 介绍
    http://mqtt.org/

MQTT 是一个轻型协议,使用基于 TCP/IP 协议的发布/订阅消息转发模式,专门用于机器对机器 (M2M) 通信。 MQTT 协议的中心是 MQTT 服务器或代理 (broker) ,支持发布程序和订阅程序进行访问,如下图所示:

用户可以使用 MQTT 构建一个传感器网络,其中各种传感器都能够以其传感器独有的消息形式发布传感器值。 订阅程序能够订阅不同的消息,以据此采取措施。 MQTT 代理将处理从发布程序到订阅程序的转发消息。
如果已经有了一个 broker ,可以直接用 MQTT 客户端软件测试。这里有一个跨平台的 MQTT 客户端 MQTT.fx 。
2. Mosquitto
mosquitto 是一个开源的 MQTT broker ,目前支持 v3.1 和 v3.1.1 协议 ,同时提供了一个 C 语言动态链接库 libmosquitto ,用于实现 mqtt 客户端:
http://mosquitto.org/documentation/

下载 mosquitto-1.4.2.tar.gz 后,解压,然后执行 make ,make install 。即可得到几个二进制可执行文件:
mosquitto : mqtt broker
mosquitto_passwd : 管理 mosquitto 密码文件的命令行工具
mosquitto_sub : mqtt 订阅者程序
mosquitto_pub : mqtt 发布者程序
相关的配置文件安装在 /etc/mosquitto/ 目录下。在 Ubuntu 下可以直接安装 sudo apt-get install mosquitto 。
现在测试一下客户端和服务端程序。为了测试方便,将客户端和服务端程序都在本机,使用 localhost 连接。执行 mosquitto -v 启动 broker ,-v 参数表示打印出运行信息,可以看到默认使用的端口是1883 :

如果你的系统出现如下问题,就需要添加一个 mosquitto 用户:

可以使用 systemd 让 mosquitto 自动启动,添加如下配置文件:
ubuntu@VM-231-137-ubuntu:/etc/systemd/system$ cat mosquitto.service
[Unit]
Description=Mosquitto MQTT Broker
ConditionPathExists=/etc/mosquitto/mosquitto.conf
After=network.target

[Service]
ExecStart=/usr/local/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
ExecReload=/bin/kill -HUP $MAINPID
User=mosquitto
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
然后在第二个终端启动订阅者程序: mosquitto_sub -h localhost -t test -v,用 -h 参数指定服务器 IP ,用 -t 参数指定订阅的话题。
在第三个终端启动发布者程序: mosquitto_pub -h localhost -t test -m “Hello world”,用 -m 参数指定要发布的信息内容,然后在订阅者的终端就可以看到由 broker 推送的信息:

在 broker 的终端也可以看到处理信息的过程:

mosquitto 语法是
mosquitto [-c config file] [ -d | --daemon ] [-p port number] [-v]
-c 是指定配置文件的路径,默认不需要配置文件。
-d 表示作为守护进程运行在后台。
-p 用来指定监听的端口,默认是 1883 ,使用 TCP 连接,如果要使用 UDP 连接,需要设为 1884。
-v 表示生成详细的运行日志,等价于配置文件中将 log_type 设为 all 。
mosquitto 默认是不需要配置文件的,它会对所有的选项采用默认值,比如用户名和密码。默认不需要用户名和密码,如果需要,可以用 mosquitto_passwd 新建用户和密码,并管理,语法是:
mosquitto_passwd [ -c | -D ] passwordfile username
mosquitto_passwd -b passwordfile username password
mosquitto_passwd -U passwordfile
-c 表示新建一个密码文件,如果文件已经存在,会被覆盖,用户名中不能包含冒号,因为密码文件中用户名和密码是用冒号隔开的。执行之后会要求设置密码,输入内容不可见,密码以加密 hash 值的方式存储在密码文件中。
-D 表示删除用户名。
-b 表示在命令行中,以明文方式设置密码。
-U 用来将密码文件中的明文密码改成加密格式。如果文件中的密码已经是 hash 值,千万不要用这个选项,否则它会对 hash 值再做一次运算,然后修改密码文件。
设好密码后,在配置文件中设置 allow_anonymous false 再用 password_file 指定密码文件的路径就可以使用了。配置文件可以放在任何位置,只要 mosquitt 能找到它。配置文件中,每一行设置一个选项,选项名称和值用空格隔开,用井号可以注释。安装好的 mosquitto 在 /etc/mosquitto/ 目录下有配置文件和密码文件的例子,复制一份皆可

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38653669/article/details/103199255

智能推荐

纯文本用textbox,带格式的文本用richtextbox_textbox设置纯文本-程序员宅基地

文章浏览阅读762次。纯文本用textbox,带格式的文本用richtextbox_textbox设置纯文本

Expected one result (or null) to be returned by selectOne(), but found: 7-程序员宅基地

文章浏览阅读1.1k次。在ssm中运行代码报错如下:org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 7检查发现查询mapping层数据接收问题,返回多条数据用对象无法接收解决方案:..._expected one result (or null) to be returned by selectone(), but found: 7

我的DBHelper类-程序员宅基地

文章浏览阅读41次。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Data;using System.Data.SqlClient;namespace DAL{ public class DBHelper ..._完整的dbhelper类

【Android学习专题】安卓样式学习(学习内容记录)_android权威编程指南第三版笔记-程序员宅基地

文章浏览阅读490次。格式:按钮组件不支持着色,所以colorAccent主题色在项目中没有效果。_android权威编程指南第三版笔记

Windows10&windows server 2012r2作为slave 用jenkins部署微信小程序自动化打包_win2012如何配置小程序?-程序员宅基地

文章浏览阅读945次。背景微信小程序的测试发布在没有 CI/CD 等相关工具的情况下,存在着如下的问题:小程序开发助手中,同一个开发者只能显示一个开发版本测试同事、产品经理、UI设计师找开发要二维码,或者本地拉取代码后使用开发者工具打开,不方便且效率较低本地生成的二维码会出现携带本地代码、未及时拉取分支其他改动等问题为了避免如上问题的发生,采用微信小程序集成 Jenkins 的方案。想达到一个效果,开发人员只管往前写代码,提交代码,修改bug。而测试人员就通过jenkins自动打包和部署进行测试开发人员所做的功能和回归_win2012如何配置小程序?

GCC 分别64位和32为体系_gcc查看64 32位-程序员宅基地

文章浏览阅读1k次。#if defined(__X86_64__) || defined(__X86_64) || defined(__amd_64) || defined(__amd_64__)_gcc查看64 32位

随便推点

Android Bluetooth 移植(上)_安卓移植hcitool-程序员宅基地

文章浏览阅读972次。原文链接地址:http://source.android.com/porting/bluetooth.html#androidBluetoothPorting本文涵盖以下方面· 移植· 编译· 疑难解答· 工具· 支持特性 Android 的蓝牙协议栈使用BlueZ实现来对GAP, SDP以及R_安卓移植hcitool

基于hadoop和echarts的教育大数据可视化系统_基于hadoop线上课程信息分析系统实现-程序员宅基地

文章浏览阅读1.5k次,点赞4次,收藏20次。教育大数据可视化系统,通过使用Hadoop生态圈中的组件进行数据归一化及存储,解决数据分析过程,使用ECharts可视化工具来对学习行为分析后的抽象结果进行展现,数据分析的维度有平台健康度,每日登录人数分析、平均学习时长分析、学习行为次数分析、每日活跃情况分析和分时段学习人数分析等。在学生学习的过程中,学校的管理者或负责教师需要了解学生的学习情况和学习状态,因此必须要通过学生的学习行为数据进行数据分析,将学生的学习情况直观的展现给用户,方便教师进行学生管理和评测。5.7 分时段学习人数分析界面 23。_基于hadoop线上课程信息分析系统实现

搭建自己的博客遇到的问题记录和备注2(java后台)_在这次的博客后台实战中,我遇到了很多问题-程序员宅基地

文章浏览阅读163次。java 功能 备注 跨域请求配置 spring增加@CrossOrigin注释 返回参数前端不接收 配置springmvc返回格式为json example 查询未查到content 为null @PathVariable("articleId") 用来动态绑定url参数 spingmvc No mapping found for HTT..._在这次的博客后台实战中,我遇到了很多问题

socket.io 中namespace 和 room的概念。_socketio 房间概念-程序员宅基地

文章浏览阅读2.2w次,点赞9次,收藏13次。基本概念看socketio官方文档 http://socket.io/docs/rooms-and-namespaces/namespace 和room的概念其实用来同一个服务端socket多路复用的。namespace,room和socketio的关系如下。socket会属于某一个room,如果没有指定,那么会有一个default的room。这个room又会属于某个namespace,_socketio 房间概念

编辑 Ext 表格(一)——— 动态添加删除行列_extjs 表格删除一列-程序员宅基地

文章浏览阅读6.5k次。一、动态增删行在 ext 表格中,动态添加行主要和表格绑定的 store 有关,通过对 store 数据集进行添加或删除,就能实现表格行的动态添加删除。 (1) 动态添加表格的行 gridStore.add({}); (2) 动态删除表格的行 gridStore.removeAt(gridStore.count() - 1); 二、动态增删列在 ext_extjs 表格删除一列

1.1 仿射集与凸集-1_仿射集为相对开集-程序员宅基地

文章浏览阅读211次。2021 年 2 月 5 日星期五,想喝奶茶的一天。想要 coco 今日推出的奶茶包,可惜要 88 赞。废话少说,进入正题。1 凸集与凸函数1.1 仿射集与凸集-1定义 1.1.1 若集合 W⊆RnW\subseteq\mathbb{R}^nW⊆Rn 中任意两个不同元素对于加法和数乘皆是封闭的,即任取 x1,x2∈Wx_1,x_2\in Wx1​,x2​∈W,λ1,λ2∈R\lambda_1,\lambda_2\in\mathbb{R}λ1​,λ2​∈R 皆有λ1x1+λ2x2∈W,\lambd_仿射集为相对开集