波形图增加速度时域图,速度频域图
This commit is contained in:
parent
6dc2209be8
commit
7c95bc442c
1
.gitignore
vendored
1
.gitignore
vendored
@ -7,3 +7,4 @@ opt/
|
||||
cgi-bin/
|
||||
bin/
|
||||
GateWay/
|
||||
Release/
|
||||
|
@ -92,7 +92,7 @@ void Calculation::_FFT(std::vector<float> & vecData, std::vector<float> & vecFFT
|
||||
}
|
||||
|
||||
FFT(vecData.size(), inHilFFt, outHilFFt);
|
||||
fftShift(outHilFFt, vecData.size());
|
||||
//fftShift(outHilFFt, vecData.size());
|
||||
for (int i = 0; i < vecData.size(); i++) {
|
||||
vecFFTrealData.push_back(outHilFFt[i][0]);
|
||||
vecFFTimageData.push_back(outHilFFt[i][1]);
|
||||
@ -432,15 +432,44 @@ void Calculation::envSpec(std::vector<float> & vecData, std::vector<float> & vec
|
||||
|
||||
void Calculation::GenerateSin(std::vector<float> & vecData)
|
||||
{
|
||||
int i;
|
||||
int ft = 1; /* 周期 hz */
|
||||
int fs = 12800; /* 采样频率*/
|
||||
double frequency = 160.0; // Frequency of the sine wave in Hz
|
||||
double sampling_rate = 3200.0; // Sampling rate in Hz (8 kHz)
|
||||
size_t num_samples = 8000; // Total number of samples (1 second of data)
|
||||
double dt = 1.0 / sampling_rate; // Time step in seconds
|
||||
|
||||
/* generate data */
|
||||
int data_len = (8*1024);
|
||||
// Vector to hold the sine wave data
|
||||
//std::vector<double> sine_wave(num_samples);
|
||||
|
||||
for (i = 0; i < data_len; i++) {
|
||||
vecData.push_back(sin(1000 * 2 *3.1415926*ft*i/fs));
|
||||
}
|
||||
// Generate the sine wave
|
||||
for (size_t i = 0; i < num_samples; ++i) {
|
||||
vecData.push_back(std::sin(2 * M_PI * frequency * i * dt));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Calculation::Integration(std::vector<float> & vecData,std::vector<float>& retData)
|
||||
{
|
||||
std::vector<float> realshiftfft;
|
||||
std::vector<float> imageshiftfft;
|
||||
std::vector<float> realvalue,imagevalue;
|
||||
_FFT(vecData,realshiftfft,imageshiftfft);
|
||||
|
||||
for (int i = 0; i < 5; i++) {
|
||||
realshiftfft[i] = 0;
|
||||
imageshiftfft[i] = 0;
|
||||
}
|
||||
for (int i = 1000; i < realshiftfft.size(); i++) {
|
||||
realshiftfft[i] = 0;
|
||||
imageshiftfft[i] = 0;
|
||||
}
|
||||
|
||||
for(int k = 1; k < realshiftfft.size()+1;k++){
|
||||
realvalue.push_back((realshiftfft.at(k-1)/(k*2*M_PI))*1000 * 2);//单位转换mm/s,*1000 *2 精度损失
|
||||
imagevalue.push_back((imageshiftfft.at(k-1)/(k*2*M_PI))*1000 * 2);//单位转换mm/s,*1000
|
||||
}
|
||||
|
||||
//_iFFT(realshiftfft,imageshiftfft,retData);
|
||||
_iFFT(realvalue,imagevalue,retData);
|
||||
|
||||
|
||||
}
|
@ -151,6 +151,8 @@ public:
|
||||
void FFTSpec(std::vector<float> & vecData, std::vector<float> & vecFFTSpecData);
|
||||
//包络图谱数据
|
||||
void envSpec(std::vector<float> & vecData, std::vector<float> & vecEnvSpecData,int StartFrequency,int EndFrequency);
|
||||
|
||||
void Integration(std::vector<float> & vecData,std::vector<float>& retData);
|
||||
};
|
||||
|
||||
|
||||
|
@ -571,6 +571,27 @@ struct Param_54 {
|
||||
Param_54():mMode(0),mCmdSerial(""),mDataNodeNo(""),mPackageFlag(0){};
|
||||
|
||||
};
|
||||
|
||||
struct Param_55 {
|
||||
int mMode;
|
||||
std::string mChannelId;
|
||||
std::string mDataNodeNo;
|
||||
int mPackageFlag;
|
||||
int StartFrequency;
|
||||
int EndFrequency;
|
||||
Param_55():mMode(0),mChannelId(""),mDataNodeNo(""),mPackageFlag(0),StartFrequency(0),EndFrequency(0){};
|
||||
};
|
||||
|
||||
struct Param_56 {
|
||||
int mMode;
|
||||
std::string mChannelId;
|
||||
std::string mDataNodeNo;
|
||||
int mPackageFlag;
|
||||
int StartFrequency;
|
||||
int EndFrequency;
|
||||
Param_56():mMode(0),mChannelId(""),mDataNodeNo(""),mPackageFlag(0),StartFrequency(0),EndFrequency(0){};
|
||||
};
|
||||
|
||||
typedef struct DataNodeUpdate{
|
||||
std::string strUpdataFileName;
|
||||
std::string strSoftVersion;
|
||||
|
@ -397,6 +397,7 @@ int SqliteDB::GetTableRows(const char *tablename, const char *whereCon)
|
||||
if (sqlite3_prepare_v2(mDBAcess, strSql.c_str(), -1, &stmt, 0) != SQLITE_OK) {
|
||||
print_error("sqlite3_prepare_v2:%s\n",sqlite3_errmsg(mDBAcess));
|
||||
sqlite3_finalize(stmt);
|
||||
g_tDbMutex.UnLock();
|
||||
return -1;
|
||||
}
|
||||
int retStep = sqlite3_step(stmt);
|
||||
|
@ -1805,6 +1805,7 @@ std::string JsonData::JsonCmd_Cgi_30(Param_30 ¶m)
|
||||
}
|
||||
|
||||
int max = number / sampleRateReference;
|
||||
print_info("max = %d\n",max);
|
||||
if (max == 0 && number > 0) {
|
||||
max = 1;
|
||||
}
|
||||
@ -2473,5 +2474,269 @@ std::string JsonData::JsonCmd_Cgi_53(std::vector<Param_53> ¶m)
|
||||
return showValue.write(jsonVal);
|
||||
}
|
||||
|
||||
std::string JsonData::JsonCmd_Cgi_55(Param_55 ¶m)
|
||||
{
|
||||
Json::Value jsonVal;
|
||||
Json::Value jsBody;
|
||||
Json::Value SystemSetting;
|
||||
jsonVal.clear();
|
||||
jsonVal["cmd"] = "55";
|
||||
jsonVal["dataNodeGatewayNo"] = GlobalConfig::MacAddr_G;
|
||||
jsonVal["success"] = true;
|
||||
jsonVal["message"] = " ";
|
||||
std::vector<float> vecWave;
|
||||
std::vector<float> IntegrationWave;
|
||||
/* 新增代码 */
|
||||
char whereCon[64] = {};
|
||||
sprintf(whereCon, "dataNodeNo='%s'",param.mDataNodeNo.c_str());
|
||||
vec_t res = sql_ctl->GetDataSingleLine(T_SENSOR_INFO(TNAME)," * ",whereCon);
|
||||
char localtimestamp[32] = { 0 };
|
||||
std::string strWaveData = "";
|
||||
std::string filename = "/opt/data/" + param.mChannelId + ".dat";
|
||||
if (access(filename.c_str(), 0) >= 0) {
|
||||
std::ifstream inFile(filename.c_str(),ios::in|ios::binary);
|
||||
if (!inFile) {
|
||||
print_error("read channel data error\n");
|
||||
jsonVal["success"] = false;
|
||||
jsonVal["message"] = "error";
|
||||
} else {
|
||||
float fTemp = 0;
|
||||
|
||||
std::vector<float> hanningWave;
|
||||
inFile.read((char *)localtimestamp,sizeof(localtimestamp));
|
||||
while (inFile.read((char *)&fTemp, sizeof(fTemp))) {
|
||||
vecWave.push_back(fTemp);
|
||||
}
|
||||
|
||||
// //积分
|
||||
pCalculation->Integration(vecWave, IntegrationWave);
|
||||
|
||||
//测试正弦波
|
||||
// pCalculation->GenerateSin(vecWave);
|
||||
// pCalculation->Integration(vecWave, IntegrationWave);
|
||||
|
||||
//添加汉宁窗
|
||||
/*pCalculation->Hanning(vecWave, hanningWave);
|
||||
for(int i = 0; i < vecWave.size();i++){
|
||||
vecWave[i] = (vecWave[i]*hanningWave[i]);
|
||||
}*/
|
||||
|
||||
int flag = param.mPackageFlag;
|
||||
flag = (flag + 1) * 1024;
|
||||
int number = IntegrationWave.size();
|
||||
int start = param.mPackageFlag * 1024;
|
||||
if (number < 1024) {
|
||||
flag = number;
|
||||
start = 0;
|
||||
}
|
||||
char buf[32];
|
||||
for (int i = start; i < flag; i++) {
|
||||
if ( i == start ) {
|
||||
memset(buf, 0, 32);
|
||||
sprintf(buf, "%.2f", IntegrationWave[i]);
|
||||
std::string waveTemp(buf);
|
||||
strWaveData = waveTemp;
|
||||
|
||||
} else {
|
||||
memset(buf, 0, 32);
|
||||
sprintf(buf, "%.2f", IntegrationWave[i]);
|
||||
std::string waveTemp(buf);
|
||||
strWaveData = strWaveData + "," + waveTemp;
|
||||
}
|
||||
}
|
||||
|
||||
int max = number / 1024;
|
||||
if (max == 0 && number > 0) {
|
||||
max = 1;
|
||||
}
|
||||
jsBody["packageMax"] = max;
|
||||
}
|
||||
|
||||
} else {
|
||||
jsonVal["success"] = false;
|
||||
jsonVal["message"] = "没有数据文件";
|
||||
}
|
||||
|
||||
jsBody["channelId"] = param.mChannelId;
|
||||
jsBody["package"] = param.mPackageFlag;
|
||||
print_info("vecWave.size() = %d,sample = %d,second = %f\n",IntegrationWave.size(),atoi(res[23].c_str()),float(IntegrationWave.size()/atoi(res[23].c_str())));
|
||||
string::size_type comper = param.mChannelId.find("Z");
|
||||
if (comper != string::npos && res[17]=="02"){
|
||||
jsBody["second"] = float((float)IntegrationWave.size()/(float)atoi(res[23].c_str()));
|
||||
}else if(res[17]=="01"){
|
||||
jsBody["second"] = float((float)IntegrationWave.size()/(float)atoi(res[23].c_str()));
|
||||
}else{
|
||||
jsBody["second"] = 1;
|
||||
}
|
||||
|
||||
jsBody["Data"] = strWaveData;
|
||||
jsBody["timestamp"] = string(localtimestamp);
|
||||
jsonVal["content"] = jsBody;
|
||||
return showValue.write(jsonVal);
|
||||
}
|
||||
|
||||
std::string JsonData::JsonCmd_Cgi_56(Param_56 ¶m)
|
||||
{
|
||||
Json::Value jsonVal;
|
||||
Json::Value jsBody;
|
||||
Json::Value SystemSetting;
|
||||
jsonVal.clear();
|
||||
|
||||
jsonVal["cmd"] = "56";
|
||||
jsonVal["dataNodeGatewayNo"] = GlobalConfig::MacAddr_G;
|
||||
jsonVal["success"] = true;
|
||||
jsonVal["message"] = "";
|
||||
int i = 0;
|
||||
std::string strWaveData;
|
||||
std::string filename = "/opt/data/" + param.mChannelId + ".dat";
|
||||
char localtimestamp[32] = { 0 };
|
||||
std::vector<float> vecWave;
|
||||
std::vector<float> hanningWave;
|
||||
std::vector<float> addhanningWave;
|
||||
std::vector<float> fftWave;
|
||||
std::vector<float> IntegrationWave;
|
||||
int sampleRateReference = 0;
|
||||
/* 新增代码 */
|
||||
char whereCon[64] = {};
|
||||
sprintf(whereCon, "dataNodeNo='%s'",param.mDataNodeNo.c_str());
|
||||
vec_t res = sql_ctl->GetDataSingleLine(T_SENSOR_INFO(TNAME)," * ",whereCon);
|
||||
if (access(filename.c_str(), 0) >= 0)
|
||||
{
|
||||
std::ifstream inFile(filename.c_str(),ios::in|ios::binary);
|
||||
if(!inFile)
|
||||
{
|
||||
print_error("read channel data error\n");
|
||||
jsonVal["success"] = "false";
|
||||
jsonVal["message"] = "error";
|
||||
}else{
|
||||
float fTemp = 0;
|
||||
|
||||
|
||||
inFile.read((char *)localtimestamp,sizeof(localtimestamp));
|
||||
string::size_type comper = param.mChannelId.find("Z");
|
||||
if (comper != string::npos && res[17]=="02") {
|
||||
while(inFile.read((char *)&fTemp,sizeof(fTemp)))
|
||||
{
|
||||
vecWave.push_back(fTemp);
|
||||
}
|
||||
//积分
|
||||
pCalculation->Integration(vecWave, IntegrationWave);
|
||||
pCalculation->FFTSpec(IntegrationWave, fftWave);
|
||||
sampleRateReference = 1000;
|
||||
|
||||
}else{
|
||||
while(inFile.read((char *)&fTemp,sizeof(fTemp)))
|
||||
{ // 取8K进行计算
|
||||
if(i < 8192)
|
||||
{
|
||||
vecWave.push_back(fTemp);
|
||||
}else{
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
//测试正弦波
|
||||
//pCalculation->GenerateSin(vecWave);
|
||||
|
||||
if(vecWave.size() < 8192){
|
||||
for(int i = vecWave.size(); i < 8192;i++){
|
||||
vecWave.push_back(0);
|
||||
}
|
||||
}
|
||||
// //添加汉宁窗
|
||||
// pCalculation->Hanning(vecWave, hanningWave);
|
||||
// for(int i = 0; i < vecWave.size();i++){
|
||||
// addhanningWave.push_back(vecWave[i]*hanningWave[i]);
|
||||
// }
|
||||
|
||||
// //积分
|
||||
|
||||
pCalculation->Integration(vecWave, IntegrationWave);
|
||||
pCalculation->FFTSpec(IntegrationWave, fftWave);
|
||||
sampleRateReference = 1024;
|
||||
}
|
||||
/*for(int i = 0; i < fftWave.size();i++){
|
||||
fftWave[i] = fftWave[i]*2;
|
||||
}*/
|
||||
printf("2---------------------------------------------->vecWave = %d,fftWave = %d\n",vecWave.size(),fftWave.size());
|
||||
|
||||
int flag = param.mPackageFlag;
|
||||
flag = (flag + 1) * sampleRateReference;
|
||||
int number = fftWave.size();
|
||||
printf("number---------------------------------------------->%d\n",number);
|
||||
int start = param.mPackageFlag * sampleRateReference;
|
||||
printf("param.mPackageFlag = %d\n",param.mPackageFlag);
|
||||
printf("param.start = %d\n",start);
|
||||
printf("param.flag = %d\n",flag);
|
||||
if (number < sampleRateReference) {
|
||||
flag = number;
|
||||
start = 0;
|
||||
}
|
||||
char buf[32];
|
||||
for (int i = start; i < flag; i++) {
|
||||
if ( i == start ) {
|
||||
memset(buf, 0, 32);
|
||||
sprintf(buf, "%.6f", fftWave[i]);
|
||||
std::string waveTemp(buf);
|
||||
strWaveData = waveTemp;
|
||||
|
||||
} else {
|
||||
memset(buf, 0, 32);
|
||||
sprintf(buf, "%.6f", fftWave[i]);
|
||||
std::string waveTemp(buf);
|
||||
strWaveData = strWaveData + "," + waveTemp;
|
||||
}
|
||||
}
|
||||
|
||||
int max = number / sampleRateReference;
|
||||
if (max == 0 && number > 0) {
|
||||
max = 1;
|
||||
}
|
||||
|
||||
jsBody["packageMax"] = max;
|
||||
|
||||
|
||||
|
||||
}
|
||||
} else {
|
||||
jsonVal["success"] = false;
|
||||
jsonVal["message"] = "没有数据文件";
|
||||
}
|
||||
|
||||
jsBody["channelId"] = param.mChannelId;
|
||||
jsBody["package"] = param.mPackageFlag;
|
||||
jsBody["timestamp"] = string(localtimestamp);
|
||||
jsBody["Data"] = strWaveData;
|
||||
|
||||
double resolution = 0.0;
|
||||
int SampleRate =0;
|
||||
print_info("sensor type %s\n",res[17].c_str());
|
||||
if(res[17]=="01"){
|
||||
SampleRate = atoi(res[23].c_str());
|
||||
printf("@@@@@@@@@@@@@@@@@@@@sample_rate=%d\n",SampleRate);
|
||||
resolution = (((double)SampleRate/1000)*1024)/ 8192;
|
||||
|
||||
}else if(res[17]=="02"){
|
||||
string::size_type comper = param.mChannelId.find("Z");
|
||||
if (comper != string::npos) {
|
||||
SampleRate = atoi(res[23].c_str());
|
||||
resolution = (double)SampleRate/vecWave.size();
|
||||
//resolution = (((double)vecWave.size()/1000)*1024)/ (SampleRate * ((vecWave.size()/SampleRate)));
|
||||
printf("@@@@@@@@@@@@@@@@@@@@sample_rate=%d,resolution = %f\n",SampleRate,resolution);
|
||||
}else{
|
||||
SampleRate = 8000;
|
||||
printf("@@@@@@@@@@@@@@@@@@@@sample_rate=%d\n",SampleRate);
|
||||
resolution = (((double)SampleRate/1024)*1024)/ 8192;
|
||||
}
|
||||
}
|
||||
|
||||
print_info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@the sample rate is %d,the resolution %f\n",SampleRate,resolution);
|
||||
char buf[32];
|
||||
memset(buf, 0, 32);
|
||||
sprintf(buf, "%f", resolution);
|
||||
jsBody["resolution"] = std::string(buf);
|
||||
|
||||
jsonVal["content"] = jsBody;
|
||||
return showValue.write(jsonVal);
|
||||
}
|
||||
|
||||
|
@ -70,6 +70,9 @@ public :
|
||||
std::string JsonCmd_Cgi_52(Param_52 ¶m);
|
||||
std::string JsonCmd_Cgi_53(std::vector<Param_53> ¶m);
|
||||
std::string JsonCmd_Cgi_54(Param_54 ¶m);
|
||||
|
||||
std::string JsonCmd_Cgi_55(Param_55 ¶m);
|
||||
std::string JsonCmd_Cgi_56(Param_56 ¶m);
|
||||
std::string JsonCmd_Cgi_default();
|
||||
|
||||
private :
|
||||
|
@ -616,6 +616,26 @@ try{
|
||||
return data;
|
||||
}
|
||||
break;
|
||||
case 55:{
|
||||
JsonData jd;
|
||||
Param_55 param;
|
||||
param.mChannelId = recvBody["channelId"].asString();
|
||||
param.mPackageFlag = recvBody["package"].asInt();
|
||||
param.mDataNodeNo = recvBody["dataNodeNo"].asString();
|
||||
std::string data = jd.JsonCmd_Cgi_55(param);
|
||||
return data;
|
||||
}
|
||||
break;
|
||||
case 56:{
|
||||
JsonData jd;
|
||||
Param_56 param;
|
||||
param.mChannelId = recvBody["channelId"].asString();
|
||||
param.mPackageFlag = recvBody["package"].asInt();
|
||||
param.mDataNodeNo = recvBody["dataNodeNo"].asString();
|
||||
std::string data = jd.JsonCmd_Cgi_56(param);
|
||||
return data;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
JsonData jd;
|
||||
std::string data = jd.JsonCmd_Cgi_default();
|
||||
|
2
main.cpp
2
main.cpp
@ -45,7 +45,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
sql_ctl->InintGateway();
|
||||
//sql_ctl->CalculateDip();
|
||||
sql_ctl->CalculateBattery();
|
||||
//sql_ctl->CalculateBattery();
|
||||
pUart->InitZigbee();
|
||||
// UDP,接收客户端发来的组播消息,用于外接 QT 专家系统,屏蔽之
|
||||
boost::thread searchT(SearchThread);
|
||||
|
@ -28,7 +28,6 @@ subscribe_callback my_subscribe_callback = NULL;
|
||||
log_callback my_log_callback = NULL;
|
||||
publish_callback my_publish_callback = NULL;
|
||||
|
||||
|
||||
void register_collback(connect_callback connect_c,
|
||||
message_callback message_c,
|
||||
subscribe_callback subscribe_c,
|
||||
@ -71,7 +70,7 @@ int data_publish(const char *str, const char *topic)
|
||||
}
|
||||
if(iRet != 0)
|
||||
{
|
||||
reconnect();
|
||||
disconnect();
|
||||
}
|
||||
return iRet;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
561
mqttclient/mosquitto_broker.h
Normal file
561
mqttclient/mosquitto_broker.h
Normal file
@ -0,0 +1,561 @@
|
||||
/*
|
||||
Copyright (c) 2009-2020 Roger Light <roger@atchoo.org>
|
||||
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are made available under the terms of the Eclipse Public License 2.0
|
||||
and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
|
||||
The Eclipse Public License is available at
|
||||
https://www.eclipse.org/legal/epl-2.0/
|
||||
and the Eclipse Distribution License is available at
|
||||
http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
|
||||
SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
|
||||
|
||||
Contributors:
|
||||
Roger Light - initial implementation and documentation.
|
||||
*/
|
||||
|
||||
/*
|
||||
* File: mosquitto_broker.h
|
||||
*
|
||||
* This header contains functions for use by plugins.
|
||||
*/
|
||||
#ifndef MOSQUITTO_BROKER_H
|
||||
#define MOSQUITTO_BROKER_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if defined(WIN32) && defined(mosquitto_EXPORTS)
|
||||
# define mosq_EXPORT __declspec(dllexport)
|
||||
#else
|
||||
# define mosq_EXPORT
|
||||
#endif
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <time.h>
|
||||
|
||||
struct mosquitto;
|
||||
typedef struct mqtt5__property mosquitto_property;
|
||||
|
||||
enum mosquitto_protocol {
|
||||
mp_mqtt,
|
||||
mp_mqttsn,
|
||||
mp_websockets
|
||||
};
|
||||
|
||||
/* =========================================================================
|
||||
*
|
||||
* Section: Register callbacks.
|
||||
*
|
||||
* ========================================================================= */
|
||||
|
||||
/* Callback events */
|
||||
enum mosquitto_plugin_event {
|
||||
MOSQ_EVT_RELOAD = 1,
|
||||
MOSQ_EVT_ACL_CHECK = 2,
|
||||
MOSQ_EVT_BASIC_AUTH = 3,
|
||||
MOSQ_EVT_EXT_AUTH_START = 4,
|
||||
MOSQ_EVT_EXT_AUTH_CONTINUE = 5,
|
||||
MOSQ_EVT_CONTROL = 6,
|
||||
MOSQ_EVT_MESSAGE = 7,
|
||||
MOSQ_EVT_PSK_KEY = 8,
|
||||
MOSQ_EVT_TICK = 9,
|
||||
MOSQ_EVT_DISCONNECT = 10,
|
||||
};
|
||||
|
||||
/* Data for the MOSQ_EVT_RELOAD event */
|
||||
struct mosquitto_evt_reload {
|
||||
void *future;
|
||||
struct mosquitto_opt *options;
|
||||
int option_count;
|
||||
void *future2[4];
|
||||
};
|
||||
|
||||
/* Data for the MOSQ_EVT_ACL_CHECK event */
|
||||
struct mosquitto_evt_acl_check {
|
||||
void *future;
|
||||
struct mosquitto *client;
|
||||
const char *topic;
|
||||
const void *payload;
|
||||
mosquitto_property *properties;
|
||||
int access;
|
||||
uint32_t payloadlen;
|
||||
uint8_t qos;
|
||||
bool retain;
|
||||
void *future2[4];
|
||||
};
|
||||
|
||||
/* Data for the MOSQ_EVT_BASIC_AUTH event */
|
||||
struct mosquitto_evt_basic_auth {
|
||||
void *future;
|
||||
struct mosquitto *client;
|
||||
char *username;
|
||||
char *password;
|
||||
void *future2[4];
|
||||
};
|
||||
|
||||
/* Data for the MOSQ_EVT_PSK_KEY event */
|
||||
struct mosquitto_evt_psk_key {
|
||||
void *future;
|
||||
struct mosquitto *client;
|
||||
const char *hint;
|
||||
const char *identity;
|
||||
char *key;
|
||||
int max_key_len;
|
||||
void *future2[4];
|
||||
};
|
||||
|
||||
/* Data for the MOSQ_EVT_EXTENDED_AUTH event */
|
||||
struct mosquitto_evt_extended_auth {
|
||||
void *future;
|
||||
struct mosquitto *client;
|
||||
const void *data_in;
|
||||
void *data_out;
|
||||
uint16_t data_in_len;
|
||||
uint16_t data_out_len;
|
||||
const char *auth_method;
|
||||
void *future2[3];
|
||||
};
|
||||
|
||||
/* Data for the MOSQ_EVT_CONTROL event */
|
||||
struct mosquitto_evt_control {
|
||||
void *future;
|
||||
struct mosquitto *client;
|
||||
const char *topic;
|
||||
const void *payload;
|
||||
const mosquitto_property *properties;
|
||||
char *reason_string;
|
||||
uint32_t payloadlen;
|
||||
uint8_t qos;
|
||||
uint8_t reason_code;
|
||||
bool retain;
|
||||
void *future2[4];
|
||||
};
|
||||
|
||||
/* Data for the MOSQ_EVT_MESSAGE event */
|
||||
struct mosquitto_evt_message {
|
||||
void *future;
|
||||
struct mosquitto *client;
|
||||
char *topic;
|
||||
void *payload;
|
||||
mosquitto_property *properties;
|
||||
char *reason_string;
|
||||
uint32_t payloadlen;
|
||||
uint8_t qos;
|
||||
uint8_t reason_code;
|
||||
bool retain;
|
||||
void *future2[4];
|
||||
};
|
||||
|
||||
|
||||
/* Data for the MOSQ_EVT_TICK event */
|
||||
struct mosquitto_evt_tick {
|
||||
void *future;
|
||||
long now_ns;
|
||||
long next_ns;
|
||||
time_t now_s;
|
||||
time_t next_s;
|
||||
void *future2[4];
|
||||
};
|
||||
|
||||
/* Data for the MOSQ_EVT_DISCONNECT event */
|
||||
struct mosquitto_evt_disconnect {
|
||||
void *future;
|
||||
struct mosquitto *client;
|
||||
int reason;
|
||||
void *future2[4];
|
||||
};
|
||||
|
||||
|
||||
/* Callback definition */
|
||||
typedef int (*MOSQ_FUNC_generic_callback)(int, void *, void *);
|
||||
|
||||
typedef struct mosquitto_plugin_id_t mosquitto_plugin_id_t;
|
||||
|
||||
/*
|
||||
* Function: mosquitto_callback_register
|
||||
*
|
||||
* Register a callback for an event.
|
||||
*
|
||||
* Parameters:
|
||||
* identifier - the plugin identifier, as provided by <mosquitto_plugin_init>.
|
||||
* event - the event to register a callback for. Can be one of:
|
||||
* * MOSQ_EVT_RELOAD
|
||||
* * MOSQ_EVT_ACL_CHECK
|
||||
* * MOSQ_EVT_BASIC_AUTH
|
||||
* * MOSQ_EVT_EXT_AUTH_START
|
||||
* * MOSQ_EVT_EXT_AUTH_CONTINUE
|
||||
* * MOSQ_EVT_CONTROL
|
||||
* * MOSQ_EVT_MESSAGE
|
||||
* * MOSQ_EVT_PSK_KEY
|
||||
* * MOSQ_EVT_TICK
|
||||
* * MOSQ_EVT_DISCONNECT
|
||||
* cb_func - the callback function
|
||||
* event_data - event specific data
|
||||
*
|
||||
* Returns:
|
||||
* MOSQ_ERR_SUCCESS - on success
|
||||
* MOSQ_ERR_INVAL - if cb_func is NULL
|
||||
* MOSQ_ERR_NOMEM - on out of memory
|
||||
* MOSQ_ERR_ALREADY_EXISTS - if cb_func has already been registered for this event
|
||||
* MOSQ_ERR_NOT_SUPPORTED - if the event is not supported
|
||||
*/
|
||||
mosq_EXPORT int mosquitto_callback_register(
|
||||
mosquitto_plugin_id_t *identifier,
|
||||
int event,
|
||||
MOSQ_FUNC_generic_callback cb_func,
|
||||
const void *event_data,
|
||||
void *userdata);
|
||||
|
||||
/*
|
||||
* Function: mosquitto_callback_unregister
|
||||
*
|
||||
* Unregister a previously registered callback function.
|
||||
*
|
||||
* Parameters:
|
||||
* identifier - the plugin identifier, as provided by <mosquitto_plugin_init>.
|
||||
* event - the event to register a callback for. Can be one of:
|
||||
* * MOSQ_EVT_RELOAD
|
||||
* * MOSQ_EVT_ACL_CHECK
|
||||
* * MOSQ_EVT_BASIC_AUTH
|
||||
* * MOSQ_EVT_EXT_AUTH_START
|
||||
* * MOSQ_EVT_EXT_AUTH_CONTINUE
|
||||
* * MOSQ_EVT_CONTROL
|
||||
* * MOSQ_EVT_MESSAGE
|
||||
* * MOSQ_EVT_PSK_KEY
|
||||
* * MOSQ_EVT_TICK
|
||||
* * MOSQ_EVT_DISCONNECT
|
||||
* cb_func - the callback function
|
||||
* event_data - event specific data
|
||||
*
|
||||
* Returns:
|
||||
* MOSQ_ERR_SUCCESS - on success
|
||||
* MOSQ_ERR_INVAL - if cb_func is NULL
|
||||
* MOSQ_ERR_NOT_FOUND - if cb_func was not registered for this event
|
||||
* MOSQ_ERR_NOT_SUPPORTED - if the event is not supported
|
||||
*/
|
||||
mosq_EXPORT int mosquitto_callback_unregister(
|
||||
mosquitto_plugin_id_t *identifier,
|
||||
int event,
|
||||
MOSQ_FUNC_generic_callback cb_func,
|
||||
const void *event_data);
|
||||
|
||||
|
||||
/* =========================================================================
|
||||
*
|
||||
* Section: Memory allocation.
|
||||
*
|
||||
* Use these functions when allocating or freeing memory to have your memory
|
||||
* included in the memory tracking on the broker.
|
||||
*
|
||||
* ========================================================================= */
|
||||
|
||||
/*
|
||||
* Function: mosquitto_calloc
|
||||
*/
|
||||
mosq_EXPORT void *mosquitto_calloc(size_t nmemb, size_t size);
|
||||
|
||||
/*
|
||||
* Function: mosquitto_free
|
||||
*/
|
||||
mosq_EXPORT void mosquitto_free(void *mem);
|
||||
|
||||
/*
|
||||
* Function: mosquitto_malloc
|
||||
*/
|
||||
mosq_EXPORT void *mosquitto_malloc(size_t size);
|
||||
|
||||
/*
|
||||
* Function: mosquitto_realloc
|
||||
*/
|
||||
mosq_EXPORT void *mosquitto_realloc(void *ptr, size_t size);
|
||||
|
||||
/*
|
||||
* Function: mosquitto_strdup
|
||||
*/
|
||||
mosq_EXPORT char *mosquitto_strdup(const char *s);
|
||||
|
||||
/* =========================================================================
|
||||
*
|
||||
* Section: Utility Functions
|
||||
*
|
||||
* Use these functions from within your plugin.
|
||||
*
|
||||
* ========================================================================= */
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_log_printf
|
||||
*
|
||||
* Write a log message using the broker configured logging.
|
||||
*
|
||||
* Parameters:
|
||||
* level - Log message priority. Can currently be one of:
|
||||
*
|
||||
* * MOSQ_LOG_INFO
|
||||
* * MOSQ_LOG_NOTICE
|
||||
* * MOSQ_LOG_WARNING
|
||||
* * MOSQ_LOG_ERR
|
||||
* * MOSQ_LOG_DEBUG
|
||||
* * MOSQ_LOG_SUBSCRIBE (not recommended for use by plugins)
|
||||
* * MOSQ_LOG_UNSUBSCRIBE (not recommended for use by plugins)
|
||||
*
|
||||
* These values are defined in mosquitto.h.
|
||||
*
|
||||
* fmt, ... - printf style format and arguments.
|
||||
*/
|
||||
mosq_EXPORT void mosquitto_log_printf(int level, const char *fmt, ...);
|
||||
|
||||
|
||||
/* =========================================================================
|
||||
*
|
||||
* Client Functions
|
||||
*
|
||||
* Use these functions to access client information.
|
||||
*
|
||||
* ========================================================================= */
|
||||
|
||||
/*
|
||||
* Function: mosquitto_client_address
|
||||
*
|
||||
* Retrieve the IP address of the client as a string.
|
||||
*/
|
||||
mosq_EXPORT const char *mosquitto_client_address(const struct mosquitto *client);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_client_clean_session
|
||||
*
|
||||
* Retrieve the clean session flag value for a client.
|
||||
*/
|
||||
mosq_EXPORT bool mosquitto_client_clean_session(const struct mosquitto *client);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_client_id
|
||||
*
|
||||
* Retrieve the client id associated with a client.
|
||||
*/
|
||||
mosq_EXPORT const char *mosquitto_client_id(const struct mosquitto *client);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_client_keepalive
|
||||
*
|
||||
* Retrieve the keepalive value for a client.
|
||||
*/
|
||||
mosq_EXPORT int mosquitto_client_keepalive(const struct mosquitto *client);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_client_certificate
|
||||
*
|
||||
* If TLS support is enabled, return the certificate provided by a client as an
|
||||
* X509 pointer from openssl. If the client did not provide a certificate, then
|
||||
* NULL will be returned. This function will only ever return a non-NULL value
|
||||
* if the `require_certificate` option is set to true.
|
||||
*
|
||||
* When you have finished with the x509 pointer, it must be freed using
|
||||
* X509_free().
|
||||
*
|
||||
* If TLS is not supported, this function will always return NULL.
|
||||
*/
|
||||
mosq_EXPORT void *mosquitto_client_certificate(const struct mosquitto *client);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_client_protocol
|
||||
*
|
||||
* Retrieve the protocol with which the client has connected. Can be one of:
|
||||
*
|
||||
* mp_mqtt (MQTT over TCP)
|
||||
* mp_mqttsn (MQTT-SN)
|
||||
* mp_websockets (MQTT over Websockets)
|
||||
*/
|
||||
mosq_EXPORT int mosquitto_client_protocol(const struct mosquitto *client);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_client_protocol_version
|
||||
*
|
||||
* Retrieve the MQTT protocol version with which the client has connected. Can be one of:
|
||||
*
|
||||
* Returns:
|
||||
* 3 - for MQTT v3 / v3.1
|
||||
* 4 - for MQTT v3.1.1
|
||||
* 5 - for MQTT v5
|
||||
*/
|
||||
mosq_EXPORT int mosquitto_client_protocol_version(const struct mosquitto *client);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_client_sub_count
|
||||
*
|
||||
* Retrieve the number of subscriptions that have been made by a client.
|
||||
*/
|
||||
mosq_EXPORT int mosquitto_client_sub_count(const struct mosquitto *client);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_client_username
|
||||
*
|
||||
* Retrieve the username associated with a client.
|
||||
*/
|
||||
mosq_EXPORT const char *mosquitto_client_username(const struct mosquitto *client);
|
||||
|
||||
|
||||
/* Function: mosquitto_set_username
|
||||
*
|
||||
* Set the username for a client.
|
||||
*
|
||||
* This removes and replaces the current username for a client and hence
|
||||
* updates its access.
|
||||
*
|
||||
* username can be NULL, in which case the client will become anonymous, but
|
||||
* must not be zero length.
|
||||
*
|
||||
* In the case of error, the client will be left with its original username.
|
||||
*
|
||||
* Returns:
|
||||
* MOSQ_ERR_SUCCESS - on success
|
||||
* MOSQ_ERR_INVAL - if client is NULL, or if username is zero length
|
||||
* MOSQ_ERR_NOMEM - on out of memory
|
||||
*/
|
||||
mosq_EXPORT int mosquitto_set_username(struct mosquitto *client, const char *username);
|
||||
|
||||
|
||||
/* =========================================================================
|
||||
*
|
||||
* Section: Client control
|
||||
*
|
||||
* ========================================================================= */
|
||||
|
||||
/* Function: mosquitto_kick_client_by_clientid
|
||||
*
|
||||
* Forcefully disconnect a client from the broker.
|
||||
*
|
||||
* If clientid != NULL, then the client with the matching client id is
|
||||
* disconnected from the broker.
|
||||
* If clientid == NULL, then all clients are disconnected from the broker.
|
||||
*
|
||||
* If with_will == true, then if the client has a Last Will and Testament
|
||||
* defined then this will be sent. If false, the LWT will not be sent.
|
||||
*/
|
||||
mosq_EXPORT int mosquitto_kick_client_by_clientid(const char *clientid, bool with_will);
|
||||
|
||||
/* Function: mosquitto_kick_client_by_username
|
||||
*
|
||||
* Forcefully disconnect a client from the broker.
|
||||
*
|
||||
* If username != NULL, then all clients with a matching username are kicked
|
||||
* from the broker.
|
||||
* If username == NULL, then all clients that do not have a username are
|
||||
* kicked.
|
||||
*
|
||||
* If with_will == true, then if the client has a Last Will and Testament
|
||||
* defined then this will be sent. If false, the LWT will not be sent.
|
||||
*/
|
||||
mosq_EXPORT int mosquitto_kick_client_by_username(const char *username, bool with_will);
|
||||
|
||||
|
||||
/* =========================================================================
|
||||
*
|
||||
* Section: Publishing functions
|
||||
*
|
||||
* ========================================================================= */
|
||||
|
||||
/* Function: mosquitto_broker_publish
|
||||
*
|
||||
* Publish a message from within a plugin.
|
||||
*
|
||||
* This function allows a plugin to publish a message. Messages published in
|
||||
* this way are treated as coming from the broker and so will not be passed to
|
||||
* `mosquitto_auth_acl_check(, MOSQ_ACL_WRITE, , )` for checking. Read access
|
||||
* will be enforced as normal for individual clients when they are due to
|
||||
* receive the message.
|
||||
*
|
||||
* It can be used to send messages to all clients that have a matching
|
||||
* subscription, or to a single client whether or not it has a matching
|
||||
* subscription.
|
||||
*
|
||||
* Parameters:
|
||||
* clientid - optional string. If set to NULL, the message is delivered to all
|
||||
* clients. If non-NULL, the message is delivered only to the
|
||||
* client with the corresponding client id. If the client id
|
||||
* specified is not connected, the message will be dropped.
|
||||
* topic - message topic
|
||||
* payloadlen - payload length in bytes. Can be 0 for an empty payload.
|
||||
* payload - payload bytes. If payloadlen > 0 this must not be NULL. Must
|
||||
* be allocated on the heap. Will be freed by mosquitto after use if the
|
||||
* function returns success.
|
||||
* qos - message QoS to use.
|
||||
* retain - should retain be set on the message. This does not apply if
|
||||
* clientid is non-NULL.
|
||||
* properties - MQTT v5 properties to attach to the message. If the function
|
||||
* returns success, then properties is owned by the broker and
|
||||
* will be freed at a later point.
|
||||
*
|
||||
* Returns:
|
||||
* MOSQ_ERR_SUCCESS - on success
|
||||
* MOSQ_ERR_INVAL - if topic is NULL, if payloadlen < 0, if payloadlen > 0
|
||||
* and payload is NULL, if qos is not 0, 1, or 2.
|
||||
* MOSQ_ERR_NOMEM - on out of memory
|
||||
*/
|
||||
mosq_EXPORT int mosquitto_broker_publish(
|
||||
const char *clientid,
|
||||
const char *topic,
|
||||
int payloadlen,
|
||||
void *payload,
|
||||
int qos,
|
||||
bool retain,
|
||||
mosquitto_property *properties);
|
||||
|
||||
|
||||
/* Function: mosquitto_broker_publish_copy
|
||||
*
|
||||
* Publish a message from within a plugin.
|
||||
*
|
||||
* This function is identical to mosquitto_broker_publish, except that a copy
|
||||
* of `payload` is taken.
|
||||
*
|
||||
* Parameters:
|
||||
* clientid - optional string. If set to NULL, the message is delivered to all
|
||||
* clients. If non-NULL, the message is delivered only to the
|
||||
* client with the corresponding client id. If the client id
|
||||
* specified is not connected, the message will be dropped.
|
||||
* topic - message topic
|
||||
* payloadlen - payload length in bytes. Can be 0 for an empty payload.
|
||||
* payload - payload bytes. If payloadlen > 0 this must not be NULL.
|
||||
* Memory remains the property of the calling function.
|
||||
* qos - message QoS to use.
|
||||
* retain - should retain be set on the message. This does not apply if
|
||||
* clientid is non-NULL.
|
||||
* properties - MQTT v5 properties to attach to the message. If the function
|
||||
* returns success, then properties is owned by the broker and
|
||||
* will be freed at a later point.
|
||||
*
|
||||
* Returns:
|
||||
* MOSQ_ERR_SUCCESS - on success
|
||||
* MOSQ_ERR_INVAL - if topic is NULL, if payloadlen < 0, if payloadlen > 0
|
||||
* and payload is NULL, if qos is not 0, 1, or 2.
|
||||
* MOSQ_ERR_NOMEM - on out of memory
|
||||
*/
|
||||
mosq_EXPORT int mosquitto_broker_publish_copy(
|
||||
const char *clientid,
|
||||
const char *topic,
|
||||
int payloadlen,
|
||||
const void *payload,
|
||||
int qos,
|
||||
bool retain,
|
||||
mosquitto_property *properties);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
420
mqttclient/mosquitto_plugin.h
Normal file
420
mqttclient/mosquitto_plugin.h
Normal file
@ -0,0 +1,420 @@
|
||||
/*
|
||||
Copyright (c) 2012-2020 Roger Light <roger@atchoo.org>
|
||||
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are made available under the terms of the Eclipse Public License 2.0
|
||||
and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
|
||||
The Eclipse Public License is available at
|
||||
https://www.eclipse.org/legal/epl-2.0/
|
||||
and the Eclipse Distribution License is available at
|
||||
http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
|
||||
SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
|
||||
|
||||
Contributors:
|
||||
Roger Light - initial implementation and documentation.
|
||||
*/
|
||||
|
||||
#ifndef MOSQUITTO_PLUGIN_H
|
||||
#define MOSQUITTO_PLUGIN_H
|
||||
|
||||
/*
|
||||
* File: mosquitto_plugin.h
|
||||
*
|
||||
* This header contains function declarations for use when writing a Mosquitto plugin.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* The generic plugin interface starts at version 5 */
|
||||
#define MOSQ_PLUGIN_VERSION 5
|
||||
|
||||
/* The old auth only interface stopped at version 4 */
|
||||
#define MOSQ_AUTH_PLUGIN_VERSION 4
|
||||
|
||||
#define MOSQ_ACL_NONE 0x00
|
||||
#define MOSQ_ACL_READ 0x01
|
||||
#define MOSQ_ACL_WRITE 0x02
|
||||
#define MOSQ_ACL_SUBSCRIBE 0x04
|
||||
#define MOSQ_ACL_UNSUBSCRIBE 0x08
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <mosquitto_broker.h>
|
||||
|
||||
struct mosquitto;
|
||||
|
||||
struct mosquitto_opt {
|
||||
char *key;
|
||||
char *value;
|
||||
};
|
||||
|
||||
struct mosquitto_auth_opt {
|
||||
char *key;
|
||||
char *value;
|
||||
};
|
||||
|
||||
struct mosquitto_acl_msg {
|
||||
const char *topic;
|
||||
const void *payload;
|
||||
long payloadlen;
|
||||
int qos;
|
||||
bool retain;
|
||||
};
|
||||
|
||||
#ifdef WIN32
|
||||
# define mosq_plugin_EXPORT __declspec(dllexport)
|
||||
#else
|
||||
# define mosq_plugin_EXPORT
|
||||
#endif
|
||||
|
||||
/*
|
||||
* To create an authentication plugin you must include this file then implement
|
||||
* the functions listed in the "Plugin Functions" section below. The resulting
|
||||
* code should then be compiled as a shared library. Using gcc this can be
|
||||
* achieved as follows:
|
||||
*
|
||||
* gcc -I<path to mosquitto_plugin.h> -fPIC -shared plugin.c -o plugin.so
|
||||
*
|
||||
* On Mac OS X:
|
||||
*
|
||||
* gcc -I<path to mosquitto_plugin.h> -fPIC -shared plugin.c -undefined dynamic_lookup -o plugin.so
|
||||
*
|
||||
* Authentication plugins can implement one or both of authentication and
|
||||
* access control. If your plugin does not wish to handle either of
|
||||
* authentication or access control it should return MOSQ_ERR_PLUGIN_DEFER. In
|
||||
* this case, the next plugin will handle it. If all plugins return
|
||||
* MOSQ_ERR_PLUGIN_DEFER, the request will be denied.
|
||||
*
|
||||
* For each check, the following flow happens:
|
||||
*
|
||||
* * The default password file and/or acl file checks are made. If either one
|
||||
* of these is not defined, then they are considered to be deferred. If either
|
||||
* one accepts the check, no further checks are made. If an error occurs, the
|
||||
* check is denied
|
||||
* * The first plugin does the check, if it returns anything other than
|
||||
* MOSQ_ERR_PLUGIN_DEFER, then the check returns immediately. If the plugin
|
||||
* returns MOSQ_ERR_PLUGIN_DEFER then the next plugin runs its check.
|
||||
* * If the final plugin returns MOSQ_ERR_PLUGIN_DEFER, then access will be
|
||||
* denied.
|
||||
*/
|
||||
|
||||
/* =========================================================================
|
||||
*
|
||||
* Helper Functions
|
||||
*
|
||||
* ========================================================================= */
|
||||
|
||||
/* There are functions that are available for plugin developers to use in
|
||||
* mosquitto_broker.h, including logging and accessor functions.
|
||||
*/
|
||||
|
||||
|
||||
/* =========================================================================
|
||||
*
|
||||
* Section: Plugin Functions v5
|
||||
*
|
||||
* This is the plugin version 5 interface, which covers authentication, access
|
||||
* control, the $CONTROL topic space handling, and message inspection and
|
||||
* modification.
|
||||
*
|
||||
* This interface is available from v2.0 onwards.
|
||||
*
|
||||
* There are just three functions to implement in your plugin. You should
|
||||
* register callbacks to handle different events in your
|
||||
* mosquitto_plugin_init() function. See mosquitto_broker.h for the events and
|
||||
* callback registering functions.
|
||||
*
|
||||
* ========================================================================= */
|
||||
|
||||
/*
|
||||
* Function: mosquitto_plugin_version
|
||||
*
|
||||
* The broker will attempt to call this function immediately after loading the
|
||||
* plugin to check it is a supported plugin version. Your code must simply
|
||||
* return the plugin interface version you support, i.e. 5.
|
||||
*
|
||||
* The supported_versions array tells you which plugin versions the broker supports.
|
||||
*
|
||||
* If the broker does not support the version that you require, return -1 to
|
||||
* indicate failure.
|
||||
*/
|
||||
mosq_plugin_EXPORT int mosquitto_plugin_version(int supported_version_count, const int *supported_versions);
|
||||
|
||||
/*
|
||||
* Function: mosquitto_plugin_init
|
||||
*
|
||||
* Called after the plugin has been loaded and <mosquitto_plugin_version>
|
||||
* has been called. This will only ever be called once and can be used to
|
||||
* initialise the plugin.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* identifier - This is a pointer to an opaque structure which you must
|
||||
* save and use when registering/unregistering callbacks.
|
||||
* user_data - The pointer set here will be passed to the other plugin
|
||||
* functions. Use to hold connection information for example.
|
||||
* opts - Pointer to an array of struct mosquitto_opt, which
|
||||
* provides the plugin options defined in the configuration file.
|
||||
* opt_count - The number of elements in the opts array.
|
||||
*
|
||||
* Return value:
|
||||
* Return 0 on success
|
||||
* Return >0 on failure.
|
||||
*/
|
||||
mosq_plugin_EXPORT int mosquitto_plugin_init(mosquitto_plugin_id_t *identifier, void **userdata, struct mosquitto_opt *options, int option_count);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_plugin_cleanup
|
||||
*
|
||||
* Called when the broker is shutting down. This will only ever be called once
|
||||
* per plugin.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* user_data - The pointer provided in <mosquitto_plugin_init>.
|
||||
* opts - Pointer to an array of struct mosquitto_opt, which
|
||||
* provides the plugin options defined in the configuration file.
|
||||
* opt_count - The number of elements in the opts array.
|
||||
*
|
||||
* Return value:
|
||||
* Return 0 on success
|
||||
* Return >0 on failure.
|
||||
*/
|
||||
mosq_plugin_EXPORT int mosquitto_plugin_cleanup(void *userdata, struct mosquitto_opt *options, int option_count);
|
||||
|
||||
|
||||
|
||||
/* =========================================================================
|
||||
*
|
||||
* Section: Plugin Functions v4
|
||||
*
|
||||
* This is the plugin version 4 interface, which is exclusively for
|
||||
* authentication and access control, and which is still supported for existing
|
||||
* plugins. If you are developing a new plugin, please use the v5 interface.
|
||||
*
|
||||
* You must implement these functions in your plugin.
|
||||
*
|
||||
* ========================================================================= */
|
||||
|
||||
/*
|
||||
* Function: mosquitto_auth_plugin_version
|
||||
*
|
||||
* The broker will call this function immediately after loading the plugin to
|
||||
* check it is a supported plugin version. Your code must simply return
|
||||
* the version of the plugin interface you support, i.e. 4.
|
||||
*/
|
||||
mosq_plugin_EXPORT int mosquitto_auth_plugin_version(void);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_auth_plugin_init
|
||||
*
|
||||
* Called after the plugin has been loaded and <mosquitto_auth_plugin_version>
|
||||
* has been called. This will only ever be called once and can be used to
|
||||
* initialise the plugin.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* user_data - The pointer set here will be passed to the other plugin
|
||||
* functions. Use to hold connection information for example.
|
||||
* opts - Pointer to an array of struct mosquitto_opt, which
|
||||
* provides the plugin options defined in the configuration file.
|
||||
* opt_count - The number of elements in the opts array.
|
||||
*
|
||||
* Return value:
|
||||
* Return 0 on success
|
||||
* Return >0 on failure.
|
||||
*/
|
||||
mosq_plugin_EXPORT int mosquitto_auth_plugin_init(void **user_data, struct mosquitto_opt *opts, int opt_count);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_auth_plugin_cleanup
|
||||
*
|
||||
* Called when the broker is shutting down. This will only ever be called once
|
||||
* per plugin.
|
||||
* Note that <mosquitto_auth_security_cleanup> will be called directly before
|
||||
* this function.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* user_data - The pointer provided in <mosquitto_auth_plugin_init>.
|
||||
* opts - Pointer to an array of struct mosquitto_opt, which
|
||||
* provides the plugin options defined in the configuration file.
|
||||
* opt_count - The number of elements in the opts array.
|
||||
*
|
||||
* Return value:
|
||||
* Return 0 on success
|
||||
* Return >0 on failure.
|
||||
*/
|
||||
mosq_plugin_EXPORT int mosquitto_auth_plugin_cleanup(void *user_data, struct mosquitto_opt *opts, int opt_count);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_auth_security_init
|
||||
*
|
||||
* This function is called in two scenarios:
|
||||
*
|
||||
* 1. When the broker starts up.
|
||||
* 2. If the broker is requested to reload its configuration whilst running. In
|
||||
* this case, <mosquitto_auth_security_cleanup> will be called first, then
|
||||
* this function will be called. In this situation, the reload parameter
|
||||
* will be true.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* user_data - The pointer provided in <mosquitto_auth_plugin_init>.
|
||||
* opts - Pointer to an array of struct mosquitto_opt, which
|
||||
* provides the plugin options defined in the configuration file.
|
||||
* opt_count - The number of elements in the opts array.
|
||||
* reload - If set to false, this is the first time the function has
|
||||
* been called. If true, the broker has received a signal
|
||||
* asking to reload its configuration.
|
||||
*
|
||||
* Return value:
|
||||
* Return 0 on success
|
||||
* Return >0 on failure.
|
||||
*/
|
||||
mosq_plugin_EXPORT int mosquitto_auth_security_init(void *user_data, struct mosquitto_opt *opts, int opt_count, bool reload);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_auth_security_cleanup
|
||||
*
|
||||
* This function is called in two scenarios:
|
||||
*
|
||||
* 1. When the broker is shutting down.
|
||||
* 2. If the broker is requested to reload its configuration whilst running. In
|
||||
* this case, this function will be called, followed by
|
||||
* <mosquitto_auth_security_init>. In this situation, the reload parameter
|
||||
* will be true.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* user_data - The pointer provided in <mosquitto_auth_plugin_init>.
|
||||
* opts - Pointer to an array of struct mosquitto_opt, which
|
||||
* provides the plugin options defined in the configuration file.
|
||||
* opt_count - The number of elements in the opts array.
|
||||
* reload - If set to false, this is the first time the function has
|
||||
* been called. If true, the broker has received a signal
|
||||
* asking to reload its configuration.
|
||||
*
|
||||
* Return value:
|
||||
* Return 0 on success
|
||||
* Return >0 on failure.
|
||||
*/
|
||||
mosq_plugin_EXPORT int mosquitto_auth_security_cleanup(void *user_data, struct mosquitto_opt *opts, int opt_count, bool reload);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_auth_acl_check
|
||||
*
|
||||
* Called by the broker when topic access must be checked. access will be one
|
||||
* of:
|
||||
* MOSQ_ACL_SUBSCRIBE when a client is asking to subscribe to a topic string.
|
||||
* This differs from MOSQ_ACL_READ in that it allows you to
|
||||
* deny access to topic strings rather than by pattern. For
|
||||
* example, you may use MOSQ_ACL_SUBSCRIBE to deny
|
||||
* subscriptions to '#', but allow all topics in
|
||||
* MOSQ_ACL_READ. This allows clients to subscribe to any
|
||||
* topic they want, but not discover what topics are in use
|
||||
* on the server.
|
||||
* MOSQ_ACL_READ when a message is about to be sent to a client (i.e. whether
|
||||
* it can read that topic or not).
|
||||
* MOSQ_ACL_WRITE when a message has been received from a client (i.e. whether
|
||||
* it can write to that topic or not).
|
||||
*
|
||||
* Return:
|
||||
* MOSQ_ERR_SUCCESS if access was granted.
|
||||
* MOSQ_ERR_ACL_DENIED if access was not granted.
|
||||
* MOSQ_ERR_UNKNOWN for an application specific error.
|
||||
* MOSQ_ERR_PLUGIN_DEFER if your plugin does not wish to handle this check.
|
||||
*/
|
||||
mosq_plugin_EXPORT int mosquitto_auth_acl_check(void *user_data, int access, struct mosquitto *client, const struct mosquitto_acl_msg *msg);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_auth_unpwd_check
|
||||
*
|
||||
* This function is OPTIONAL. Only include this function in your plugin if you
|
||||
* are making basic username/password checks.
|
||||
*
|
||||
* Called by the broker when a username/password must be checked.
|
||||
*
|
||||
* Return:
|
||||
* MOSQ_ERR_SUCCESS if the user is authenticated.
|
||||
* MOSQ_ERR_AUTH if authentication failed.
|
||||
* MOSQ_ERR_UNKNOWN for an application specific error.
|
||||
* MOSQ_ERR_PLUGIN_DEFER if your plugin does not wish to handle this check.
|
||||
*/
|
||||
mosq_plugin_EXPORT int mosquitto_auth_unpwd_check(void *user_data, struct mosquitto *client, const char *username, const char *password);
|
||||
|
||||
|
||||
/*
|
||||
* Function: mosquitto_psk_key_get
|
||||
*
|
||||
* This function is OPTIONAL. Only include this function in your plugin if you
|
||||
* are making TLS-PSK checks.
|
||||
*
|
||||
* Called by the broker when a client connects to a listener using TLS/PSK.
|
||||
* This is used to retrieve the pre-shared-key associated with a client
|
||||
* identity.
|
||||
*
|
||||
* Examine hint and identity to determine the required PSK (which must be a
|
||||
* hexadecimal string with no leading "0x") and copy this string into key.
|
||||
*
|
||||
* Parameters:
|
||||
* user_data - the pointer provided in <mosquitto_auth_plugin_init>.
|
||||
* hint - the psk_hint for the listener the client is connecting to.
|
||||
* identity - the identity string provided by the client
|
||||
* key - a string where the hex PSK should be copied
|
||||
* max_key_len - the size of key
|
||||
*
|
||||
* Return value:
|
||||
* Return 0 on success.
|
||||
* Return >0 on failure.
|
||||
* Return MOSQ_ERR_PLUGIN_DEFER if your plugin does not wish to handle this check.
|
||||
*/
|
||||
mosq_plugin_EXPORT int mosquitto_auth_psk_key_get(void *user_data, struct mosquitto *client, const char *hint, const char *identity, char *key, int max_key_len);
|
||||
|
||||
/*
|
||||
* Function: mosquitto_auth_start
|
||||
*
|
||||
* This function is OPTIONAL. Only include this function in your plugin if you
|
||||
* are making extended authentication checks.
|
||||
*
|
||||
* Parameters:
|
||||
* user_data - the pointer provided in <mosquitto_auth_plugin_init>.
|
||||
* method - the authentication method
|
||||
* reauth - this is set to false if this is the first authentication attempt
|
||||
* on a connection, set to true if the client is attempting to
|
||||
* reauthenticate.
|
||||
* data_in - pointer to authentication data, or NULL
|
||||
* data_in_len - length of data_in, in bytes
|
||||
* data_out - if your plugin wishes to send authentication data back to the
|
||||
* client, allocate some memory using malloc or friends and set
|
||||
* data_out. The broker will free the memory after use.
|
||||
* data_out_len - Set the length of data_out in bytes.
|
||||
*
|
||||
* Return value:
|
||||
* Return MOSQ_ERR_SUCCESS if authentication was successful.
|
||||
* Return MOSQ_ERR_AUTH_CONTINUE if the authentication is a multi step process and can continue.
|
||||
* Return MOSQ_ERR_AUTH if authentication was valid but did not succeed.
|
||||
* Return any other relevant positive integer MOSQ_ERR_* to produce an error.
|
||||
*/
|
||||
mosq_plugin_EXPORT int mosquitto_auth_start(void *user_data, struct mosquitto *client, const char *method, bool reauth, const void *data_in, uint16_t data_in_len, void **data_out, uint16_t *data_out_len);
|
||||
|
||||
mosq_plugin_EXPORT int mosquitto_auth_continue(void *user_data, struct mosquitto *client, const char *method, const void *data_in, uint16_t data_in_len, void **data_out, uint16_t *data_out_len);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
282
mqttclient/mqtt_protocol.h
Normal file
282
mqttclient/mqtt_protocol.h
Normal file
@ -0,0 +1,282 @@
|
||||
/*
|
||||
Copyright (c) 2009-2020 Roger Light <roger@atchoo.org>
|
||||
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are made available under the terms of the Eclipse Public License 2.0
|
||||
and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
|
||||
The Eclipse Public License is available at
|
||||
https://www.eclipse.org/legal/epl-2.0/
|
||||
and the Eclipse Distribution License is available at
|
||||
http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
|
||||
SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
|
||||
|
||||
Contributors:
|
||||
Roger Light - initial implementation and documentation.
|
||||
*/
|
||||
|
||||
#ifndef MQTT_PROTOCOL_H
|
||||
#define MQTT_PROTOCOL_H
|
||||
|
||||
/*
|
||||
* File: mqtt_protocol.h
|
||||
*
|
||||
* This header contains definitions of MQTT values as defined in the specifications.
|
||||
*/
|
||||
#define PROTOCOL_NAME_v31 "MQIsdp"
|
||||
#define PROTOCOL_VERSION_v31 3
|
||||
|
||||
#define PROTOCOL_NAME "MQTT"
|
||||
|
||||
#define PROTOCOL_VERSION_v311 4
|
||||
#define PROTOCOL_VERSION_v5 5
|
||||
|
||||
|
||||
/* Message types */
|
||||
#define CMD_CONNECT 0x10U
|
||||
#define CMD_CONNACK 0x20U
|
||||
#define CMD_PUBLISH 0x30U
|
||||
#define CMD_PUBACK 0x40U
|
||||
#define CMD_PUBREC 0x50U
|
||||
#define CMD_PUBREL 0x60U
|
||||
#define CMD_PUBCOMP 0x70U
|
||||
#define CMD_SUBSCRIBE 0x80U
|
||||
#define CMD_SUBACK 0x90U
|
||||
#define CMD_UNSUBSCRIBE 0xA0U
|
||||
#define CMD_UNSUBACK 0xB0U
|
||||
#define CMD_PINGREQ 0xC0U
|
||||
#define CMD_PINGRESP 0xD0U
|
||||
#define CMD_DISCONNECT 0xE0U
|
||||
#define CMD_AUTH 0xF0U
|
||||
|
||||
/* Mosquitto only: for distinguishing CONNECT and WILL properties */
|
||||
#define CMD_WILL 0x100
|
||||
|
||||
/* Enum: mqtt311_connack_codes
|
||||
*
|
||||
* The CONNACK results for MQTT v3.1.1, and v3.1.
|
||||
*
|
||||
* Values:
|
||||
* CONNACK_ACCEPTED - 0
|
||||
* CONNACK_REFUSED_PROTOCOL_VERSION - 1
|
||||
* CONNACK_REFUSED_IDENTIFIER_REJECTED - 2
|
||||
* CONNACK_REFUSED_SERVER_UNAVAILABLE - 3
|
||||
* CONNACK_REFUSED_BAD_USERNAME_PASSWORD - 4
|
||||
* CONNACK_REFUSED_NOT_AUTHORIZED - 5
|
||||
*/
|
||||
enum mqtt311_connack_codes {
|
||||
CONNACK_ACCEPTED = 0,
|
||||
CONNACK_REFUSED_PROTOCOL_VERSION = 1,
|
||||
CONNACK_REFUSED_IDENTIFIER_REJECTED = 2,
|
||||
CONNACK_REFUSED_SERVER_UNAVAILABLE = 3,
|
||||
CONNACK_REFUSED_BAD_USERNAME_PASSWORD = 4,
|
||||
CONNACK_REFUSED_NOT_AUTHORIZED = 5,
|
||||
};
|
||||
|
||||
/* Enum: mqtt5_return_codes
|
||||
* The reason codes returned in various MQTT commands.
|
||||
*
|
||||
* Values:
|
||||
* MQTT_RC_SUCCESS - 0
|
||||
* MQTT_RC_NORMAL_DISCONNECTION - 0
|
||||
* MQTT_RC_GRANTED_QOS0 - 0
|
||||
* MQTT_RC_GRANTED_QOS1 - 1
|
||||
* MQTT_RC_GRANTED_QOS2 - 2
|
||||
* MQTT_RC_DISCONNECT_WITH_WILL_MSG - 4
|
||||
* MQTT_RC_NO_MATCHING_SUBSCRIBERS - 16
|
||||
* MQTT_RC_NO_SUBSCRIPTION_EXISTED - 17
|
||||
* MQTT_RC_CONTINUE_AUTHENTICATION - 24
|
||||
* MQTT_RC_REAUTHENTICATE - 25
|
||||
* MQTT_RC_UNSPECIFIED - 128
|
||||
* MQTT_RC_MALFORMED_PACKET - 129
|
||||
* MQTT_RC_PROTOCOL_ERROR - 130
|
||||
* MQTT_RC_IMPLEMENTATION_SPECIFIC - 131
|
||||
* MQTT_RC_UNSUPPORTED_PROTOCOL_VERSION - 132
|
||||
* MQTT_RC_CLIENTID_NOT_VALID - 133
|
||||
* MQTT_RC_BAD_USERNAME_OR_PASSWORD - 134
|
||||
* MQTT_RC_NOT_AUTHORIZED - 135
|
||||
* MQTT_RC_SERVER_UNAVAILABLE - 136
|
||||
* MQTT_RC_SERVER_BUSY - 137
|
||||
* MQTT_RC_BANNED - 138
|
||||
* MQTT_RC_SERVER_SHUTTING_DOWN - 139
|
||||
* MQTT_RC_BAD_AUTHENTICATION_METHOD - 140
|
||||
* MQTT_RC_KEEP_ALIVE_TIMEOUT - 141
|
||||
* MQTT_RC_SESSION_TAKEN_OVER - 142
|
||||
* MQTT_RC_TOPIC_FILTER_INVALID - 143
|
||||
* MQTT_RC_TOPIC_NAME_INVALID - 144
|
||||
* MQTT_RC_PACKET_ID_IN_USE - 145
|
||||
* MQTT_RC_PACKET_ID_NOT_FOUND - 146
|
||||
* MQTT_RC_RECEIVE_MAXIMUM_EXCEEDED - 147
|
||||
* MQTT_RC_TOPIC_ALIAS_INVALID - 148
|
||||
* MQTT_RC_PACKET_TOO_LARGE - 149
|
||||
* MQTT_RC_MESSAGE_RATE_TOO_HIGH - 150
|
||||
* MQTT_RC_QUOTA_EXCEEDED - 151
|
||||
* MQTT_RC_ADMINISTRATIVE_ACTION - 152
|
||||
* MQTT_RC_PAYLOAD_FORMAT_INVALID - 153
|
||||
* MQTT_RC_RETAIN_NOT_SUPPORTED - 154
|
||||
* MQTT_RC_QOS_NOT_SUPPORTED - 155
|
||||
* MQTT_RC_USE_ANOTHER_SERVER - 156
|
||||
* MQTT_RC_SERVER_MOVED - 157
|
||||
* MQTT_RC_SHARED_SUBS_NOT_SUPPORTED - 158
|
||||
* MQTT_RC_CONNECTION_RATE_EXCEEDED - 159
|
||||
* MQTT_RC_MAXIMUM_CONNECT_TIME - 160
|
||||
* MQTT_RC_SUBSCRIPTION_IDS_NOT_SUPPORTED - 161
|
||||
* MQTT_RC_WILDCARD_SUBS_NOT_SUPPORTED - 162
|
||||
*/
|
||||
enum mqtt5_return_codes {
|
||||
MQTT_RC_SUCCESS = 0, /* CONNACK, PUBACK, PUBREC, PUBREL, PUBCOMP, UNSUBACK, AUTH */
|
||||
MQTT_RC_NORMAL_DISCONNECTION = 0, /* DISCONNECT */
|
||||
MQTT_RC_GRANTED_QOS0 = 0, /* SUBACK */
|
||||
MQTT_RC_GRANTED_QOS1 = 1, /* SUBACK */
|
||||
MQTT_RC_GRANTED_QOS2 = 2, /* SUBACK */
|
||||
MQTT_RC_DISCONNECT_WITH_WILL_MSG = 4, /* DISCONNECT */
|
||||
MQTT_RC_NO_MATCHING_SUBSCRIBERS = 16, /* PUBACK, PUBREC */
|
||||
MQTT_RC_NO_SUBSCRIPTION_EXISTED = 17, /* UNSUBACK */
|
||||
MQTT_RC_CONTINUE_AUTHENTICATION = 24, /* AUTH */
|
||||
MQTT_RC_REAUTHENTICATE = 25, /* AUTH */
|
||||
|
||||
MQTT_RC_UNSPECIFIED = 128, /* CONNACK, PUBACK, PUBREC, SUBACK, UNSUBACK, DISCONNECT */
|
||||
MQTT_RC_MALFORMED_PACKET = 129, /* CONNACK, DISCONNECT */
|
||||
MQTT_RC_PROTOCOL_ERROR = 130, /* DISCONNECT */
|
||||
MQTT_RC_IMPLEMENTATION_SPECIFIC = 131, /* CONNACK, PUBACK, PUBREC, SUBACK, UNSUBACK, DISCONNECT */
|
||||
MQTT_RC_UNSUPPORTED_PROTOCOL_VERSION = 132, /* CONNACK */
|
||||
MQTT_RC_CLIENTID_NOT_VALID = 133, /* CONNACK */
|
||||
MQTT_RC_BAD_USERNAME_OR_PASSWORD = 134, /* CONNACK */
|
||||
MQTT_RC_NOT_AUTHORIZED = 135, /* CONNACK, PUBACK, PUBREC, SUBACK, UNSUBACK, DISCONNECT */
|
||||
MQTT_RC_SERVER_UNAVAILABLE = 136, /* CONNACK */
|
||||
MQTT_RC_SERVER_BUSY = 137, /* CONNACK, DISCONNECT */
|
||||
MQTT_RC_BANNED = 138, /* CONNACK */
|
||||
MQTT_RC_SERVER_SHUTTING_DOWN = 139, /* DISCONNECT */
|
||||
MQTT_RC_BAD_AUTHENTICATION_METHOD = 140, /* CONNACK */
|
||||
MQTT_RC_KEEP_ALIVE_TIMEOUT = 141, /* DISCONNECT */
|
||||
MQTT_RC_SESSION_TAKEN_OVER = 142, /* DISCONNECT */
|
||||
MQTT_RC_TOPIC_FILTER_INVALID = 143, /* SUBACK, UNSUBACK, DISCONNECT */
|
||||
MQTT_RC_TOPIC_NAME_INVALID = 144, /* CONNACK, PUBACK, PUBREC, DISCONNECT */
|
||||
MQTT_RC_PACKET_ID_IN_USE = 145, /* PUBACK, SUBACK, UNSUBACK */
|
||||
MQTT_RC_PACKET_ID_NOT_FOUND = 146, /* PUBREL, PUBCOMP */
|
||||
MQTT_RC_RECEIVE_MAXIMUM_EXCEEDED = 147, /* DISCONNECT */
|
||||
MQTT_RC_TOPIC_ALIAS_INVALID = 148, /* DISCONNECT */
|
||||
MQTT_RC_PACKET_TOO_LARGE = 149, /* CONNACK, PUBACK, PUBREC, DISCONNECT */
|
||||
MQTT_RC_MESSAGE_RATE_TOO_HIGH = 150, /* DISCONNECT */
|
||||
MQTT_RC_QUOTA_EXCEEDED = 151, /* PUBACK, PUBREC, SUBACK, DISCONNECT */
|
||||
MQTT_RC_ADMINISTRATIVE_ACTION = 152, /* DISCONNECT */
|
||||
MQTT_RC_PAYLOAD_FORMAT_INVALID = 153, /* CONNACK, DISCONNECT */
|
||||
MQTT_RC_RETAIN_NOT_SUPPORTED = 154, /* CONNACK, DISCONNECT */
|
||||
MQTT_RC_QOS_NOT_SUPPORTED = 155, /* CONNACK, DISCONNECT */
|
||||
MQTT_RC_USE_ANOTHER_SERVER = 156, /* CONNACK, DISCONNECT */
|
||||
MQTT_RC_SERVER_MOVED = 157, /* CONNACK, DISCONNECT */
|
||||
MQTT_RC_SHARED_SUBS_NOT_SUPPORTED = 158, /* SUBACK, DISCONNECT */
|
||||
MQTT_RC_CONNECTION_RATE_EXCEEDED = 159, /* CONNACK, DISCONNECT */
|
||||
MQTT_RC_MAXIMUM_CONNECT_TIME = 160, /* DISCONNECT */
|
||||
MQTT_RC_SUBSCRIPTION_IDS_NOT_SUPPORTED = 161, /* SUBACK, DISCONNECT */
|
||||
MQTT_RC_WILDCARD_SUBS_NOT_SUPPORTED = 162, /* SUBACK, DISCONNECT */
|
||||
};
|
||||
|
||||
/* Enum: mqtt5_property
|
||||
* Options for use with MQTTv5 properties.
|
||||
* Options:
|
||||
*
|
||||
* MQTT_PROP_PAYLOAD_FORMAT_INDICATOR - property option.
|
||||
* MQTT_PROP_MESSAGE_EXPIRY_INTERVAL - property option.
|
||||
* MQTT_PROP_CONTENT_TYPE - property option.
|
||||
* MQTT_PROP_RESPONSE_TOPIC - property option.
|
||||
* MQTT_PROP_CORRELATION_DATA - property option.
|
||||
* MQTT_PROP_SUBSCRIPTION_IDENTIFIER - property option.
|
||||
* MQTT_PROP_SESSION_EXPIRY_INTERVAL - property option.
|
||||
* MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER - property option.
|
||||
* MQTT_PROP_SERVER_KEEP_ALIVE - property option.
|
||||
* MQTT_PROP_AUTHENTICATION_METHOD - property option.
|
||||
* MQTT_PROP_AUTHENTICATION_DATA - property option.
|
||||
* MQTT_PROP_REQUEST_PROBLEM_INFORMATION - property option.
|
||||
* MQTT_PROP_WILL_DELAY_INTERVAL - property option.
|
||||
* MQTT_PROP_REQUEST_RESPONSE_INFORMATION - property option.
|
||||
* MQTT_PROP_RESPONSE_INFORMATION - property option.
|
||||
* MQTT_PROP_SERVER_REFERENCE - property option.
|
||||
* MQTT_PROP_REASON_STRING - property option.
|
||||
* MQTT_PROP_RECEIVE_MAXIMUM - property option.
|
||||
* MQTT_PROP_TOPIC_ALIAS_MAXIMUM - property option.
|
||||
* MQTT_PROP_TOPIC_ALIAS - property option.
|
||||
* MQTT_PROP_MAXIMUM_QOS - property option.
|
||||
* MQTT_PROP_RETAIN_AVAILABLE - property option.
|
||||
* MQTT_PROP_USER_PROPERTY - property option.
|
||||
* MQTT_PROP_MAXIMUM_PACKET_SIZE - property option.
|
||||
* MQTT_PROP_WILDCARD_SUB_AVAILABLE - property option.
|
||||
* MQTT_PROP_SUBSCRIPTION_ID_AVAILABLE - property option.
|
||||
* MQTT_PROP_SHARED_SUB_AVAILABLE - property option.
|
||||
*/
|
||||
enum mqtt5_property {
|
||||
MQTT_PROP_PAYLOAD_FORMAT_INDICATOR = 1, /* Byte : PUBLISH, Will Properties */
|
||||
MQTT_PROP_MESSAGE_EXPIRY_INTERVAL = 2, /* 4 byte int : PUBLISH, Will Properties */
|
||||
MQTT_PROP_CONTENT_TYPE = 3, /* UTF-8 string : PUBLISH, Will Properties */
|
||||
MQTT_PROP_RESPONSE_TOPIC = 8, /* UTF-8 string : PUBLISH, Will Properties */
|
||||
MQTT_PROP_CORRELATION_DATA = 9, /* Binary Data : PUBLISH, Will Properties */
|
||||
MQTT_PROP_SUBSCRIPTION_IDENTIFIER = 11, /* Variable byte int : PUBLISH, SUBSCRIBE */
|
||||
MQTT_PROP_SESSION_EXPIRY_INTERVAL = 17, /* 4 byte int : CONNECT, CONNACK, DISCONNECT */
|
||||
MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER = 18, /* UTF-8 string : CONNACK */
|
||||
MQTT_PROP_SERVER_KEEP_ALIVE = 19, /* 2 byte int : CONNACK */
|
||||
MQTT_PROP_AUTHENTICATION_METHOD = 21, /* UTF-8 string : CONNECT, CONNACK, AUTH */
|
||||
MQTT_PROP_AUTHENTICATION_DATA = 22, /* Binary Data : CONNECT, CONNACK, AUTH */
|
||||
MQTT_PROP_REQUEST_PROBLEM_INFORMATION = 23, /* Byte : CONNECT */
|
||||
MQTT_PROP_WILL_DELAY_INTERVAL = 24, /* 4 byte int : Will properties */
|
||||
MQTT_PROP_REQUEST_RESPONSE_INFORMATION = 25,/* Byte : CONNECT */
|
||||
MQTT_PROP_RESPONSE_INFORMATION = 26, /* UTF-8 string : CONNACK */
|
||||
MQTT_PROP_SERVER_REFERENCE = 28, /* UTF-8 string : CONNACK, DISCONNECT */
|
||||
MQTT_PROP_REASON_STRING = 31, /* UTF-8 string : All except Will properties */
|
||||
MQTT_PROP_RECEIVE_MAXIMUM = 33, /* 2 byte int : CONNECT, CONNACK */
|
||||
MQTT_PROP_TOPIC_ALIAS_MAXIMUM = 34, /* 2 byte int : CONNECT, CONNACK */
|
||||
MQTT_PROP_TOPIC_ALIAS = 35, /* 2 byte int : PUBLISH */
|
||||
MQTT_PROP_MAXIMUM_QOS = 36, /* Byte : CONNACK */
|
||||
MQTT_PROP_RETAIN_AVAILABLE = 37, /* Byte : CONNACK */
|
||||
MQTT_PROP_USER_PROPERTY = 38, /* UTF-8 string pair : All */
|
||||
MQTT_PROP_MAXIMUM_PACKET_SIZE = 39, /* 4 byte int : CONNECT, CONNACK */
|
||||
MQTT_PROP_WILDCARD_SUB_AVAILABLE = 40, /* Byte : CONNACK */
|
||||
MQTT_PROP_SUBSCRIPTION_ID_AVAILABLE = 41, /* Byte : CONNACK */
|
||||
MQTT_PROP_SHARED_SUB_AVAILABLE = 42, /* Byte : CONNACK */
|
||||
};
|
||||
|
||||
enum mqtt5_property_type {
|
||||
MQTT_PROP_TYPE_BYTE = 1,
|
||||
MQTT_PROP_TYPE_INT16 = 2,
|
||||
MQTT_PROP_TYPE_INT32 = 3,
|
||||
MQTT_PROP_TYPE_VARINT = 4,
|
||||
MQTT_PROP_TYPE_BINARY = 5,
|
||||
MQTT_PROP_TYPE_STRING = 6,
|
||||
MQTT_PROP_TYPE_STRING_PAIR = 7
|
||||
};
|
||||
|
||||
/* Enum: mqtt5_sub_options
|
||||
* Options for use with MQTTv5 subscriptions.
|
||||
*
|
||||
* MQTT_SUB_OPT_NO_LOCAL - with this option set, if this client publishes to
|
||||
* a topic to which it is subscribed, the broker will not publish the
|
||||
* message back to the client.
|
||||
*
|
||||
* MQTT_SUB_OPT_RETAIN_AS_PUBLISHED - with this option set, messages
|
||||
* published for this subscription will keep the retain flag as was set by
|
||||
* the publishing client. The default behaviour without this option set has
|
||||
* the retain flag indicating whether a message is fresh/stale.
|
||||
*
|
||||
* MQTT_SUB_OPT_SEND_RETAIN_ALWAYS - with this option set, pre-existing
|
||||
* retained messages are sent as soon as the subscription is made, even
|
||||
* if the subscription already exists. This is the default behaviour, so
|
||||
* it is not necessary to set this option.
|
||||
*
|
||||
* MQTT_SUB_OPT_SEND_RETAIN_NEW - with this option set, pre-existing retained
|
||||
* messages for this subscription will be sent when the subscription is made,
|
||||
* but only if the subscription does not already exist.
|
||||
*
|
||||
* MQTT_SUB_OPT_SEND_RETAIN_NEVER - with this option set, pre-existing
|
||||
* retained messages will never be sent for this subscription.
|
||||
*/
|
||||
enum mqtt5_sub_options {
|
||||
MQTT_SUB_OPT_NO_LOCAL = 0x04,
|
||||
MQTT_SUB_OPT_RETAIN_AS_PUBLISHED = 0x08,
|
||||
MQTT_SUB_OPT_SEND_RETAIN_ALWAYS = 0x00,
|
||||
MQTT_SUB_OPT_SEND_RETAIN_NEW = 0x10,
|
||||
MQTT_SUB_OPT_SEND_RETAIN_NEVER = 0x20,
|
||||
};
|
||||
|
||||
#define MQTT_MAX_PAYLOAD 268435455U
|
||||
|
||||
#endif
|
@ -53,7 +53,10 @@ void CheckThread()
|
||||
if (10 == heart_count) {
|
||||
// StatusPub();
|
||||
if (GlobalConfig::LinkCount > 30) {
|
||||
//exit(0);
|
||||
#ifdef IMX6UL_GATEWAY
|
||||
LOG_ERROR("MQTT connect failed,reboot\n");
|
||||
exit(0);
|
||||
#endif
|
||||
}
|
||||
std::string ipTemp = IpAddrInit();
|
||||
GlobalConfig::IpAddr_G = ipTemp;
|
||||
@ -453,7 +456,7 @@ void HeartRep()
|
||||
int iRet = data_publish(strJson.c_str(), GlobalConfig::Topic_G.mPubHeart.c_str());
|
||||
print_info("heart = %s,iRet = %d\n",strJson.c_str(),iRet);
|
||||
if(iRet != 0){
|
||||
count ++;
|
||||
//count ++;
|
||||
gpio_set(GlobalConfig::GPIO_G.errorLed,1);
|
||||
sleep(1);
|
||||
gpio_set(GlobalConfig::GPIO_G.errorLed,0);
|
||||
@ -808,7 +811,7 @@ void my_connect_callback(struct mosquitto *mosq, void *obj, int result)
|
||||
void my_disconnect_callback(struct mosquitto *mosq, void *obj, int result)
|
||||
{
|
||||
int ret = 0;
|
||||
//ret = disconnect();
|
||||
ret = disconnect();
|
||||
//LOG_ERROR("The MQTT connection lost:%d\n", ret);
|
||||
print_debug("The MQTT connection lost\n");
|
||||
char gwTime[32] = { 0 };
|
||||
@ -913,7 +916,7 @@ void my_log_callback(struct mosquitto *mosq, void *obj, int level, const char *s
|
||||
if (level == MOSQ_LOG_ERR) {
|
||||
//LOG_ERROR("%s\n", str);
|
||||
} else if (level == MOSQ_LOG_WARNING) {
|
||||
// LOG_WARN("%s\n", str);
|
||||
//LOG_WARN("%s\n", str);
|
||||
} else if (level == MOSQ_LOG_NOTICE) {
|
||||
//LOG_INFO("%s\n", str);
|
||||
}
|
||||
|
@ -1964,7 +1964,7 @@ void Uart::DealDataNodeFeature(const char *pData, int flag)
|
||||
char buf[20] = {0x00};
|
||||
int nodeResend = 0;
|
||||
sprintf(buf, "%02x%02x", pRecvData->ShortAddr[0], pRecvData->ShortAddr[1]);
|
||||
//LOG_INFO("DealDataNodeFeature %02x%02x\n",pRecvData->ShortAddr[0], pRecvData->ShortAddr[1]);
|
||||
LOG_INFO("DealDataNodeFeature %02x%02x\n",pRecvData->ShortAddr[0], pRecvData->ShortAddr[1]);
|
||||
|
||||
std::string strShortAddr = std::string(buf);
|
||||
print_info("zigbeeShortAddr='%s'\n", strShortAddr.c_str());
|
||||
@ -2144,7 +2144,6 @@ void Uart::DealDataNodeFeature(const char *pData, int flag)
|
||||
|
||||
sprintf(whereCon,"StaticIndex = %d",staticIndex);
|
||||
int count = sql_ctl->GetTableRows(szTableNameStatic, whereCon);//避免重复数据
|
||||
|
||||
sprintf(szTableNameData,"t_data_%s",strLongAddr.c_str());
|
||||
|
||||
int count2 = sql_ctl->GetTableRows(szTableNameData, whereCon);
|
||||
@ -2155,7 +2154,6 @@ void Uart::DealDataNodeFeature(const char *pData, int flag)
|
||||
return;
|
||||
}
|
||||
memset(whereCon,0x00,sizeof(whereCon));
|
||||
|
||||
///////////////////////////////////////////////////////////// for V2.0.3 upgrade to V3.0
|
||||
std::string strTmp = "";
|
||||
char sztmp[100]={0x00};
|
||||
@ -3434,7 +3432,7 @@ void Uart::DealDataNodeFeature(const char *pData, int flag)
|
||||
}
|
||||
bZigbeeSinal = false;
|
||||
}
|
||||
//LOG_INFO("DealDataNodeFeature end\n");
|
||||
LOG_INFO("DealDataNodeFeature end\n");
|
||||
}
|
||||
|
||||
void Uart::DealDataNodeWave(const char *pData)
|
||||
|
Loading…
x
Reference in New Issue
Block a user