The ID is just an integer number that you use on the receiver to register a function as RPC. Then you use the same ID on the caller which will result in a call to the function linked to that ID on the receiver.

It's probably best to use a shared header for client and server that contain defines for the IDs:

#define RPC_function1 0
#define RPC_function2 1 // and so on.

You can then register your functions:
RAKGS_registerRPC(function1Ptr, RPC_function1, function1ArgumentCount);

And call the function from another system:
RAKGS_callRemote(RPC_function1, function1ArgumentCount, arg1, arg2, arg3, arg4);


I've built my own RPC functionality, instead of using RakNet. Rationale for this is that RakNet requires you to initialize a struct containing a char* to a list of serialized arguments. This is pretty much the same as serializing your "arguments" with a BitStream, send them with a certain MessageID, and deserialize them in the network event. The way I've implemented RPCs it takes very little setup, and once that's done, all serializing and deserializing is done for you and you just have to call a function.