This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/EK-TM4C1294XL:如何在 lwIP&quot 中使用 UDP 的设备定位器服务器使用"设置设备应用标题、并读相同

Guru**** 2478765 points
Other Parts Discussed in Thread: EK-TM4C1294XL

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/690625/ccs-ek-tm4c1294xl-how-to-use-a-device-locator-server-using-udp-in-lwip-set-a-device-application-title-and-read-same

器件型号:EK-TM4C1294XL

工具/软件:Code Composer Studio

我通过读取示例 enet_io 中的代码、逐渐熟悉 EK-TM4C1294以太网接口。

由于我需要一种在网络上查找器件的方法、因此我看到了文件 locator.c / locator.h 文件中的"在 lwIP 中使用 UDP 的器件定位器服务器"可能的解决方案。

在搜索项目时、此代码似乎没有被很好地使用。 例如、从未调用"Set a Device Application Title"来设置包含标题的字符串(我可以看到)。

还有一个用于 Windows 的软件、它可以找到使用此定位器在网络中宣布其漂亮的设备吗?

我会假设 ARp -a 这样的值、它不仅返回 IP 地址、MAC、还返回定位器中的其余字段。

谢谢、

(Forrest) Lee Erickson

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我对这一点更困惑、因为我发现了 A h 在 enet_io.c 中搜索"LocatorAppTitleSet"代码、该代码用于设置标题。
    从644行开始:
    //设置设备定位服务。
    //
    LocatorInit();
    LocatorMACAddrSet (pui8MACArray);
    LocatorAppTitleSet ("EK-TM4C1294XL enet_IO");


    我仍然需要一种从客户端 PC 读取此信息的方法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Forrest、

    这里不是专家。 但我认为 LocatorInit()正在设置 UDP 发现响应,以预期客户端尝试查找服务器。 客户端将在搜索服务器时发出自己的多播消息、然后服务器将对该服务器作出响应。 客户端可以定期重复发送此多播消息、直到服务器响应。

    您可能需要检查本地 IT 部门可以使用哪些 Windows 网络查询命令来查找网络上的服务。 我进行了一些 Google 搜索、但实际上并没有遇到命令。 我找到了命令 DNS -SD、但它对我来说不是很有效。 我建议您从您的 IT 网络专家处了解这一点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    感谢您回来。 我想我们在同一页上。
    是的、我认为提出我的问题的另一种方法是、我正在寻找客户端可以找到该服务器并读取 TM4C1294XL 服务器上 UDP 中设置的信息。

    名为 utility>locator.h 的文件夹中的文件提到了....

    //此函数在收到 UDP 时由 lwIP TCP/IP 堆栈调用
    //发现端口的数据包。 它生成响应数据包、即
    //发送回查询客户端。

    但我还没有弄清楚"查询客户机"。

    我认为、作为 Web 服务器的 TM4C1294XL 的每个用户应用程序都存在查找服务器的问题。

    谢谢、
    Forrest Erickson
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Forrest、
    您引用的注释是指 LocatorReceive()函数。

    请参阅定义 LocatorReceive()的 locator.c。 LocatorReceive()是一个回调函数,在收到 UDP 数据报时调用。 请参见 LocatorInit()函数中的 udp_recv()如何注册 LocatorReceive()回调。 您可以看到服务器正在等待来自客户端的一些查询。 接收到 UDP 数据报后,将调用 LocatorReceive,然后评估数据报是否为发现数据包。 如果接收到的数据包是发现数据包、则会发送响应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    关于、

    [引用用户="Charles Tsaaa">您好 Forrest、
    您引用的注释是指 LocatorReceive()函数。

    请参阅定义 LocatorReceive()的 locator.c。 LocatorReceive()是一个回调函数,在收到 UDP 数据报时调用。 请参见 LocatorInit()函数中的 udp_recv()如何注册 LocatorReceive()回调。 您可以看到服务器正在等待来自客户端的一些查询。 接收到 UDP 数据报后,将调用 LocatorReceive,然后评估数据报是否为发现数据包。 如果接收到的数据包是发现数据包、则会发送响应。

    [/报价]

    感谢 Charles 的帮助。

    下面是我的思路。

    文件 locator.c 具有在端口23上设置侦听器的代码。  我从 UDP_BIND 语句推断端口号、该语句遵循 UDP_rec 协议控制块的设置。
       //创建一个新的 UDP 端口,用于侦听设备定位器请求。
       //
       PCB = UDP_NEW ();
       UDP_recv (PCB、LocatorReceive、NULL);
       UDP_BIND (PCB、IP_ADDR_ANY、23);

    LocatorReceive 函数测试 UDP 数据包、如果该数据包通过、则返回响应。  从同一个文件:
    //
    //
    //此函数在收到 UDP 时由 lwIP TCP/IP 堆栈调用
    //发现端口的数据包。  它生成响应数据包、即
    //发送回查询客户端。
    //
    //
    静态空
    LocatorReceive(void *arg,struct udp_pcb *pcb,struct pbuf *p,
                  struct ip_addr *地址、u16_t 端口)

       uint8_t * pui8Data;
       uint32_t ui32Idx;

       //
       //验证数据报的内容。
       //
       pui8Data = p->payload;
       if (p->len!= 4)||(pui8Data[0]!= tag_CMD)||(pui8Data[1]!= 4)||
          (pui8Data[2]!= CMD_discover_target)||
          (pui8Data[3]!=(0 - TAG_CMD - 4 - CMD_discover_target)& 0xff)))
       {
           pbuf_free (p);
           返回;
       }

     //
       //不再需要传入的 pbuf,因此可以将其释放。
       //
       pbuf_free (p);

       //
       //为发送响应分配一个新的 pbuf。
       //
       p = pbuf_alloc (PBUF_transport、sizeof (g_pui8LocatorData)、PBUF_RAM);
       if (p = NULL)
       {
           返回;
       }

       //
       //计算并填写响应数据包上的校验和。
       //
       for (ui32Idx = 0、g_pui8LocatorData[sizeof (g_pui8LocatorData)- 1]= 0;
           ui32Idx <(sizeof (g_pui8LocatorData)- 1);ui32Idx++)
       {
           G_pui8LocatorData[sizeof (g_pui8LocatorData)-1]-=
               G_pui8LocatorData[ui32Idx];
       }

       //
       //将响应数据包数据复制到 pbuf 中。
       //
       pui8Data = p->payload;
       for (ui32Idx = 0;ui32Idx < sizeof (g_pui8LocatorData);ui32Idx++)
       {
           pui8Data[ui32Idx]= g_pui8LocatorData[ui32Idx];
       }

       //
       //发送响应。
       //
       udp_sendto (pcb、p、addr、port);



       //
       //释放 pbuf。
       //
       pbuf_free (p);

    因此,我需要的是一个客户端,它发送适当的 UDP 数据报以满足条件测试,并接收已制定的响应并告诉我成功(找到了服务器)。

    任何想法、排队 UDP 数据报是否是一个定义明确的行业标准(来自某个位置的库?) 是否有名称或书面案例?


    当然、感谢您阅读到目前为止的内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Forrest、
    我不是 UDP 发现方面的专家。 但是、我在下面找到了一些链接、这些链接可能对您的理解有所帮助。

    support.biamp.com/.../TCP_and_UDP_discovery_methods
    michieldemey.be/.../
    en.wikipedia.org/.../Simple_Service_Discovery_Protocol
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在处理中创建了一个程序、以发送 UDP 广播并接收来自 Tiva 上定位器服务器的数据的单播应答。

    这是一个工作版本。

    我将对此进行一些更详细的阐述、并在确定上传流程时将其上传到 GitHub。

    /**
     * udp_broadcast。 通过修改 Proccessing UDP_multicast 示例创建。
     *李埃里克森
     *日期:20180527
     *尝试广泛应用到 TIVI Launchpad 器件
     * Tiva 设备 UDP 端口显示为23。
     * TI 文件 locator.c 定义了它想要接收的四个字节的序列。
     *这些定义用于描述设备定位器协议。
     #define TAG_CMD                0xff
     #define TAG_STATUS             0xFE
     #define CMD_discover_target    0x02
     *

    // LocatorReceive 函数中按照 locator.c 的 tag_check_Byte 公式。
    字节 TAG_CMD =字节(0xFF);
    字节 TAG_STATUS =字节(0xFE);
    字节 CMD_discover_target =字节(0x02);
    字节 TAG_CHECK_BYTE = BYTE ((0 - TAG_CMD - 4 - CMD_discover_target)& 0xff);

    // IP 地址和 UDP 端口号。
    string broadcast_ip_address ="255.255.255.255";
    字符串组播_IP_address ="224.0.0.1";
    字符串 my_IP_address ="192.168.1.29";
    int udp_port = 23;

    //导入 UDP 库
    导入 hypermedia.net.*;

    UDP UDP; // UDP 对象

    /**
     *初始化帧和 UDP 对象。
     *
     
    void setup(){
    //通过设置多播设置广播????
     大小(255,255);
     背景(32); //深灰色背景
     
     UDP = new udp( this,udp_port,multicing_ip_address );
     udp.loopback (false); //禁止我们自己的广播。
     udp.log (true); //这将显示 UDP 趋势输出和输入运行此软件的 PC。

    // udp.setReceiveHandler(this.myCustomReceiveHandler);
     udp.setReceiveHandler("myCustomReceiveHandler");

     //设置持续监听并等待输入数据
     udp.listen( true );
     println ("我们正在聆听");

     //打开广播
     udp.broadcast(true);
     //... 嗯、只是验证它是否真的是多播套接字和消融
     println(“init as Multicast socket ...” "+udp.isMulticast ();
    // println (“init as Broadcast socket……” "+udp.isBroadcast());
     println(“UDP 加入组 ... "+udp.isJoined());
    // println ("UDP 广播打开?  (笑声) "+ udp.broadcast(true);
     println ("在窗口中单击鼠标以发送广播并查找设备。");
     

    //处理事件
    void Draw (){


    /**
     *在鼠标上单击:
     *点击鼠标发送 TI UDP 数据。
     *
    void mouseClicked(){
     println ("已单击鼠标。\n");

     // Tivia Locator UDP 字符串创建。
     //这适用于完整的 Launchpad 条件测试   
     byte[] bdata =新字节[4];
     bdata[0]= tag_cmd;
     bdata[1]=字节(0x04);
     bdata[2]= CMD_discover_target;
     bdata[3]=字节(tag_check_byte);

     //字符串 sLocator
     字符串 sLocator = str (bdata[0]+ bdata[1]+ bdata[2]+ bdata[3]);
     println ("正在发送 TI 定位器广播。 ");
     udp.send (bdata、broadcast_ip_address、udp_port);//= send (data、group_ip、port);
    }//鼠标单击

     
    //自定义接收器处理程序,从响应广播的客户端获取数据。
    void myCustomReceiveHandler( byte[] data、String IP、int port ){
     字符串 removeMAC ="";
     字符串 remoteAppTitle ="";
     字符串 remoteIPaddress = IP;
     字节 tempdata []=新字节[255];

    //写入绘图窗口
     textSize (32);
     文本("GOT: "、0、20);
     对于(int i =0;i< data.length;i++){
       文本(十六进制(数据[i])、i*32、41);
       print (hex (data[i]));
     }

    //查找定位器的广播是4个字节集,因此我们忽略它们。
     if (data.length >4){
     //写入控制台。
       println ("\n\n 已找到新设备! ");
       println ("设备地址为:"+ IP +"、端口:"+端口);
       //print ("myReceivedata data:");
       //println("");

       Print ("渴望满足男孩和女孩的设备需求? ");

       //解析一些数据!
       打印("这是您的大 Mac:");
       对于(int i = 9;i<=14;i++){
          print (hex (data[i]));
       }  
     
       print("\n 您的名字是什么? (你的要求是什么?):");
       //解析"AppTitleSet"定位器服务字段。
       对于(int i = 19;(i<64 && data[i]!=0);i++){
          print (char (data[i]));
          tempdata [I-19]=数据[i];      

       }//解析。
    //   字符串 str2 =新字符串(tempdata);
       string str2 =新字符串(data、19、63);
       println ("\na string:"+str2);

     }//IF 数据> 4.

    }// myCustomReceiveHandler (byte[]消息、字符串 IP、int 端口)
     
    //结束。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在网络上查找两个 TM4C1294XL 器件的结果的屏幕截图。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Forrest、
    很高兴您能正常工作。 您会再次发送屏幕截图吗? 它无法查看。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我再次尝试了。

    此屏幕截图是在我进行了一些进一步更改之后、我才进行了更改、以使结果显示为更好的可读性。

    我将尝试在我可以确定如何操作时检查 GitHub。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    本应用手册中提到了定位服务

    www.ti.com/lit/ug/tidu951/tidu951.pdf 
    和 www.ti.com/lit/ug/tidu951/tidu951.pdf 

    第二个文档解释了如何在 TivaWare 文件夹中找到并使用 TI 在示例代码中为此定位器服务器函数提供的"查找程序"。
    请参阅: C:\ti\TivaWare_C_Series-2.1.4.178\tools\bin\finder.exe
    源代码位于 :C:\ti\TivaWare_C_Series-2.1.4.178\tools\Finder





  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的处理解决方案现已推送到 GitHub。

    请参阅 :github.com/.../master
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Forrest 的分享。

    Finder 应用程序是另一种在网络上查找 Tiva 器件的工具。