精华内容
下载资源
问答
  • linux mqtt 异步
    2020-08-05 12:43:43

    1、前言

    异步函数的好处就是以非阻塞的方式去运行,但它相比于同步函数的结构就要稍微复杂一些。异步方式就是先设置对应的结构体,之后就去启动对应的操作,这些操作后台执行完成之后就会调用相结构体里面的成功或失败函数,我们就可以在这些被调用的函数里面执行我们下一步的操作。


    2、订阅端

    程序一开始就根据我们定义的宏去创建一个实例和设置回调函数,接着定义一个“连接”的结构体填充用户密码、函数指针,这个结构体中将文件句柄作为context传进去供onConnectSuccess等函数去获取,因为连接成功的函数里面需要文件句柄去订阅主题。订阅主题之后服务器端就会根据主题发送匹配的消息,消息到来之后就会调用上面设置的回调函数msgarrvd,在该函数里面就可以获得消息内容去执行相应的操作。

    #include <stdio.h>
    
    更多相关内容
  • linux mqtt物联网系统

    2022-06-15 10:12:17
    本文以正点原子mqtt例程为基础,添加了cJSON格式的编码和解码,以及使用驱动的形式控制硬件设备

    **

    (本文以正点原子mqtt例程为基础,添加了cJSON格式的编码和解码,以及使用驱动的形式控制硬件设备)

    **

    1. MQTT
    它是一种轻巧、开放、简单、规范的网络通信协议。与 HTTP 协议一样,MQTT 协议也是应用层协议,工作在 TCP/IP 四层模型中的最上层(应用层),构建于 TCP/IP 协议上。MQTT 最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服 务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

    客户端
    MQTT 客户端可以向服务端发布信息,也可以从服务端收取信息;我们把客户端发送信息的行为称为“发布”信息。而客户端要想从服务端收取信息,则首先要向服务端“订阅”信息。“订阅”信息这一操作 很像我们在使用微信时“关注”了某个公众号,当公众号的作者发布新的文章时,微信官方会向关注了该公 众号的所有用户发送信息,告诉他们有新文章更新了,以便用户查看。
    MQTT主题
    上面我们讲到了,客户端想要从服务器获取信息,首先需要订阅信息,那客户端如何订阅信息呢?这里我们要引入“主题(Topic)”的概念,“主题”在MQTT 通信中是一个非常重要的概念,客户端发布信息 以及订阅信息都是围绕“主题”来进行的,并且MQTT 服务端在管理MQTT 信息时,也是使用“主题”来 控制的。客户端发布消息时需要为消息指定一个“主题”,表示将消息发布到该主题;而对于订阅消息的客户端来说,可通过订阅“主题”来订阅消息,这样当其它客户端或自己(当前客户端)向该主题发布消息时,MQTT 服务端就会将该主题的信息发送给该主题的订阅者(客户端)。\

    客户端相互独立
    空间上分离
    时间上可异步

    2.连接MQTT服务端
    ①、首先客户端需要向服务端发送连接请求,这个连接请求实际上就是向服务端发送一个 CONNECT 报文,也就是发送了一个CONNECT 数据包。
    ②、MQTT 服务端收到连接请求后,会向客户端发送连接确认。连接确认实际上是向客户端发送一个 CONNACK报文,也就是CONNACK数据包。
    在这里插入图片描述
    MQTT 报文组成分为三个部分:固定头(Fixed header)、可变头(Variable header)以及有效载荷(Payload,消息体)。
    ⚫固定头(Fixed header):存在于所有MQTT 报文中,固定头中有报文类型标识,可用于识别是哪 种MQTT 报文,譬如该报文是CONNECT 报文还是CONNACK报文,亦或是其它类型报文。
    ⚫ 可变头(Variable header):存在于部分类型的MQTT 报文中,报文的类型决定了可变头是否存 在及其具体的内容。
    ⚫ 消息体(Payload):存在于部分类型的MQTT 报文中,payload 就是消息载体的意思。

    clientId–客户端 id
    clientId 是MQTT 客户端的标识,也就是MQTT 客户端的名字,MQTT 服务端可通过 clientId 来区分不同的客户端,MQTT 服务端用该标识来识别客户端。因此 clientId 必须是独立的,如果两个 MQTT 客户端 使用相同 clientId 标识,服务端会把它们当成同一个客户端来处理。通常 clientId 是由一串字符所构成的,譬如,在上面的示例中,clientId 是“client-id”。

    keepAlive–心跳时间间隔
    心跳机制其实就是用来 判断客户端是否与服务端保持着连接的一种方法。客户端 在没有向服务端发送信息时(空闲时),可以定时向服务端发送一个心跳数据包,这个心跳包也被称作心跳请求,心跳请求的作用正是用于告知服务端,当前客户端依然在线,服务端在收到客户端的心跳请求后,会 回复一条消息,这条回复消息被称作心跳响应。 关CONNECT 报文中的 keepAlive其实是指定了心跳时间间隔。譬如 keepAlive=60,表示告诉服务端,客户端将会每隔 60 秒左右向服务端发送心跳包。

    cleanSession–清除会话
    如果连接服务端时 cleanSession=0,当MQTT 客户 端由离线(与服务端断开连接)再次上线时,离线期间发给客户端的所有 QoS>0 的消息仍然可以接收到;如果连接服务端时 cleanSession=1,当MQTT 客户端由离线(与服务端断开连接)再次上线时,离线期间发给客户端的所有消息一律接收不到。如果 cleanSession=1,客户端既无法接收到离线消息、服务端也不会记住该客户端所订阅的主题,服务 端不会保存客户端的会话状态,每次连接都是一次新的会话;
    在这里插入图片描述
    CONNACK报文包括两个信息,一个是 returnCode(连接返回码),另一个是 sessionPresent。
    在这里插入图片描述
    在这里插入图片描述
    在 cleanSession=0 的情况下,当客户端连接到服务器之后,可通过 CONNACK 报文中返回的 sessionPresent 来查询服务端是否为客户端保存了会话状态(客户端上一次连接时的会话状态信息),如果 服务端已为客户端保存了上一次连接时的会话状态,则 sessionPresent=1,如果没有保存会话状态,则sessionPresent=0。

    QoS 是什么? QoS 是Quality of Service 的缩写,所以中文名便是服务质量。一个物联网通信中有些信息非常重要,我们需要确保这类重要信息可以准确无误的发送和接收,而有些信息则相对不那么重要,这类信息如果在传 输中丢失不会影响系统的运行;QoS 便用于告诉客户端或服务器哪些信息是重要信息,需要准确无误的传 输、不可丢失;哪些信息不是那么重要,即使在传输过程中丢失也无妨! MQTT 设计了一套保证消息稳定传输的机制,包括消息应答、存储和重传。在这套机制下,提供了三种不同级别的QoS(Quality of Service),也就是MQTT 协议有三种服务质量等级:
    ⚫ QoS = 0:最多发一次;
    ⚫ QoS = 1:最少发一次;
    ⚫ QoS = 2:保证收一次。
    以上三种不同的服务质量级别意味着不同的MQTT 传输流程。对于较为重要的MQTT 消息,我们通常会选择QoS>0 的服务级别(即QoS 为 1 或 2)。
    发送端向接收端发送 PUBLISH 报文,当接收端收到PUBLISH报文后会向发送端回复一个 PUBACK报 文,如果发送端收到 PUBACK报文,那么它就知道消息已经被接收端成功接收!
    QoS=0 的情况下,MQTT 服务端和客户端不会对消息传输是否成功进行确认和检查。消息能否成功 传输全看网络环境是否稳定。
    Qos=1 时,MQTT服务器是不会进行去重的,只要发布者或者服务器没有收到 PUBACK报文, 就认为主题消息没有发送成功进入重发;服务器或者订阅者,不会根据 dup 标志的值进行去重(也就是说协议本身不会去重),需要我们的客户端应用程序去进行判断、处理。
    在这里插入图片描述
    QoS=2。当MQTT 服务质量为 2 级时,MQTT 协议可以确保接收端 只接收一次消息(注意是只接收到一次,在QoS=1 的情况下,接收端接收到消息的次数可能不止一次:>=1)。 为了确保接收端只接收到一次消息,PUBLISH报文的收发过程相对更加复杂。发送端需要接收端进行两次消息确认,

    在这里插入图片描述

    移植 MQTT 客户端库到我们的开发板:
    下载 MQTT 客户端库源码
    Releases · eclipse/paho.mqtt.c · GitHub
    下载并解压 paho.mqtt.c-1.3.8.tar.gz
    进入到 cmake 目录下,新建 arm-linux-setup.cmake 文件,并输入以下内容:

    ################################## # 配置ARM交叉编译 ################################# 
    set(CMAKE_SYSTEM_NAME Linux)
    #设置目标系统名字 
    set(CMAKE_SYSTEM_PROCESSOR arm)
    #设置目标处理器架构
    # 指定编译器的 sysroot 路径 
    set(TOOLCHAIN_DIR /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots)
    set(CMAKE_SYSROOT ${TOOLCHAIN_DIR}/cortexa7hf-neon-poky-linux-gnueabi)
    # 指定交叉编译器arm-linux-gcc 
    set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/armpoky-linux-gnueabi-gcc)
    # 为编译器添加编译选项 
    set(CMAKE_C_FLAGS "-march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7")
    
    set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
    set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
    set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
    #################################
    # end
    ##################################
    
    

    回到工程的顶层目录,新建一个名为 build 的目录,进入并执行cmake命令:(按照自己的cmake路径设置)

    MQTTC cmake 配置命令(名字一定要一样)

    /home/alientek/linux/tool/cmake-3.16.0-Linux-x86_64/bin/cmake -DBUILD_SHARED_LIBS=1 -DCMAKE_INSTALL_PREFIX=~linux/tool/paho.mqtt.c-1.3.8/install/ -DCMAKE_C_COMPILER=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc  -DCMAKE_CXX_COMPILER=arm-linux-g++ ../
    
    

    之后进行

    make 
    make install
    

    在 install 文件夹中将所有库文件拷贝到开发板linux系统的 /usr/lib目录下。注意不要破坏原有的链接关系,建议在 操作之前,先将库文件进行打包。
    在这里插入图片描述
    创建文件夹
    在这里插入图片描述
    arm-linux-setup.cmake文件:

    ##################################
    # 配置ARM交叉编译
    #################################
    set(CMAKE_SYSTEM_NAME Linux)    #设置目标系统名字
    set(CMAKE_SYSTEM_PROCESSOR arm) #设置目标处理器架构
    
    # 指定编译器的sysroot路径
    set(TOOLCHAIN_DIR /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots)
    set(CMAKE_SYSROOT ${TOOLCHAIN_DIR}/cortexa7hf-neon-poky-linux-gnueabi)
    
    # 指定交叉编译器arm-linux-gcc
    set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc)
    
    # 为编译器添加编译选项
    set(CMAKE_C_FLAGS "-march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7")
    
    set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
    set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
    set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
    #################################
    # end
    ##################################
    

    CMakeLists.txt 文件 :

    #*******************************************************************************
    #  Copyright © ALIENTEK Co., Ltd. 1998-2021. All rights reserved.
    #
    #  顶层CMakeLists.txt
    #  All rights reserved. This program and the accompanying materials
    #  are made available under the terms of the Eclipse Public License v2.0
    #  and Eclipse Distribution License v1.0 which accompany this distribution.
    #*******************************************************************************/
    cmake_minimum_required(VERSION 2.8.12)
    project(MQTTClient C)
    message(STATUS "CMake version: " ${CMAKE_VERSION})
    message(STATUS "CMake system name: " ${CMAKE_SYSTEM_NAME})
    message(STATUS "CMake system processor: " ${CMAKE_SYSTEM_PROCESSOR})
    
    # 设置可执行文件输出路径
    set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    
    add_executable(mymqtt2 mymqtt2.c cJSON.c cJSON.h)
    
    target_include_directories(mymqtt2 PRIVATE /home/alientek/linux/tool/paho.mqtt.c-1.3.8/install/include) #MQTT头文件搜索路径
    target_link_directories(mymqtt2 PRIVATE /home/alientek/linux/tool/paho.mqtt.c-1.3.8/install/lib)        #MQTT库文件搜索路径
    target_link_libraries(mymqtt2 PRIVATE paho-mqtt3c)                #MQTT链接库 libpaho-mqtt3c.so
    
    

    进入build目录中执行cmake

    ~/linux/tool/cmake-3.16.0-Linux-x86_64/bin/cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/arm-linux-setup.cmake -DCMAKE_BUILD_TYPE=Release ..
    
    

    执行make编译:
    在这里插入图片描述

    #include <stdio.h>		
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include "cJSON.h"
    #include "MQTTClient.h"                //包含MQTT客户端库头文件
    
    /* ########################宏定义##################### */
    #define BROKER_ADDRESS        "ws://xxxxxxx:xxxx"        //MQTT服务器地址
    
    /* 客户端id、用户名、密码 *
     * 的客户端连接认证信息:也就是客户端id、用户名和密码
     * 后续我们使用MQTT.fx或MQTTool的时候 也需要使用一组连接认证信息
     * 去连接社区版MQTT服务器! */
    #define CLIENTID                    "mqtt_linux"                //客户端id(随便写,由字符串和数字组成)
    #define USERNAME                "xxxx"                                //用户名(可以不写)
    #define PASSWORD                "xxxxx"                        //密码(可以不写)
    
    /* topic
     */
    #define ORDER_TOPIC                "dt_mqtt/order"                //接收主题
    #define HOME_TOPIC                "dt_mqtt/smarthome"                //发送主题
    /* ################################################# */
    
    static volatile        int led_value;      //led驱动加载后,默认led灯不亮,led_value = 0,高电平
    
    /* 于msgarrvd 函数有两个点需要注意: 
            ⚫ 退出函数之前需要释放消息的内存空间,必须调用 MQTTClient_freeMessage 函数;
                    同时也要释放 主题名称占用的内存空间,必须调用MQTTClient_free。
            ⚫ 函数的返回值。此函数的返回值必须是 0 或 1,返回 1 表示消息已经成功处理;
                    返回 0 则表示消息 处理存在问题,在这种情况下,客户端库将重新调用 MQTTClient_messageArrived()以尝试再次将 消息传递给客户端应用程序,
                    所以返回 0 时不要释放消息和主题所占用的内存空间,否则重新投递失败。*/
    static int msgarrvd(void *context, char *topicName, int topicLen,
            MQTTClient_message *message)
    {        
            if (!strcmp(topicName, ORDER_TOPIC)) {//校验消息的主题
                    int fd;
                    unsigned char databuf[2];
    
            char * data=(char *)message->payload;
            cJSON* pose=cJSON_Parse(data);
            
            cJSON *item_led = cJSON_GetObjectItem(pose,"led"); //获取这个对象成员
            double pose_led=item_led->valuedouble;
            if(led_value != pose_led)
            {
                    printf("pose_led = %d\r\n",(int)pose_led);
                    fd = open("/dev/dtsplatled", O_RDWR);
                    if (pose_led == 0)        
                            databuf[0] = 0;        /* 要执行的操作:打开或关闭 */
                            write(fd, databuf, sizeof(databuf));
                            led_value = 0;
                    if (pose_led == 1) {//如果是"1"则LED常亮
                            databuf[0] = 1;        /* 要执行的操作:打开或关闭 */
                            write(fd, databuf, sizeof(databuf));
                            led_value = 1;
                    }
                    close(fd); /* 关闭文件 */
                    // 接收到其它数据 不做处理,可以自行扩展
            }
    
            }
    
            /* 释放占用的内存空间 */
            MQTTClient_freeMessage(&message);
            MQTTClient_free(topicName);
    
            /* 退出 */
            return 1;
    }
    
    static void connlost(void *context, char *cause)
    {
            printf("\nConnection lost\n");
            printf("    cause: %s\n", cause);
    }
    
    int main(int argc, char *argv[])
    {
            MQTTClient client;
            MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
            MQTTClient_willOptions will_opts = MQTTClient_willOptions_initializer;
            MQTTClient_message pubmsg = MQTTClient_message_initializer;
            int rc;
            led_value = 0;
            /* 创建mqtt客户端对象,做收发信息用,最主要的是客户端ID和服务器IP, 返回值:连接成功返回MQTTCLIENT_SUCCESS,是否返回错误码,有对应的错误类型 */
            if (MQTTCLIENT_SUCCESS !=
                    (rc = MQTTClient_create(&client, BROKER_ADDRESS, CLIENTID,
                    MQTTCLIENT_PERSISTENCE_NONE, NULL))) {
                    printf("Failed to create client, return code %d\n", rc);
                    rc = EXIT_FAILURE;
                    goto exit;
            }
    
            /* 调用MQTTClient_setCallbacks 函数设置回调必须在连接服务器之前完成!!! 设置回调
                    断开连接时的回调函数 cl 当客户端检测到自己掉线时会执行该函数,如果将其设置为NULL表示应用程序不处理断线的情况
                    接收消息的回调函数 ma 当客户端接收到服务端发送过来的消息时执行该函数,必须设置此函数否则客户端无法接收消息
                    发布消息的回调函数 dc 当客户端发布的消息已经确认发送时执行该回调函数,如果你的应用程序采用同步方式发布消息或者您不想检查是否成功发送时, 您可以将此设置为NULL*/
            if (MQTTCLIENT_SUCCESS !=
                    (rc = MQTTClient_setCallbacks(client, NULL, connlost,
                    msgarrvd, NULL))) {
                    printf("Failed to set callbacks, return code %d\n", rc);
                    rc = EXIT_FAILURE;
                    goto destroy_exit;
            }
    
            /* 连接MQTT服务器 */
            conn_opts.keepAliveInterval = 30;        //心跳包间隔时间
            conn_opts.cleansession = 0;                        //cleanSession标志
            conn_opts.username = USERNAME;                //用户名
            conn_opts.password = PASSWORD;                //密码
            if (MQTTCLIENT_SUCCESS !=
                    (rc = MQTTClient_connect(client, &conn_opts))) {                //连接成功返回MQTTCLIENT_SUCCESS,是否返回错误码
                    printf("Failed to connect, return code %d\n", rc);
                    rc = EXIT_FAILURE;
                    goto destroy_exit;
            }
    
            printf("MQTT服务器连接成功!\n");
    
    
            /* 订阅主题 dt_mqtt/led */
            if (MQTTCLIENT_SUCCESS !=
                    (rc = MQTTClient_subscribe(client, ORDER_TOPIC, 0))) {
                    printf("Failed to subscribe, return code %d\n", rc);
                    rc = EXIT_FAILURE;
                    goto disconnect_exit;
            }
    
            /* 向服务端发布芯片温度信息 */
            for ( ; ; ) {
    
            MQTTClient_message tempmsg = MQTTClient_message_initializer;
            char temp_str[5] = {0};             
            int fd;
    
            // /* 打开led驱动 */
            // fd = open("/dev/dtsplatled", O_RDWR);        
            // // databuf[0] = atoi('0');        /* 要执行的操作:打开或关闭 */
            // // write(fd, databuf, sizeof(databuf));
            // databuf[0] =  read(fd, led_str, sizeof(led_str));
            // close(fd); /* 关闭文件 */
    		//读取驱动,因为led没有写读取函数因此没有写这部分
    
            cJSON *pose;
            pose = cJSON_CreateObject();
            //pose x=1,y=2,yaw=30
            cJSON_AddStringToObject(pose,"x", "1");
            cJSON_AddStringToObject(pose,"temp",temp_str);
            cJSON_AddNumberToObject(pose,"led",led_value);
    
            //2.cjson to char*
            char* buff = cJSON_Print(pose);
            if(NULL == buff)
            {
                continue;
            }
    
    
            /* 发布温度信息 */
            // tempmsg.payload = temp_str;        //消息的内容
            // tempmsg.payloadlen = strlen(temp_str);                //内容的长度
            tempmsg.payload = buff;        //消息的内容
            tempmsg.payloadlen = strlen(buff);                //内容的长度
            tempmsg.qos = 0;                                //QoS等级
            tempmsg.retained = 1;                //保留消息
            if (MQTTCLIENT_SUCCESS !=
                    (rc = MQTTClient_publishMessage(client, HOME_TOPIC, &tempmsg, NULL))) {
                    printf("Failed to publish message, return code %d\n", rc);
                    rc = EXIT_FAILURE;
                    goto unsubscribe_exit;
            }
    
                     printf("%s\n",buff);
    
            cJSON_Delete(pose);
            free(buff);
    
    
            sleep(5);                //每隔30秒 更新一次数据
            }
    
    unsubscribe_exit:
            if (MQTTCLIENT_SUCCESS !=
                    (rc = MQTTClient_unsubscribe(client, ORDER_TOPIC))) {
                    printf("Failed to unsubscribe, return code %d\n", rc);
                    rc = EXIT_FAILURE;
            }
    disconnect_exit:
            if (MQTTCLIENT_SUCCESS !=
                    (rc = MQTTClient_disconnect(client, 10000))) {
                    printf("Failed to disconnect, return code %d\n", rc);
                    rc = EXIT_FAILURE;
            }
    destroy_exit:
            MQTTClient_destroy(&client);
    exit:
            return rc;
    }
    
    //增加了cJSON解码编码,事先加载了 led驱动 “/dev/dtsplatformled”
    
    
    展开全文
  • 这个仓库这包含两个单独的项目: “弹性”异步非阻塞MQTT驱动程序。 一种使用便宜的ESP8266模块将MQTT带到缺少WiFi接口的MicroPython平台的方法。1.“弹性”驱动程序这是官方驱动程序的替代方法。 已在以下平台上...
  • mqtt异步通信的简单复现,采用官网的示例,官网例子:发布端代码 订阅端 二、准备工作 本地的ubuntu系统,云端的centos系统,均安装了paho.mqtt.c以及mosquitto,如何安装,网上资料多,这里不再复述 安装paho....

    一、问题重述

    mqtt异步通信的简单复现,采用官网的示例,官网例子:发布端代码   订阅端

    二、准备工作

    本地的ubuntu系统,云端的centos系统,均安装了paho.mqtt.c 以及mosquitto,如何安装,网上资料多,这里不再复述

    安装paho.mqtt.c后,在/usr/local/lib目录下有相应的库

     异步通信,要使用的是paho-mqtt3a.so库

    这里记录一下启动mosquitto服务器的命令:mosquitto -c /etc/mosquitto/mosquitto.conf -d

    三、编译测试

    编译发布端和订阅端代码,编译命令:gcc -o s   subscribe.c    -L /usr/local/lib   -lpaho-mqtt3a   

    编译成功后,先运行订阅端代码,再运行发布端代码

    代码中需要修改的地方,主要是mqtt服务器地址,其余地方可改可不改。

     

     

     

     

     

     

    展开全文
  • LinuxMQTT环境搭建

    2022-04-05 16:22:09
    linux上搭建mqtt服务器并不难,主要就是用到了mosquitto这款消息代理服务软件 其采用发布/订阅模式传输机制,轻量、简单、开放并易于实现,被广泛应用于物联网之中 我的linux版本为centos6.7_x86 1、安装软件 输入...

    在linux上搭建mqtt服务器并不难,主要就是用到了mosquitto这款消息代理服务软件

    其采用发布/订阅模式传输机制,轻量、简单、开放并易于实现,被广泛应用于物联网之中

    我的linux版本为centos6.7_x86

    1、安装软件

    输入以下指令,挨个安装:

    yum install gcc-c++
    yum install cmake
    yum install openssl-devel
    

    新建个software文件夹,下载mosquitto,下个不高不低的版本,并解压:

    mkdir software
    cd software
    wget http://mosquitto.org/files/source/mosquitto-1.4.10.tar.gz
    tar -xzvf mosquitto-1.4.10.tar.gz
    

    但这里还不能编译安装mosquitto

    下面的三款扩展性软件,不安装也不影响mosquitto的使用:

    安装c-areas(支持异步DNS查找的库):

    wget http://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz
    tar xvf c-ares-1.10.0.tar.gz
    cd c-ares-1.10.0
    ./configure
    make
    sudo make install
    

    安装lib-uuid(支持为每个连接客户端生成唯一uuid):

    yum install libuuid-devel
    

    安装libwebsockets(支持需使用websocket的应用):

    wget https://github.com/warmcat/libwebsockets/archive/v1.3-chrome37-firefox30.tar.gz
    tar zxvf v1.3-chrome37-firefox30.tar.gz
    cd libwebsockets-1.3-chrome37-firefox30
    mkdir build
    cd build
    cmake .. -DLIB_SUFFIX=64
    make install
    

    上面的有可能没安装成功,尤其是第三个,不过并无大碍,只不过没有相应的功能

    我们修改一下mosquitto的配置:

    cd mosquitto-1.4.10
    vim config.mk
    

    将里面的WITH_SRV:=yes和WITH_UUID:=yes都用#号注释掉

    接下来编译安装mosquitto:

    make
    sudo make install
    

    注意:如果在后续使用过程中找不到libmosquitto.so.1的话,在software下输入以下指令修改一下libmosquitto.so的位置:

    sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
    sudo ldconfig
    

    2、启动测试

    创建用户:

    sudo groupadd mosquitto
    sudo useradd -g mosquitto mosquitto
    

    这里要是出现什么存在不存在的问题,一定是你copy错了

    程序配置:

    mv /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf
    

    启动程序:

    mosquitto -c /etc/mosquitto/mosquitto.conf -d
    

    默认端口为1883

    最后我们再打开一个服务器窗口,在一个(订阅)窗口输入:

    mosquitto_sub -t hello
    

    另一个(发布)窗口输入:

    mosquitto_pub -t hello -h localhost -m "hello world!"
    

    程序截图:

    这样,我们就成功订阅了主题为hello的消息了

    此过程我在树莓派上也搭建过,需自己多添加几个sudo便可以成功操作

    如果不行请从make那一步继续无误地操作一遍

    展开全文
  • mqtt
  • 如果你的应用程序调用了MQTTClient_setCallbacks(),则客户端将会进入异步模式,否则会以同步模式运行。 同步模式下,客户端应用程序运行在单个线程上。信息的发布使用MQTTClient_publish()和MQTTClient_...
  • linux 使用paho C库实现mqtt客户端

    千次阅读 2021-09-27 09:57:43
    一、下载 github 下载paho mqtt c库源码,编译安装库文件。 地址:...异步方式调用MQTTClient_setCallbacks接口设置回调函数。 同步模式 客户端应用程序在单个线程上运行,主要
  • Linux 中搭建 MQTT 服务器教程

    千次阅读 2022-02-16 11:58:16
    linux 上搭建 mqtt 服务器并不难,主要就是用到了 mosquitto 这款消息代理服务软件。其采用发布/订阅模式传输机制,轻量、简 单、开放并易于实现,被广泛应用于物联网之中。 Linux 版本:centos7.0_x64 ...
  • Linux MQTT 物联网通信

    千次阅读 2022-03-05 10:58:04
    目录 物联网曾被认为是继计算机、互联网之后,信息技术行业...MQTT、CoAP、DDS、XMPP 等,在这其中,MQTT(消息队列遥测传输协议)应该是应用最广泛的标准之一。目前,MQTT 已逐渐成为IoT 领域最热门的协议,也是国内外
  • 基于MQTT协议实现(推送系统),要的下
  • 1、安装软件 yum install gcc-c++ yum install cmake yum install openssl-devel 2、去usr/loca/目录下操作 mkdir software ...tar -xzvf mosquitto-1.4.10.tar.gz ...安装c-areas(支持异步DNS查找的库): wge
  • linuxmqtt库的编译

    千次阅读 2019-04-27 19:00:38
    linuxmqtt库的编译编译环境eclipse/paho.mqtt.c 库下载编译1,使用make编译,创建动态库2,静态库编译,使用Cmake安装库到ubuntu库的简单测试 编译环境 ubuntu 1804 编译库时需要的环境: 这需要OpenSSL库:apt-...
  • paho-mqtt3a-异步(MQTTAsync) paho-mqtt3as-与SSL异步(MQTTAsync) paho-mqtt3c-“经典” /同步(MQTTClient) paho-mqtt3cs-“经典” /与SSL同步(MQTTClient) 用法和API 详细的API文档。 也可以通过在...
  • 本篇主要是记录将MQTT移植安装到百问网STM32MP157开发板上,并且是跑一下MQTT的一个例程来验证,要完成本次移植安装,必须要保证电脑和开发板都能上网。
  • 文章目录1、编译 paho.mqtt.c1.1 步骤1.2 说明1.3 同步函数2、订阅端2.1 订阅端——MQTTClient_receive阻塞等待方式2.2 订阅端——MQTTClient_setCallbacks回调的异步方式3、发布端4、编译5、配置运行环境 ...
  • Linux编程MQTT实现主题发布订阅

    千次阅读 2022-02-14 08:47:02
    【物联网阿里云平台开发项目实战|附课件资料】智能硬件开发-数据上云,零基础入门 4G模块连接阿里云教程 MQTT通信协议(mosquitto)在Linux上的环境构建与测试 MQTT通信协议(mosquitto)发布订阅例子C语言实现 MQTT...
  • 上一篇文章简单提及了以异步函数和同步函数对比,由于异步函数是非阻塞的,所以性能上比同步函数要稍好些,所以也就常用异步函数来实现MQTT的通讯。 异步函数与同步函数两者的差别就是在连接服务器的connect函数、...
  • Linux下学习用C语言实现MQTT(三)(异步函数) https://blog.csdn.net/qq_43260665/article/details/88541433 原文是执行一次发送一次消息,然后就断开了, 我把它改成了可以连续发送消息的mqtt实现: Talk is ...
  • 介绍一下常用的MQTT的C函数。MQTT系列函数有很多,在paho-mqtt.c库中的src路径下有大量函数的定义和声明,这里只介绍比较常用的函数解耦提和结构体: 1.结构体MQTTClient 定义:typedef void* MQTTClient; 含义:...
  • paho_mqtt.zip

    2020-12-15 09:44:48
    使用Paho实现MQTT,加上openssl的RSA加密解密功能,接收采用异步回调方式,用于给各位参考。 2021-07-21:1. 修复上个版本对大数据(大于117字节)RSA加解密异常的问题。 2. 添加README文件,简单说明如何使用mqtt
  • linux系统 二、同样建立文件和文件夹 这个不说了 三开始编程 #include </home/zzl/3rdlib/include/MQTTAsync.h> //换成你自己的安装路径,不然回报错 #include <stdio.h> #include <unistd.h> #...
  • MQTT同步使用

    千次阅读 多人点赞 2019-09-24 15:38:51
    MQTT的结构体和库函数 结构体 1.结构体MQTTClient 定义: typedef void* MQTTClient; 含义:代表MQTT客户端的句柄,成功调用MQTTClient_create函数后会得到有效的客户端句柄。 使用声明: MQTTClient client; #2....
  • Linux下学习用C语言实现MQTT(一)(同步函数)

    万次阅读 多人点赞 2019-03-12 23:38:56
    先介绍一下MQTTMQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被...
  • mqttclient连接到OneNET云平台

    千次阅读 2020-06-15 23:07:02
    文章目录mqttclient连接到OneNET云平台使用OneNET测试连接手动安装相关的依赖包拉取mqttclient仓库简单介绍mqttclient仓库文件夹编译运行代码使用到的API mqttclient连接到OneNET云平台 有了前面连接百度云的经验,...
  • 前面两节讲了MQTT的简单介绍、mosquitto服务器端与客户端的两种搭建方式及其简单测试,但那些都是在命令行里面的操作,而我们需要写程序的时候总不能一直都是system函数来调用吧。 上一篇文章里面使用的就是...
  • 我是用的secureCRT登录的树莓派,要实现MQTT通信,就需要用到许多关于MQTT的函数,这里我用的是Paho.c库,所以首先下载库: 在git下下载paho C库git clone https://github.com/eclipse/paho.mqtt.c.git cd paho.mqtt...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,584
精华内容 633
关键字:

linux mqtt 异步