Anytime Help Center

Contact Us

If you still have questions or prefer to get help directly from an agent, please submit a request.
We’ll get back to you as soon as possible.

Please fill out the contact form below and we will reply as soon as possible.

  • Support
  • Guest
  • Log In
  • AKG
    Microphones Wireless Integrated Systems Automatic Mixers Headphones Discontinued Products (AKG) General AKG Inquiries Certifications (AKG) Video Manual Series (AKG)
  • AMX
    Networked A/V Distribution (AVoIP) Traditional A/V Distribution Video Signal Processing Architectural Connectivity User Interfaces Control Processing Power (AMX) Programming (AMX) Software (AMX) Discontinued Products (AMX) Video Manual Series (AMX) General AMX Inquiries Certifications (AMX)
  • BSS
    Soundweb™ Omni Soundweb™ London Soundweb™ Contrio™ Software (BSS) Discontinued Products (BSS) Video Manual Series (BSS) General BSS Inquiries Certifications (BSS)
  • Crown
    CDi DriveCore Series CDi Series Commercial Series ComTech Series DCi DriveCore Series I-Tech HD Series XLC series XLi Series XLS DriveCore 2 Series XTi 2 Series Discontinued Products (Crown) Software (Crown) General Crown Inquiries Certifications (Crown) Video Manual Series (Crown)
  • dbx
    CX Series 500 Series DriveRack Personal Monitor Control ZonePRO Zone Controllers FeedBack Suppression Microphone Preamps Dynamics Processors Crossovers Equalizers Software (dbx) Discontinued Products (dbx) General dbx Inquiries Certifications (dbx)
  • Flux::
    Immersive Processing Analysis Subscriptions General FLUX: Inquiries
  • JBL
    Cinema Sound Installed Live Portable Tour Sound Recording & Broadcast Software (JBL) Discontinued Products (JBL) Video Manual Series (JBL) General JBL Inquiries Certifications (JBL)
  • Lexicon
    Plugins Effects Processors Cinema Discontinued Products (Lexicon) Video Manual Series (Lexicon) General Lexicon Inquiries Certifications (Lexicon)
  • Martin
    Atomic ELP ERA Exterior MAC P3 VC VDO Tools Discontinued Products (Martin) General Martin Inquiries Certifications (Martin)
  • Soundcraft
    Digital Analog Connected Analog Only Discontinued Products (Soundcraft) Video Manual Series (Soundcraft) General Soundcraft Inquiries Certifications (Soundcraft)
  • General HARMAN Inquiries
    Dante
+ More
  • Home
  • AMX
  • Programming (AMX)
  • Netlinx

Netlinx NX PING Helper Code

Coding Example


Written by Wesley Moore

Updated at August 6th, 2026

Table of Contents

Brand: Models/Languages: Overview: Usage:  Downloads:  Code: 

Brand:

  • AMX

Models/Languages:

  • NX Controllers

Overview:

When dealing with IP communications in Netlinx programming, especially systems with a large number of IP devices, you want to lessen the number of sockets the controller is attempting to create at the same time if the devices aren't available.  This can be done by extending the amount of time between socket reconnects, or via a creative use of the NX controller.  This module file actually creates a Telnet connection back into the controller itself and then utilizes the PING command to test whether or not the device exists on the network.  Once the PING returns as GOOD, you can then connect the socket.


Usage: 

  • Pass a physical and virtual device to the PING module:
    • dvPING = 0:50:0
    • vdvPING = 33700:1:0
    • DEFINE_MODULE 'PING NX - Generic' pingNX(dvPing,vdvPing)
  • When you want to PING a device, send a command to the virtual PING device:
    • SEND_COMMAND vdvPing,"'PING-',IP_Address"
  • Monitor the virtual device for GOOD or BAD responses:
    • FIND_STRING(DATA.TEXT,'GOOD',1)

Downloads: 

PING NX - Generic.axs


Code: 

PING NX - Generic.axs

