Estaba pensando en hacer uso de Boost Asio para leer datos de Socket CAN. No hay nada lujoso en linux/can.h, y el dispositivo debe comportarse como la interfaz de bucle invertido , y debe usarse con un conector RAW.boost :: asio over SocketCAN
En cuanto a la interfaz basic_raw_socket
parece que puedo hacer uso de basic_raw_socket::assign para asignar la toma nativa creada con
socket(PF_CAN, SOCK_RAW, CAN_RAW);
Esto es lo que tengo hasta ahora
namespace can {
class CanSocket {
public:
typedef boost::asio::ip::basic_endpoint<CanSocket> endpoint;
typedef boost::asio::ip::basic_resolver_query<CanSocket> resolver_query;
typedef boost::asio::ip::basic_resolver_iterator<CanSocket> resolver_iterator;
typedef boost::asio::basic_raw_socket<CanSocket> socket;
typedef boost::asio::ip::basic_resolver<CanSocket> resolver;
CanSocket()
: _protocol(CAN_RAW)
, _family(PF_CAN)
{
}
static CanSocket v4()
{
return CanSocket();
}
static CanSocket v6();
int type() const;
int protocol() const;
int family() const;
friend bool operator==(const CanSocket& p1, const CanSocket& p2)
{
return p1._protocol != p2._protocol || p1._family != p2._family;
}
friend bool operator!=(const CanSocket& p1, const CanSocket& p2)
{
return p1._protocol == p2._protocol || p1._family == p2._family;
}
private:
int _protocol;
int _family;
};
}
y esto es cómo lo uso en mi aplicación
boost::asio::io_service ioserv;
CanSocket::socket s(ioserv);
int sock = socket(PF_CAN, SOCK_RAW, CAN_RAW);
s.assign(CanSocket::v4(), sock);
struct ifreq ifr;
strcpy(ifr.ifr_name, "vcan0");
ioctl(sock, SIOCGIFINDEX, &ifr); /* ifr.ifr_ifindex gets filled
* with that device's index */
/* Select that CAN interface, and bind the socket to it. */
/* this should be the endpoint */
struct sockaddr_can addr;
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
/* s.bind (....) */
bind(sock, (struct sockaddr*)&addr, sizeof(addr));
Lo que no entiendo es ¿cómo puedo binds
para el punto final local? No hay IPs ni puertos involucrados.
¿Hay algo más que debería implementarse además del punto final para que funcione?
¿Podrían presentar el ejemplo completo de lectura/escritura puede marcos al igual que lo hice para Python: http: //libbits.wordpress .com/2012/05/22/socketcan-support-in-python/Yo luego lo ubicaría en http://elinux.org/CAN_Bus#SocketCAN_Support_in_Programming_Languages.2FEnvironments – yegorich