Я думал об использовании Boost Asio для чтения данных из Socket CAN . В linux/can.h ничего особенного не происходит, и устройство должно вести себя как петлевой интерфейс и использоваться с необработанным сокетом.
Глядя на интерфейс basic_raw_socket
, кажется, что я могу использовать базовый _необработанный _сокет ::назначить для назначения собственного сокета, созданного с помощью
socket( PF_CAN, SOCK_RAW, CAN_RAW );
Это то, что у меня есть до сих пор
namespace can {
class CanSocket {
public:
typedef boost::asio::ip::basic_endpoint endpoint;
typedef boost::asio::ip::basic_resolver_query resolver_query;
typedef boost::asio::ip::basic_resolver_iterator resolver_iterator;
typedef boost::asio::basic_raw_socket socket;
typedef boost::asio::ip::basic_resolver 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;
};
}
И вот как я использую его в своем приложении
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) );
Чего я не совсем понимаю, так это того, как привязатьs
к локальной конечной точке? Нет никаких IP-адресов или портов.
Есть ли что-то еще, что нужно реализовать помимо конечной точки, чтобы все заработало?