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}
 |