MODULE_NAME='PING NX - Generic' (DEV dvDEVICE,DEV vdvDEVICE)
(***********************************************************)
(***********************************************************)
(*  FILE_LAST_MODIFIED_ON: 04/04/2006  AT: 11:33:16        *)
(***********************************************************)
(* System Type : NetLinx                                   *)
(***********************************************************)
(* REV HISTORY:                                            *)
(***********************************************************)
(*
    $History: $
*)

(***********************************************************)
(*                 HOW TO USE THIS MODULE:                 *)
(*   THIS MODULE CAN PING ANY NUMBER OF IP ADDRESSES       *)
(*   WITH 1 TELNET CONNECTION TO THE PROCESSOR             *)
(*   ONLY 1 PING AT A TIME, MODULE WILL BUFFER IF REQUIRED *)
(*   TO PING AN ADDRESS SEND PORT 1 OF THE VIRTUAL DEVICE  *)
(*   PING- or ping- IP, EX: PING-10.240.0.1                *)
(*   THE RESULT WILL BE APPENDED WITH THE IP ADDRESS       *)
(*   RESULTS CAN BE:                                       *)
(*   ERROR: IPADDRESS, Bad Address or Timeout              *)
(*   GOOD: IPADDRESS                                       *)
(*   ERROR: IPADDRESS, Packet loss                         *)
(***********************************************************)

(***********************************************************)
(*          DEVICE NUMBER DEFINITIONS GO BELOW             *)
(***********************************************************)
DEFINE_DEVICE

(***********************************************************)
(*               CONSTANT DEFINITIONS GO BELOW             *)
(***********************************************************)
DEFINE_CONSTANT
nONLINE_CHANNEL = 255

DATA_TIMELINE = 1
MAX_STRING_LENGTH = 500

(***********************************************************)
(*              DATA TYPE DEFINITIONS GO BELOW             *)
(***********************************************************)
DEFINE_TYPE

(***********************************************************)
(*               VARIABLE DEFINITIONS GO BELOW             *)
(***********************************************************)
DEFINE_VARIABLE

VOLATILE CHAR cIP_SELF[]='127.0.0.1'
VOLATILE LONG lPORT = 23
VOLATILE CHAR cBUFFER[MAX_STRING_LENGTH]
VOLATILE INTEGER nONLINE
VOLATILE CHAR cCURRENT_IP[MAX_STRING_LENGTH]

CHAR DATA_QUEUE[16000] //THE LIMIT FOR STRING CONCATENATION
CHAR DELIMITER[4] = '$XX'
LONG INTERVAL[] = {15000}

(***********************************************************)
(*               LATCHING DEFINITIONS GO BELOW             *)
(***********************************************************)
DEFINE_LATCHING

(***********************************************************)
(*       MUTUALLY EXCLUSIVE DEFINITIONS GO BELOW           *)
(***********************************************************)
DEFINE_MUTUALLY_EXCLUSIVE

(***********************************************************)
(*        SUBROUTINE/FUNCTION DEFINITIONS GO BELOW         *)
(***********************************************************)
(* EXAMPLE: DEFINE_FUNCTION <RETURN_TYPE> <NAME> (<PARAMETERS>) *)
(* EXAMPLE: DEFINE_CALL '<NAME>' (<PARAMETERS>) *)

DEFINE_FUNCTION INTEGER CHECK_FOR_DUPLICATES(CHAR DATA_IN[MAX_STRING_LENGTH])
{
    IF(FIND_STRING(DATA_QUEUE,DATA_IN,1))
    {
	RETURN 1
    }
    ELSE
    {
	RETURN 2
    }
}

