我正在使用libartnet库(https://github.com/OpenLightingProject/libartnet/tree/master/artnet)来构建artnet DMX控制器。但是,当库尝试发送第一个数据包时,出现“错误:发送失败:无效参数”。
我在这里初始化库:
- (BOOL)initArtNet
{
printf("Init art net\n");
char *ip_addr = NULL;//"10.0.0.1";// NULL;//"10.0.0.75";//NULL;
uint8_t subnet_addr = 0;
uint8_t port_addr = 1;
/*artnet_node **/m_artnetNode = artnet_new(ip_addr, 0);
if (!m_artnetNode) {
printf("Error: %s\n", artnet_strerror());
return NO;
}
artnet_set_long_name(m_artnetNode, "Art-Net Test");
artnet_set_short_name(m_artnetNode, "ANT");
// set the upper 4 bits of the universe address
artnet_set_subnet_addr(m_artnetNode, subnet_addr) ;
// enable port 0
artnet_set_port_type(m_artnetNode, 0, ARTNET_ENABLE_OUTPUT, ARTNET_PORT_DMX) ;
// bind port 0 to universe 1
artnet_set_port_addr(m_artnetNode, 0, ARTNET_OUTPUT_PORT, port_addr);
artnet_dump_config(m_artnetNode);
artnet_set_handler(m_artnetNode, ARTNET_RECV_HANDLER, artnetReceiver, NULL);
if (artnet_start(m_artnetNode) != 0) {
printf("Error: %s\n", artnet_strerror());
return NO;
}
return YES;
}
artnet_start(m_artnetNode)在libartnet库中调用此方法:
int artnet_start(artnet_node vn) {
node n = (node) vn;
int ret;
check_nullnode(vn);
if (n->state.mode != ARTNET_STANDBY)
return ARTNET_ESTATE;
if ((ret = artnet_net_start(n)))
return ret;
n->state.mode = ARTNET_ON;
if (n->state.reply_addr.s_addr == 0) {
n->state.reply_addr = n->state.bcast_addr;
}
// build the initial reply
if ((ret = artnet_tx_build_art_poll_reply(n)))
return ret;
if (n->state.node_type == ARTNET_SRV) {
// poll the network
if ((ret = artnet_tx_poll(n,NULL, ARTNET_TTM_AUTO)))
return ret;
if ((ret = artnet_tx_tod_request(n)))
return ret;
} else {
// send a reply on startup
if ((ret = artnet_tx_poll_reply(n, FALSE)))
return ret;
}
return ret;
}
然后将错误引发到'artnet_tx_poll(n,NULL,ARTNET_TTM_AUTO)':
int artnet_tx_poll(node n, const char *ip, artnet_ttm_value_t ttm) {
artnet_packet_t p;
int ret;
if (n->state.mode != ARTNET_ON)
return ARTNET_EACTION;
if (n->state.node_type == ARTNET_SRV || n->state.node_type == ARTNET_RAW) {
if (ip) {
ret = artnet_net_inet_aton(ip, &p.to);
if (ret)
return ret;
} else {
p.to.s_addr = n->state.bcast_addr.s_addr;
}
memcpy(&p.data.ap.id, ARTNET_STRING, ARTNET_STRING_SIZE);
p.data.ap.opCode = htols(ARTNET_POLL);
p.data.ap.verH = 0;
p.data.ap.ver = ARTNET_VERSION;
p.data.ap.ttm = ~ttm;
p.data.ap.pad = 0;
p.length = sizeof(artnet_poll_t);
return artnet_net_send(n, &p);
} else {
artnet_error("Not sending poll, not a server or raw device");
return ARTNET_EACTION;
}
}
...在'sendto(...)'处调用'artnet_net_send(n,&p)':
int artnet_net_send(node n, artnet_packet p) {
struct sockaddr_in addr;
int ret;
if (n->state.mode != ARTNET_ON)
return ARTNET_EACTION;
addr.sin_family = AF_INET;
addr.sin_port = htons(ARTNET_PORT);
addr.sin_addr = p->to;
p->from = n->state.ip_addr;
if (n->state.verbose)
printf("sending to %s\n" , inet_ntoa(addr.sin_addr));
ret = sendto(n->sd,
(char*) &p->data, // char* required for win32
p->length,
0,
(SA*) &addr,
sizeof(addr));
if (ret == -1) {
artnet_error("Sendto failed: %s", artnet_net_last_error());
n->state.report_code = ARTNET_RCUDPFAIL;
return ARTNET_ENET;
} else if (p->length != ret) {
artnet_error("failed to send full datagram");
n->state.report_code = ARTNET_RCSOCKETWR1;
return ARTNET_ENET;
}
if (n->callbacks.send.fh) {
get_type(p);
n->callbacks.send.fh(n, p, n->callbacks.send.data);
}
return ARTNET_EOK;
}
我对此感到茫然,我看不到问题在libartnet库本身中,更多的是如何初始化或在我的xCode项目中设置的。无论哪种方式,我都将非常感激对此提供的任何帮助。
该项目正在通过单元测试运行,导致线程问题初始化artnet库。