464 lines
22 KiB
Plaintext
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}
|