2020-07-15 10:44:59 +02:00
\chapter { The Modem}
\section { Background}
2020-07-15 15:54:15 +02:00
The VT132 modem part is designed to provide a modified Hayes \texttt { AT} compatible command set for connecting over WiFi via TCP/IP
sockets with an optional Telnet protocol layer.
2020-07-15 10:44:59 +02:00
2020-07-21 15:50:44 +02:00
\begin { itemize} [leftmargin=1em]
2020-07-15 15:54:15 +02:00
\item The original \texttt { AT} command set was strictly in upper case. This is because the bit sequence of the ASCII values for \texttt { A} and \texttt { T} have
a specific property that enables autobaud detection of the connection to the data terminal equipment (DTE).
\item \textbf { The modem only responds to \texttt { AT} commands in upper case.}
\item Commands are terminated by \LKeyEnter \footnote { carriage return, \LKeyCtrlX { M} , \texttt { 0x0D} , decimal 13} usually generated by the \LKeyEnter { }
(\biolinum { Enter} or \biolinum { Return} ) key on your keyboard.
\item Commands can by edited, before pressing \LKeyEnter , using \LKeyBack \footnote { backspace, \LKeyCtrlX { H} , \texttt { 0x08} , decimal 8} to erase the previous
character entered. You may need to configure the terminal to generate \texttt { <BS>} when you press the \LKeyBack { } (backspace) key on your keyboard.
\item The \texttt { AT} command processor is based on a finite state machine (FSM). If you type anything that is not recognized by the rules of the
FSM you will immediately see an \texttt { Error} message.
2020-07-15 10:44:59 +02:00
\end { itemize}
2020-07-15 15:54:15 +02:00
\section { Communication}
\subsection { Baudrate}
To set the baudrate of the modem, press the \textbf { Prog} button on the VT132 module. After each press of this button, the modem outputs its new
baud rate to the serial port -- so you can press this button repeatedly until you can read your baud rate.
\subsection { Serial Port}
2020-07-21 15:50:44 +02:00
To communicate with the VT132 modem, you can use either the pins of the RC2014 extended bus (Rx2, Tx2) or the 6 pin header labelled \textit { Modem Port B} .
2020-07-15 15:54:15 +02:00
See section \vref { jumperheaders} \textit { (Jumper settings and headers)} for details.
2020-07-15 10:44:59 +02:00
\newpage
\section { Modem commands}
\subsection { Standard commands}
All commands (except \texttt { AT} by itself, \texttt { A/} and \texttt { +++} ) need to have (uppercase) \texttt { AT} prefixed.
\begin { tabular} { p{ 6em} | p{ 0.75\textwidth } }
\hline
\textbf { Command} & \textbf { Function} \\
\hline
2020-07-15 15:54:15 +02:00
AT & Test, answers \texttt { OK} \\
A/ & Repeat last command (immediate) \\
\$ & Show Help \\
I or I0 & Show modem model string \\
I1 & Show firmware version string \\
I2 & Show firmware build chain version string \\
Z & Modem soft reset \\
\& F & Restore factory defaults (does not store to NVRAM) \\
\& W & Write settings to NVRAM \\
2020-07-15 10:44:59 +02:00
D\textit { host:port} & Open connection to \textit { host:port} , port defaults to 23 \\
2020-07-15 15:54:15 +02:00
$ + + + $ & Escape from data mode to command mode \\
O & Return to data mode \\
H & Hangup \\
\& A & Enable Answer mode \\
A & Answer an incoming call \\
2020-07-15 10:44:59 +02:00
S\textit { n} & Select register \textit { n} as current register \\
2020-07-15 15:54:15 +02:00
? & Query current register \\
2020-07-15 10:44:59 +02:00
=\textit { r} & Set value of register to \textit { r} \\
S\textit { n} =\textit { r} & Set value of register \textit { n} to \textit { r} , eg. \texttt { S15=1} \\
\& K or \& K0 & Disable RTS/CTS flow control \\
\& K1 & Enable RTS/CTS flow control \\
\hline
\end { tabular}
\subsection { WiFi commands}
\begin { tabular} { p{ 6em} | p{ 0.75\textwidth } }
\hline
\textbf { Command} & \textbf { Function} \\
\hline
$ + $ W? & Show WiFi status \\
$ + $ W$ = $ \textit { sss} ,\textit { ppp} & Connect to WiFi SSID \textit { sss} using password \textit { ppp} \\
$ + $ W\$ & Show WiFi IP address \\
$ + $ W\# & Show Wi-Fi MAC address \\
$ + $ W$ + $ & (Re)connect to WiFi \\
$ + $ W$ - $ & Disconnect from WiFi \\
$ + $ B? & Query Baud Rate used on serial port \\
$ + $ B=\textit { n} & Set Baud Rate on serial port \newline
(4800, 9600, 14400, 19200, 38400, 57600, 115200) \\
$ + $ T? & Query Telnet TERM environment variable \\
$ + $ T=\textit { ttt} & Set Telnet TERM environment variable \\
\hline
\end { tabular}
\subsection { OTA update commands}
\begin { tabular} { p{ 6em} | p{ 0.75\textwidth } }
\hline
\textbf { Command} & \textbf { Function} \\
\hline
$ + $ U=\textit { url} & Set custom URL to fetch image from \\
$ + $ U? & Query for new version online and show status \\
$ + $ U\textasciicircum & Upgrade to queried version if it is newer \\
$ + $ U! & Force upgrade even if queried version is the same or older \\
$ + $ U\$ & Show OTA partition status \\
\hline
\end { tabular}
\subsection { Enable Telnet mode}
Use \texttt { ATS15=1} to enable Telnet mode.
\newpage
2020-07-15 15:54:15 +02:00
\section { S Registers}
2020-07-15 10:44:59 +02:00
\label { sregister}
2020-07-15 15:54:15 +02:00
The modem has a total of 51 S registers, \texttt { S0} to \texttt { S50} .
2020-07-15 10:44:59 +02:00
Most of them are undefined and unused. The following table lists all defined registers that are used by the VT132 modem part.
\begin { tabulary} { \textwidth } { L | L | L}
\hline
\mbox { \textbf { Register} } & \mbox { \textbf { Default} } & \textbf { Function} \\
\hline
S0 & 0 & Number of rings before Auto-Answer \newline (0-255, 0 = never) \\
S1 & 0 & Ring Counter (0-255 rings) \\
S14 & 23 & TCP/IP Port for Answer Mode (0-65535) \\
S15 & 0 & Telnet Protocol for Data Mode (0/1) \\
S16 & 3 & Negotiate Telnet SGA (0/1/2/3) \\
S17 & 3 & Negotiate Telnet ECHO (0/1/2/3) \\
S18 & 0 & Negotiate Telnet BIN (0/1/2/3) \\
S19 & 3 & Negotiate Telnet NAWS (0/1/2/3) \\
S20 & 80 & NAWS Negotiate Columns (0-255) \\
S21 & 24 & NAWS Negotiate Rows (0-255) \\
S22 & 3 & Negotiate Telnet TERMINAL-TYPE (0/1/2/3) \\
S39 & 0 & RTS/CTS Flow Control (0/1, set by AT\& K) \\
\hline
\end { tabulary}
\bigskip
\begin { tabular} { rl}
0/1: & 0 - disabled, 1 - enabled \\
0/1/2/3: & 0 - Won't/Don't, 1 - Will, 2 - Do, 3 - Will/Do \\
\end { tabular}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%55
\newpage
2020-07-15 15:54:15 +02:00
\section { Messages}
2020-07-15 10:44:59 +02:00
\subsection { Dial response messages}
The following table shows the responses to the dial command \texttt { ATDhost:port}
\medskip
\begin { tabular} { p{ 8em} | p{ 0.68\textwidth } }
\hline
\textbf { Response} & \textbf { Reason} \\
\hline
\footnotesize { \texttt { NO DIALTONE} } & no Wi-Fi connection has been established with an AP \\
\footnotesize { \texttt { ALREADY IN CALL} } & a connection is already established ('Dialed' or 'Answered') with another host \\
\footnotesize { \texttt { ERROR} } & no hostname is provided \\
\footnotesize { \texttt { NO ANSWER} } & no socket can be opened to the remote \textit { hostname} :\textit { port} \\
\footnotesize { \texttt { CONNECT} } & a socket connection is opened with \textit { hostname} :\textit { port} \\
\footnotesize { \texttt { CONNECT TELNET} } & a Telnet connection is opened with \textit { hostname} :\textit { port} \\
\hline
\end { tabular}
\subsection { Query Wi-Fi status messages}
The following table shows the responses to the \textbf { Query WiFi status} command \texttt { AT+W?}
\medskip
\begin { tabular} { p{ 10.5em} | p{ 0.6\textwidth } }
\hline
\textbf { Response} & \textbf { Reason} \\
\hline
\footnotesize { \texttt { WIFI NOT STARTED} } & no Wi-Fi connection has been attempted since power-on or hardware reset \\
\footnotesize { \texttt { WIFI IDLE} } & Wi-Fi status is queried during a connection attempt \\
\footnotesize { \texttt { WIFI NO SSID} } & no AP with the given SSID/password is found following the \texttt { AT+W+} or \texttt { AT+W=} \dots commands \\
\footnotesize { \texttt { WIFI CONNECTED} } & connection successful to an AP with the \texttt { AT+W+} or \texttt { AT+W=} \dots commands \\
\footnotesize { \texttt { WIFI CONNECT FAILED} } & tba \\
\footnotesize { \texttt { WIFI CONNECTION LOST} } & lost connection with the AP \\
\footnotesize { \texttt { WIFI DISCONNECTED} } & unsuccessful connection attempt, or a successful disconnection with the \texttt { AT+W-} command \\
\hline
\end { tabular}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newpage
\section { Telnet}
\subsection { Telnet options}
The VT132 supports the following Telnet options:
2020-07-21 15:50:44 +02:00
\begin { itemize} [leftmargin=1em]
2020-07-15 15:54:15 +02:00
\item SGA (Suppress Go Ahead)
\item ECHO
\item BIN (Binary Transmission)
\item NAWS (Negotiate About Window Size)
\item TERMINAL-TYPE
2020-07-15 10:44:59 +02:00
\end { itemize}
2020-07-22 20:01:21 +02:00
Each Telnet Option is negotiated via a request/response exchange described as \textit { Do/Don't} (request) and \textit { Will/Won't} (response).
2020-07-15 15:54:15 +02:00
Trying to understand how these work for each Option usually requires reading the RFC and extreme patience and experimentation.
2020-07-15 10:44:59 +02:00
2020-07-22 20:01:21 +02:00
Usually you either want an Option completely \textbf { On} (Do/Will) or \textbf { Off} (Don't/Won't).
2020-07-15 10:44:59 +02:00
2020-07-15 15:54:15 +02:00
Setting the supported Options and their default values are defined via specific S Registers \vref { sregister} .
2020-07-15 10:44:59 +02:00
In summary the defaults are:
\begin { tabular} { p{ 6em} | p{ 5.5em} | p{ 0.55\textwidth } }
\hline
\textbf { Option} & \textbf { Default} & \textbf { Description} \\
\hline
2020-07-22 20:01:21 +02:00
SGA & Do/Will & Required for the NVT to work character by character and not in linemode \\
2020-07-15 10:44:59 +02:00
ECHO & Do/Will & tba \\
BIN & Don't/Won't & To operate as an NVT, binary mode is not required. File transfer protocols like KERMIT and XMODEM do their own binary encoding \\
NAWS & Do/Will & The remote host can learn your terminal windows size in characters, the default is 80 x 24 set in S20 and S21 respectively \\
TERMINAL-TYPE & Do/Will & The remote host can learn your terminal type, the default is vt100 \\
\hline
\end { tabular}
\bigskip
The \texttt { TERMINAL-TYPE} must be known by the remote system to be recognised.
2020-07-15 15:54:15 +02:00
When connecting to \texttt { telnetd} on MacOS I use \texttt { vt100+} from the \texttt { terminfo} database which provides support for color over and above the standard
\texttt { vt100} terminal type, making text applications like \texttt { htop} work as expected and in color.
2020-07-15 10:44:59 +02:00
\subsection { Enabling Telnet Protocol}
2020-07-21 15:50:44 +02:00
Telnet protocol is \textbf { not} enabled by default. To enable it, set the S Register S15 to 1 manually:
2020-07-15 10:44:59 +02:00
2020-07-21 15:50:44 +02:00
\begin { itemize} [leftmargin=1em]
\item Enable Telnet using: \texttt { ATS15=1}
\item Disable Telnet using: \texttt { ATS15=0}
2020-07-15 10:44:59 +02:00
\end { itemize}
The Telnet protocol is applied to both \textbf { outgoing} connections 'Dialed' with ATD and \textbf { incoming} connections 'Answered' with \texttt { ATA} or Auto-answer.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newpage
\section { Answer Mode}
Listening for incoming TCP/IP socket connections is \textbf { not enabled} by default.
2020-07-21 15:50:44 +02:00
\begin { itemize} [leftmargin=1em]
2020-07-15 15:54:15 +02:00
\item To \textbf { enable} listening for incoming TCP/IP socket connections you must manually enter \texttt { AT\& A} to \textit { Enable Answer Mode} .
\item Answer Mode will remain enabled, and can only disabled by an \texttt { ATZ} (Soft Reset), hardware reset or power-cycle.
\item Incoming TCP/IP socket connections will cause the modem to respond with \texttt { RING} , repeated every three (3) seconds.
\item As each \texttt { RING} occurs the Ring Counter in \texttt { S1} is incremented by one (1).
\item The user can \textit { Answer} the incoming call at any time with \texttt { ATA} and the modem will accept the TCP/IP socket connection and enter \textbf { Data Mode} .
\item If the \textbf { Number of rings before Auto-Answer} is set in \texttt { S0} to a number greater than zero (0 = never) and \texttt { S1} is greater-then-or-equal to
\texttt { S0} the modem will \textit { Auto-answer} : accept the TCP/IP socket connection and enter \textbf { Data Mode} .
\item If Telnet protocol is enabled by \texttt { ATS15=1} then the Telnet Protocol will be negotiated with the remote host after the modem enters \textbf { Data Mode} .
\item The user can \textit { Hangup} an incoming call by sending the Escape Sequence \texttt { +++} (with guard times) to return to \textbf { Command Mode} and then sending
\texttt { ATH} to \textit { Hangup} .
\item A Hangup \texttt { ATH} will reset the Ring Counter in \texttt { S1} to zero (0).
2020-07-15 10:44:59 +02:00
\end { itemize}