ELM can do both CAN and K-line (but beware of the very cheap Chinese clones that have seriously castrated functionality), but you can't do them both at the same time. Also, it can sniff CAN traffic, but e.g. combining this with true diagnostics requests becomes cumbersome. Plus the serial AT protocol gives substantial overheads on communication and programming (I can make it work, it is versatile I agree, but I hate it with all my guts). For K-line a simple KKL based circuit will be sufficient, both for PC and a board of some sort, only needs suitable program coding. For CAN the best results I got so far was Arduino plus a CAN shield, you can actually buy integrated boards for this (see
http://www.hobbytronics.co.uk/leonardo-canbus). But in either case, if you plan to do something interesting, you would have to solder a bit and decide and then design what you actually need. Also, proper MCP2515 programming on Arduino handling heavy and fast CAN traffic with multi frames is a PITA, you almost have to write a complete OS with interrupt based ring buffers and what not (I learned it the hard way couple of last months, with a finally perfect result). Another alternative is RaspberryPI with a CAN hat. Here the low level programming is sorted out by good people, yet there are other things to take care of (also went this route).
As an example, the picture (was supposed to, there is a problem with adding the attachment) is a box I made that hooks up to the CAN and to the Zeitronix Zt-2 module over serial at the same time, repackages it all into a new packet which is then sent over BT / another serial to my Android app. Plus it has a couple of ready equipped inputs and outputs for dash buttons and lights. Ideal would be to make a proper integrated board design and make it produced in small quantities, but that's just a proof of concept prototype. You can find a clip in a thread nearby.
So this is essentially the route you are on