1.简介
在国标语音对讲对接中,会发现不同的厂商或不同型号的设备,对讲流程都不一样,本文主要介绍流媒体与设备之间的交互情况。
SMS流媒体服务代码库地址:https://gitee.com/inyeme/simple-media-server
2.流媒体与设备交互的可能情况
对讲流程中,流媒体与设备的交互场景大致可以分为几种:
- 作为服务端,被动等待设备来建链,并发送数据
- 作为服务端,被动等待设备来建链,等待设备发数据
- 作为服务端,被动等待设备来建链,既发送也接收数据
- 作为客户端,主动向设备建链,并发送数据
- 作为客户端,主动向设备建链,等待设备发数据
- 作为客户端,主动向设备建链,既发送也接收数据
3.几种常见对讲流程
3.1.单向通道
情况1:
情况2:
3.2.双向通道
情况1:
情况2:
4.SMS对讲接口
目前SMS支持单向对讲的几种场景,对应的对讲接口如下:
void GB28181Api::initApi()
{
g_mapApi.emplace("/api/v1/gb28181/recv/create", GB28181Api::createGB28181Receiver);
g_mapApi.emplace("/api/v1/gb28181/send/create", GB28181Api::createGB28181Sender);
g_mapApi.emplace("/api/v1/gb28181/recv/stop", GB28181Api::stopGB28181Receiver);
g_mapApi.emplace("/api/v1/gb28181/send/stop", GB28181Api::stopGB28181Sender);
}
从接口上,可以创建发送者或者接受者
void GB28181Api::createGB28181Sender(const HttpParser& parser, const UrlParser& urlParser,
const function<void(HttpResponse& rsp)>& rspFunc)
{
HttpResponse rsp;
rsp._status = 200;
json value;
checkArgs(parser._body, {"active", "ssrc", "port", "socketType", "streamName", "appName", "ip"});
int active = toInt(parser._body["active"]);
// logInfo << "json active: " << parser._body["active"];
// logInfo << "active: " << active;
if (active) {
int ssrc = toInt(parser._body["ssrc"]);
int port = toInt(parser._body["port"]);
int socketType = toInt(parser._body["socketType"]); //1:tcp,2:udp,3:both
string streamName = parser._body["streamName"];
string appName = parser._body["appName"];
string ip = parser._body["ip"];
auto push = make_shared<GB28181ClientPush>(ip, port, appName, streamName, ssrc, socketType);
push->create();
push->start();
string key = ip + "_" + to_string(port) + "_" + to_string(ssrc);
GB28181Client::addClient(key, push);
value["port"] = push->getLocalPort();
value["ip"] = push->getLocalIp();
value["ssrc"] = ssrc;
} else {
int ssrc = toInt(parser._body["ssrc"]);
int port = toInt(parser._body["port"]);
int socketType = toInt(parser._body["socketType"]); //1:tcp,2:udp,3:both
string streamName = parser._body["streamName"];
string appName = parser._body["appName"];
GB28181Server::instance()->startSend("0.0.0.0", port, socketType, appName, streamName, ssrc);
value["port"] = port;
value["ip"] = Config::instance()->get("LocalIp");
value["ssrc"] = ssrc;
}
value["code"] = "200";
value["msg"] = "success";
rsp.setContent(value.dump());
rspFunc(rsp);
}
在创建发送者或接收者的时候,又可以指定是主动建链还是被动等待建链。基本满足了单向通道的对讲流程。
5.结束语
目前SMS还在开发中,欢迎有兴趣的朋友一起开发,qq号见项目地址。