L4Server Help Documentation

Introduction

L4Server was developed exclusively for sensors and devices that communicate using the RAW TCP / UDP Packets to enable developers to collect, manage, and visualize data. In this document TCP / UDP explained in simple step-by-step instructions for configuring the Server.

System Requirements

The minimum system requirements necessary to implement the L4Server are 

Processor – 1 GHz.

Memory – 512 MB RAM.

Operating System – Windows, Linux.

For other OS – Contact Support.

Installation and Setup

L4Server is accessible for download for Windows / Windows (32 and 64 bit), and Linux servers. The binaries are available as a zip file for Linux and as a self-extracting exe for the Windows OS.

 

Windows Installation

Double-click the downloaded exe and follow the wizard instructions and install it. By default, the product will be installed in the C:\Bevywise\L4Server folder. You can change the folder during installation.

For Linux

For linux, you can unzip the file to the desired location and use the sh Files in /Bevywise/L4Server/bin to begin the Server.

Starting L4Server  

For Windows

You can run the Server with various ways

  • Double-click the “runtcpserver.bat” file inside the Bevywise/L4Server/bin folder.

  • Open cmd and go to Bevywise/L4Server/bin folder.

  • Next, type “runtcpserver.bat” and press Enter.

Note: UPD Server is not available for windows.

    For Linux:

    • Open the terminal and go to Bevywise/L4Server/bin.

    • Type “sh runtcpserver.sh” or “sh runudpserver.sh” and press Enter.

    L4Server Configuration

    The TCPServer can be configured inside the conf folder using the tcpserver.conf file. UDPServer can be configured inside the conf folder using the udpserver.conf file. By default, the TCP / UDP Server starts at port 2000 and can be customized to run on a different port in the TCPServer / conf and UDPServer / conf.

    The Configuration of the TCPServer:

    TCPServer.conf

    ##########################TCP Server Details#########################

    [TCP] 

    TCP_PORT_NO = 2000 

    [PAYLOAD_FORMAT_TEXT] 

    CLIENT_ID_POSITION = 1

    TIMESTAMP_POSITION = 2

    FINAL_RAW_FIELDS = temperature,humidity,pressure,Gyroscope 

    [PAYLOAD_FORMAT_JSON] 

    KEY_FOR_CLIENT_ID = clientid

    KEY_FOR_TIEMSTAMP = timestamp 

    #################### UserInterface Details #########################

    # You can either use an Apache at the front end or you can change the

    #port to 80 and run as super admin.

    [UI]

    UI_Http_Port = 8080 

    [WEBSOCKET]

    WEBSOCKET_PORT=8081 

    ################ ############ WEB LOGIN ############################

    # Securing the Web login  XXXX Need to be removed XXX

    [WEB_LOGIN_PAGE]

    WEB_LOGIN = ENABLED 

    WEB_USERNAME = admin

    WEB_PASSWORD = admin 

    # ENABLED || DISABLED

    The Configuration of the UDPServer:

    UDPServer.conf

     

    ##########################UDP Server Details#########################

    [UDP]

     

    UDP_PORT_NO = 2000

     

    [PAYLOAD_FORMAT_TEXT]

     

    CLIENT_ID_POSITION = 1

    TIMESTAMP_POSITION = 2

    FINAL_RAW_FIELDS = temperature,humidity,pressure,Gyroscope

     

    [PAYLOAD_FORMAT_JSON]

     

    KEY_FOR_CLIENT_ID = clientid

    KEY_FOR_TIEMSTAMP = timestamp

     

    #################### UserInterface Details #########################

    # You can either use an Apache at the front end or you can change the

    #port to 80 and run as super admin.

     

    [UI]

    UI_Http_Port = 8080 

     

    [WEBSOCKET]

    WEBSOCKET_PORT=8081 

     

    ################ ############ WEB LOGIN ############################

    # Securing the Web login  XXXX Need to be removed XXX

     

    [WEB_LOGIN_PAGE]

    WEB_LOGIN = ENABLED

     

    WEB_USERNAME = admin

    WEB_PASSWORD = admin

     

    # ENABLED || DISABLED

     

    PORT_NO – Specify the port in which L4Server starts. By default, it will start in 2000. 

    WEBSOCKET_PORT – The port on which the server waits for the WebSocket connection. The WebSocket port is 8081. 

    UI_Http_Port – The UI port is 8080. You can either use an Apache at the front end or change the port to 80 and run it as a super administrator.

    TEXT / JSON Configuration

    L4Server processes data collected from Edge devices based on the data format specified. L4Server accepts plain TEXT and JSON formats as input to TCP / UDP data to collect custom data from remote devices. Configuration of the L4 server data must be provided in the tcpserver.conf / udpserver.conf file. 

    The L4Server UI provides Client ID, Message, and Time details. On L4Server, a plain text data is acquired from the edge device, and it will be configured to JSON format and rendered in the UI.

    Plain Text Format 

    Mostly the client will publish the data as a Plain text format.

    For example: 

    The client publishes the data in the plain text as “WT470000113410, 5.93317126536, 5.7845379096, 9.20227207305, 2.5470337929, Jan 01 1970 05:30:00.”

    In the case of Plain text format, when data is published by the edge device, only the data is published and the data definition mostly resides in the manuals.  The L4Server need the explanation of the data to be specified on the conf file, so that the mapping of the data will happen on the server side for a meaningful visual representation.

    [PAYLOAD_FORMAT_TEXT]

    CLIENT_ID_POSITION = 1

    TIMESTAMP_POSITION = 2

    FINAL_RAW_FIELDS = temperature,humidity,pressure,Gyroscope

    In this, we defined that the client ID position must be 1, and the timestamp position 2. The client ID and timestamp are taken as the client details, and the raw fields are used as message data, and they are provided in JSON format and displayed in the user interface.

     

    JSON Format 

    In JSON format, we can easily read a published message and enclose multiple data in a single message. 

    JSON syntax

    { “ KEY 1” : “ VALUE1 ” , “KEY2” : “ VALUE2 “ , “ KEY 3“ : “VALUE 3” }

    For example: 

    The client will publishes the data in the JSON format as {‘clientid’: ‘WT470000113410’, ‘pressure’: ‘5.93317126536’, ‘temperature’: ‘5.7845379096’, ‘humidity’: ‘9.20227207305’, ‘Gyroscope’: ‘2.5470337929, ‘timestamp’:’1606910275′}. 

    In this example, we have defined the “key” and “value” of the acquired data in the JSON format. 

    When data is retrieved from an edge device, the “key” and “value” of “Clientid” and “Timestamp” becomes indeterminate and it is important to identify the “key” and “value” to transform the data. This can be retrieved from the following.

    [PAYLOAD_FORMAT_JSON]

    KEY_FOR_CLIENT_ID = clientid

    KEY_FOR_TIMESTAMP = timestamp

    Through this, we define the “key” and “value” for the “Clientid” and “Timestamp”. For example, the clientid should be defined as {“clientid”:”esp”} and timestamp should be defined as {“timestamp”:”1606910275″}. 

    In case, if the client wants to provide the customized data format, then they must define which is the client ID, timestamp, and message.

     

    Custom Data Storage

    The L4Server supports data storage in SQLite by default. You can change the storage configuration to MySQL. The L4Server also provides the ability to store user data on a large data engine. You can enable storage in Elastic by default. It also has an extension in which you can hook up your received payload and store data in any of your analytics / big data engines. If you plan to store data in your own engine. You need to implement the following procedure specified in the custom_store.py in the extension/ folder. 

    The parameters can be configured using the data_store.conf file inside the config folder.

    data_store.conf

     

    [RELATIONAL_PERSISTENCE]

    RELATIONAL_PERSISTENCE_ENABLED = TRUE 

    [CONFIG]

    DB_SERVER = SQLITE 

    SQLITE || MYSQL

     

    [SQLITE]

     

    SQLITE_DB = bevywise

     

    [MYSQL]

     

    DBHOST=127.0.0.1

    DBPORT= 3306

    MYSQL_DB = bevy

    MYSQL_USER = root

    MYSQL_PASSWORD = root

     

    ######################CUSTOM STORAGE######################

    def handle_Received_Payload(data)

     

    [DATASTORE]

     

    CUSTOMSTORAGE = DISABLED

    # ENABLED || DISABLED

     

    DATASTORE = CUSTOM

    # ELASTIC || CUSTOM

     

    [ELASTIC]

    HOSTNAME = 127.0.0.1

    PORT = 9200

    INDEX_NAME = layerfour

    BULK_INSERT_TIMING = 2

     

    [CUSTOM]

    INTERCEPT_FILEPATH = ./../extensions/custom_store.py

     

    RELATIONAL_PERSISTENCE_ENABLED – By default, it is true. It stores data in SQLite or MySQL based on the DB_SERVER value.

    DB_SERVER – Specifies whether the server should store data in MySQL or SQLite. When set to SQLLite, the data is stored in a data folder under the file name specified for SQLITE_DB. 

    DB Port – Port Number of MySQL The default port is 3306.

    MYSQL_DB – DB You want to store data in MySQL.

    MYSQL_USER – The username provided for the Connection.

    MYSQL_PASSWORD – Password provided for Connection.

    L4Server User Interface

    Sign-in Page   

    This page helps the user to log into the L4 server user interface. The following username and password are the default credentials to sign into the user interface. 

    Username – admin

    Password – admin 

    Users can also change the username and password by clicking on the user icon on the top right corner and select Change Password via the user interface based on their needs. 

    L4Server Login

    To Logout   

    To log out in the user interface, click the user icon in the upper right corner, and select Logout.

    L4Server logout

    Dashboard and Widgets Creation   

    Users can view the latest events and monitor all ongoing processes in the L4Server on the dashboard. The following status will be visible to the user in the dashboard 

    • The total number of Active Devices. 
    • Total Received events. 
    • Total Devices. 
    • In Recent Events, users can view the Device ID, published data or messages, and Published time. 
    • In Recent Connection, the user can view the latest connected device id, IP, and device connected time. 
    • In Recent Disconnection, users can view the latest disconnected device id, IP, and device disconnected time.
    L4Server Dashboard

     To create a Custom Dashboard   

    • Click the “Create Dashboard” icon in the top right corner. 
    • The dashboard window will appear showing “Name” and Description. 
    • Enter the “Dashboard name” and a small description in the corresponding fields. 
    • When you are completed, click the “Create” button to open the “Widgets” tab. 
    • Then click the “+” icon at the top right corner of the widgets tab. A drop-down menu will appear listing the widget types. 
    L4Server Create Dashboard

     To create widgets: 

    L4Server Widget
    L4Server Create Widget

     Text widget  

    • Select “Text” from the widgets list. 
    • Then provide a Title, and select Device from the devices listed in the drop-down menu. 
    • When you select a device, related topics appear on the Topics tab. You can select the subject from the list. 
    • Enter the “key” and “unit” in the corresponding locations and select the “color” to be displayed. 
    • Then Select “Minimum”, “Maximum” & “Offset value”. 
    • Enter “Subtitle” and select “Color” to display. 
    • If you need to add more key click the “Add” button and repeat the previous steps. 
    • Once you complete, click the “Create” button to view the widget. 
    L4Server Text Widget

     Color  

    • Select “color” from the widgets list. 
    • Then provide a Title, and select Device from the devices listed in the drop-down menu. 
    • After selecting the device, the corresponding topics are listed in the “Topics” tab. From the list, you can select the topic. 
    • Enter “key”, “unit” in the appropriate space provided and select “color” to display. 
    • Then Select “Minimum”, “Maximum” & “Offset value”. 
    • Enter “Subtitle” and select “Color” to display. 
    • If you need to add more key click the “Add” button and repeat the previous steps. 
    • Once you complete, click the “Create” button to view the widget. 
    L4Server Color Widget

    Line Chart  

    • Select “Line Chart” from the widgets listed. 
    • Then provide a Title, and select Device from the devices listed in the drop-down menu. 
    • After selecting the device, the related topic is listed on the “Topics” tab. You can select a topic from the list. 
    • Enter the “key”, “subtitle”, and “unit” in the appropriate fields and select the color to display. 
    • If you need to add more key click the “Add” button and repeat the previous step. 
    • Once you complete, click the “Create” button to view the widget. 
    L4Server Line Chart

    Bar Chart  

    • Select “Bar Chart” from the widgets listed. 
    • Then provide a Title, and select Device from the devices listed in the drop-down menu. 
    • Now, the corresponding content will be listed on the “Topics” tab. You can select the topic from the list. 
    • Enter Subtitle, Unit, and Key in the appropriate field and select Color for display. 
    • If you need to add more key click the “Add” button and repeat the previous step. 
    • Once you complete, click the “Create” button to view the widget. 
    L4Server Bar Chart

    Gauge Chart  

    • Select “Gauge Chart” from the widgets listed. 
    • Then provide a Title, and select Device from the devices listed in the drop-down menu. 
    • After selecting the device, the relevant topic appears in the “Topics” tab. You can select the topic from the list. 
    • Enter “Key”, “Unit” in the appropriate field and select “Color” for the display. 
    • Then Select “Minimum”, “Maximum” & “Offset value”. 
    • Enter “Subtitle” and select “Color” to display. 
    • If you need to add more key click the “Add” button and repeat the previous steps. 
    • Once you are complete, click the “Create” button to view the widget. 
    L4Server Gauge Chart

    Vertical Gauge  

    • Select “Vertical Gauge” from the widgets listed. 
    • Then provide a Title, and select Device from the devices listed in the drop-down menu. 
    • After selecting the device, the corresponding topic is listed in the “Topics” tab. From the list, you can select the topic. 
    • Enter “Key”, “Unit” and select “Color” to display. 
    • Then Select “Minimum”, “Maximum” & “Offset value”. 
    • Enter “Subtitle” and select “Color” to display. 
    • If you need to add more key click the “Add” button and repeat the previous steps. 
    • When you’re done, click the “Create” button to see the widget. 
    L4Server Vertical gauge

    Horizontal Gauge  

    • Select “Horizontal Gauge” from the widgets listed. 
    • Then provide a Title, and select Device from the devices listed in the drop-down menu. 
    • Related topics are listed in the “Topics” tab. From the list, you can select the topic.   
    • Enter “key”, “unit” in the corresponding location, and select “color” to display. 
    • Then Select “Minimum”, “Maximum” & “Offset value”. 
    • Enter “Subtitle” and select “Color” to display. 
    • If you need to add more key click the “Add” button and repeat the previous steps. 
    • Then, click the “Create” button to view the widget. 
    L4Server Horizontal Gauge

    Led Light  

    • Select “Led Light” from the widgets listed. 
    • Then provide a Title, and select Device from the devices listed in the drop-down menu. 
    • After selecting the device, select a topic from the list that appears in the Topics tab. 
    • Select Active value and Color to display active value. Similarly, select Inactive value and color to display inactive value. 
    • At last, click the Create button to see the widget you have. 
    L4Server Led Light

    Download Reports   

    • To download the reports click the “download button” which is placed on the top right corner on each widget. 
    • Provide the ‘From Date” and “To Date” to download the report. 
    • Now, the reports will start downloading on your browser. 
    L4Server Download Reports

    Modify widgets  

    • Click the      icon at the bottom right corner of the widget. 
    • Now, you can modify the current widgets.
    L4Server Edit Widgets

    Delete Widgets  

    • Click the icon      on the bottom right corner of the current widget.
    • Now, the current widget will be deleted from your dashboard.
    L4Server Delete Widget

    Device Details

    This tab provides a more detailed view of each active and inactive devices that are connected to L4Server. Individual views for each device are available where you can see the Device Name, ID, status, IP, and Time for each device using the Device tab. 

    • Device – Device name.
    • Id – The ID of connected Device.
    • Status – Shows current status of the device whether it is Active or Inactive.
    • IP – The IP Address of connected Device.
    • Time – It shows the time when the device is active or inactive.
    L4Server Device Details

    L4Server Client 

    Now, L4Server is ready to connect your edge devices. Based on your configuration, you can either connect without or with authentication. You can connect any standard MQTT Client. You can also download our prebuilt libraries for the different OS to connect. 

    The L4Server also has some clients to connect to the edge devices inside the Bevywise/L4Server/clients folder. Contact support if you are looking for help building clients.

    Extensions 

    Features of the L4 Server include some extensions for your flexibility. You can customize it to your needs.

    Custom Data Store

    L4Server has the option of storing data in elastic by default. It has extensions in which you can hook up the received payload and store data in any of your analytics / big data engines. If you are planning to store data in your own engine, you will need to use data_store.conf to configure your storage.

    [DATASTORE]

     

    CUSTOMSTORAGE = DISABLED

    # ENABLED || DISABLED

     

    DATASTORE = CUSTOM

    # ELASTIC || CUSTOM

     

    [ELASTIC]

    HOSTNAME = 127.0.0.1

    PORT = 9200

    INDEX_NAME = layerfour

    BULK_INSERT_TIMING = 2 

     

    [CUSTOM]

    INTERCEPT_FILEPATH = ./../extensions/custom_store.py

     

    Enable the CUSTOMSTORAGE option in the data_store.conf file to send data to the document data store in addition to the MySQL / SQLite / MSSQL store. Data must be specified as elastic in order to continue data in elastic search. For custom implementation, the DATASTORE value must be specified as CUSTOM. HOSTNAME, the hostname of the datastore you are using to store data. If you are using Elastic as your custom datastore, the hostname of Elastic Search will be specified. PORT, the port of the user data store you are using. INDEX_NAME is the name of the index where you want to store data. This is similar to the name of the database in MySQL. You can apply this method to your own file and then specify the path here: INTERCEPT_FILEPATH. 

    Custom data storage for large data storage. The custom data hook can be enabled in the broker.conf file in the Conf / folder. Parameters data are in dict format and the keys are “sender”, “topic”, “message”, “unixtime”, “timestamp”.

    global db_cursor 

    #

    # elasstic_search cursor.

    #

    global elastic_search

     

    from elasticsearch import Elasticsearch

    from elasticsearch import helpers

    elastic_search = Elasticsearch(“localhost”, port = 9200, max_retries = 0)

     

    from datetime import datetime

    import json

    import ast

    import os, sys

    The SQL Connector db.conf file will contain the SQLite / MSQL / MySQL cursor depending on your configuration. You have to make your questions accordingly.

    global Client_obj

     

    sys.path.append(os.getcwd()+’/../extensions’)

     

    # Called on the initial call to set the SQL Connector

     

    def setsqlconnector(conf):

     

        global db_cursor

        db_cursor=conf[“sql”]

    # Called on the initial call to set the Elastic Search Connector

     

    def setelasticconnector(conf):

    global elastic_search

    elastic_search=conf[“elastic”]

     

    try :

    mapping = {

    “settings”: {

    “number_of_shards”: 1

    },

    “mappings”: {

    “mappings” : {

    “properties”: {

    “sender”: { “type”: “keyword” },  

    “topic”: { “type”: “keyword”  },

    “message-dict”: { “type”: “object”},

    “message-integer” : {“type” : “integer”},

    “message-float” : {“type” : “float”},

    “message-string” : {“type” : “text”},

    # “timestamp” : {“type” : “date”, “format”: “dd-MM-yyyy HH:mm:ss”}

    }

    }

    }

    }

    elastic_search.indices.create(index = “bevywise”, body=mapping)

    except Exception as e:

    print(e)

    global datasend

    def setwebsocketport(conf):

        global web_socket

        web_socket=conf[“websocket”]

     

    def setclientobj(obj):

    global Client_obj

    Client_obj=obj[‘Client_obj’]

    #Client_obj(‘bevywise’,’clientno1′,’test’,’client_message’,1) 

     

    The client object is used to send / publish messages to any active client. Call function with parameters such as User_name, Client_id, Topic_name, Message, QoS.

    # Importing the custom class into the handler

     

    from customimpl import DataReceiver

     

    datasend = DataReceiver()

     

    def handle_Received_Payload(data):

     

    #

    # Write your code here. Use your connection object to

    # Send data to your data store

     

    # print(“print in the handle_received_payload”,data)

     

    # result = datasend.receive_data(data)

     

    es_msg_type = {int : “message-integer”, float : “message-float”, str : “message-string”, dict : “message-dict”, list : “message-dict”}

    try :

    es_msg = ast.literal_eval(data[“message”])

    except Exception as e :

    data[“message”] = (data[“message”]).replace(‘[“0”]]’, ‘[]’)

    try :

    # print(data[“message”])

    es_msg = ast.literal_eval(data[“message”])

    except Exception as e :

    # print(e, “#################”, data[“message”])

    es_msg_type = “message-string”

    es_msg = data[“message”]

    try :

    data[es_msg_type[type(es_msg)]] = es_msg

    del data[“message”]

    # date_time = datetime.strptime(data[“timestamp”], “%Y-%m-%d %H:%M:%S”)

    # print(date_time, type(date_time))

    # data[“timestamp”] = date_time

    # print(data, data[“message-dict”][“bid”], type(data[“message-dict”][“bid”]))

     

    data[“timestamp”] = datetime.now()

    elastic_search.index(index= “bevywise”, doc_type = ‘recv_payload’, body = data)

    except Exception as e :

    print(e, 97)

    # if result is none then write failed

    def handle_Sent_Payload(data):

     

    pass

     

    #

    # Write your code here. Use your connection object to

    # Send data to your data store

     

    # print(“print in the handle_Sent_payload”,data)

     

    # result = datasend.sent_data(data)

    Your execution should retrieve data, store it, and return the method. We recommend that you simply store the data or pass the data in stream analysis and return to the method handle.

    Custom UI Server

    The UI custom server helps you customize the L4Server UI by adding your own server-side code. You can modify the code in the Custom_ui_server.py file to customize it as needed.

    global Client_obj

     

    # Called on the initial call to set the SQL Connector

    def setsqlconnector(conf):

     

        global db_cursor

        db_cursor=conf[“sql”] 

     

    # Called on the initial call to set the Elastic Search Connector

     

    def setelasticconnector(conf):

        global elastic_search

        elastic_search=conf[“elastic”]

     

    def setclientobj(obj):

        global Client_obj

        Client_obj=obj[‘Client_obj’]

    Data Connectors, SQL Connector will be provided as a cursor global variable for querying the Database & Elastic Search connector for querying Elastic if you have enabled custom storage options.

    def custom_urls(): 

        urllist={

            “AUTHENTICATION”:’DISABLE’,

            “URL_REDIRECT”: “/”,

            “urls”:[

            {“/dashboard/” : dashboard},

            {“/bwiot/extend-ui/create-dashboard/”:create_dashboard},

            {“/bwiot/extend-ui/get-dashboard/”:get_dashboard},

            {“/bwiot/extend-ui/delete-dashboard/”:delete_dashboard},

            {“/bwiot/extend-ui/widget/” : get_widgets},

            {“/bwiot/extend-ui/create-widget/” : create_widget},

            {“/bwiot/extend-ui/delete-widget/” : delete_widget}

            ]

        }

        return urllist

     

    # write your url function codes in the following methods

    def method(data):

        return (“BEVYWISE NETWORKS”)

     

    def method1(data):

        return(“BEVYWISE NETWORKS”)

     

    def method2(data):

        return(“BEVYWISE NETWORKS”) 

     

    Add your new feature using the URL and the corresponding method. These URLs can be called from your user interface to manipulate data. We support the GET Http method.

    Custom Scheduler  

    The Scheduling module helps to process data at predefined time intervals. The custom scheduler helps you create your own schedule by adding your own code on the server-side.

    def schedule_conf(): 

    # ENABLE/DISABLE YOUR SCHEDULE

    #Add your schedule time in MINUTES in ‘OnceIn’

    #Add your method to call on schedule in ‘methodtocall’

     

    schedules={}

     

    schedules={

    “STATUS” : “DISABLE”,

    ‘SCHEDULE’:’DISABLE’,

    ‘TIME-SCHEDULE’:’DISABLE’,

    ‘SCHEDULES’:[

    {‘OnceIn’:1,’methodtocall’:oneminschedule},

    {‘OnceIn’:5,’methodtocall’:fiveminschedule}]}

    return schedules  

    Enable / disable your schedule by adding the value as Enable / Disable in ‘STATUS’. You can add your schedule in MINUTES in ‘OnceIn’. Add your method to call the on schedule in ‘methodtocall’.

    global elastic_search

    from elasticsearch import Elasticsearch

    elastic_search = Elasticsearch(“localhost”, port = 9200, max_retries = 0)

    import json, sys, os

    # Called on the initial call to set the SQL Connector

     

    global web_socket

    # Web_socket

    def setsqlconnector(conf):

        global db_cursor

        db_cursor=conf[“sql”]

     

    def setelasticconnector(conf):

        global elastic_search

        elastic_search=conf[“elastic”]

     

    def setwebsocketport(conf):

        global web_socket

        web_socket=conf[“websocket”]

     

    def setclientobj(obj):

    global Client_obj

    Client_obj=obj[‘Client_obj’]

     

    def fiveminschedule():

    pass

    #Write your code here

    #print “extension print”

    def custom_urls(): 

    Package Structure 

    It gives you details about the L4Server product package. Unzip the file and the Bevywise folder will be created. The contents of L4Server are in Bevywise / L4Server. 

    bin/ 

    Executable file in this folder is required to run L4Server. The runtcpserver.sh / runudpserver.sh file runs L4Server for Linux, Mac, and Raspbian OS. The Windows version does not have a bin/folder, and implementation will be available under the Bevywise / L4Server folder. 

    conf/ 

    L4Server configuration files are stored in this folder. This folder contains a tcpserver.conf and updserver.conf files that enables/disables custom memory and modifies the ports and tcp conf file and a data_store.conf file that updates the MySQL information. 

    data/ 

    If you are using SQLite storage for a TCP server, the database will be created and saved in this folder. 

    clients/ 

    This folder contains libraries with some examples to connect to the edge devices. 

    extensions/ 

    L4 server functionality includes extensions for your flexibility. You can customize it according to your needs. 

    lib /  

    This folder contains the required binary files. 

    license / 

    This folder will have all the license files of all the third-party packages we are using in the product. Besides, we will have the EULA of our Product Software. 

    ui / 

    This folder contains the files required for the user interface. You can use 127.0.0.1:8080 to view the user interface from your browser.