17 Star 42 Fork 15

广州灵派科技有限公司/Encoder

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
SimpleControl.cpp 18.78 KB
一键复制 编辑 原始数据 按行查看 历史
zc 提交于 2025-10-09 11:21 +08:00 . socket重启
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
#include "SimpleControl.h"
#include "Json.h"
#include <QFile>
#include "Config.h"
#include "Push.h"
#include "Record.h"
#include "RPC.h"
#include "Carousel.h"
SimpleControl::SimpleControl(QObject *parent) : QObject(parent)
{
tcpSocket=NULL;
udpPort=0;
}
void SimpleControl::init()
{
connect(&tcp,SIGNAL(newConnection()),this,SLOT(onNewConnection()));
connect(&udp,SIGNAL(readyRead()),this,SLOT(onUdpRead()));
connect(&uart,SIGNAL(readyRead()),this,SLOT(onUartRead()));
QFile file("/link/config/misc/simpleControl.json");
file.open(QFile::ReadOnly);
QString json=file.readAll();
file.close();
update(json);
}
QString SimpleControl::onRead(QString buf)
{
QString cmd=buf;
QStringList args;
if(buf.contains(argSplit))
{
args=buf.split(argSplit);
cmd=args.takeFirst();
}
qDebug()<<"Ctrl:"<<cmd<<args;
QVariantMap map;
foreach (QVariant obj, cmdList) {
if(obj.toMap()["cmd"].toString()==cmd)
{
map=obj.toMap();
break;
}
}
if(map.isEmpty())
{
QString err="ERROR: Unknow CMD "+cmd;
qDebug()<<err;
write(err);
return err;
}
if(args.isEmpty() && !map["defArgs"].toString().isEmpty())
{
args=map["defArgs"].toString().split(argSplit);
}
QString ret;
QMetaObject::invokeMethod(this,map["func"].toString().toLatin1().data(),Qt::DirectConnection,Q_RETURN_ARG(QString,ret),Q_ARG(QStringList, args));
write(ret);
return ret;
}
void SimpleControl::write(QString str)
{
str+=endCode;
if(uart.isOpen())
{
uart.write(str.toUtf8().data());
uart.flush();
}
if(udpPort!=0)
{
udp.writeDatagram(str.toUtf8(),udpIP,udpPort);
udp.flush();
}
if(tcpSocket!=NULL)
{
tcpSocket->write(str.toUtf8());
tcpSocket->flush();
}
}
void SimpleControl::onTcpRead()
{
while(tcpSocket->bytesAvailable()>0)
{
tcpBuf+=QString::fromUtf8(tcpSocket->readAll());
if(tcpBuf.contains(endCode))
{
int i=tcpBuf.indexOf(endCode);
onRead(tcpBuf.left(i));
tcpBuf=tcpBuf.remove(0,i+endCode.length());
}
}
}
void SimpleControl::onUdpRead()
{
while (udp.hasPendingDatagrams()) {
QByteArray ba;
ba.resize(udp.pendingDatagramSize());
udp.readDatagram(ba.data(),ba.size(),&udpIP,&udpPort);
QString str=QString::fromUtf8(ba);
if(str.endsWith(endCode))
{
str=str.remove(endCode);
onRead(str);
}
}
}
void SimpleControl::onUartRead()
{
while(uart.bytesAvailable()>0)
{
uartBuf+=QString::fromUtf8(uart.readAll());
if(uartBuf.contains(endCode))
{
int i=uartBuf.indexOf(endCode);
onRead(uartBuf.left(i));
uartBuf=uartBuf.remove(0,i+endCode.length());
}
}
}
void SimpleControl::onNewConnection()
{
tcpSocket=tcp.nextPendingConnection();
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onTcpRead()));
}
bool SimpleControl::update(QString json)
{
QVariantMap cfg=Json::decode(json).toMap();
Json::saveFile(cfg,"/link/config/misc/simpleControl.json");
if(cfg.isEmpty())
return false;
config=cfg;
cmdList=cfg["cmd"].toList();
if(!cfg["enable"].toBool())
{
if(uart.isOpen())
uart.close();
if(tcpSocket!=NULL)
{
disconnect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onTcpRead()));
tcpSocket->abort();
tcpSocket->deleteLater();
tcpSocket=NULL;
tcp.close();
}
if(udp.isOpen())
{
udp.close();
}
return true;
}
endCode=cfg["endCode"].toString();
argSplit=cfg["argSplit"].toString();
QVariantMap uartCfg=cfg["uart"].toMap();
if(uartCfg["device"].toString()!=uart.portName() || uartCfg["baudRate"].toInt()!=uart.baudRate() || !uart.isOpen())
{
if(uart.isOpen())
uart.close();
if(!uartCfg["device"].toString().isEmpty())
{
uart.setPortName(uartCfg["device"].toString());
if(uart.open(QIODevice::ReadWrite))
{
uart.setBaudRate(uartCfg["baudRate"].toInt());
uart.setDataBits(QSerialPort::Data8);
uart.setParity(QSerialPort::NoParity);
uart.setFlowControl(QSerialPort::NoFlowControl);
uart.setStopBits(QSerialPort::OneStop);
}
else
{
qDebug()<<"can not open uart "<<uart.portName();
}
}
}
if(cfg["udp"].toInt()!=0)
{
if(udp.localPort()!=cfg["udp"].toInt())
{
udp.close();
if(!udp.bind(cfg["udp"].toInt()))
{
qDebug()<<"Ctrl UDP bind error"<<tcp.errorString();
}
else
{
qDebug()<<"SimpleControl udp bind"<<cfg["udp"].toInt();
}
}
}
else
{
udp.close();
udpPort=0;
}
if(cfg["tcp"].toInt()!=0)
{
if(tcp.serverPort()!=cfg["tcp"].toInt())
{
tcp.close();
if(!tcp.listen(QHostAddress::Any,cfg["tcp"].toInt()))
{
qDebug()<<"Ctrl TCP listen error"<<tcp.errorString();
}
else
{
qDebug()<<"SimpleControl tcp bind"<<cfg["tcp"].toInt();
}
}
}
else
{
tcp.close();
}
return true;
}
QString SimpleControl::cmdTest(QString cmd)
{
if(cmd.endsWith(endCode))
{
cmd=cmd.remove(endCode);
return onRead(cmd);
}
return "ERROR: miss end code";
}
QString SimpleControl::startRecord(QStringList args)
{
if(args.isEmpty())
{
GRecord->start();
}
else
{
int chnId=args[0].toInt();
QVariantMap cfg=Json::loadFile(RECPATH).toMap();
QVariantList chns=cfg["chns"].toList();
QVariant ch=chnId;
if(!chns.contains(ch))
chns.append(ch);
cfg["chns"]=chns;
Json::saveFile(cfg,RECPATH);
if(!GRecord->update(Json::encode(cfg)))
return "ERROR:update failed";
}
return "OK";
}
QString SimpleControl::stopRecord(QStringList args)
{
if(args.isEmpty())
{
GRecord->stop();
}
else
{
int chnId=args[0].toInt();
QVariantMap cfg=Json::loadFile(RECPATH).toMap();
QVariantList chns=cfg["chns"].toList();
QVariant ch=chnId;
chns.removeAll(ch);
cfg["chns"]=chns;
Json::saveFile(cfg,RECPATH);
if(!GRecord->update(Json::encode(cfg)))
return "ERROR:update failed";
}
return "OK";
}
QString SimpleControl::startPush(QStringList args)
{
QString ret="OK";
if(args.isEmpty())
{
GPush->start();
}
else
{
int index=args[0].toInt();
QVariantMap cfg=GPush->config;
QVariantList list=cfg["url"].toList();
if(list.count()<=index)
return "ERROR: Out of Index";
QVariantMap map=list[index].toMap();
map["enable"]=true;
list[index]=map;
cfg["url"]=list;
GPush->update(Json::encode(cfg));
GPush->start();
}
return ret;
}
QString SimpleControl::stopPush(QStringList args)
{
QString ret="OK";
if(args.isEmpty())
{
GPush->stop();
}
else
{
int index=args[0].toInt();
QVariantMap cfg=GPush->config;
QVariantList list=cfg["url"].toList();
if(list.count()<=index)
return "ERROR: Out of Index";
QVariantMap map=list[index].toMap();
map["enable"]=false;
list[index]=map;
cfg["url"]=list;
GPush->update(Json::encode(cfg));
}
return ret;
}
QString SimpleControl::setOverlayText(QStringList args)
{
QString ret="OK";
if(args.count()!=3)
return "ERROR: wrong args format";
int chnId=args[0].toInt();
int overId=args[1].toInt();
QString text=args[2];
Channel *chn=Config::findChannelById(chnId);
if(chn==NULL)
return QString("ERROR: can not find chnId %1").arg(chnId);
QVariantMap lays;
QVariantList list=Config::overlayList[chnId].toList();
QVariantMap map=list[overId].toMap();
map["content"]=text;
list[overId]=map;
lays["lays"]=list;
chn->overlay->setData(lays);
return ret;
}
QVariantMap SimpleControl::deepSetConfig(QVariantMap map, QStringList keyList, QString value, int deep)
{
QString key=keyList[deep];
if(!map.contains(key))
return QVariantMap();
if(deep==keyList.count()-1)
{
if(map[key].type()==QVariant::Bool)
map[key]=(value.toLower()=="true");
else if(map[key].type()==QVariant::String)
map[key]=value;
else
map[key]=value.toInt();
}
else
{
map[key]=deepSetConfig(map[key].toMap(),keyList,value,deep+1);
}
return map;
}
QString SimpleControl::setConfig(QStringList args)
{
if(args.count()!=3)
return "ERROR: wrong args format";
int chnId=args[0].toInt();
QStringList keyList=args[1].split(".");
QString value=args[2];
QVariantList config=Json::loadFile(CFGPATH).toList();
int index=-1;
for(int i=0;i<config.count();i++)
{
if(config[i].toMap()["id"].toInt()==chnId)
index=i;
}
if(index==-1)
return QString("ERROR: can not find chnId %1").arg(chnId);
config[index]=deepSetConfig(config[index].toMap(),keyList,value);
if (!GRPC->update(Json::encode(config)))
return "ERROR:update failed";
return "OK";
}
QString SimpleControl::getConfig(QStringList args)
{
if(args.count()!=2)
return "ERROR: wrong args format";
int chnId=args[0].toInt();
QStringList keyList=args[1].split(".");
QVariantList config=Json::loadFile(CFGPATH).toList();
int index=-1;
for(int i=0;i<config.count();i++)
{
if(config[i].toMap()["id"].toInt()==chnId)
index=i;
}
if(index==-1)
return QString("ERROR: can not find chnId %1").arg(chnId);
QVariantMap map=config[index].toMap();
for(int i=0;i<keyList.count()-1;i++)
{
QString key=keyList[i];
if(!map.contains(key))
return QString("ERROR: %1 is not valid").arg(args[1]);
map=map[key].toMap();
}
return map[keyList.last()].toString();
}
QString SimpleControl::setEncV(QStringList args)
{
if(args.count()!=7)
return "ERROR: wrong args format";
int chnId=args[0].toInt();
QVariantList config=Json::loadFile(CFGPATH).toList();
int index=-1;
for(int i=0;i<config.count();i++)
{
if(config[i].toMap()["id"].toInt()==chnId)
index=i;
}
if(index==-1)
return QString("ERROR: can not find chnId %1").arg(chnId);
QVariantMap data=config[index].toMap();
QVariantMap encv=data["encv"].toMap();
if(!args[1].trimmed().isEmpty())
encv["width"]=args[1].toInt();
if(!args[2].trimmed().isEmpty())
encv["height"]=args[2].toInt();
if(!args[3].trimmed().isEmpty())
encv["framerate"]=args[3].toInt();
if(!args[4].trimmed().isEmpty())
encv["codec"]=args[4];
if(!args[5].trimmed().isEmpty())
encv["bitrate"]=args[5].toInt();
if(!args[6].trimmed().isEmpty())
encv["rcmode"]=args[6];
data["encv"]=encv;
config[index]=data;
if (!GRPC->update(Json::encode(config)))
return "ERROR:update failed";
return "OK";
}
QString SimpleControl::getEncV(QStringList args)
{
if(args.count()!=1)
return "ERROR: wrong args format";
int chnId=args[0].toInt();
Channel *chn=Config::findChannelById(chnId);
if(chn==NULL)
return QString("ERROR: can not find chnId %1").arg(chnId);
QVariantMap encv=chn->data["encv"].toMap();
QStringList list;
list<<encv["width"].toString();
list<<encv["height"].toString();
list<<encv["framerate"].toString();
list<<encv["codec"].toString();
list<<encv["bitrate"].toString();
list<<encv["rcmode"].toString();
return list.join(argSplit.toLatin1());
}
QString SimpleControl::setEncA(QStringList args)
{
if(args.count()!=5)
return "ERROR: wrong args format";
int chnId=args[0].toInt();
QVariantList config=Json::loadFile(CFGPATH).toList();
int index=-1;
for(int i=0;i<config.count();i++)
{
if(config[i].toMap()["id"].toInt()==chnId)
index=i;
}
if(index==-1)
return QString("ERROR: can not find chnId %1").arg(chnId);
QVariantMap data=config[index].toMap();
QVariantMap enca=data["enca"].toMap();
if(!args[1].trimmed().isEmpty())
enca["codec"]=args[1];
if(!args[2].trimmed().isEmpty())
enca["bitrate"]=args[2].toInt();
if(!args[3].trimmed().isEmpty())
enca["samplerate"]=args[3].toInt();
if(!args[4].trimmed().isEmpty())
enca["channel"]=args[4].toInt();
data["enca"]=enca;
config[index]=data;
if (!GRPC->update(Json::encode(config)))
return "ERROR:update failed";
return "OK";
}
QString SimpleControl::getEncA(QStringList args)
{
if(args.count()!=1)
return "ERROR: wrong args format";
int chnId=args[0].toInt();
Channel *chn=Config::findChannelById(chnId);
if(chn==NULL)
return QString("ERROR: can not find chnId %1").arg(chnId);
QVariantMap enca=chn->data["enca"].toMap();
QStringList list;
list<<enca["codec"].toString();
list<<enca["bitrate"].toString();
list<<enca["samplerate"].toString();
list<<enca["channel"].toString();
return list.join(argSplit.toLatin1());
}
QString SimpleControl::setChnEnbale(QStringList args)
{
if(args.count()!=2)
return "ERROR: wrong args format";
int chnId=args[0].toInt();
QVariantList config=Json::loadFile(CFGPATH).toList();
int index=-1;
for(int i=0;i<config.count();i++)
{
if(config[i].toMap()["id"].toInt()==chnId)
index=i;
}
if(index==-1)
return QString("ERROR: can not find chnId %1").arg(chnId);
QVariantMap data=config[index].toMap();
data["enable"]=(args[1].toInt()==1);
config[index]=data;
if (!GRPC->update(Json::encode(config)))
return "ERROR:update failed";
return "OK";
}
QString SimpleControl::getChnEnbale(QStringList args)
{
Q_UNUSED(args);
QStringList list;
for(int i=0;i<Config::chns.count();i++)
{
if(!Config::chns[i]->enable)
continue;
list<<QString::number(Config::chns[i]->id);
}
return list.join(argSplit.toLatin1());
}
QString SimpleControl::setStream(QStringList args)
{
if(args.count()<1)
return "ERROR: wrong args format";
int chnId=args[0].toInt();
QVariantList config=Json::loadFile(CFGPATH).toList();
int index=-1;
for(int i=0;i<config.count();i++)
{
if(config[i].toMap()["id"].toInt()==chnId)
index=i;
}
if(index==-1)
return QString("ERROR: can not find chnId %1").arg(chnId);
args.removeFirst();
for(int i=0;i<args.count();i++)
args[i]=args[i].trimmed().toLower();
QVariantMap data=config[index].toMap();
QVariantMap stream=data["stream"].toMap();
QStringList list1,list2;
list1<<"rtmp"<<"rtsp"<<"http"<<"hls"<<"webrtc";
list2<<"rtsp"<<"push"<<"udp"<<"srt"<<"rist";
foreach (QString key, list1) {
if(args.contains(key))
stream[key]=true;
else
stream[key]=false;
}
foreach (QString key, list2) {
QVariantMap map=stream[key].toMap();
if(args.contains(key))
map["enable"]=true;
else
map["enable"]=false;
stream[key]=map;
}
QVariantMap ndi=data["ndi"].toMap();
if(args.contains("ndi"))
ndi["enable"]=true;
else
ndi["enable"]=false;
data["ndi"]=ndi;
data["stream"]=stream;
config[index]=data;
if (!GRPC->update(Json::encode(config)))
return "ERROR:update failed";
return "OK";
}
QString SimpleControl::getStream(QStringList args)
{
if(args.count()!=1)
return "ERROR: wrong args format";
int chnId=args[0].toInt();
Channel *chn=Config::findChannelById(chnId);
if(chn==NULL)
return QString("ERROR: can not find chnId %1").arg(chnId);
QVariantMap data=chn->data;
QVariantMap stream=data["stream"].toMap();
QStringList list1,list2,ret;
list1<<"rtmp"<<"rtsp"<<"http"<<"hls"<<"webrtc";
list2<<"rtsp"<<"push"<<"udp"<<"srt"<<"rist";
foreach (QString key, list1) {
if(stream[key].toBool())
ret<<key;
}
foreach (QString key, list2) {
if(stream[key].toMap()["enable"].toBool())
ret<<key;
}
if(data["ndi"].toMap()["enable"].toBool())
ret<<"ndi";
qDebug()<<stream["rtmp"];
return ret.join(argSplit.toLatin1());
}
QString SimpleControl::setLayId(QStringList args)
{
if(args.count()!=1)
return "ERROR: wrong args format";
int layId=args[0].toInt();
QVariantList layouts;
QVariantList list=Json::loadFile(DEFLAYS_CONF).toList();
for(int i=0;i<list.count();i++)
{
if(list[i].toMap()["layId"].toInt()==layId)
{
layouts=list[i].toMap()["layouts"].toList();
}
}
if(layouts.count()==0)
return QString("ERROR: can not find layId %1").arg(layId);
QVariantList lays;
for(int i=0;i<layouts.count();i++)
{
lays<<layouts[i].toMap()["pos"].toMap();
}
QVariantList config=Json::loadFile(CFGPATH).toList();
QVariantMap data=config.last().toMap();
data["layout"]=lays;
config[config.count()-1]=data;
if (!GRPC->update(Json::encode(config)))
return "ERROR:update failed";
return "OK";
}
QString SimpleControl::setLaySrcV(QStringList args)
{
if(args.count()<1)
return "ERROR: wrong args format";
QVariantList config=Json::loadFile(CFGPATH).toList();
QVariantMap data=config.last().toMap();
QVariantList srcv;
for(int i=0;i<args.count();i++)
{
if(args[i].isEmpty())
srcv<<-1;
else
srcv<<args[i].toInt();
}
data["srcV"]=srcv;
config[config.count()-1]=data;
if (!GRPC->update(Json::encode(config)))
return "ERROR:update failed";
return "OK";
}
QString SimpleControl::setLaySrcA(QStringList args)
{
if(args.count()<1)
return "ERROR: wrong args format";
QVariantList config=Json::loadFile(CFGPATH).toList();
QVariantMap data=config.last().toMap();
QVariantList srca;
srca<<"line";
for(int i=0;i<args.count();i++)
{
if(args[i].isEmpty())
srca<<-1;
else
srca<<args[i].toInt();
}
data["srcA"]=srca;
config[config.count()-1]=data;
if (!GRPC->update(Json::encode(config)))
return "ERROR:update failed";
return "OK";
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C/C++
1
https://gitee.com/LinkPi/Encoder.git
git@gitee.com:LinkPi/Encoder.git
LinkPi
Encoder
Encoder
master

搜索帮助