目的:使用libiec61850-1.4 库接收和发送goose数据,环境Ubuntu 18.04.4 LTS。
问题:使用libiec61850-1.4\examples\goose_publisher例程发送goose数据正常,使用libiec61850-1.4\examples\goose_subscriber例程接收不到数据。
调试分析源代码后问题已解决,记录如下:
1.注释掉bind代码:libiec61850-1.4new\hal\ethernet\linux\ethernet_linux.c
/* non-blocking receive */
int
Ethernet_receivePacket(EthernetSocket self, uint8_t* buffer, int bufferSize)
{
#if 0
if (self->isBind == false) {
if (bind(self->rawSocket, (struct sockaddr*) &self->socketAddress, sizeof(self->socketAddress)) == 0)
self->isBind = true;
else
{
perror("bind error:Ethernet_receivePacket");
return 0;
}
}
#endif
return recvfrom(self->rawSocket, buffer, bufferSize, MSG_DONTWAIT, 0, 0);
}
2.由于goose_subscriber接收端例程没有发送接口,所以需要封装一个发送接口。
//libiec61850-1.4new\src\goose\goose_receiver.c
int GooseReceiver_sendPacket(GooseReceiver self, unsigned char buf[], uint32_t dwLen)
{
uint8_t srcAddr[6];
if (self->interfaceId != NULL)
{
Ethernet_getInterfaceMACAddress(self->interfaceId, srcAddr);
memcpy(&buf[0], srcAddr, sizeof(srcAddr));
}
Ethernet_sendPacket(self->ethSocket, buf, dwLen);
return 0;
}
3.接收多个goose订阅,以下是根据例程重写函数,不难。
4.编译与运行
/libiec61850-1.4# make
libiec61850-1.4/examples/goose_publisher# make
libiec61850-1.4/examples/goose_subscriber# make
libiec61850-1.4/examples/goose_publisher# sudo ./goose_publisher_example ens33
libiec61850-1.4/examples/goose_subscriber# sudo ./goose_subscriber_example ens33
拿到数据后就可以为所欲为了!