/* ************************************************************************ ** ** Copyright (c) 2008..2010 by ** Core|Vision B.V. ** Cereslaan 10b ** 5384 VT Heesch ** The Netherlands ** ** All Rights Reserved ** ************************************************************************ */ /* ************************************************************************ ** ** Project name: Dual Inventive: Communication Protocol 3000 ** Filename: cp3000-cmd.h ** Author: Jack Weeland ** Date: July 9, 2008 ** File version: 1.00 of April 29, 2010 ** ************************************************************************ */ /* ************************************************************************ ** ** CP3000 command definitions ** ************************************************************************ */ #ifndef _CP3000_CMD_H_COMMON #define _CP3000_CMD_H_COMMON /* ** Default port number */ #define TCPSERVER_DEFAULT_PORT 3000 #define SMSSERVER_DEFAULT_PORT 3030 #define SECURESERVER_DEFAULT_PORT 3300 /* ** Status codes and token components */ #define TCPFMT_TOKEN_CMD "$" #define TCPFMT_TOKEN_REPLY "!" #define TCPFMT_TOKEN_CHECKSUM "*" #define TCPFMT_TOKEN_CLIENTSEP "@" #define TCPFMT_TOKEN_SEP "," #define TCPFMT_STATUS_FMT "%02X" #define TCPFMT_STATUS_BASE 16 // for 'strtoul()' #define TCPFMT_STATUS TCPFMT_TOKEN_REPLY TCPFMT_STATUS_FMT #define TCPFMT_REPLY_DATA TCPFMT_TOKEN_SEP "\"%s\"" #define TCPFMT_CLIENT_FMT "%u" #define TCPFMT_CLIENT_BASE 10 // for 'strtoul()' #define TCPFMT_CLIENT TCPFMT_TOKEN_CLIENTSEP TCPFMT_CLIENT_FMT #define TCPFMT_CHECKSUM_FMT "%02X" #define TCPFMT_CHECKSUM TCPFMT_TOKEN_CHECKSUM TCPFMT_CHECKSUM_FMT "\n" #define TCPFMT_CHILD_FMT "%s" // child devices are identified by hardware address /* ** TCP protocol messages ** ** Messages are formatted like the NMEA format: ** $WHAT,*CHECKSUM\n ** ** Return and status codes are formated like this: ** !,*CHECKSUM\n */ // Maximum length of a TCP message #define TCPMSG_MAXLEN 2048 /* ** Messages from ZKL to database server */ // ZKL login message // Parameters // 1 IMEI (string) // 2 reprogramming counter (16-bit unsigned integer) // 3 start-up counter (16-bit unsigned integer) // 4 Primary channel // 5 Encoded password or signature (TBD) #define TCPID_LOGIN "$ZKL" #define TCP_N_LOGIN (1 + 5) #define TCPFMT_LOGIN TCPID_LOGIN ",\"%s\",%u,%u,%d,\"%s\"" // ZKL logout message #define TCPID_LOGOUT "$EXIT" #define TCP_N_LOGOUT (1) #define TCPFMT_LOGOUT TCPID_LOGOUT // Register a log file; status updates are done by TCPID_RESEND as off 20090729 // Parameters // 1 Reprogramming counter // 2 Start-up counter // 3 File size // 4 Error code (obsolete 20090729) // 0: update status // other: error code #define TCPID_LOGFILE "$LOGFILE" #define TCP_N_LOGFILE (1 + 3) #define TCP_N_LOGFILE_OLD (1 + 4) #define TCP_N_LOGFILE_NONE (1) #define TCPFMT_LOGFILE TCPID_LOGFILE ",%u,%u,%lu" // Log entry // Parameters // 1 Major identifier for the log entry // 2 Minor identifier for the log entry // 3 Reprogramming counter // 4 Start-up counter // 5 Next position in the log file (following this entry) // 6 Time stamp // 7 Sequence number // ... Other parameters (maximum: 10) #define TCPID_LOG "$LOG" #define TCP_NF_LOG (1 + 7) /* fixed nr items */ #define TCP_N_LOG (TCP_NF_LOG + 10) /* max nr items */ #define TCPFMT_LOG TCPID_LOG ",%u,%u,%u,%u,%lu,%lu,%lu" #define TCPFMT_LOG_NOTIME TCPID_LOG ",%u,%u,%u,%u,,," // Sync black box log with the database // Parameters // 1 Reprogramming counter // 2 Start-up counter // 3 File position // 4 Time stamp // 5 Old time stamp, for resyncing the database (optional) #define TCPID_SYNC "$SYNC" #define TCP_N_SYNC (1 + 4 + 1) #define TCPFMT_SYNC TCPID_SYNC ",%u,%u,%lu,%lu" #define TCPFMT_RESYNC TCPID_SYNC ",%u,%u,%lu,%lu,%lu" // Status // Parameters (device to server) // 1 What has changed (bitfield) // 2 Full status #define TCPID_STATUPDATE "$STAT" #define TCPID_STATUPDATE_JSON TCPID_STATUPDATE "[JSON]" #define TCP_N_STATUPDATE (1 + 2) #define TCP_N_STATCACHE (1) #define TCPFMT_STATUPDATE_CHNG "%u" #define TCPFMT_STATUPDATE TCPID_STATUPDATE "," TCPFMT_STATUPDATE_CHNG ",\"%s\"" #define TCPFMT_STATCACHE TCPID_STATUPDATE #define TCPFMT_STATCACHE_JSON TCPID_STATUPDATE_JSON // Update status, as a (ideally) shorter and more extendable alternative // for the STATUPDATE. // Parameters // 1 Item (simple, single string or numeric) // 2 Value // No parameters for heartbeat messages (a.k.a. "update cache") #define TCPID_UPDATE "$UPDT" #define TCP_N_UPDATE (1 + 2) #define TCP_N_UPDATECACHE (1) #define TCPFMT_UPDATE TCPID_UPDATE ",%u,\"%s\"" #define TCPFMT_UPDATECACHE TCPID_UPDATE // Abort-command; shuts down the ZKL side of the TCP-server // This command is _not_ to be used under normal circumstances; // it is used by the TCP-server itself to terminate a hanging // server (which may occur when the connection failes, the ZKL // tries to connect again but the old connection did not yet // notice that it has lost its connection) // Parameter: // 1 Sender's own process ID #define TCPID_ABORT "$ABORT" #define TCP_N_ABORT 2 #define TCPFMT_ABORT TCPID_ABORT ",%lu" /* ** Messages from database or web server to ZKL */ // Database/webserver login // Note: obsolete // Parameters // 1 Database ID of the ZKL // 2 channel for alarm messages #define TCPID_DB "$DB" #define TCP_N_DB 3 #define TCPFMT_DB TCPID_DB ",%u,%d" // MTinfo login // Parameters // 1 Database ID of the ZKL // 2 channel for alarm messages // 3 security key #define TCPID_MTINFO "$MTINFO" #define TCP_N_MTINFO 3 #define TCPFMT_MTINFO TCPID_MTINFO ",%u,%d,\"%s\"" // MTinfo Secure login // Parameters // 1 Database ID of the ZKL // 2 channel for alarm messages // 3 security key #define TCPID_MTINFO_SECURE "$SECURE" #define TCP_N_MTINFO_SECURE 3 #define TCPFMT_MTINFO_SECURE TCPID_MTINFO_SECURE ",%u,%d,\"%s\"" // Database/webserver changes a value on the ZKL3000 // Parameters // 1 Key (as in the SMS interface) // 2 Value #define TCPID_DBSTOR "$STOR" #define TCP_N_DBSTOR 3 #define TCPFMT_DBSTOR TCPID_DBSTOR ",\"%s\",\"%s\"" #define TCPFMT_DBSTOR_CLIENT TCPID_DBSTOR TCPFMT_CLIENT ",\"%s\",\"%s\"" // Database/webserver retrieves a value on the ZKL3000 // Parameters // 1 Key (as in the SMS interface) #define TCPID_DBRETR "$RETR" #define TCP_N_DBRETR 2 #define TCPFMT_DBRETR TCPID_DBRETR ",\"%s\"" #define TCPFMT_DBRETR_CLIENT TCPID_DBRETR TCPFMT_CLIENT ",\"%s\"" // Connection watchdog reset #define TCPID_DBWDRST "$WD" #define TCP_N_DBWDRST 0 #define TCPFMT_DBWDRST TCPID_DBWDRST // Gateway command // Parameters: // 1 Child index // 2 Command // 3.. Argument(s) for command #define TCPID_GATEWAYCMD "$GW" #define TCPFMT_GATEWAYCMD TCPID_GATEWAYCMD "," TCPFMT_CHILD_FMT ",%s" #define TCPFMT_GATEWAYCMD_CLIENT TCPID_GATEWAYCMD TCPFMT_CLIENT "," TCPFMT_CHILD_FMT ",%s" // Locking (from peer to database server) // No parameters // Returns: // TCPSTAT_OK // TCPSTAT_BUSY when locked by another entity #define TCPID_LOCK "$LOCK" #define TCP_N_LOCK (1) #define TCPID_UNLOCK "$UNLOCK" #define TCP_N_UNLOCK (1) // Set authorization // Paramter // 1 Authorization token #define TCPID_AUTH "$AUTH" #define TCPID_N_AUTH 2 #define TCPFMT_AUTH TCPID_AUTH ",\"%s\"" // Request ZKL3000 to resent log data _or_ ZKL registers a log file // Parameters to ZKL // 1 Resend from this reprogramming count; can be negative to indicate // special cases // 2 Resend from this start-up count // If reprogramming count is '-1': // -1 abort replay // 1 set battery #1 age and time base // 2 set battery #2 age and time base // 3 File position in the log file to start resending from // 4 Time base // 5 Initial sequence number // Parameters from ZKL // 1 Reprogramming counter // 2 Start-up counter // 3 File size // 4 Error code // 0: update status // other: error code #define TCPID_DBRESEND "$REPLAY" #define TCP_N_DBRESEND (1 + 5) #define TCP_N_DBRESEND_NONE 1 #define TCP_N_DBRESEND_WCPU (1 + 4) #define TCPFMT_DBRESEND TCPID_DBRESEND ",%d,%d,%lu,%lu,%u" #define TCPFMT_DBRESEND_ABORT TCPID_DBRESEND ",-1,-1" #define TCPFMT_DBRESEND_WCPU TCPID_DBRESEND ",%u,%u,%lu,%d" // Debug traces #define TCPID_TRACE "$TRACE" #define TCP_N_TRACE 3 #define TCPFMT_TRACE TCPID_TRACE ",%d,\"%s\"" // Synchronise TCP-server // Parameters: none #define TCPID_DBSYNC "$SYNCDB" #define TCP_N_DBSYNC 1 #define TCPFMT_DBSYNC TCPID_DBSYNC #define TCPFMT_DBSYNC_ITEMS TCPID_DBSYNC ",\"%s\"" // Request phone number; the ZKL will send an SMS // Parameters: phone number of the SMS server #define TCPID_DBSENDPHONENR "$SENDPHONENR" #define TCP_N_DBSENDPHONENR 2 #define TCPFMT_DBSENDPHONENR TCPID_DBSENDPHONENR ",\"%s\"" // Phone number (sent as SMS to the SMS server) // Parameters: IMEI,IMSI,EF-CCID (SIM number) #define TCPID_DBPHONENR "$PHONENR" #define TCP_N_DBPHONENR 4 #define TCPFMT_DBPHONENR TCPID_DBPHONENR ",\"%s\",\"%s\",\"%s\"" // Run an AT command on the Wavecom (during production only) // Returns // status with command replies #define TCPID_RUNATCOMMAND "$AT" #define TCP_N_RUNATCOMMAND 2 #define TCPFMT_RUNATCOMMAND TCPID_RUNATCOMMAND ",\"%s\"" /* ** Geo-fencing, from database server to ZKL ** Return status after each sequence */ // Commands for TCPID_GEOFENCE - defined in "zkl-common.h" // GEOFENCECMD_START 0 // GEOFENCECMD_END 6 // GEOFENCECMD_DELETE 7 // GEOFENCECMD_OBJECT 1 // GEOFENCECMD_POINT 2 // GEOFENCECMD_ACTION 3 // Main command // Parameters // 1 Command (one of the GEOFENCECMD_xxx definitions) // Returns: // Only the GEOFENCECMD_END returns an overall status code #define TCPID_GEOFENCE "$GEOFENCE" // Start a geo-fence design // Parameters: // 1 Command // 2 Geo-fence ID // 3 Name // 4 Number of objects (n) // Return value postponed till GEOEND line // Next (order undetermined): // Send actions. // Send exactly n objects. // Last: send GEOFENCE_END #define TCPFMT_GEOFENCE_START TCPID_GEOFENCE ",0,%u,\"%s\",%u" // End a geo-fence design // Parameters: // 1 Command // 2 Geo-fence ID // Returns: // TCPSTAT_OK // TCPERR_NOMEM: not enough memory // TCPERR_INVAL: bad formatting in one of commands in the sequence for this shape // TCPERR_PARAM: not enough points sent for an object #define TCPFMT_GEOFENCE_END TCPID_GEOFENCE ",6,%u" // Delete a geo-fence design // Parameters: // 1 Command // 2 Geo-fence ID or '-1' to delete all current designs // Returns nothing #define TCPFMT_GEOFENCE_CLEAR TCPID_GEOFENCE ",7,%u" #define TCPFMT_GEOFENCE_CLEAR_ALL TCPID_GEOFENCE ",7,-1" // Geo-fence object // Parameters: // 1 Command // 2 Geo-fence ID // 3 Object ID // 4 Type: // "point", m=1 // "line", m=2 // "track" aka multi-line, arbitrary m > 0 // "rect", rectangle, m=2 // "polygon", arbitrary m > 0 // 5 Number of points (m) // 6 Radius for a point or (multi-)line (in meters) // Return value postponed till GEOFENCE_END line // Next: // Points, either in-line (seperated by comma's) or as GEOPOINT objects #define TCPFMT_GEOFENCE_OBJECT TCPID_GEOFENCE ",1,%u,%u,\"%s\",%u,%f" // Geo-fence object: point(s) for object // Parameters: // 1 Command // 2 Geo-fence ID // 3 Object ID // 4 Point (latitude,longitude) // ... (m-1 points separated by commas) // Return value postponed till GEOEND line // NB: due to implementation limitations, the number of co-ordinate pairs // on one line is limited to 16. #define TCPFMT_GEOFENCE_POINT_INLINE ",\"%f,%f\"" #define TCPFMT_GEOFENCE_POINT_HDR TCPID_GEOFENCE ",2,%u,%u" #define TCPFMT_GEOFENCE_POINT TCPID_GEOFENCE_POINT_HDR TCPFMT_GEOPOINT_INLINE /* x m */ // Geo-fence action when going from out to in or v.v. // Actions are added to a list in the order received. // Parameters: // 1 Command // 2 Geo-fence ID // 3 Direction ("exit" or "enter") // 4 Key // 5 Value // Return value postponed till GEOFENCE_END line #define TCPFMT_GEOFENCE_ACTION TCPID_GEOFENCE ",3,%u,\"%s\",\"%s\",\"%s\"" #define TCPFMT_GEOFENCE_ACTION_DEFAULT TCPID_GEOFENCE ",3,%u,\"%s\",\"%s\"" /* ** Messages from database or web server or ZKL to the SMS server; ** none of these return a status */ // Send text message (generic) // Parameters // 1 da (i.e. phone number to which the message must be sent) // 2 text // Returns // status with message idenitifier #define TCPID_SENDSMS "$SENDSMS" #define TCP_N_SENDSMS (1 + 2) #define TCPFMT_SENDSMS TCPID_SENDSMS ",\"%s\",\"%s\"" // Compose text message // Parameters // 1 message ID (MSG_xxx identifier in "zkl_common.h") // 2 MCU state (32-bit integer, state in LSW, local_state in MSW) // or error code (16-bit signed integer); type is determined by // the message ID // 3 full state (as sent by the $STAT command) // Returns // status with message idenitifier #define TCPID_COMPOSE "$COMPOSE" #define TCP_N_COMPOSE (1 + 3) #define TCPFMT_COMPOSE TCPID_COMPOSE ",%u,\"%08lX\",\"%s\"" /* ** Server stats */ // Base command #define TCPID_SVRSTAT "$SVRSTAT" // TCP statistics #define TCPID_SVRSTAT_TCP "$SVRSTAT[TCP]" // Logging statistics #define TCPID_SVRSTAT_LOG "$SVRSTAT[LOG]" /* ** Logging from the Secure Server and CA Server */ // Commands for TCPID_LOGSECURE #define LOGSECURE_START 0 #define LOGSECURE_END 1 #define LOGSECURE_INTERMEDIATE 2 #define LOGSECURE_DEVICE 3 #define LOGSECURE_USER 4 // Commands for TCPID_LOGCA #define LOGSECURE_CAVERIFY 10 #define LOGSECURE_CASIGN 11 // Generic secure logging command #define TCPID_LOGSECURE "$LOGSECURE" // Format of the session identifier in replies #define TCPFMT_LOGSECURE_SESSION "%lu" // Start a log session // Parameters // 1 command // 2 database-ID for the project (work instruction) // 3 time stamp // 4 peer name // 5 database-ID of the user // 6 reason for connect // Returns: // status with database identifier for this session #define TCPFMT_LOGSECURE_START TCPID_LOGSECURE ",0,%u,%lu,\"%s\",%u,\"%s\"" // End a log session // Parameters // 1 command // 2 session identifier // 3 time stamp // 4 overall status // 5 textual description // Returns: // status with database identifier for this session (same a parameter 2) #define TCPFMT_LOGSECURE_END TCPID_LOGSECURE ",1,%lu,%lu,%u,\"%s\"" // Add a generic intermediate log entry (as a tree under a TCPID_LOGSECURE) // Parameters: // 1 command // 2 session identifier // 3 time stamp // 4 (not used) // 5 status or error code returned by the device // 6 textual description // Returns // status with database identifier for this session (same a parameter 2) #define TCPFMT_LOGSECURE_INTERM TCPID_LOGSECURE ",2,%lu,%lu,,%d,\"%s\"" // Add log entry for a device (as a tree under a TCPID_LOGSECURE) // Parameters: // 1 command // 2 session identifier // 3 time stamp // 4 database-ID for the device // 5 status or error code returned by the device // 6 textual description // Returns // status with database identifier for this session (same a parameter 2) #define TCPFMT_LOGSECURE_DEVICE TCPID_LOGSECURE ",3,%lu,%lu,%u,%d,\"%s\"" // Add log entry for a user (as a tree under a TCPID_LOGSECURE) // Parameters: // 1 command // 2 session identifier // 3 time stamp // 4 database-ID for the user // 5 status or error code // 6 textual description // Returns // status with database identifier for this session (same a parameter 2) #define TCPFMT_LOGSECURE_USER TCPID_LOGSECURE ",4,%lu,%lu,%u,%d,\"%s\"" // Add log entry on behalf of the CA Server // Parameters: // 1 command // 2 time stamp // 3 peer (common) name // 4 status or error code // 5 target (common) name // 6 serial number of the certificate #define TCPFMT_LOGCA_VERIFY TCPID_LOGSECURE ",10,%lu,\"%s\",%d,\"%s\",%u" #define TCPFMT_LOGCA_SIGN TCPID_LOGSECURE ",11,%lu,\"%s\",%d,\"%s\",%u" /* ** Commands for MTinfo Secure ** See "Server voor MTinfo Secure - SwDS", v2.00, sections 5.7.3.2--5.7.3.8 */ // Start a work instruction // Parameters: // 1 project identifier // 2 project name // 3 reason // 4 desired state // 5 device count // 6 user count // 7 user identifier (actor) // Returns: // nothing (status is delayed until TCPID_WIEND) #define TCPID_WISTART "$WISTART" #define TCP_N_WISTART (1 + 7) #define TCPFMT_WISTART TCPID_WISTART ",%u,\"%s\",\"%s\",\"%s\",%u,%u,%u" // Terminate a work instruction // Parameters: // 1 digital signature (hex encoded) // Returns: // status of the action indicated by TCPID_WISTART #define TCPID_WIEND "$WIEND" #define TCP_N_WIEND (1 + 1) #define TCPFMT_WIEND TCPID_WIEND ",\"%s\"" // Replies (intermediate and final, with number of devices that succeeded, // returned an error and those that timed out) #define TCPFMT_WIEND_INTERMEDIATE TCPFMT_STATUS_FMT ",%u" #define TCPFMT_WIEND_REPLY TCPFMT_STATUS ",\"%u,%u,%u" // Add a device to the device list of a work instruction // Parameters: // 1 device identifier // 2 flags // 3 imei // 4 serial number // 5 id-code // 6 verification code for an RS 3000 // 7 TCP-server that instantiates this device // Returns: // nothing (status is delayed until TCPID_WIEND) #define TCPID_WIDEVICE "$WIDEVICE" #define TCP_N_WIDEVICE (1 + 7) #define TCPFMT_WIDEVICE TCPID_WIDEVICE ",%u,\"0x%04X\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"" // Add a user to the list of allowed users for a work instruction // Parameters: // 1 user identifier // 2 user name // 3 i18n // 4 tz // 5 method of verification // 6 encoded verification code _or_ phone number of SMS verification // Returns: // nothing (status is delayed until TCPID_WIEND) #define TCPID_WIUSER "$WIUSER" #define TCP_N_WIUSER (1 + 6) #define TCPFMT_WIUSER TCPID_WIUSER ",%u,\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"" // Specify the user that makes a request to turn the switch on or off // Parameters: // 1 user identifier // 2 method of verification // Returns: // nothing (status is delayed until TCPID_WIEND) #define TCPID_WIREQ "$WIREQ" #define TCP_N_WIREQ (1 + 2) #define TCPFMT_WIREQ TCPID_WIREQ ",%u,\"%s\"" // Verify the user that makes a request to turn the switch on or off // Parameters: // 1 user identifier // 2 method of verification // 3 encoded verification code // Returns: // nothing (status is delayed until TCPID_WIEND) #define TCPID_WIVERIFY "$WIVERIFY" #define TCP_N_WIVERIFY (1 + 3) #define TCPFMT_WIVERIFY TCPID_WIVERIFY ",%u,\"%s\",\"%s\"" // Add an e-mail or phone number to the list of people/entities that // must receive an alarm messages when the verification protocol is // violated. // Parameters: // 1 Method (the string "sms" or "e-mail") // 2 E-mail address or phone number // Returns: // nothing (status is delayed until TCPID_WIEND) #define TCPID_WIALARM "$WIALARM" #define TCP_N_WIALARM (1 + 2) #define TCPFMT_WIALARM TCPID_WIALARM ",\"%s\",\"%s\"" // Override default time-out // Parameters: // 1 Time-out in seconds #define TCPID_WITO "$WITO" #define TCP_N_WITO (1 + 1) #define TCPFMT_WITO TCPID_WITO ",%u" /* ** Commands for the CA Server ** See "CA Server - SwRS-SwAS-SwDS", v1.00, sections 5.6.2.2 and 5.7.2.2 */ // Request to verify a certificate // Parameters: // 1 certificate to verify (PEM format, escaped) // Returns: // status and common name of the owner of the certificate: // TCPSTAT_OK if the certificate verifies okay // TCPERR_INVAL if not // TCPERR_STALE if the validity of the certificate has expired // TCPERR_UNKNOWN if the common name is unknown to MTinfo (Secure) #define TCPID_CAVRFY "$CAVRFY" #define TCP_N_CAVRFY (1 + 1) #define TCPFMT_CAVRFY TCPID_CAVRFY ",\"%s\"" // Request to sign a certificate // Parameters: // 1 certificate request (PEM format, escaped) // Returns: // status and signed certificate (PEM format, escaped) // TCPSTAT_OK if the certificate is signed // TCPERR_ACCESS if not #define TCPID_CASIGN "$CASIGN" #define TCP_N_CASIGN (1 + 1) #define TCPFMT_CASIGN TCPID_CASIGN ",\"%s\"" #endif /* _CP3000_CMD_H_COMMON */