7,540
社区成员
发帖
与我相关
我的任务
分享
using namespace System;
using namespace System::Runtime::InteropServices;
using namespace ClassShare;
namespace ClassSmartbow {
public ref class Smartbow
{
public:
// 构造函数
Smartbow(String^ ServiceName, bool SaveLog, String^ ConnectionString) {
// 三个全局变量
service_name = (char*)(void*)Marshal::StringToHGlobalAnsi(ServiceName);
save_log = SaveLog;
connection_string = (char*)(void*)Marshal::StringToHGlobalAnsi(ConnectionString);
};
// 托管
void Connect(String^ IP, int Port, String^ Username, String^ Password);
//void connect_callback(struct mosquitto *mosq, void *userdata, int result);
void Disconnect();
};
}
#include "stdafx.h"
#include "ClassSmartbow.h"
#include "mosquitto.h"
#include "stdio.h"
#include "stdlib.h"
namespace ClassSmartbow {
mosquitto *mosclient;
// 把CHAR转为STRING
String^ to_string(char *str) {
return Marshal::PtrToStringAnsi((IntPtr)(char *)str);
}
// 消息
void set_message(char *msg, bool log = false) {
SmartBow^ SB = gcnew SmartBow(to_string(service_name), to_string(connection_string));
// 处理消息
if (log) {
if (save_log) SB->Log(to_string(msg));
}
else {
SB->Insert(to_string(msg));
}
// 释放类
SB->Close();
// 释放内存
delete SB;
}
// 正在连接回调
void connect_callback(struct mosquitto *mosq, void *userdata, int result)
{
if (result) {
set_message("连接MQTT代理服务器失败!", true);
}
else {
set_message("成功连接到MQTT代理服务器!", true);
}
}
// 连接中断回调
void disconnect_callback(struct mosquitto *mosq, void *obj, int rc)
{
set_message("与MQTT代理服务器的连接中断,正在重连...", true);
int result = mosquitto_reconnect(mosq);
if (result != MOSQ_ERR_SUCCESS)
{
set_message("重新连接MQTT代理服务器失败!", true);
}
else {
set_message("成功重新连接到MQTT代理服务器!", true);
}
}
// 收到消息回调
void message_callback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message)
{
if (message->payloadlen) {
set_message((char *)message->payload);
}
else {
set_message(message->topic, true);
}
}
// 连接MQTT服务器
void Smartbow::Connect(String^ IP, int Port, String^ Username, String^ Password) {
// 把String转成char
char *char_ip = (char*)(void*)Marshal::StringToHGlobalAnsi(IP);
char *char_username = (char*)(void*)Marshal::StringToHGlobalAnsi(Username);
char *char_password = (char*)(void*)Marshal::StringToHGlobalAnsi(Password);
// mosquitto
//mosquitto *mosclient;
char *session_id[15];
//
mosquitto_lib_init();
mosclient = mosquitto_new(itoa(rand(), (char*)session_id, 10), true, NULL);
mosquitto_connect_callback_set(mosclient, connect_callback);
mosquitto_disconnect_callback_set(mosclient, disconnect_callback);
mosquitto_tls_set(mosclient, "ca.cer", NULL, NULL, NULL, NULL); //请联系源清慧虹技术支持获得CA证书文件
mosquitto_message_retry_set(mosclient, 3);
mosquitto_message_callback_set(mosclient, message_callback);
mosquitto_username_pw_set(mosclient, char_username, char_password);
if (mosquitto_connect(mosclient, char_ip, Port, 60))
{
set_message("无法连接到指定服务器!", true);
}
else
{
mosquitto_subscribe(mosclient, NULL, "#", 0);
int a = mosquitto_loop_forever(mosclient, 30000, 1000);
int b = 10 * 5;
}
mosquitto_destroy(mosclient);
mosquitto_lib_cleanup();
//return 0;
}
// 连开MQTT服务器连接
void Smartbow::Disconnect() {
mosquitto_disconnect(mosclient);
}
}