Are you using Gatling 3?
I've done it in 2.3.1 only so far (yes, it takes care of general websocket ping-pongs, but heartbeats i'm dealing with are different).
I've found a place in Gatling code, dealing with received message - WsActor.scala, created my own version of that class, and of everything that was using it (mostly just copy-paste with a few additions of my own, like failing a test step when some message on error channel is received, plus some additional logging).
WS, WSActionBuilders, WSActor, WSOpen, WSOpenRequestBuilder - those are the files that i had to create my own versions of.
Feel free to ping me around 25-26 Dec, I will have some time to investigate possibility of migration to Gatling 3 in my project then, and i might have more ideas on how to handle heartbeats there)