缘由
同一个交换机下无法连接多个设备进行goose通信。
实践
以下实践均在同一个交换机上做出,不同交换机上还没有这个问题:单片机网卡同时可以接收带TPID、TCI和不带TPID、TCI都能够接收,使用wireshark抓包看不到TPID、TCI,被抓包软件过滤掉了,goose发布端口能够正常发送,订阅端口也能够正常接收,被抓包软件带偏了,导致无法正常解析带TPID、TCI的报文数据,在enc624j600网卡接收goose报文时,会判断报文类别,也就是ethhdr->type,根据相应的ethhdr->type进入不同的回调函数。在接收到不带TPID、TCI的goose报文时,那么报文的第12个字节和第13个字节是0x88、0xb8,也就是ETH_P_GOOSE类型。当报文中带TPID、TCI(假设TPID设置为0x81、0x00),报文的第12个字节和第13个字节会变成0x81和0x00,但是接收中没有对这个类型进行处理,导致无法正常接收到带TPID、TCI的goose报文。
/** GOOSE**/
ETH_P_GOOSE = 0x88B8U,
/** VLAN **/
ETH_P_GOOSE_VLAN = 0x8100U
switch (htons(ethhdr->type)) {
/* IP or ARP packet? */
case ETHTYPE_IP:
case ETHTYPE_IPV6:
case ETHTYPE_ARP:
/* full packet send to tcpip_thread to process */
ok = netif->input(p, netif);
if (ok != ERR_OK) {
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
pbuf_free(p);
p = NULL;
}
break;
case ETH_VLAN:
case ETH_P_GOOSE:
......
GooseReceiver_handleMessage(receiver, p->payload, p->len);
pbuf_free(p);
p = NULL;
break;
......