DEFINE_FUNCTION ADD_TO_QUEUE (CHAR QUEUE_DATA[MAX_STRING_LENGTH])
{
    STACK_VAR INTEGER DUPLICATE
    
    DUPLICATE = CHECK_FOR_DUPLICATES(QUEUE_DATA)
    IF(DUPLICATE=2)
    {
	DATA_QUEUE = "DATA_QUEUE,QUEUE_DATA,DELIMITER"
    }
    ELSE
    {
	SEND_STRING vdvDEVICE,"'INFO: ',cCURRENT_IP,', Already in Queue'"
    }
    
    IF(!(TIMELINE_ACTIVE(DATA_TIMELINE)))
    {
	TIMELINE_CREATE(DATA_TIMELINE,INTERVAL,1,TIMELINE_ABSOLUTE,TIMELINE_REPEAT)
	TIMELINE_SET(DATA_TIMELINE,INTERVAL[1]-1)
    }
}

DEFINE_FUNCTION SEND_A_STRING()
{
    STACK_VAR CHAR TEMP_STRING[MAX_STRING_LENGTH]
    STACK_VAR LONG nSTART,nCOUNT
    IF((LENGTH_STRING(DATA_QUEUE)) && (FIND_STRING(DATA_QUEUE,"DELIMITER",1)))
    {
	TEMP_STRING = REMOVE_STRING(DATA_QUEUE,"DELIMITER",1)
	SET_LENGTH_STRING(TEMP_STRING,LENGTH_STRING(TEMP_STRING)-3)
	SEND_STRING dvDEVICE,"TEMP_STRING"
	nSTART = FIND_STRING(TEMP_STRING,' ',1) + 1
	nCOUNT = (LENGTH_STRING(TEMP_STRING) - (nSTART+1))
	cCURRENT_IP = MID_STRING(TEMP_STRING,nSTART,nCOUNT)
    }
    ELSE IF(LENGTH_STRING(DATA_QUEUE) = 0)
    {
	TIMELINE_KILL(DATA_TIMELINE)
    }
    ELSE IF((LENGTH_STRING(DATA_QUEUE)) && (!(FIND_STRING(DATA_QUEUE,"DELIMITER",1))))
    {
	CLEAR_BUFFER DATA_QUEUE
    }
}

(***********************************************************)
(*                STARTUP CODE GOES BELOW                  *)
(***********************************************************)
DEFINE_START
CREATE_BUFFER dvDEVICE, cBUFFER
IP_CLIENT_OPEN(dvDEVICE.PORT,cIP_SELF,lPORT,IP_TCP)


(***********************************************************)
(*                THE EVENTS GO BELOW                      *)
(***********************************************************)
DEFINE_EVENT

DATA_EVENT[dvDEVICE]
{
    ONLINE:
    {
	nONLINE = 1
	ON[vdvDEVICE,nONLINE_CHANNEL]
    }
    OFFLINE:
    {
	nONLINE = 0
	OFF[vdvDEVICE,nONLINE_CHANNEL]
	WAIT 10
	IP_CLIENT_OPEN(dvDEVICE.PORT,cIP_SELF,lPORT,IP_TCP)
    }
    ONERROR:
    {
	IF(DATA.NUMBER > 0)
	{
	    OFF[vdvDEVICE,nONLINE_CHANNEL]
	    WAIT 10
	    IP_CLIENT_OPEN(dvDEVICE.PORT,cIP_SELF,lPORT,IP_TCP)
	}
    }
    STRING:
    {
	STACK_VAR CHAR cDEV_BUFF[MAX_STRING_LENGTH]
	STACK_VAR INTEGER nSENT
	STACK_VAR INTEGER nRECEIVED
	STACK_VAR INTEGER nLOSS
	STACK_VAR CHAR cIPADDRESS[MAX_STRING_LENGTH]
	
	IF(FIND_STRING(cBUFFER,'Login :',1))
	{
	    SEND_STRING dvDEVICE,"'administrator',$0d,$0a"
	}
	IF(FIND_STRING(cBUFFER,'Password :',1))
	{
	    SEND_STRING dvDEVICE,"'password',$0d,$0a"
	}
	
	WHILE(FIND_STRING(cBUFFER,"$0D,$0A",1))
	{
	    cDEV_BUFF = REMOVE_STRING(cBUFFER,"$0D,$0A",1)
	    IF((FIND_STRING(cDEV_BUFF,'Error - command timed out',1)) ||
	    (FIND_STRING(cDEV_BUFF,'ping: bad address',1)))
	    {
		SEND_STRING vdvDEVICE,"'ERROR: ',cCURRENT_IP,', Bad Address or Timeout'"
		TIMELINE_SET(DATA_TIMELINE,INTERVAL[1]-1000)
	    }
	    ELSE IF(FIND_STRING(cDEV_BUFF,'packet loss',1))
	    {
		cIPADDRESS = REMOVE_STRING(cDEV_BUFF,'ping statistics ---',1)
		REMOVE_STRING(cIPADDRESS,' ',1)
		cIPADDRESS = REMOVE_STRING(cIPADDRESS,' ',1)
		SET_LENGTH_STRING(cIPADDRESS,LENGTH_STRING(cIPADDRESS)-1)
		nSENT = ATOI(cDEV_BUFF)
		REMOVE_STRING(cDEV_BUFF,',',1)
		nRECEIVED = ATOI(cDEV_BUFF)
		REMOVE_STRING(cDEV_BUFF,',',1)
		nLOSS = ATOI(cDEV_BUFF)
		IF((nSENT=nRECEIVED) && (nLOSS=0))
		{
		    SEND_STRING vdvDEVICE,"'GOOD: ',cCURRENT_IP"
		}
		ELSE
		{
		    SEND_STRING vdvDEVICE,"'ERROR: ',cCURRENT_IP,', Packet loss'"
		}
		TIMELINE_SET(DATA_TIMELINE,INTERVAL[1]-1000)
	    }	
	}
    }
}

