adam

adam

Consuming an API that connects via TCP connection

I’m looking at a potential project where an entry system for a premises has a “push notifications API” for people entering an establishment.

The system can be enabled to POST the entry “event” to a third party system upon its completion. The documentation is vague at present, but, it does involve the system connecting to the third party via a “TCP Socket”. The data sent includes a binary of a jpeg of the person entering / using the system. From the docs.

" When pushing a notification, a terminal establishes a socket connection with the subscriber by using the IP address and port, and then sends records. After sending, the terminal closes the connection if short connection is used, and keeps keep-alive connection."

I have zero experience with an API sending data over a TCP socket, and my Google Fu is eluding me on this one.

Does anyone have experience of the best way to approach this in a Phoenix/Elixir app?

Thanks in advance.

Most Liked

ityonemo

ityonemo

For a long time. I didn’t know about “connection”, which is a fantastic library for writing clients with a specialized genserver-like behaviour. If you’ll eventually need tcp and tls, I recommend “transport”, which is a library I wrote that abstracts the difference between tcp and tls and makes it so you can seamlessly transition between one and the other.

This is the place to start to learn: Buckets of Sockets | Learn You Some Erlang for Great Good!

You’ll have to switch between erlang and elixir (a good exercise in and of itself) and I recommend writing a generic udp client/server pair and then a tcp client/server pair on localhost, then you can graduate to your application.

I would also recommend first learning by using active: true sockets (packets get turned into messages) and if you want, later learn active: false sockets. I think active: false sockets are better but active: true sockets are simpler.

shanesveller

shanesveller

Usually there should be a documented line protocol that defines what kinds of bits and bytes you send across the wire, and in what order, to indicate various intents. It might be a custom binary format, something like Protobufs, line-separated JSON, etc. There are all kinds of answers there and they all get handled a little differently. I think only the vendor you’re trying to integrate with can answer the initial part of this question for you.

ityonemo

ityonemo

:gen_tcp erlang module is useful for this. I’ve written several tcp protocols using it, it’s not terrible.

Where Next?

Popular in Questions Top

vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
Kurisu
For example for a current url like http://localhost:4000/cosmetic/products?_utf8=✓&query=perfume&page=2, I would like to get: ...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
beno
I will often find my self writing things similar to: case some_value do nil -> something() "" -> something() _ -> somethi...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New

Other popular topics Top

aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
chrismccord
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
josevalim
Hi everyone, One of the features added to Elixir early on to help integration with Erlang code was the idea of overridable function defi...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
AstonJ
Seen any cool LiveView demos, sample apps or examples? Please post them here! :003:
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New

We're in Beta

About us Mission Statement