2. Consideraciones para la migración.
Diferencias en las funciones de NK90 y TMP.
Diseño de aplicaciones en TMP.
Pruebas y debug en TMP.
Mejores practicas.
3. Conocimiento de funciones NSL en NK90.
Maqueta para pruebas.
Marcación de prueba.
4.
5.
6. Los scripts y audios deben estar colocados de una forma
estandar para poder llamar a scripts y audios de igual
manera en todas las aplicaciones.
7. Para llamar a un script local del proyecto
◦ sScriptRutinas = “264_rutinas.nek”;
Para llamar a un audio local
◦ sAudiosBienvenida = “audios/bienvenida.wav”;
Para llamar a un script externo al proyecto
◦ sScript264 =
http://localhost:8080/264/264/264.nek;
8. Para manejo de archivos de la
aplicación, estos se guardan localmente en el
MR, estos deben guardar se en la ruta
estándar:
◦ /opt/sns/app/<aplicación>
◦ Ejemplo:
◦ /opt/sns/app/fax
◦ /opt/sns/app/buzon
◦ /opt/sns/app/log
9.
10. PlayMessage.
◦ Esta función recibe como parámetro el nombre del archivo a
reproducirse, para TMP se coloca la ruta relativa si el archivo esta en
el directorio del proyecto o la URL si el archivo esta en otro proyecto.
PlayMessage("audios/nombre_de_audio.wav");
RaiseScript y ExecuteScriptFunction
◦ Colocar solo el nombre del archivo a invocar si esta dentro
del proyecto o toda la URL si esta en otro proyecto
RaiseScript("111_CAC.nek",0,1);
StringFormatEx(sScriptMenu3G, "%s/264/264/3G/menu3
G.nek", sHttpBAS);
ExecuteScriptFunction
(sScriptMenu3G, "", sTemp, iResult,sDynData,sDyn
Data);
11. CallInfo
◦ Las transferencias pueden ser con ForwardCall o con MakeCal lEx o MakeCallAsync en
cualquiera de los 2 casos se debe de usar la estructura CALL_INFO.
◦ CallInfo.strPhoneA debe ser llenado con el número de A, solo dígitos, el intérprete lo
pondrá en el formato correcto en caso de ser llamada IP
◦ CallInfo.strPhoneB debe ser llenado con el número de B, solo dígitos, el intérprete lo
pondrá en el formato correcto en caso de ser llamada IP
◦ CallInfo.strNetwork debe ser llamada con PSTN_CALL en caso de llamada ISUP, R2 o
ISDN ó IP_CALL en caso de llamada SIP.
◦ Ejemplo:
@PHONE_B = "*0002";
@SERVICE_NAME = "IP_CALL";
CALL_INFO sCallInfo;
sCallInfo = sCALL_INFO;
DynamicClear(sCallInfo.sProtocolInfo);
sCallInfo.strPhoneA = @PHONE_A;
sCallInfo.strPhoneB = @PHONE_B;
sCallInfo.strNetworkChoice = @SERVICE_NAME;
ForwardCall(sCallInfo);
12. HTTPRequest
◦ Para las peticiones HTTP se debe de usar la función HTTPRequestEx, la
vieja función HTTPRequest queda depreciada para esta versión. Para usar
la nueva función hay que declarar las siguientes variables.
DYNAMIC_STRUCT dHTTPParams;
INT iCode;
INT iHttpTimeout = 20000;
DynamicAdd(dHTTPParams, "TIMEOUT", iHttpTimeout);
DynamicAdd(dHTTPParams, "CONNECTTIMEOUT", iHttpTimeout);
La función vieja se veria asi:
HttpRequest(salida,entrada,iResult,20000);
◦ La nueva queda asi:
HttpRequestEx(salida, dHTTPParams, entrada, iResult, iCode);
◦ El timer que se usaba como parámetro en el HTTPRequest anterior ahora
se declara en la estructura dHTTPParams.
13. Consultas a BD [ACTPREPAGO]
Application Attributes = T
◦ Las consultas a BD no Attributes = W
BatchAutocommitMode = IfAllSuccessful
cambian, lo que hay que BindAsFLOAT = F
CloseCursor = F
conocer es como hacer la DisableDPM = F
configuración del ODBC. La
DisableMTS = T
Driver = Oracle 11g ODBC driver
conexión del ODBC debe DSN = ACTPREPAGO
EXECSchemaOpt =
hacerse en el MR, para lo EXECSyntax = T
Failover = T
cual es necesario que FailoverDelay = 10
tenga instalado los drivers FailoverRetryCount = 10
FetchBufferSize = 64000
ODBC ya sea para ORACLE ForceWCHAR = F
Lobs = T
o para MySQL. La conexión Longs = T
se declara en el archivo
MetadataIdDefault = F
QueryTimeout = T
ResultSets = T
/etc/odbcunix/odbc.ini ServerName = COSTARRICA
un ejemplo de conexión SQLGetData extensions = F
Translation DLL =
para ORACLE es: Translation Option = 0
DisableRULEHint = T
UserID = ACTPREPAGO
14. Los campos importantes son:
el nombre del bloque porque ese es el nombre del DSN,
DSN, en este campo va el nombre del DSN, normalmente
igual al nombre del bloque.
ServerName , aquí va el identificador del Host, para telcel
ese server name siempre es telcel
UserID, este es el usuario de la BD para conectarnos.
Para probar la conexión a BD.
Se usa el comando isql desde una sesión SSH en el MR:
$isql DSN_NAME USER PASSWORD
Otro punto importante es que si quieren usar la BD de la
plataforma esta es ORACLE por lo que se deben armar los
queries para este motor de BD.
15. Fax y File
◦ Para usar las funciones de Fax y File hay que tener en cuenta las rutas recomendadas
para tener organizado los archivos en el MR.
String sFaxPath = “/opt/sns/apps/<apptmp>/fax”;
String sFilePath = “/opt/sns/apps/<apptmp>/log”;
EventLaunchCodes
◦ Los eventlauchcodes son soportados por el ControlNSL pero en vez de asociarlos a
prefijos se usan directamente las rutas completas, en nuestro caso por el uso del AS
se usan las URLs
STRING sHttpBAS = "http://localhost:8080";
STRING sScriptOnBusy;
STRING sScriptOnError;
STRING sScriptOnAnswer;
STRING sScriptOnAnswer;
StringFormatEx(sScriptOnBusy, “%s/proyecto/proyecto/OnBusy.nek”, sHttpBAS);
StringFormatEx(sScriptOnError, “%s/proyecto/proyecto/OnError.nek”, sHttpBAS);
StringFormatEx(sScriptOnAnswer, “%s/proyecto/proyecto/OnAnswer.nek”, sHttpBAS);
StringFormatEx(sScriptOnNoAnswer, “%s/proyecto/proyecto/OnNoAnswer.nek”, sHttpBAS);
sLaunchCodes.OnAnswerSimple = sScriptOnAnswer;
sLaunchCodes.OnBusy = sScriptOnBusy
sLaunchCodes.OnError = sScriptOnError
sLaunchCodes.OnNoAnswer = sScriptOnNoAnswer;
SetEventLaunchCode(sLaunchCodes);
16. Fecha
◦ Cuando se usa la función StringData el formato que retornado es YYYY-
MM-DD, para mayor control de la fecha se recomienda usar la función
StringDateEx, por ejemplo .
StringDateEx("yyyy-MM-dd", strFecha);
Mail
◦ Para enviar un Correo debe de usarse la function MailSend de la siguiente
forma.
DYNAMIC_STRUCT dMailSend; INT iResult;
DynamicAdd(dMailSend, "MailServer", "mail.nekotectelecom.com");
DynamicAdd(dMailSend, "Login", "arturo.ruiz@nekotectelecom.com");
DynamicAdd(dMailSend, "Password", "XXXXXX");
DynamicAdd(dMailSend, "to.AllAddresses", "arturo_ruiz_m@hotmail.com, kaliman1
997@gmail.com");
DynamicAdd(dMailSend, "from.AllAddresses", "arturo.ruiz@nekotectelecom.com");
DynamicAdd(dMailSend, "subject", "un email desde el ControlNSL");
//DynamicAdd(dMailSend, "Text", "El texto del mensaje");
DynamicAdd(dMailSend, "TMIME.1.Text", "");
DynamicAdd(dMailSend, "MIME.2.AttachmentFile", sFileName);
MailSend(dMailSend, iResult);
17.
18. Diseñar la Base de datos de acuerdo a los
siguientes requerimientos.
Datos dinámicos a consultar
Catálogos a consultar
Reportes
Estadísticas
19. Modularizar
◦ Script Principal con la lógica del servicio
◦ Script de variables
◦ Script(s) de configuración(es).
◦ Scripts Secundarios
20.
21. Cargar la aplicación en el AS y asociarle una
regla, usando el SMILODON.
22. Esperar 1 minuto para la sincronización del
AS con los MRs.
Marcar al número DID asociado al proyecto.
Seguir el flujo de acuerdo a la prueba que se
quiere hacer.
Se pueden consultar los trazados que hace
el ControlNSL de la ejecución del
script, estos se localizan en la ruta
/opt/sixlabs/var/log y el formato del
nombre del log es ControlNSL-YYYYMMDD-
HHMISS.txt.
23. Es muy recomendable colocar trazados en el
script para hacer un debugueo más efectivo.
Para abrir el trace se puede usar el vi o
puede descargarse con una aplicación de
transferencia de archivos SFTP como el
WinSCP, FileZilla, etc.
También se puede usar el comando tail para
ver en línea la ejecución:
$cd /opt/sixlabs/var/log
$tail -f ControlNSL-YYYYMMDD-HHMISS.txt |
grep @@@
24.
25. Usar cuadro de datos para cada script:
//----------------------------------------------------------------------
// Script 111.nek
// Autor: Lucero Estrada
// Fecha Elaboración: Abril-Junio de 2011
// Descripcion: Servicio de 111 Homologado
//----------------------------------------------------------------------
// Actividad:
// - Adaptado para R6
//
26. Versionar cada script y los audios pueden
indicarse en el script principal.
v.X.Y.Z/a.W
X es la versión del script liberado,
Y la versión del cambio,
Z la versión de la corrección,
W la versión del paquete de audios.
Cuando X incrementa, Y y Z cambian a 0, cuando Y incrementan Z
cambia a 0. W indica los cambios en los archivos de audios.
Usar la variable STRING sVersion = “1.0.0”; y actualizarla en cada
cambio.
27. Los cambios en el script deben documentarse
abajo del cuadro de texto:
//---------------------------------------------------------------------------//
Actividad:
// - Adaptado para R6
//
// Versión: 1.0.4/a.3
// Realizada por: Francisco A. Mondragón
// Fecha del cambio: 14-07-11 4:15p.m.
// Solicitante: Arturo Ruiz
//---------------------------------------------------------------------------
28. Usar un encabezado para realizar los traces.
StringFormatEx(sTrace,"[A:%s][%s][%s][v%s][B:%d-S:%d-
C:%d]:",sANI,@SCRIPT_NAME,sFH,sVersion,@BOARD,@STREAM,@CHANNEL);
29. Los nombres de las variables debe de tener
un prefijo que indique el tipo:
str para STRING,
i para INT,
s Para STRUCT,
d para DYNAMIC_STRUCT.
30. Usar rutinas para las tareas repetitivas.
SUB OBTEN_IDEQUIPO
ExecuteScriptFunction(sScript_GetIP, "", sTemp,
iResult, @DYNAMIC_STRUCT, @DYNAMIC_STRUCT);
IF(iResult == 0) //b
DynamicGet(@DYNAMIC_STRUCT, "IdEquipo",
giID_EQUIPO);
Trace("%s IDequipo: %d", sTrace,giID_EQUIPO);
ELSE //b
giID_EQUIPO = 0;
Trace("%s No se pudo obtener IDequipo, se fija a:
%d", sTrace,giID_EQUIPO);
END_IF //b
END_SUB
CALL_SUB OBTEN_IDEQUIPO