Unable to create new inputs after 10.7.1 update

2436
6
07-17-2019 11:52 AM
CassidyKillian
Occasional Contributor II

I just updated Geoevent to 10.7.1 hoping to improve overall stability issues.  After the upgrade my Networkfleet input no longer worked.  When I tried to create a new input it advances to the Create Input screen but the page is blank.  The system logs show quite a few error messages that dont really make sense to me.  I will attach a screen shot.

I have tried restarting services and server itself with no luck.

0 Kudos
6 Replies
EricIronside
Esri Regular Contributor

Hey Cassidy,

We updated our release process, so there are some extra steps that you have to go through to upgrade to the new Networkfleet Connector.  The steps should be detailed in the release documentation, so I encourage you to read through the upgrade sections there. Here's a brief overview of the steps below.

The new Networkfleet Adapter is released with a version of 10.4.0. This indicates the adapter is compatible with all versions of GeoEvent 10.4 and later (this is the change in process that we made).Because the version is changing on the .jar you are deploying you must do the following:

1. In GeoEvent Manager, go to Site > GeoEvent > Connectors and edit the Networkfleet Connector. Ensure that it is using the Networkfleet Adapter and the HTTP Transport. Press Save (you must save it so it updates to the new adapter).

2. Go to Services > Inputs and add a new Networkfleet input.  The dialog to create a new input should display the properties correctly.  

Best, Eric

0 Kudos
CassidyKillian
Occasional Contributor II

Thanks Eric.  I have gone through the 10.4 documentation that you have outlined above.  When I create the new input it does not receive any data.  Once I renamed the input to the old name it started working.  I can see the data pass all the way through the stream output in the monitor but nothing is showing up in a map.  I think this all ties back to the schema errors I mentioned in the other post. 

I started looking at the data in Logger and it appears that the data coming from Verizon is not consistent but I think some of it should be passing through Geoevent.  I will attach a screenshot, but when you look at the data, some of the events are missing the Heading field.  Could this be causing the schema problem?  I would think the ones in the correct order would make it through to the service?

0 Kudos
EricIronside
Esri Regular Contributor

Hey,

Page 6 in the documentation lists the different message schema you might expect to receive from Networkfleet. In most cases people only get the NetworkfleetGPS messages (but some people get all of them).  

Verizon Networkfleet Message Types

You can put a filter between your input and your output (stream service or logger) to filter for only the GPS messages.  That will ensure you only pass the GPS messages through.

Definition Name Filter

Another thing you should probably do prior to the stream service is add a new GeoEvent Definition that "flattens" the original NetworkfleetGPS definition (the attached configuration has this definition). If you use the flat definition, you will have to re-create your stream service using the new flat definition.  

Verizon Networkfleet Flat GPS

Use a Field Mapper to map the nested/grouped fields into the flat definition as shown below:

Grouped to Flat

0 Kudos
CassidyKillian
Occasional Contributor II

Thanks...I will give this a shot.  I currently have the Filter and Field Mapper in place so I will try to flatten it as well and see if that works.

0 Kudos
CassidyKillian
Occasional Contributor II

No luck mapping to the flattened schema.  When I try to set up the field mapper I do not see the entire speed hierarchy.  I am only seeing one set of speed attributes (not GPSFix.Speed[0], GPSFix.Speed[1], etc.)

I have gone back and deleted everything related to Networkfleet in my GeoEvent installation and I still cant seem to get anything to work.

0 Kudos
EricIronside
Esri Regular Contributor

Hey,

Short Answer:

GPSFix.Speed[0].Type = Speed1_Type

GPSFix.Speed[0].Units = Speed1_Units

GPSFix.Speed[0].Value = Speed1_Value

GPSFix.Speed[1].Type = Speed2_Type

GPSFix.Speed[1].Units = Speed2_Units

GPSFix.Speed[1].Value = Speed2_Value

GPSFix.Speed[2].Type = Speed3_Type

GPSFix.Speed[2].Units = Speed3_Units

GPSFix.Speed[2].Value = Speed3_Value

NOTE: I updated the Networkfleet Connector yesterday, so please upgrade to the latest release (this should be easy now that you migrated to the 10.4.0 version and have it working). Please see the section Replace the Verizon Networkfleet Adapter in the documentation to replace your .jar files.  The Release Notes has information on why I had to make a new release.

Long Answer:

In the GeoEvent Definition the Speed field is a 'multi-cardinal group' which means it is an array of Speed items.  This is slightly different from the GPSFix group which has a single cardinality (there is always only one GPSFix group).  Event though each is a group, accessing a single vs. multi cardinal group is slightly different in notation.  When the field mapper provides the drop down of fields, it treats ALL groups as single groups.

Single Group

For a single group, there will be only one item and GeoEvent can make the assumption that any variable under that group is directly accessible from the parent item. So the 'dot' notation in the Field Mapper drop down works as expected.  For the single GPSFix group item, it has one and only one FixTime attribute.  So accessing fields in the GPSFix group looks like the following:

GPSFix.FixTime

GPSFix.FixTimeUTF

GPSFix.Latitude

GPSFix.Longitude

GPSFix.Ignition

GPSFix.Speed

Multi-Cardinal Group (Array)

For the multi-cardinal group, there could be any number of child items in an array (0 or more). To access the data, you need to inform GeoEvent which item in the array you are trying to access this. You do this using common array notation with a 0 based index (index 0 is the first item in the array).  The only way to know if you need to use the 'Array Index' format is to look at the GeoEvent Definition cardinality setting on the field (is it 'one' or 'many'). If  it is set to many you must use the array index format. 

So to get at the first speed item's Type parameter, you have to index into the Speed array using index [0] for the first item: GPSFix.Speed[0].Type

Thus:

GPSFix.Speed[0].Type = Speed1_Type

GPSFix.Speed[0].Units = Speed1_Units

GPSFix.Speed[0].Value = Speed1_Value

GPSFix.Speed[1].Type = Speed2_Type

GPSFix.Speed[1].Units = Speed2_Units

GPSFix.Speed[1].Value = Speed2_Value

GPSFix.Speed[2].Type = Speed3_Type

GPSFix.Speed[2].Units = Speed3_Units

GPSFix.Speed[2].Value = Speed3_Value

A note of caution

You should not see this issue for the Networkfleet data, so can safely ignore it for your current use case, but I bring this up for future reference as something to avoid in your data structures if you can (unfortunately we don't control the format of most incoming data). 

For most data arrays, the length of the array is fixed (for example, You can always assume you will get 3 speeds with the Networkfleet GPS message type). But sometimes, the length of the array can be variable.  There is no good way to account for this in GeoEvent since indexing into an array with 0 items will fail with a "Null Pointer" exception. For example, if a GPSFix had no Speed records, GPSFix.Speed[0] would be null, so GPSFix.Speed[0].Type would be an exception. To get around this, you have to use a filter to determine if an event has an item at a specific index (filter where NOT(GPSFix.Speed[0] ISNULL) ). As you can guess, this gets quite messy in the GeoEvent Service, and become unpractical for larger arrays (the most I've ever implemented is an array that could contain 0 to 4 records and that seriously tested my patience).

RJ Sunderman‌ has a blog post that might be helpful in understanding hierarchical and multi-cardinal data structures in GeoEvent if you need more details or examples.

0 Kudos