Приклад південного плагіна на C/C++: датчик DHT11
Використовуючи той самий приклад, що й раніше, датчик температури та вологості DHT11, давайте розглянемо, як створити плагін у C/C++.
Програмне забезпечення
Для цього плагіна ми використовуємо бібліотеку wiringpi C для підключення до апаратного забезпечення Raspberry Pi
$ sudo apt-get install wiringpi
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
wiringpi
...
Плагін
Це код для файлу plugin.cpp, який надає API плагіна:
/*
* Fledge south plugin.
*
* Copyright (c) 2018 OSisoft, LLC
*
* Released under the Apache 2.0 Licence
*
* Author: Amandeep Singh Arora
*/
#include <dht11.h>
#include <plugin_api.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <string>
#include <logger.h>
#include <plugin_exception.h>
#include <config_category.h>
#include <rapidjson/document.h>
#include <version.h>
using namespace std;
#define PLUGIN_NAME "dht11_V2"
/**
* Default configuration
*/
const static char *default_config = QUOTE({
"plugin" : {
"description" : "DHT11 C south plugin",
"type" : "string",
"default" : PLUGIN_NAME,
"readonly": "true"
},
"asset" : {
"description" : "Asset name",
"type" : "string",
"default" : "dht11",
"order": "1",
"displayName": "Asset Name",
"mandatory" : "true"
},
"pin" : {
"description" : "Rpi pin to which DHT11 is attached",
"type" : "integer",
"default" : "7",
"displayName": "Rpi Pin"
}
});
/**
* The DHT11 plugin interface
*/
extern "C" {
/**
* The plugin information structure
*/
static PLUGIN_INFORMATION info = {
PLUGIN_NAME, // Name
VERSION, // Version
0, // Flags
PLUGIN_TYPE_SOUTH, // Type
"1.0.0", // Interface version
default_config // Default configuration
};
/**
* Return the information about this plugin
*/
PLUGIN_INFORMATION *plugin_info()
{
return &info;
}
/**
* Initialise the plugin, called to get the plugin handle
*/
PLUGIN_HANDLE plugin_init(ConfigCategory *config)
{
unsigned int pin;
if (config->itemExists("pin"))
{
pin = stoul(config->getValue("pin"), nullptr, 0);
}
DHT11 *dht11= new DHT11(pin);
if (config->itemExists("asset"))
dht11->setAssetName(config->getValue("asset"));
else
dht11->setAssetName("dht11");
Logger::getLogger()->info("m_assetName set to %s", dht11->getAssetName());
return (PLUGIN_HANDLE)dht11;
}
/**
* Poll for a plugin reading
*/
Reading plugin_poll(PLUGIN_HANDLE *handle)
{
DHT11 *dht11 = (DHT11*)handle;
return dht11->takeReading();
}
/**
* Reconfigure the plugin
*/
void plugin_reconfigure(PLUGIN_HANDLE *handle, string& newConfig)
{
ConfigCategory conf("dht", newConfig);
DHT11 *dht11 = (DHT11*)*handle;
if (conf.itemExists("asset"))
dht11->setAssetName(conf.getValue("asset"));
if (conf.itemExists("pin"))
{
unsigned int pin = stoul(conf.getValue("pin"), nullptr, 0);
dht11->setPin(pin);
}
}
/**
* Shutdown the plugin
*/
void plugin_shutdown(PLUGIN_HANDLE *handle)
{
DHT11 *dht11 = (DHT11*)handle;
delete dht11;
}
};
Повний в ихідний код, включаючи клас DHT11, можна знайти на GitHub
Зборка Fledge і додавання плагіна
Якщо ви ще не створили Fledge, виконайте кроки, описані в . Після зборки ви можете додатково встановити Fledge, виконавши кроки .
- Клонуйте репозиторій fledge-south-dht
$ git clone https://github.com/fledge-iot/fledge-south-dht.git
...
- Встановіть змінну середовища FLEDGE_ROOT на каталог, у якому ви зібрали Fledge
$ export FLEDGE_ROOT=~/fledge
- Перейдіть до місця, де ви клонували репозиторій fledge-south-dht, створіть каталог зборки та запустіть cmake у цьому каталозі
$ cd ~/fledge-south-dht
$ mkdir build
$ cd build
$ cmake ..
...
- Тепер створіть плагін
$ make
- Якщо ви запустили Fledge з каталогу зборки, скопіюйте плагін у цільовий каталог
$ mkdir -p $FLEDGE_ROOT/plugins/south/dht
$ cp libdht.so $FLEDGE_ROOT/plugins/south/dht
- Якщо ви встановили Fledge, виконавши
sudo make install, скопіюйте плагін у цільовий каталог
$ sudo mkdir -p /usr/local/fledge/plugins/south/dht
$ sudo cp libdht.so /usr/local/fledge/plugins/south/dht
Note
Якщо ви встановили Fledge за допомогою альтернативного DESTDIR, не
забудьте додати шлях до цільового каталогу до команди cp.
- Додайте сервіс
$ curl -sX POST http://localhost:8081/fledge/service -d '{"name": "dht", "type": "south", "plugin": "dht", "enabled": true}'
Тепер ви можете використовувати плагін C/C++ точно так само, як використовували плагін Python раніше.