mosquitto/openssl 在RK3288上的编译以及MQTT客户端的代码示例

心不动则不痛 提交于 2019-12-01 16:10:49

1,依赖库openssl 的交叉编译

(1)配置编译器信息

setarch i386 ./config no-asm shared --cross-compile-prefix=arm-linux-androideabi-

(2)修改Makefile

删除-m32

(3)编译(指定编译器)

make CC=arm-linux-androideabi-gcc CXX=arm-linux-androideabi-g++

2,mosquitto 的交叉编译

(1)修改该config.mk

WITH_STATIC_LIBRARIES:=yes
CFLAGS += -I/where_is_your_openssl_headerfiles/
LDFLAGS += -L/where_is_your_openssl_staticlib/

(2)编译

make CC=arm-linux-androideabi-gcc CXX=arm-linux-androideabi-g++

3,基于mosquitto的MQTT client

代码中struct mqtt_conf是自定义结构,mqtt_send是一个双向链表实现的队列。

void start_mqtt_module(struct mqtt_conf *conf)
{
    if (!conf->server || conf->server_port <= 0) {
        DEBUG_MSG("[%s] invalid parameters for mqtt module\n", THISFILE);
        return;
    }

    int rc = 0;

    DEBUG_MSG("init_default_mqtt_parameters clientid %s\n", conf->clientid);
    
    mosquitto_lib_init();

    mosq = mosquitto_new(conf->clientid, conf->clean_session, NULL);

    #ifdef MQTT_DEBUGLOG
    mosquitto_log_callback_set(mosq, log_callback);
    #endif

    mosquitto_connect_callback_set(mosq, on_connect);
    mosquitto_publish_callback_set(mosq, on_publish);
    mosquitto_disconnect_callback_set(mosq, on_disconnect);

    mosquitto_username_pw_set(mosq, conf->username, conf->password);

    //配置证书
    if (!conf->disable_ssl) {
        rc = mosquitto_tls_set(mosq,
                conf->cafile,
                conf->capath,
                conf->certfile,
                conf->keyfile,  /* Notice: DO NOT encrypt your private key */
                NULL            /* password callback */
                );
        if (MOSQ_ERR_SUCCESS != rc) {
            DEBUG_MSG("[%s] failed to set tls certification info\n", THISFILE);
        }

        rc = mosquitto_tls_opts_set(mosq, SSL_VERIFY_PEER, NULL, NULL);
        if (MOSQ_ERR_SUCCESS != rc) {
            DEBUG_MSG("[%s] failed to set tls option\n", THISFILE);
        }

        /* set this to false(default) means check server hostname under TLS protocol */
        rc = mosquitto_tls_insecure_set(mosq, true);
        if (MOSQ_ERR_SUCCESS != rc) {
            DEBUG_MSG("[%s] failed to set incecrue\n", THISFILE);
        }
    }
        //链接服务器
    do {
        rc = mosquitto_connect(mosq, conf->server, conf->server_port, 60);
        if (MOSQ_ERR_SUCCESS != rc) {
            DEBUG_MSG("[%s] failed to connect mqtt server %s:%d\n", THISFILE, conf->server, conf->server_port);
        }
    } while (rc != MOSQ_ERR_SUCCESS);

    DEBUG_MSG("[%s] connect mqtt server %s:%d OK\n", THISFILE, conf->server, conf->server_port);

    set_queue_alive(&mqtt_send);

    sleep(1);
        //新线程用于定时发送 MQTT PING
    create_function_thread(mqtt_loop, NULL);

    struct mqtt_msg *msg;

    while (run == -1) {
        msg = NULL;
                //从队列中取出一个消息PUB出去
        msg = (struct mqtt_msg *)dequeue(&mqtt_send);
        if (msg) {
            /* dispatch msg according to Qos */
            rc = mosquitto_publish(mosq, NULL, msg->topic, msg->datalen, msg->data, msg->qos, false);

            if (MOSQ_ERR_SUCCESS == rc) {
                DEBUG_MSG("[%s] mosquitto_publish success\n", THISFILE);
                mqtt_pubs_succ++;
            } else {
                DEBUG_MSG("[%s] mosquitto_publish failed %d\n", THISFILE, rc);
                mqtt_pubs_fail++;
            }

            free(msg);
        }
    }
    mosquitto_lib_cleanup();
}
/*
    MQTT ping and reply for keepalive
 */
void *mqtt_loop(void *arg)
{
    uint32_t cnt = 0;
    while (run == -1){
        int rc = mosquitto_loop(mosq, -1, 1);
        if (MOSQ_ERR_SUCCESS != rc) {
            DEBUG_MSG("[%s] mosquitto_loop error %d\n", THISFILE, rc);
            if (rc == MOSQ_ERR_ERRNO) {
                DEBUG_MSG("[%s] mosquitto_loop error %s, errno %d\n", THISFILE, strerror(errno), errno);
            }
            mosquitto_lib_cleanup();
            break;
        } else {
            //DEBUG_MSG("[%s] mosquitto_loop started! %d\n", THISFILE, cnt);
        }
        cnt++;
        //3s  keepalive
        usleep(DELTA_US);
    }

    return NULL;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!