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; }
