techreview/techreview.latex

464 lines
22 KiB
Plaintext

\documentclass[10pt, draftclsnofoot,onecolumn, compsoc]{IEEEtran}
\def\changemargin#1#2{\list{}{\rightmargin#2\leftmargin#1}\item[]}
\let\endchangemargin=\endlist
\usepackage{todonotes}
\usepackage{caption}
\usepackage{pgfgantt}
\linespread{1}
\begin{document}
\title{Fenceless Grazing Tech Review - Danila Fedorin}
\author{Danila Fedorin, \and Matthew Sessions, \and Ryan Alder}
\maketitle
\begin{abstract}
The Fenceless Grazing Collar System aims to reduce the burden
on farmers caused by the need of constant manual herding of livestock.
The project will use LoRa wireless technology, and will prevent
animals from leaving prescribed grazing areas through the use of
an auditory or electrical stimulus. The project will additionally provide
data gathering features. As a member of the FGC team, I will be
responsible for creating the smart application that will be used
to control the wireless collars, as well as some supporting
software such as an HTTP API server.
\end{abstract}
\pagebreak
\tableofcontents
\pagebreak
% TODO: She wanted something with "my role"?
% TODO: She wanted a more specific abstract.
\section{Role}
My role in this project is the development of the smart application which
will be used to control the Fenceless Grazing Collars in the field. This
includes the actual application, as well as the software to support
the app, such as a web server for authentication and data retrieval.
\section{Team Goal}
The goal of the Fenceless Grazing Collar (FGC) System is to reduce
the amount of manual labor required for keeping farm animals. The FGC system
does this by automating the process of keeping animals within their prescribed
grazing area through the use of GPS location tracking, as well as audio
and electric stimuli. Additionally, the FGC aims to provide information
about the behavior of the farm animals to their keepers, with the goal
of improving their understanding of the livestock.
\section{Selection Criteria}
Because there is no ideal technical solution, the tradeoffs
of every possible technical solution must be analyzed through specific
critera. The Fenceless Grazing Collar system is intended for actual
use in the field by non-technical personnel, and therefore has
the following concrete design concerns:
\begin{itemize}
\item \emph{Accessibility:} The system must be configurable and usable
without a significant learning curve. This means, among other things,
that the user interface of the system must be in some way familliar
to the users (farmers).
\item \emph{Cost:} The entire idea of the project is to reduce the amount
of time and resources that is currently spent by farmers on herding
livestock. If the system is not cost-effective, it does not efficiently
replace farmers, and therefore, is not worth it to the users.
\item \emph{Maintainability:} While this metric is not necessarily reflected
externally, it's nonetheless an important consideration. The software
written for this project must be easy to support and maintain in the future.
This is a goal for most long-term projects.
\item \emph{Reliability:} The system must be reliable, since failures may lead
to loss of livestock or property. This means that communication between
the various components of the project must be effective and consistent,
and that bugs occurring in the codebase have a high cost to the users.
\end{itemize}
\section{Responsibilities}
\subsection{Smart Device Application}
A major component of this project is the creation
of an application that is capable of adjusting
the settings of the wireless collar devices. This
section describes the components of this application.
\subsubsection{Platform}
Either the Android or the iOS platform could be used
for the smart application. These platforms require entirely
different tooling and codebases, as well as different types
of devices (Apple phones only run iOS, while Android devices
only run Android).
From the perspective of \emph{Accessibility}, Android is better
suited for this project. This is because the Android platform
makes up more than half of the market share in the United States \cite{android-share},
with a majority of the remaining share taken up by Apple iOS. Furthermore,
because Android devices are on average 50\% cheaper than Apple devices\cite{iphone-price}, the barrier
to purchasing new technology to accomodate the smart application would
be lower if Android was used. This is also a benefit from the \emph{Cost} perspective.
Because the Android platform has advantages in terms of both the \emph{Accessibility}
and the \emph{Cost} aspect, this is the optimal technology to use for the
FGC project.
\subsubsection{Language}
There exists a variety of available technologies and techniques suitable
for creating an Android application. The most common way for developing
Android apps is using the Java programming language,
utilizing the standard Android tooling. Such tooling includes
the Android Studio Integrated Development Environment (IDE),
and the Gradle build system. However, since Android's creation,
multiple other ways of developing Android applications have been introduced. For
example, technologies such as the Ionic Framework \cite{ionic} and
React Native \cite{react-native} have been created, allowing for the creation
of Android applications using the JavaScript programming
language. More recently, Google announced that JetBrains' Kotlin
language will be made an official language of the Android
platform \cite{android-kotlin}.
%https://ionicframework.com/
%https://facebook.github.io/react-native/
%https://www.theverge.com/2017/5/17/15654988/google-jet-brains-kotlin-programming-language-android-development-io-2017
The \emph{Maintainability} persepctive is most imprtant for decisions
in this area: The chosen language may significantly affect the difficulty
of developing and maintaining the smart application. From this perspective,
JavaScript-based frameworks such as Ionic and React Native are
at a disadvantage. They have weak type systems, which means that they
do not undergo a process called "type checking". This, in turn,
means that certain bugs that can easily be detected in other languages may
go unnoticed in a JavaScript program until they are observed in practice, making
it harder to ensure high software quality. Furthermore, the weak type system
property is also detrimental in terms of \emph{Reliability}: if bugs may
slip directly into the real-world usage of the application, there is
no way to guarantee consistent good behavior.
Between Java and Kotlin, Kotlin has a still stronger type system, helping
prevent more bugs at compile-time than Java. It is also a language
with less "boilerplate" code, which eases maintenance and
reduces needless complexity in resulting software. Both
of these are benefits to \emph{Maintainability}. Besides this,
because Kotlin is a language that runs on the Java Virtual Machine,
there are no features of the Android platform that can be done
with Java and not with Kotlin. As such, Kotlin is at the very
least equally as powerful as Java, and with the benefits outlined
above, it should be the language of choice for the project.
\subsubsection{Backwards Compatibility}
Because vendors can customize the Android operating system prior
to using it on their products, a variety of Android devices
run an "outdated" version of the Android platform, resulting
in a severe fragmentation of the overall codebase. Since maintaining
compatibility with every Android version on the market is not viable,
the project will focus on the version of Android supported by 95\%
of Android devices at the time the project implementation begins.
This will allow the project to target a majority of available
devices, while at the same time not being bogged down by the
compatibility requirements with very old version of Android.
\subsection{Data Storage}
Data storage is a major component of the fenceless grazing project.
It is important that the collars collect and store meaningful data
about the animals in the field, to be analyzed by the client.
\subsubsection{Type of Data Collected}
The data collected will consist of GPS coordinates of the animal,
taken every 15 seconds, as well as instances of the activation
of the collars' sound and shock features. This way, the client
can monitor the locations and habits of the animals, as well
as quantitatively assess the number of items that the animals
attempt to leave the prescribed area. Each data point will
be associated with the collar that produced it, such that
behaviors of individual animals can be easily analyzed.
\subsubsection{Storage Server}
Two major categories of storage servers are available at the
present time: SQL and NoSQL databases. SQL-based systems
store data in relational format, turning each piece of
data into a collection of related entries in one or more
tables. On the other hand, NoSQL systems store data in
arbitrary formats (i.e., as potentially more complex entities
than entries in a table).
SQL and NoSQL are largely equivalent in terms of the criteria
presented at the top of this document. However, because
SQL systems enforce a particular format for data (in
contrast to NoSQL systems, which allow data of various,
unpredictable formats), and because the type of data
that will be stored by the FGC project is known ahead
of time, SQL systems offer a slight advantage to
\emph{Maintainability}. This is because "invalid" data
can be detected and reported immediately as it is stored in
the database. External applications that access the database
(such as the API server) may contain bugs pertaining to
data storage, and having an additional layer of verification
in the storage server will help detect and fix those bugs.
Among SQL systems, three are most commonly used: MariaDB
\cite{mariadb}, MySQL\cite{mysql}, and SQLite. SQLite
is a simple SQL-based database system: it doesn't use
a standalone server, unlike MariaDB and MySQL, and
is simply used from inside other applications as a library.
MySQL and MariaDB, on the other hand, are server-based
database systems. Applications needing to store information
into the databases must first establish a connection to
the database server. MariaDB and MySQL are nearly identical
in terms of functionality, although MariaDB has a more
permissive license.
In terms of \emph{Maintainability}, SQLite is at a slight
disadvantage to the rest of the SQL-based systems due to
its restricted feature set. SQLite supports a subset of
the operations supprted by MySQL and MariaDB, and therefore
may be restrictive in the long run. In terms of \emph{Cost},
MySQL is at a disadvantage due to its prohibitive license:
it is non-free software in terms of price, and although
it has a "free" version, this version receives security
updates and fixes at a slower pace. Since MariaDB
is entirely free and open source, but maintains
the features of MySQL, it is best choice for this project.
\subsubsection{Storage Hardware}
Because MariaDB and MySQL require a server machine, such
a machine must be part of the final design. This
can be achieved with a standard server computer,
a VPS host, or a single-board computer such as a Raspberry Pi \cite{raspi}.
The Raspberry Pi is a promising option in terms of both
\emph{Cost} and \emph{Maintainability}. It is a small, single-board
computer that costs approximately \$30, and is fully
capable of running a Linux distribution such as
Debian (or Raspbian). After the initial cost
of the purchase, the Raspberry Pi will not consume
significant amounts of power, and thus remain very cheap
in the long run. The advantage to maintainability is
due to its official support for various additional
hardware modules, such as modules for the LoRa
protocol used in other parts of the project. By
combining the functionality of the LoRa receiver
and the API server, the complexity of the overall
system can be greatly reduced, making it easier
to design and maintain.
A VPS host would have both benefits and drawbacks
in terms of \emph{Maintainability} and \emph{Cost},
although it is superior in terms of \emph{Reliability}.
A Virtual Private Server is a Linux server that is hosted
by another company for a monthly or yearly fee. The costs
of such servers are fairly small: common VPS packages
cost around \$5 per month, which is an adequate price
for such a product. However, unlike the Raspberry Pi,
these costs would accumulate over time, since a VPS
is a subscription-based service. Furthermore, unlike
the Raspberry Pi, the VPS does not support any additional
hardware. Therefore, another device would need to
be constructed to receive data from the Fenceless Grazing
Collars in the field, and forward that data to the VPS
for storage. This increases the complexity of the system,
thereby making software for it more difficult to develop and
maintain. The main advantage of a VPS host is that it
will be guaranteed to remain functional at all times
without the need for additional support, preventing
unexpected outages and therefore increasing reliability.
For this project, a standard server machine is practically
the worst of both worlds. Unlike the Raspberry Pi, which
has support for additional hardware through a standardized
and officially supported interface, a regular server computer
would require additional modification to be able to interface
with LoRa devices in the field (or, just like the VPS host,
it would require an additional dedicated device to receive
and forward LoRa communication). Furthermore, unlike
a VPS host, it will potentially require support (in
events such as power outages or network failures), which
may result in temporary failures, a major downside from
the perspective of \emph{Reliability}.
Between a VPS host and a Raspberry Pi, the latter appears
better suited for the project due the simplicity of integrating
it into the system. No additional hardware or components
would be necessary, reducing the surface area for failures
(thereby benefitting \emph{Reliability}), and the cost
after the initial investment would be minimal, benefitting \emph{Cost}.
As such, a Raspberry Pi should be used for this project.
\subsection{App API Server}
An API server is needed to allow users of the Android
smart application to interact with the fenceless collars
deployed on farm animals. Smartphones do not have
hardware that can communicate using the LoRa protocol,
which is used for collars. As such, an intermediate
device - a server that can communicate with both smartphones
and LoRa - must be used.
\subsubsection{Server Hardware}
It is possible to use the aforementioned Linux storage machine
as the hardware for the API server. This would have benefits
in terms of \emph{Cost} and \emph{Maintainability},
while having certain drawbacks in terms of \emph{Reliability}.
It would be cheaper to use the existing hardware for the API
server: no further purchases would be necessary besides
the Raspberry Pi, VPS, or other server described
in the sections above. Furthermore, such a configuration
would be maintainable, since it eliminates the complexity
of managing two separate server instances and their communication
with each other. On the other hand, this approach
would couple the health of the API server to the health
of the database server: if one suffers a hardware or critical
software failure, so will the other. This means that
the API/data server will be a major point of failure.
The alternative approach would be to have a separate
API server. Since no special-purpose hardware would
be needed for this task, by the logic in the Storage Hardware
section, a VPS host would tbe most likely candidate for
such a server. This would bring in the advantage
of \emph{Reliability}, but could complicate the system
making it less \emph{Maintainable}. Furthermore,
since such a configuration would introduce the need
for communication between the API server and the data
server, this exposes more area for bugs and faults.
Because it is cheaper and less complex to set up
the API server on the same hardware as the data
server (the Raspberry Pi), this should be the
configuration of choice for this project.
\subsubsection{Server Language}
Virtually any language can be used for developing an API.
Python \cite{python} and Rust are some of the viable
options for this project.
Unlike Python, Rust a complicated type system, which is one of its
main selling points. The type system prevents many
classes of bugs that are common in software products,
especially those that use concurrency. It is therefore,
in a way, more \emph{Maintainable} than th other alternatives,
by the same logic that made Koltin more maintainable than
the alternatives for smart application development.
Python is a dynamically typed language, and as such does
not benefit from type checking directly. It thus suffers
in comparison to Rust in terms of maintainability. However,
Python's main advantage for this project is that it is
the official language of the Raspberry Pi, and therefore
can be used for certain hardware manipulation tasks
that are more difficult in other languages. Because
the API server will be tied to LoRa, which is an external
hardware module, using Python for the entire
project will make the end product \emph{more} maintainable,
since there will be no need for additional frameworks,
libraries, or other components to bridge the gap between
the implementation language and the hardware.
Because of its first-class support for hardware manipulation
on the Raspberry Pi, Python is significantly better for
this project than other possible languages.
\subsubsection{Server Software}
Special software is typically used to expose a web application
to the outside world (which is necessary for other components,
such as the smart application, to access the API server). Apache,
nginx, and Gunicorn\cite{gunicorn} are valid options for this purpose.
Gunicorn is superior in terms of \emph{Maintainability} due to
its simplicity. Whereas both Apache and nginx are general-purpose
server software, which have powerful configuration options and
complex execution models, Gunicorn does one thing: host Python
web applications. Since the API server is not intended to be
a complex system, it will not benefit from additional configurability
provided by Apache or nginx, and will therefore reduce the cognitive
load on team members as they work on the project.
\subsubsection{Authentication}
JWT and Cookie-based approaches can be used to perform
authentication in the API server.
The idea of JWT is that a JSON (JavaScript Object Notation) object, containing
session information (such as the identity of the current user),
is encrypted with information from the server. The encrypted
version of this object is then sent to the user, and can be
used as a "proof of identity". Since only the server can decrypt
the token, the user cannot deliberately make changes to it, preventing
security breaches. Once a user logs in, a JWT token will be generated,
containing the identity of the user and an expiration date, and
returned to the app. The app will then use the token for further
requests. This technology is useful in terms of \emph{Maintainablity},
since it is widely supported by most programming languages, and does
not require the use of a browser. Thus, if the project migrates
to other platforms in the future, the technical cost of implementing
authentication on these new platforms will be negligible.
Cookie-based authentication systems are commonly used in web applications,
serving as a different way to avoid authentication on every API or web request. However,
this approach will not generalize well. Using cookie or session-based
authentication requires more extensive bookkeeping on the client side, which
complicates the implementation of other clients. In the future, it is
likely that the smart application will be ported to other platforms,
including iOS and Web. To ease this expansion, the approach
requiring the least additional implementation overhead is preferred.
Because of this criterion, JWT-based authentication is better suited
for the API server.
Because of the above issues with Cookie-based authentication, JWT
should be used for this project due to its benefits to \emph{Maintainability}.
\subsubsection{API}
There are several ways of communicating data to the mobile application
from the server. Because writing custom code to encode / decode data
sent between the android application (client) and the server is
time consuming and prone to errors, priority is given to existing
encoding / decoding technologies. Of these technologies, Google's
ProtoBuf \cite{protobuf}, XML, and JSON are the most viable.
% TODO I guess you can talk about protobuf need to regenerate shit
JSON should be used for this project because of the ease with which it can be decoded,
as well as due to its compatibility with the JavaScript ecosystem.
Virtually every language (including Kotlin and Python) has support
for JSON decoding that is well-tested and supported. This makes
JSON the most standard choice for an interchange format. These
benefits give a huge boost to \emph{Maintainability}, since
little additional work needs to be done to handle JSON in most
modern systems.
\pagebreak
\begin{thebibliography}{99}
\bibitem{android-share}Alex Cocotas, \textit{Android Bounces Back From U.S. Market Share Decline} \\
\texttt{https://www.businessinsider.com/android-stops-us-market-share-decline-2013-5}
\bibitem{iphone-price}Amit Chowdhry, \textit{Average iPhone Price Increases To $687 And Android Decreases To $254, Says Report} \\
\texttt{https://www.forbes.com/sites/amitchowdhry/2015/02/03/average-iphone-price-increases-to-687-and-android-decreases-to-254-says-report/\#437c18ac539e}
\bibitem{ionic}\textit{Ionic Framework} \\
\texttt{https://ionicframework.com/}
\bibitem{react-native}\textit{React Native} \\
\texttt{https://facebook.github.io/react-native/}
\bibitem{android-kotlin}Paul Miller, \textit{Google is adding Kotlin as an official programming language for Android development} \\
\texttt{https://www.theverge.com/2017/5/17/15654988/google-jet-brains-kotlin-programming-language-android-development-io-2017}
\bibitem{mariadb}\textit{MariaDB} \\
\texttt{https://mariadb.org/}
\bibitem{mysql}\textit{MySQL} \\
\texttt{https://www.mysql.com/}
\bibitem{raspi}\textit{Raspberry Pi} \\
\texttt{https://www.raspberrypi.org/}
\bibitem{python}\textit{Python} \\
\texttt{https://www.python.org/}
\bibitem{gunicorn}\textit{GUnicorn} \\
\texttt{https://gunicorn.org/}
\bibitem{protobuf}\textit{Protocol Buffer} \\
\texttt{https://developers.google.com/protocol-buffers}
\end{thebibliography}
\end{document}