#include #include #include #include #include #include #include #include #include #include #define MQTT_SERVER_IP "127.0.0.1" #define MQTT_SERVER_PORT 1883 #define MQTT_SERVER_USER "iops" #define MQTT_SERVER_PASSWORD "12345678" #define MQTT_SUB_TOPIC "n3150-sensors" // 连接回调函数,当连接成功时会进入这里,可以在这里进行连接成功之后的操作,比如连接之后的信息同步 void my_connect_callback(struct mosquitto *mosq, void *obj, int rc) { } // 断开连接回调函数,在断开连接之后进入 void my_disconnect_callback(struct mosquitto *mosq, void *obj, int result) { printf("%d:\n", __LINE__); } void my_message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *msg) { time_t t; struct tm *lt; time(&t); lt = localtime(&t); printf("%d.%d.%d %d:%d:%d ", lt->tm_year + 1900, lt->tm_mon, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec); printf("%d:topic(%s)->%s\n", __LINE__, (char *)msg->topic, (char *)msg->payload); } // 订阅消息回调 void my_subscribe_callback(struct mosquitto *mosq, void *obj, int mid, int qos_count, const int *granted_qos) { int i; time_t t; struct tm *lt; time(&t); lt = localtime(&t); printf("%d: %s\n", __LINE__, (char *)obj); printf("%d: mid=%d\n", __LINE__, mid); printf("%d: qos_count=%d\n", __LINE__, qos_count); for (i = 0; i < qos_count; i++) { printf("%d: granted_qos[%d]=%d\n", __LINE__, i, granted_qos[i]); } } int print_usage(void) { printf("Usage:\n"); printf(" satatemp [-d] /dev/sda\n"); printf(" -d print debug info\n"); return 0; } int main(int argc, char *argv[]) { struct mosquitto *m_hMqtt; char *topic1 = "server-status"; char content[256]; int cpu_temp = 0; int hdd_temp = 0; char *device = NULL; if (3 == argc) { if (0 != strncmp(argv[1], "-d", strlen("-d"))) { print_usage(); return -1; } device = argv[2]; } else if (argc == 2) { if (0 != strncmp(argv[1], "/dev/", strlen("/dev/"))) { print_usage(); return -1; } device = argv[1]; } else { print_usage(); return -1; } //初始化lib库函数 mosquitto_lib_init(); // 定义一个客户端名为subtest的发布端。客户端表示订阅端的唯一性 m_hMqtt = mosquitto_new(MQTT_SUB_TOPIC, true, "data"); //设置连接确认回调 mosquitto_connect_callback_set(m_hMqtt, my_connect_callback); //设置断开连接确认回调 mosquitto_disconnect_callback_set(m_hMqtt, my_disconnect_callback); //设置收到订阅回调 //mosquitto_message_callback_set(m_hMqtt, my_message_callback); //设置订阅回调(mosquitto_subscribe()订阅后回调) //mosquitto_subscribe_callback_set(m_hMqtt, my_subscribe_callback); mosquitto_username_pw_set(m_hMqtt, MQTT_SERVER_USER, MQTT_SERVER_PASSWORD); //开始连接服务器 if (MOSQ_ERR_SUCCESS == mosquitto_connect(m_hMqtt, MQTT_SERVER_IP, MQTT_SERVER_PORT, 20)) { printf("connect server: %s:%d success\n", MQTT_SERVER_IP, MQTT_SERVER_PORT); } else { printf("connect server: %s:%d failed\n", MQTT_SERVER_IP, MQTT_SERVER_PORT); exit(-1); } //mosquitto_subscribe(m_hMqtt,NULL,topic1,1); //mosquitto_subscribe(m_hMqtt,NULL,topic2,1); mosquitto_loop_start(m_hMqtt); //mosquitto会创建一个进程实时运行发送心跳包和接收订阅的主题消息 while (1) { sleep(5); get_sata_hddtemp(device, &hdd_temp); sprintf(content, "{\"cpu_temp\" : \"%d\", \"hdd_temp\" : \"%d\", \"cpu_rate\" : \"%0.2f\", \"mem_rate\" : \"%0.2f\"}", get_cpu_temp(1), hdd_temp, get_sysCpuUsage(), cal_mem_occupy()); mosquitto_publish(m_hMqtt, NULL, topic1, strlen(content), content, 0, false); } //mosquitto_loop_stop(m_hMqtt, false); mosquitto_destroy(m_hMqtt); mosquitto_lib_cleanup(); return 0; }