DATA_EVENT[vdvDEVICE]
{
    ONLINE:{}
    OFFLINE:{}
    STRING:{}
    COMMAND:
    {
	STACK_VAR CHAR cCMD_BUFFER[100]
	IF([vdvDEVICE,nONLINE_CHANNEL])
	{
	    cCMD_BUFFER = UPPER_STRING(DATA.TEXT)
	    IF(FIND_STRING(cCMD_BUFFER,'PING-',1))
	    {
		REMOVE_STRING(cCMD_BUFFER,'PING-',1)
		//SEND_STRING 0,"'RX PING ',cCMD_BUFFER"
		ADD_TO_QUEUE("'PING ',cCMD_BUFFER,$0D,$0A")
	    }
	}
	ELSE
	{
	    SEND_STRING vdvDEVICE,"'TELNET INACTIVE..TRY AGAIN'"
	    IP_CLIENT_OPEN(dvDEVICE.PORT,cIP_SELF,lPORT,IP_TCP)
	}
    }
}

TIMELINE_EVENT[DATA_TIMELINE]
{
    SEND_A_STRING()
}

(*****************************************************************)
(*                                                               *)
(*                      !!!! WARNING !!!!                        *)
(*                                                               *)
(* Due to differences in the underlying architecture of the      *)
(* X-Series masters, changing variables in the DEFINE_PROGRAM    *)
(* section of code can negatively impact program performance.    *)
(*                                                               *)
(* See Ԅifferences in DEFINE_PROGRAM Program ExecutionԠsection *)
(* of the NX-Series Controllers WebConsole & Programming Guide   *)
(* for additional and alternate coding methodologies.            *)
(*****************************************************************)

DEFINE_PROGRAM

(*****************************************************************)
(*                       END OF PROGRAM                          *)
(*                                                               *)
(*         !!!  DO NOT PUT ANY CODE BELOW THIS COMMENT  !!!      *)
(*                                                               *)
(*****************************************************************)

 

Related Videos

netlinx programming

Was this article helpful?

Yes
No
Give feedback about this article

Table of Contents

Brand: Models/Languages: Overview: Usage:  Downloads:  Code: 

Related Articles

  • Configuring a Telnet Connection Handshake in NetLinx

Related Articles

  • Configuring a Telnet Connection Handshake in NetLinx
Copyright © HARMAN Professional. All rights reserved. Privacy Policy | Terms of Use
Expand