Я использую Odroid (Raspi-подобную ARM Board) для запуска небольшого радиочипа на основе SPI, который отправляет данные, помимо прочего, в Websocket. Это применяется с помощью Websocket ++: https://github.com/zaphoyd/websocketpp. Я убил одного из простых примеров, который отправляет сообщение сервера всем клиентам. Программа имеет класс count_server, который обрабатывает веб-сокет, но также имеет ISR, обрабатываемый WiringPi, который вызывает вложенные функции для обработки различных операций.
Проблема, с которой я столкнулся, заключается в том, что для отправки этого сообщения функция отправки должна находиться в классе count_server, насколько я могу судить, для доступа к адресам клиентов и т. Д. Этот метод класса недоступен изнутри моего ISR, который обрабатывает все данные, полученные с радио, поэтому, когда я пытаюсь отправить сообщение веб-сокета изнутри ISR, я получаю сообщение об ошибке:
error: 'webSocketServer' was not declared in this scope webSocketServer.sendLiveData();
WebSocketServer является экземпляром класса count_server, созданным в main (). Почему ISR не может видеть класс webSocketServer.
Одним из обходных путей является опрос внутри функции count (), но это блокирует процессор, и я бы предпочел оставить его готовым для выполнения других задач.]
Вот самый простой пример, который я мог привести.
Требуется Websocket ++ и WiringPi для attachInterrupt.
#include <cstdlib>
#include <unistd.h>
#include <iostream>
#include <sstream>
#include <string>
#include <RF24/RF24.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//Websocket++ includes
#include <mutex>
#include <set>
#include <thread>
#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>
//*///websocket++ declarations
typedef websocketpp::server<websocketpp::config::asio> server;
using websocketpp::connection_hdl;
using websocketpp::lib::placeholders::_1;
class count_server {
public:
count_server() : m_count(0) {
m_server.init_asio();
m_server.set_open_handler(bind(&count_server::on_open,this,_1));
m_server.set_close_handler(bind(&count_server::on_close,this,_1));
}
void on_open(connection_hdl hdl) {
std::lock_guard<std::mutex> lock(m_mutex);
m_connections.insert(hdl);
}
void on_close(connection_hdl hdl) {
std::lock_guard<std::mutex> lock(m_mutex);
m_connections.erase(hdl);
}
void sendLiveData(){
std::stringstream ss;
ss << "foobar";
for (auto it : m_connections) {
m_server.send(it,ss.str(),websocketpp::frame::opcode::text);
}
}
void count() {//simple loop thread, most likely not needed, but in working example so lef
t for time being
while (1) {
sleep(1000);
}
}
void run(uint16_t port) {
m_server.listen(port);
m_server.start_accept();
m_server.run();
}
private:
typedef std::set<connection_hdl,std::owner_less<connection_hdl>> con_list;
int m_count;
server m_server;
con_list m_connections;
std::mutex m_mutex;
};
/****************** Raspberry Pi ***********************/int interruptPin = 6; // GPIO pin for interrupts - interrupts have been edited to be handled
//by wiringPi, so #6 is used, not #103, check RF24/utility/SPIDEV/interrupt.c for info
int i=0;
/**************************************************************/
void addLiveData(){ //Live data buffer handler + calls sending function when buffer hits max
webSocketServer.sendLiveData();
}
void intHandler(){//when radio chip IRQ goes Low, something happened, this handles it
addLiveData();//recvd = 2;//flag that the data is live data
}
int main(){
attachInterrupt(interruptPin, INT_EDGE_FALLING, &intHandler); //Attach interrupt to bcm p
in 23
count_server webSocketServer;
std::thread t(std::bind(&count_server::count,&webSocketServer));
webSocketServer.sendLiveData();
webSocketServer.run(8080);
}
'
Задача ещё не решена.
Других решений пока нет …