varunsk00
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # ECE564project: Perygee Hub Companion App App architecture and UI wireframes can be found on our [Figma](https://www.figma.com/file/lRm7zGEXkX3TQMgSwK6V8P/Perygee-Application-ECE564?node-id=0%3A1). An overview of the writeups for app architecture, features, apis, etc can be found [here](https://docs.google.com/document/d/10R-Px_YxAACcKHnQKZvaR9Pyn6CfoXPsKg051YsbpFM/edit?usp=sharing). A presentation on the App's purpose, functionality, and primary features can be found [here](https://docs.google.com/presentation/d/1tysyLxoBlR1xTHJHvBKbhqsr2-MQ3mVAJyLcOpGRGjs/edit?usp=sharing). ### Developers Abhijay Suhag (as866) Frank Tang (ft39) Varun Kosgi (vsk10) ### Timeline Start Date: March 23, 2021 Submission Date: April 22, 2021 Hours Spent: 100+ (~30-40 hours each) ### Introduction Perygee is an Internet of Things (IoT) Security platform aiming to secure enterprise users' most critical connected infrastructure devices. By providing Perygee Hubs that facilitate communication between enterprise networks and the Perygee Cloud, Perygee offers real-time monitoring, detection, and prevention of the world's most dangerous cybersecurity threats. ### Functionality The Perygee Hub Companion App was designed to assist in the setup and monitoring of Perygee Hubs and their associated devices, which are meant to secure IoT devices in real-time and provide crucial analytics on network behavior. #### Implemented Features * Hub Setup * Scan a QR Code to register and configure a Perygee Hub * Parses text data from QR code to gather new Hub's relevant parameters * Call a GraphQL add mutation to update company's Hasura backend database with new Hub information, including user's current location (representing Hub location) * Hub Directory * View and edit all Hubs and Devices on a Network * Calls a GraphQL query to fetch all Hubs from the server * Populates Table View to allow User to scroll through and tap for more information on each Hub. * Uses universal search bar to narrow down Hubs based on parameters * Swipes on a cell to edit and delete Hub from directory (via GraphQL calls) * Views Hub info/devices and edit Hub image, location, name, and manufacturer * Device Directory * User can tap to see a Hub's associated devices from the database (separate table in GraphQL, accessed with conditional query) * Associated devices can also be tapped to see more info and edit devices' images, locations, names, manufacturers, and priorities. * Hub Location Visualization * Monitor Hubs at different geographical locations * Hubs dynamically appear on Map View based on parsed latitude and longitude from server * Click into each Hub directly from Mapview to either view information about the Hub or edit Hub's parameters (dynamic segue) * Clustering allows for a clean view of groups of hubs from a distance * Change the detail and look of the map on the fly through the segmented controller on the navigation bar * Analytics Dashboard * Aggregate network insights into customizable widgets * View aggregate hub info, including count, packet info, and availability * Drag and drop widgets into different slots on dashboard * Long press on a widget to get the option to remove it from the Dashboard * Swap same size widgets * Add widgets from a Widget Library by swiping in from the left ### Primary Roles #### Abhijay * Dashboard and Widget Library * Custom widgets for viewing data in various ways using Charts framework, complete with collision handling, swaping, deleting, animations * Separate view controllers for active and inactive widgets * Timers for periodic data pulling from GraphQL or from a set of mock data * Added haptic feedback to notify user of deletion and addition success and fail * Map View * Custom annotation views for single hubs and for clustered hubs * Custom callout for single hub annotations that display picture, location, and buttons for seguing to read-only/edit detail views * Dynamic map type switching via segmented controller * Added haptic feedback to notify user that an annotation was successfully clicked, and that a button in the annotation was successfully pressed * QR Scanning * Researched into framework, modified existing QR code to start and stop camera sessions and retrieve meta data * Created a custom scanner overlay with a mask, indicator box, highlighted region, and instruciton label * Alert functions for repeated QR code scans * Directory TableView * Setup and overall design - curved imageviews, curved cells * Created and implemented collapsible headers * Detail View Controllers * Added image selection with both camera and photo album * Storyboard * Setup initial project Storyboard with TabBarViewController and main VCs/segues #### Frank * Perygee Hub and Perygee Device directory controllers * Hub and Device detail view controllers that show detailed information about each hub/device stored on Perygee Hasura Server * Live editing capabilities from these pages of hubs/devices directly to server * Developed the basic structure of a TableView in a UIView to showcase the hub/device list and details * Testing for bugs and racing conditions when viewing and editing pages * Data Model development * Assisted development with JSON codability and GraphQL compatibility with Varun * QR Scanning * Created the QR string parser/format for making hubs * Storyboard * Created the original hub and device detail VCs and linked many of the segues to the detail pages (e.g. mapView to Detail) #### Varun * GraphQL Server integration * Apollo framework to authenticate and post queries/mutation to Perygee Server * Defined parameters in database and coded appropriate parsing from calls * Editing of Hubs & Devices on server from app * Data Model development * Parameter development with JSON codability and GraphQL compatibility * Parsing of DataModel into Table Views * Directory TableView Controller * Search functionality for Hubs * Cell population, deletion, and active server refreshing * Map View Controller * Developed initial population of annotations from hub latitudes and longitudes from server * QR Scan Controller * Addition of new Hub to database upon QR Scan ### Frameworks Used * Apollo - GraphQL Integration (See auto-generated **GraphQLAPI.swift** for auto-generated methods) * Had to run introspection query on company database to find all possible calls (had to program authentication manually) * Then ran .sh script provided by framework, in addition to the queries/mutations defined in get_hub.graphql, to auto generate GraphQL method calls in **GraphQLAPI.swift** * Called methods within appilcation to perform qeuries or mutations * Charts - Dashboard View * Learned api for multiple modes of data presentation such as LineChartView, BarChartView, PieChartView * Customization as well as data initialization and periodic updating * AV Foundation - QR Scan * Researched metadata parsing and video layers * MapKit - Hub Map View * Researched into clustering, custom annotation views, numerous delegate functions ### Running the Application **Location Permission Note:** Upon running the app, the app will ask for location permission. For the QR code scanning and hub instantiation to work, location permission needs to be granted, otherwise an alert/error will pop up. * **Dashboard/Analytics Page** - This page has graphs and statistics available to admins about the hubs and devices in their network. * **Widgets** - Multiple dashboard widgets that show different network analytics. For the sake of the project, several of the widgets showcase mock data, but the hub and device totals pull data from the hasura server and change dynamically * **Movement** - By pressing and holding down on a widget, the widget will begin to wiggle, showing a delete button in the top-right hand corner of the widget. The user can then move this widget around on the dashboard to a new dashboard location. If the user tried to move the widget into the cell of a similarly-sized widget, the moving widget will move static widget out of the cell. **Note:** An easy way to see this is to press and hold the hub/device totals widget in the top-right corner and slide it over the availability widget in the top-left corner. * **Widget Library** - The dashboard also has several other widgets in a widget library that users can add/remove into the main dashboard page if there is space. To see this, press and hold on a widget and delete it from the dashboard page. By swiping right from the left side of the application, a widget library will pop up with all the different widgets that can be used in the dashboard. By tapping on a widget, the widget will be added in the closest available slot in the dashboard. **Note:** An easy way to see this is to delete one of the medium-sized widget (a widget that takes up an entire row e.g. unauthorized usage widget.) By going into the app library, tapping on another medium widget will populate the dashboard page with it. * **Directory Page** - This page has a listing of all the hubs in the network, seguing into the details of the hub, the device list of a hub, and the details of a device * **Tableview** - All the controllers in the Directory Page chain use a tableview of sorts to display data. For the directory and deviceList VCs, these tableviews display hubs and devices respectively that can be selected to segue into the details of said hub or device. In the hubDetail and deviceDetail pages, the tableview is used to list the details about a hub or device * **Server Fetching** - The main directory page has a refresh button in the top-right that will do a full server fetch from the Perygee cloud to populate the hub directory. The same server fetch can be done by pulling down on the directory. This makes it so that a user can keep up-to-date information about their network. **Note:** An easy way to test this is by having two devices and scanning in a new hub with the QR scanner on one of the phones. By being on the directory page on the other phone, we can click refresh or pull down to refresh and see that the new hub will pop up on our directory, showing that the app is fetching data from the Perygee Cloud * **Swipe Action** - On the main directory page, the hub cells have a swipe action handler that allows users to do two things: delete a hub or go directly to editing a hub. By swiping right to left, the user can access these buttons. * **Deleting** - Swiping all the way from the right to the left will delete the hub from the directory and the Perygee cloud (it is not recommended to delete too many hubs, as this will cause them to be permanently deleted from the Perygee cloud until reinstantiated). The same functionality can be done by pressing the "Delete" button when it shows up from swiping on a cell. * **Editing** - By pressing on the "Edit" button in the swipe menu, a user can go directly to the hub detail page in edit mode. This allows for faster access into editing the hubs. * **Search Bar** - The directory page also has a search bar to filter through all the different hubs. This search is based on an auto-generated description made from the hub's details. * **Collapsible Sections** - The directory page also has collapsible sections. This can be done by pressing the small triangle button on the section header in order to minimize all the hubs in that section * **Hub Detail Page** - This page holds all the details about a hub, such as its name, IP address, MAC address, etc. This is to provide more details about the hubs and allows a user to segue into the devices that hub protects * **Live Hub Editing** - On the hub detail page, a user can directly edit the hub on the app, which will then save to the Perygee cloud using a GraphQL mutation. This is done by being in edit mode, which can be achieved by using the edit button from the directory or the edit button in the top-right corner. By being in edit mode, certain fields are enabled for editing -- the name, location, picture and manufacturer of a hub. Other fields are kept immutable because we considered them as fixed and should not be able to be edited. A user knows when a field is mutable by the thin black box that appears around the field's right side description. The picture can be changed by clicking on the image of the hub in editing mode, and it will allow the user to either take a photo or use a photo from gallery. These text fields can be edited, and by pressing "Save Changes" in the top right corner, a query to the cloud will be made and the changes saved. Upon pressing the button, a timed "Saving..." alert will appear (this is to prevent racing conditions found because of staging a query to the Hasura server). * **Viewing Device List** - Users can also access the device list that the hub protects by pressing the "Devices" row to segue into the deviceList VC. * **Device List Page** - This page acts like the directory view, except it lists the devices that a hub protects. Devices would normally be discovered by its hub automatically -- to simulate this, the devices are prepopulated and queried using its linked hub ID. * **Swipe Action** - Users can swipe to open up the "Edit" button to segue into the device details in editing mode automatically. Unlike the hubs, there is not delete button to delete devices from the hub. We chose to do this in particular for the project because we did not want users to delete a device from the DB permanently, as the only way to add back a hub is through the DB. This is because the device discovery from Perygee was not added to the app, which is how device would normally be added. * **Viewing Device Details** - Users can access the details of a device by pressing on a device in the device list. This will segue into the details about the device (normally in viewing mode unless the user presses the swipe edit button) * **Device Detail Page** - This page holds all the details about a device, such as the name, location, manufacturer, priority, etc. It is very similar to the hub detail page, as they both function to list details about a hub or device repsectively. * **Live Device Editing** - Similar to the hub editing, devices can be live-edited by being in editing mode, which is triggered from the device list swipe edit button or the edit button in the top-right. Fields like the name, priority, location, picture, and manufacturer can be changed (indicated by the thing black box that outlines these fields when in editing mode). Pressing save changes in the top right will trigger a similar GraphQL mutation to change the device details on the Perygee Cloud. * **Map View Page** - This page has a map that shows the location of all the hubs geographically. Provides a spatial perspective to a network admin of where all their hubs are located. * **Clustering** - Hub annotations are grouped and clustered together when too close to each other based on the zoom of the user in the map. An annotation that holds the count of the hubs in that cluster shows the general location of this hub. Upon zooming in closer, this cluster breaks into smaller chunks, until each individual hub is visible to the user. * **Map Viewing Options** - The user has the ability to see the map in three different views: standard, satellite, and hybrid. These viewing options can be changed via the segmented control at the top of the map. * **View and Edit Segues to Hubs** - By pressing on the annotation of a hub, a user will see the hub's picture and two icon buttons in the annotation -- an eye (for viewing) and pen & paper (for editing). By pressing on either of these buttons, the user will segue into the hub detail page of the selected hub from the annotation in either viewing or edit mode. * **QR Scanning Page** - This page provides a QR code scanner that is used to instantiate hubs into the Perygee cloud. * **QR Code Scanning/Hub Instantiation** - Provides an area where a QR code should be placed for scanning. Upon scanning the code, a new hub detail page will be presented modally, indicating that the new hub has been successfully instantiated. When scanning a poorly formatted QR code or the QR code of an existing hub, the app will pop up with an alert to tell the user the error ### Conclusion Our Perygee companion app is robust and offers many features to network admins for use with the Perygee platform. Despite the core of the app being a simple hub and device directory, by adding supplementary frameworks like the map and QR code scanning, we create a complex and effective app. While there is still work to be done, the app showcases that it has the ability to be well-integrated in the Perygee business model and can be used right now as a demoing tool for fund raising and attracting clients.

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully