OpenALPR Webhook Processor for IP Cameras

I have intercepted traffic going between the watchman agent and the openalpr cloud. the payload matches what comes from the cloud webhook. In theory the openalpr cloud webhook could call the processing service, it shows up the overlay on the camera, then relays the same webhook to an onsite openalpr server.

Once the data is in the on premises openalpr server you can configure it to store data forever. The on premises server doesn't need a license to run. It is also very easy to install and configure.

Flowchart.png

PR is merging in now, look at the example for how to set up the relay urls in the configuration
 
  • Like
  • Love
Reactions: biggen and tech101
Thank you @mlapaglia for this. I always wanted to run openalpr locally instead of there cloud plan. However only reason I have stayed away from it is I find it a bit complex to setup plus I am windows user so never have any experience with Ubuntu / linux.. Definitely is very tempting to try though to try running on premises OpenALPR..

I am guessing can even run it as a VM/ with ubuntu installed on w10 box.

I know you said something about unraid yesterday I will look into that as well as what it is and how it works. Thank you though for sharing all this :) Really always learning a lot on this forum thanks to all the members like you who share all this good stuff with us and create all this for us thank you :)
 
the license is handled by the watchman client, you will still be limited by whatever plan you have subscribed to.
 
  • Like
Reactions: tech101
the license is handled by the watchman client, you will still be limited by whatever plan you have subscribed to.
Got it, thank you so Data will be local instead of 5 days it be as long we wanna hold and then off course faster webhooks since it be on premises server right ?
 
yes to the data, your webhook will still have the same delay because you watchman client is still talking to the openalpr cloud.
 
  • Like
Reactions: tech101
you will also get vehicle make/model since that is in the payload it's just hidden in the cloud api
 
  • Like
Reactions: tech101
I"m spinning up a Ubuntu VM now for testing. If this work, man. This is a game changer for LPR cams. $5/month/cam for just the Watchman with unlimited local storage.
 
  • Like
Reactions: tech101
I am storing the Openalpr data. Locally using gymratz tool currently.. Which is also a very great tool plus it can also look up car vin info and pull make model that way only thing dont have is color of the vehicle.. I think openalpr has that but its just hidden ..and you have to go thru meta data to find it..
 
That's a good tool if you aren't interested in hosting a local version of their dashboard.
 
  • Like
Reactions: tech101
Logs are showing a few errors and I'm not seeing any overlays:

JSON:
{"log":"[19:48:46 WRN] 'AddEntityFramework*' was called on the service provider, but 'UseInternalServiceProvider' wasn't called in the DbContext options configuration. Remove the 'AddEntityFramework*' call as in most cases it's not needed and might cause conflicts with other products and services registered in the same service provider.\n","stream":"stdout","time":"2021-01-05T19:48:46.78561506Z"}
{"log":"[19:48:47 INF] Entity Framework Core 3.1.10 initialized 'ProcessorContext' using provider 'Microsoft.EntityFrameworkCore.Sqlite' with options: None\n","stream":"stdout","time":"2021-01-05T19:48:47.329055085Z"}
{"log":"[19:48:47 INF] Executed DbCommand (19ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\n","stream":"stdout","time":"2021-01-05T19:48:47.519149031Z"}
{"log":"SELECT COUNT(*) FROM \"sqlite_master\" WHERE \"name\" = '__EFMigrationsHistory' AND \"type\" = 'table';\n","stream":"stdout","time":"2021-01-05T19:48:47.519216099Z"}
{"log":"[19:48:47 INF] Executed DbCommand (5ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\n","stream":"stdout","time":"2021-01-05T19:48:47.563574175Z"}
{"log":"SELECT \"MigrationId\", \"ProductVersion\"\n","stream":"stdout","time":"2021-01-05T19:48:47.563605475Z"}
{"log":"FROM \"__EFMigrationsHistory\"\n","stream":"stdout","time":"2021-01-05T19:48:47.563614616Z"}
{"log":"ORDER BY \"MigrationId\";\n","stream":"stdout","time":"2021-01-05T19:48:47.563621107Z"}
{"log":"[19:48:47 INF] Now listening on: http://[::]:80\n","stream":"stdout","time":"2021-01-05T19:48:47.704826599Z"}
{"log":"[19:48:47 INF] Application started. Press Ctrl+C to shut down.\n","stream":"stdout","time":"2021-01-05T19:48:47.705298832Z"}
{"log":"[19:48:47 INF] Hosting environment: Production\n","stream":"stdout","time":"2021-01-05T19:48:47.705404862Z"}
{"log":"[19:48:47 INF] Content root path: /app\n","stream":"stdout","time":"2021-01-05T19:48:47.705554598Z"}
{"log":"[19:49:34 INF] Request starting HTTP/1.1 POST http://<redacted>:3859/webhook application/json 20716\n","stream":"stdout","time":"2021-01-05T19:49:34.266010119Z"}
{"log":"[19:49:34 INF] Executing endpoint 'OpenAlprWebhookProcessor.WebhookProcessor.WebhookController.Post (OpenAlprWebhookProcessor)'\n","stream":"stdout","time":"2021-01-05T19:49:34.465157838Z"}
{"log":"[19:49:34 INF] Route matched with {action = \"Post\", controller = \"Webhook\"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.ActionResult] Post() on controller OpenAlprWebhookProcessor.WebhookProcessor.WebhookController (OpenAlprWebhookProcessor).\n","stream":"stdout","time":"2021-01-05T19:49:34.561953128Z"}
{"log":"[19:49:34 INF] request received from: ::ffff:35.170.81.143\n","stream":"stdout","time":"2021-01-05T19:49:34.853336383Z"}
{"log":"[19:49:35 INF] Executed action OpenAlprWebhookProcessor.WebhookProcessor.WebhookController.Post (OpenAlprWebhookProcessor) in 680.0881ms\n","stream":"stdout","time":"2021-01-05T19:49:35.257151384Z"}
{"log":"[19:49:35 INF] Executed endpoint 'OpenAlprWebhookProcessor.WebhookProcessor.WebhookController.Post (OpenAlprWebhookProcessor)'\n","stream":"stdout","time":"2021-01-05T19:49:35.259723873Z"}
{"log":"[19:49:35 ERR] HTTP POST /webhook responded 500 in 1495.5046 ms\n","stream":"stdout","time":"2021-01-05T19:49:35.883860979Z"}
{"log":"System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.\n","stream":"stdout","time":"2021-01-05T19:49:35.883921923Z"}
{"log":" ---\u003e System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.\n","stream":"stdout","time":"2021-01-05T19:49:35.883938463Z"}
{"log":"   at System.Net.Security.SslStream.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, ExceptionDispatchInfo exception)\n","stream":"stdout","time":"2021-01-05T19:49:35.883953615Z"}
{"log":"   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.883963743Z"}
{"log":"   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884020455Z"}
{"log":"   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884035133Z"}
{"log":"   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884043925Z"}
{"log":"   at System.Net.Security.SslStream.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884053231Z"}
{"log":"   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.88406248Z"}
{"log":"   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884068704Z"}
{"log":"   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884075267Z"}
{"log":"   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884081397Z"}
{"log":"   at System.Net.Security.SslStream.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884091033Z"}
{"log":"   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884097434Z"}
{"log":"   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884104272Z"}
{"log":"   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884110991Z"}
{"log":"   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884122355Z"}
{"log":"   at System.Net.Security.SslStream.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884129426Z"}
{"log":"   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884136325Z"}
{"log":"   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884143069Z"}
{"log":"   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884262682Z"}
{"log":"   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884275706Z"}
{"log":"   at System.Net.Security.SslStream.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884282105Z"}
{"log":"   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884288572Z"}
{"log":"   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884295291Z"}
{"log":"   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884304576Z"}
{"log":"   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884322285Z"}
{"log":"   at System.Net.Security.SslStream.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884331039Z"}
{"log":"   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.88433779Z"}
{"log":"   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884344604Z"}
{"log":"   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884351712Z"}
{"log":"   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884358404Z"}
{"log":"   at System.Net.Security.SslStream.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884364929Z"}
{"log":"   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884371522Z"}
{"log":"   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884378597Z"}
{"log":"   at System.Net.Security.SslStream.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.884385336Z"}
{"log":"   at System.Net.Security.SslStream.ProcessAuthentication(LazyAsyncResult lazyResult, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.884392045Z"}
{"log":"   at System.Net.Security.SslStream.BeginAuthenticateAsClient(SslClientAuthenticationOptions sslClientAuthenticationOptions, CancellationToken cancellationToken, AsyncCallback asyncCallback, Object asyncState)\n","stream":"stdout","time":"2021-01-05T19:49:35.88439998Z"}
{"log":"   at System.Net.Security.SslStream.\u003c\u003ec.\u003cAuthenticateAsClientAsync\u003eb__65_0(SslClientAuthenticationOptions arg1, CancellationToken arg2, AsyncCallback callback, Object state)\n","stream":"stdout","time":"2021-01-05T19:49:35.884407651Z"}
{"log":"   at System.Threading.Tasks.TaskFactory`1.FromAsyncImpl[TArg1,TArg2](Func`5 beginMethod, Func`2 endFunction, Action`1 endAction, TArg1 arg1, TArg2 arg2, Object state, TaskCreationOptions creationOptions)\n","stream":"stdout","time":"2021-01-05T19:49:35.884415722Z"}
{"log":"   at System.Threading.Tasks.TaskFactory.FromAsync[TArg1,TArg2](Func`5 beginMethod, Action`1 endMethod, TArg1 arg1, TArg2 arg2, Object state, TaskCreationOptions creationOptions)\n","stream":"stdout","time":"2021-01-05T19:49:35.884423738Z"}
{"log":"   at System.Threading.Tasks.TaskFactory.FromAsync[TArg1,TArg2](Func`5 beginMethod, Action`1 endMethod, TArg1 arg1, TArg2 arg2, Object state)\n","stream":"stdout","time":"2021-01-05T19:49:35.884431185Z"}
{"log":"   at System.Net.Security.SslStream.AuthenticateAsClientAsync(SslClientAuthenticationOptions sslClientAuthenticationOptions, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.884438037Z"}
{"log":"   at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.884446324Z"}
{"log":"   --- End of inner exception stack trace ---\n","stream":"stdout","time":"2021-01-05T19:49:35.884453645Z"}
{"log":"   at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.884460569Z"}
{"log":"   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.884473226Z"}
{"log":"   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.884481826Z"}
{"log":"   at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.884488938Z"}
{"log":"   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.884495936Z"}
{"log":"   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.884502758Z"}
{"log":"   at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.884591077Z"}
{"log":"   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)\n","stream":"stdout","time":"2021-01-05T19:49:35.884608527Z"}
{"log":"   at OpenAlprWebhookProcessor.WebhookProcessor.WebhookHandler.RelayWebhookToSubscribersAsync(String rawWebhook) in /src/OpenAlprWebhookProcessor/WebhookProcessor/WebhookHandler.cs:line 81\n","stream":"stdout","time":"2021-01-05T19:49:35.884616066Z"}
{"log":"   at OpenAlprWebhookProcessor.WebhookProcessor.WebhookHandler.HandleWebhookAsync(String rawWebhook, Webhook webhook) in /src/OpenAlprWebhookProcessor/WebhookProcessor/WebhookHandler.cs:line 37\n","stream":"stdout","time":"2021-01-05T19:49:35.884622994Z"}
{"log":"   at OpenAlprWebhookProcessor.WebhookProcessor.WebhookController.Post() in /src/OpenAlprWebhookProcessor/WebhookProcessor/WebhookController.cs:line 64\n","stream":"stdout","time":"2021-01-05T19:49:35.884631227Z"}
{"log":"   at lambda_method(Closure , Object )\n","stream":"stdout","time":"2021-01-05T19:49:35.884638057Z"}
{"log":"   at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult()\n","stream":"stdout","time":"2021-01-05T19:49:35.884644289Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)\n","stream":"stdout","time":"2021-01-05T19:49:35.884650968Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.\u003cInvokeActionMethodAsync\u003eg__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)\n","stream":"stdout","time":"2021-01-05T19:49:35.884658035Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.\u003cInvokeNextActionFilterAsync\u003eg__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)\n","stream":"stdout","time":"2021-01-05T19:49:35.884665318Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)\n","stream":"stdout","time":"2021-01-05T19:49:35.884672811Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State\u0026 next, Scope\u0026 scope, Object\u0026 state, Boolean\u0026 isCompleted)\n","stream":"stdout","time":"2021-01-05T19:49:35.884679646Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.\u003cInvokeInnerFilterAsync\u003eg__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)\n","stream":"stdout","time":"2021-01-05T19:49:35.884687521Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.\u003cInvokeFilterPipelineAsync\u003eg__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)\n","stream":"stdout","time":"2021-01-05T19:49:35.88469586Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.\u003cInvokeAsync\u003eg__Logged|17_1(ResourceInvoker invoker)\n","stream":"stdout","time":"2021-01-05T19:49:35.884710567Z"}
{"log":"   at Microsoft.AspNetCore.Routing.EndpointMiddleware.\u003cInvoke\u003eg__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)\n","stream":"stdout","time":"2021-01-05T19:49:35.884718111Z"}
{"log":"   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)\n","stream":"stdout","time":"2021-01-05T19:49:35.884725037Z"}
{"log":"   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)\n","stream":"stdout","time":"2021-01-05T19:49:35.884731989Z"}
{"log":"   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)\n","stream":"stdout","time":"2021-01-05T19:49:35.88473861Z"}
{"log":"   at Serilog.AspNetCore.RequestLoggingMiddleware.Invoke(HttpContext httpContext)\n","stream":"stdout","time":"2021-01-05T19:49:35.884747971Z"}
{"log":"[19:49:35 ERR] Connection id \"0HM5HMC3A6RAF\", Request id \"0HM5HMC3A6RAF:00000001\": An unhandled exception was thrown by the application.\n","stream":"stdout","time":"2021-01-05T19:49:35.922747888Z"}
{"log":"System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.\n","stream":"stdout","time":"2021-01-05T19:49:35.922859701Z"}
{"log":" ---\u003e System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.\n","stream":"stdout","time":"2021-01-05T19:49:35.922914545Z"}
{"log":"   at System.Net.Security.SslStream.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, ExceptionDispatchInfo exception)\n","stream":"stdout","time":"2021-01-05T19:49:35.922925188Z"}
{"log":"   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.922932807Z"}
{"log":"   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.922940998Z"}
{"log":"   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.922947832Z"}
{"log":"   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.922954776Z"}
{"log":"   at System.Net.Security.SslStream.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.922962251Z"}
{"log":"   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.922968617Z"}
{"log":"   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.922975503Z"}
{"log":"   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.922981872Z"}
{"log":"   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923033507Z"}
{"log":"   at System.Net.Security.SslStream.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923041577Z"}
{"log":"   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923208046Z"}
{"log":"   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923287089Z"}
{"log":"   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923299187Z"}
{"log":"   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923306273Z"}
{"log":"   at System.Net.Security.SslStream.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.92331346Z"}
{"log":"   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923321488Z"}
{"log":"   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923328328Z"}
{"log":"   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923334731Z"}
{"log":"   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.92334113Z"}
{"log":"   at System.Net.Security.SslStream.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923348336Z"}
{"log":"   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923355058Z"}
{"log":"   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923361332Z"}
{"log":"   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923413033Z"}
{"log":"   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923422038Z"}
{"log":"   at System.Net.Security.SslStream.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923428785Z"}
{"log":"   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923435182Z"}
{"log":"   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923443236Z"}
{"log":"   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923449788Z"}
{"log":"   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923458249Z"}
{"log":"   at System.Net.Security.SslStream.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923465006Z"}
{"log":"   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923509705Z"}
{"log":"   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923519971Z"}
{"log":"   at System.Net.Security.SslStream.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)\n","stream":"stdout","time":"2021-01-05T19:49:35.923528091Z"}
{"log":"   at System.Net.Security.SslStream.ProcessAuthentication(LazyAsyncResult lazyResult, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.923547314Z"}
{"log":"   at System.Net.Security.SslStream.BeginAuthenticateAsClient(SslClientAuthenticationOptions sslClientAuthenticationOptions, CancellationToken cancellationToken, AsyncCallback asyncCallback, Object asyncState)\n","stream":"stdout","time":"2021-01-05T19:49:35.923557174Z"}
{"log":"   at System.Net.Security.SslStream.\u003c\u003ec.\u003cAuthenticateAsClientAsync\u003eb__65_0(SslClientAuthenticationOptions arg1, CancellationToken arg2, AsyncCallback callback, Object state)\n","stream":"stdout","time":"2021-01-05T19:49:35.923564603Z"}
{"log":"   at System.Threading.Tasks.TaskFactory`1.FromAsyncImpl[TArg1,TArg2](Func`5 beginMethod, Func`2 endFunction, Action`1 endAction, TArg1 arg1, TArg2 arg2, Object state, TaskCreationOptions creationOptions)\n","stream":"stdout","time":"2021-01-05T19:49:35.923572525Z"}
{"log":"   at System.Threading.Tasks.TaskFactory.FromAsync[TArg1,TArg2](Func`5 beginMethod, Action`1 endMethod, TArg1 arg1, TArg2 arg2, Object state, TaskCreationOptions creationOptions)\n","stream":"stdout","time":"2021-01-05T19:49:35.923579931Z"}
{"log":"   at System.Threading.Tasks.TaskFactory.FromAsync[TArg1,TArg2](Func`5 beginMethod, Action`1 endMethod, TArg1 arg1, TArg2 arg2, Object state)\n","stream":"stdout","time":"2021-01-05T19:49:35.923589533Z"}
{"log":"   at System.Net.Security.SslStream.AuthenticateAsClientAsync(SslClientAuthenticationOptions sslClientAuthenticationOptions, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.923638573Z"}
{"log":"   at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.923648059Z"}
{"log":"   --- End of inner exception stack trace ---\n","stream":"stdout","time":"2021-01-05T19:49:35.923654913Z"}
{"log":"   at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.923828909Z"}
{"log":"   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.923899092Z"}
{"log":"   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.923908085Z"}
{"log":"   at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.923916679Z"}
{"log":"   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.923924016Z"}
{"log":"   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.923931134Z"}
{"log":"   at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n","stream":"stdout","time":"2021-01-05T19:49:35.92393804Z"}
{"log":"   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)\n","stream":"stdout","time":"2021-01-05T19:49:35.923945824Z"}
{"log":"   at OpenAlprWebhookProcessor.WebhookProcessor.WebhookHandler.RelayWebhookToSubscribersAsync(String rawWebhook) in /src/OpenAlprWebhookProcessor/WebhookProcessor/WebhookHandler.cs:line 81\n","stream":"stdout","time":"2021-01-05T19:49:35.923952447Z"}
{"log":"   at OpenAlprWebhookProcessor.WebhookProcessor.WebhookHandler.HandleWebhookAsync(String rawWebhook, Webhook webhook) in /src/OpenAlprWebhookProcessor/WebhookProcessor/WebhookHandler.cs:line 37\n","stream":"stdout","time":"2021-01-05T19:49:35.924021377Z"}
{"log":"   at OpenAlprWebhookProcessor.WebhookProcessor.WebhookController.Post() in /src/OpenAlprWebhookProcessor/WebhookProcessor/WebhookController.cs:line 64\n","stream":"stdout","time":"2021-01-05T19:49:35.924032096Z"}
{"log":"   at lambda_method(Closure , Object )\n","stream":"stdout","time":"2021-01-05T19:49:35.924038651Z"}
{"log":"   at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult()\n","stream":"stdout","time":"2021-01-05T19:49:35.924045347Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)\n","stream":"stdout","time":"2021-01-05T19:49:35.924052222Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.\u003cInvokeActionMethodAsync\u003eg__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)\n","stream":"stdout","time":"2021-01-05T19:49:35.924059589Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.\u003cInvokeNextActionFilterAsync\u003eg__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)\n","stream":"stdout","time":"2021-01-05T19:49:35.924070039Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)\n","stream":"stdout","time":"2021-01-05T19:49:35.924117839Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State\u0026 next, Scope\u0026 scope, Object\u0026 state, Boolean\u0026 isCompleted)\n","stream":"stdout","time":"2021-01-05T19:49:35.924130099Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.\u003cInvokeInnerFilterAsync\u003eg__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)\n","stream":"stdout","time":"2021-01-05T19:49:35.924137671Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.\u003cInvokeFilterPipelineAsync\u003eg__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)\n","stream":"stdout","time":"2021-01-05T19:49:35.924145028Z"}
{"log":"   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.\u003cInvokeAsync\u003eg__Logged|17_1(ResourceInvoker invoker)\n","stream":"stdout","time":"2021-01-05T19:49:35.924155213Z"}
{"log":"   at Microsoft.AspNetCore.Routing.EndpointMiddleware.\u003cInvoke\u003eg__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)\n","stream":"stdout","time":"2021-01-05T19:49:35.924162508Z"}
{"log":"   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)\n","stream":"stdout","time":"2021-01-05T19:49:35.924169658Z"}
{"log":"   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)\n","stream":"stdout","time":"2021-01-05T19:49:35.924176422Z"}
{"log":"   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)\n","stream":"stdout","time":"2021-01-05T19:49:35.924184037Z"}
{"log":"   at Serilog.AspNetCore.RequestLoggingMiddleware.Invoke(HttpContext httpContext)\n","stream":"stdout","time":"2021-01-05T19:49:35.924190418Z"}
{"log":"   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)\n","stream":"stdout","time":"2021-01-05T19:49:35.924196548Z"}
{"log":"[19:49:35 INF] Request finished in 1677.506ms 500 \n","stream":"stdout","time":"2021-01-05T19:49:35.932042274Z"}
{"log":"[19:50:16 INF] Application is shutting down...\n","stream":"stdout","time":"2021-01-05T19:50:16.400677156Z"}

JSON:
{
  "AllowedHosts": "*",
  "Cameras": {
    "Cameras": [
      {
        "Manufacturer": "Dahua",
        "OpenAlprCameraId": 123456789,
        "Password": "password",
        "UpdateOverlayTextUrl": "http://10.200.200.14/cgi-bin/configManager.cgi?action=setConfig&VideoWidget[0].CustomTitle[1].Text=",
        "Username": "admin"
      }
    ]
  },
  "ConnectionStrings": {
    "ProcessorContext": "Data Source=config/processor.db"
},
"WebhookRelays": {
    "RelayUrls": [
      "https://10.200.200.54/push/"
    ]
  },
  "WebRequestLoggingEnabled": false

Bash:
#!/bin/bash

docker run -d \
--name=openalprwebhookprocessor \
--net=bridge \
-v /home/joe/webhook_alpr/app/config/:/app/config/ \
-p 3859:80 \
mlapaglia/openalprwebhookprocessor
 
Last edited:
  • Like
Reactions: tech101
I think after the update mine stopped working as well not sure why..
 
if you don't have a valid https cert for the relay url it won't work right now, can you post non https?
 
Do I need to enter something here ?

Code:
  "WebhookRelays": {
    "RelayUrls": [
      "https://another.aplr.server/push/"

If yes is it the ip where my docker is running ?
 
if you don't have a valid https cert for the relay url it won't work right now, can you post non https?
Yeah I just spun up a new Ubuntu VM and ran the curl command to install the OpenALPR server. So no HTTPS certs are installed. What would be the easiest way to install one for an internal IP?
 
Do I need to enter something here ?

Code:
  "WebhookRelays": {
    "RelayUrls": [
      "https://another.aplr.server/push/"

If yes is it the ip where my docker is running ?

if you don't want to relay it anywhere just remove "https://another.aplr.server/push/"
 
  • Like
Reactions: biggen
Do I need to enter something here ?

Code:
  "WebhookRelays": {
    "RelayUrls": [
      "https://another.aplr.server/push/"

If yes is it the ip where my docker is running ?
That is where your OpenALPR web server is running. I'm wondering if not putting in a server will break overlay functionality.