Essa biblioteca é responsável por fornecer uma interface de conexão ao Crystal Difusor Cedro.
Instalação
Adicione o arquivo NuGet.Config na solução:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
<add key="Cedro-Cedro" value="https://nuget.cedrotech.com/v3/index.json" />
</packageSources>
<packageRestore>
<add key="enabled" value="True" />
<add key="automatic" value="True" />
</packageRestore>
<bindingRedirects>
<add key="skip" value="False" />
</bindingRedirects>
<packageManagement>
<add key="format" value="0" />
<add key="disabled" value="False" />
</packageManagement>
</configuration>Instale a biblioteca via Nuget no projeto:
dotnet add <Meu Projeto>.csproj package Cd3.Connector -s https://nuget.cedrotech.com/v3/index.jsonCaso já tenha a biblioteca instalada, atualize:
dotnet add <Meu Projeto>.csproj package Cd3.Connector –version <NovaVersao> -s
https://nuget.cedrotech.com/v3/index.jsonComo usar
1. Inicialize o Connector
O primeiro passo é criar uma instância da classe Connector, passando o nome
de usuário, senha e funções de callback para lidar com eventos de conexão,
desconexão e mensagens recebidas.
using Cd3Connector;
class Program
{
static void Main(string[] args)
{
// Inicializando o conector
var connector = new Connector("seu_usuario", "sua_senha", OnConnect,
OnDisconnect, OnMessage);
// Inicia a conexão
connector.Start();
}
static void OnConnect()
{
Console.WriteLine("Conectado com sucesso!");
}
static void OnDisconnect()
{
Console.WriteLine("Desconectado!");
}
static void OnMessage(string message)
{
Console.WriteLine($"Mensagem recebida: {message}");
}
}Além dos parâmetros obrigatórios, o Connector permite configurar a inicialização
com os seguintes parâmetros opcionais:
- active_conflated: (bool, padrão: False)
- Define se o modo conflated deve ser ativado, permitindo uma menor
frequência de atualizações.
- Define se o modo conflated deve ser ativado, permitindo uma menor
- log_level: (string, padrão: “INFO”)
- Define o nível de detalhe do log. Os valores podem ser:
- “DEBUG” para maior detalhe;
- “INFO” para informações gerais;
- “WARNING” ou “ERROR” para menos detalhes
- Define o nível de detalhe do log. Os valores podem ser:
- log_path: (string, padrão: “”)
- Caminho para salvar os arquivos de log. Se não for fornecido, os logs
serão criados em uma pasta padrão chamada cd3_connector no
diretório atual.
- Caminho para salvar os arquivos de log. Se não for fornecido, os logs
- active_realtime: (bool, padrão: False)
- Define se o modo realtime deve ser ativado, permitindo receber atualizações em tempo real dos servidores datafeed. Por padrão a informação é recebida dos servidores delay.
Esses parâmetros podem ser fornecidos/configurados ao chamar o construtor de
forma independente, ou seja, não é necessário especificar todos os parâmetros
opcionais ao mesmo tempo. Cada parâmetro pode ser configurado
individualmente, sem depender dos outros. Para detalhes de como utilizá-los,
consulte o Exemplo completo 2.
2. Métodos principais
- Start(): Inicia a conexão com o servidor.
- Stop(): Finaliza a conexão com o servidor.
- SendCommand(string command): Envia um comando ao servidor
3. Enviar comandos
Com a conexão estabelecida, você pode enviar comandos ao servidor usando o
método SendCommand. Cada comando deve ser enviado como uma string.
connector.SendCommand("SQT PETR4"); // Solicita cotação de PETR4
connector.SendCommand("BQT PETR4"); // Solicita book de ofertas de PETR44. Callbacks
Você deve definir funções de callback para tratar eventos de conexão,
desconexão e para processar as mensagens recebidas. São elas:
- OnConnect: Invocada quando a conexão é estabelecida com sucesso.
- OnDisconnect: Invocada quando a conexão é perdida.
- OnMessage: Invocada sempre que uma nova mensagem é recebida.
Exemplo de uma função de callback para receber mensagens:
static void OnMessage(string message)
{
if (message.Equals("invalid login.", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("Login inválido. Verifique suas credenciais.");
}
else
{
Console.WriteLine($"Mensagem recebida: {message}");
}
}Exemplos
Exemplo completo 1
using Cd3Connector;
namespace Example
{
class Receiver
{
private readonly Queue<string> messages;
private readonly ManualResetEventSlim eventSlim;
private readonly Connector connector;
private bool reconnect;
public Receiver()
{
connector = new Connector("username", "password", OnConnect, OnDisconnect, OnMessage, active_conflated:true, log_level:"INFO", log_path:"C:\\logs_cd3connector");
messages = new Queue<string>();
eventSlim = new ManualResetEventSlim(false);
ThreadPool.QueueUserWorkItem(state => ProcessMessages());
reconnect = true;
}
public void Start()
{
connector.Start();
}
private void OnConnect()
{
connector.SendCommand("sqt petr4");
connector.SendCommand("bqt petr4");
connector.SendCommand("sqt winm24");
connector.SendCommand("bqt winm24");
}
private void OnDisconnect()
{
if (reconnect)
connector.Start();
}
private void OnMessage(string message)
{
lock (messages)
{
messages.Enqueue(message);
eventSlim.Set();
}
}
private void ProcessMessages()
{
while (true)
{
eventSlim.Wait();
string msg;
lock (messages)
{
msg = messages.Dequeue();
if (messages.Count == 0)
eventSlim.Reset();
}
if (msg.Equals("invalid login.", StringComparison.OrdinalIgnoreCase))
reconnect = false;
Console.WriteLine(msg);
}
}
}
class Program
{
static void Main(string[] args)
{
Receiver MktDataConnector = new();
MktDataConnector.Start();
}
}
}Exemplo completo 2
using Cd3Connector;
namespace Example
{
class Receiver
{
private readonly Queue<string> messages;
private readonly ManualResetEventSlim eventSlim;
private readonly Connector connector;
private bool reconnect;
public Receiver()
{
connector = new Connector("username", "password", OnConnect, OnDisconnect, OnMessage, active_conflated:true,
log_level:"INFO", log_path:"C:\\logs_cd3connector", active_realtime:true);;
messages = new Queue<string>();
eventSlim = new ManualResetEventSlim(false);
ThreadPool.QueueUserWorkItem(state => ProcessMessages());
reconnect = true;
}
public void Start()
{
connector.Start();
}
private void OnConnect()
{
connector.SendCommand("sqt petr4");
connector.SendCommand("bqt petr4");
connector.SendCommand("sqt winm24");
connector.SendCommand("bqt winm24");
}
private void OnDisconnect()
{
if (reconnect)
connector.Start();
}
private void OnMessage(string message)
{
lock (messages)
{
messages.Enqueue(message);
eventSlim.Set();
}
}
private void ProcessMessages()
{
while (true)
{
eventSlim.Wait();
string msg;
lock (messages)
{
msg = messages.Dequeue();
if (messages.Count == 0)
eventSlim.Reset();
}
if (msg.Equals("invalid login.", StringComparison.OrdinalIgnoreCase))
reconnect = false;
Console.WriteLine(msg);
}
}
}
class Program
{
static void Main(string[] args)
{
Receiver MktDataConnector = new();
MktDataConnector.Start();
}
}
}