manhuami2007 发表于 2022-5-3 16:19

【平头哥RVB2601创意应用开发】 第六篇 建立TCP客户端

<div class="parsedown-markdown">
<p>wifi的使用不太顺利,源代码的结构很乱,使用代码的跳转功能,发现socket的函数在sal和socket的头文件之间跳来跳去,成了一个循环,找不到具体在哪里实现的,放弃了。</p>

<p>后来参考多位坛友的分享,使用w800里的函数,创建了一个TCP的客户端。</p>

<p>创建过程如下:</p>

<h3>1.连接wifi</h3>

<p>整个代码的修改是在&quot;ch2601_webplayer_demo&quot;的例程下进行修改的。首先在&quot;init.c&quot;里的&quot;static void network_init()&quot;修改自己wifi的ssid和密码:</p>

<pre>
<code class="language-c">netmgr_config_wifi(app_netmgr_hdl, "ChinaNet-JvAb", strlen("ChinaNet-JvAb"), "s3fackxx", strlen("s3fackxx"));</code></pre>

<h3>2.增加收到数据的回调函数</h3>

<p>回调函数如下:</p>

<pre>
<code class="language-c">void w800_in(int linkid, void *data, size_t len, char remote_ip, uint16_t remote_ports)
{
    uint8_t* d;
    uint8_t speed;
    d=(uint8_t *)data;
    printf("rev:%sn",data);
    // do sth. in here
}</code></pre>

<p>注册回调函数,注册的位置也放到了&quot;init.c&quot;里的&quot;static void network_init()&quot;中,完整的&quot;static void network_init()&quot;函数如下:</p>

<pre>
<code class="language-cpp">static void network_init()
{
    w800_wifi_param_t w800_param;
    /* init wifi driver and network */
    w800_param.reset_pin      = PA21;
    w800_param.baud         = 1*1000000;
    w800_param.cs_pin         = PA15;
    w800_param.wakeup_pin   = PA25;
    w800_param.int_pin      = PA22;
    w800_param.channel_id   = 0;
    w800_param.buffer_size    = 4*1024;

    wifi_w800_register(NULL, &amp;w800_param);
    app_netmgr_hdl = netmgr_dev_wifi_init();

    if (app_netmgr_hdl) {
      utask_t *task = utask_new("netmgr", 2 * 1024, QUEUE_MSG_COUNT, AOS_DEFAULT_APP_PRI);
      netmgr_service_init(task);
      netmgr_config_wifi(app_netmgr_hdl, "ChinaNet-JvAb", strlen("ChinaNet-JvAb"), "s3fackxx", strlen("s3fackxx"));
                w800_packet_input_cb_register(&amp;w800_in);// 注册回调函数
      netmgr_start(app_netmgr_hdl);
    }
}</code></pre>

<h3>3. 当连上wifi后建立TCP客户端</h3>

<p>在&quot;app_main.c&quot;的&quot;main.c&quot;中,注册了2个事件,分别是获取到IP地址和断开连接时的事件。</p>

<pre>
<code class="language-c">int main(void)
{
    board_yoc_init();
    pwm_io_init();

    /* Subscribe */
    event_subscribe(EVENT_NETMGR_GOT_IP, network_event, NULL);
    event_subscribe(EVENT_NETMGR_NET_DISCON, network_event, NULL);
}</code></pre>

<p>在获取到IP地址的事件中,建立TCP客户端</p>

<pre>
<code class="language-cpp">static void network_event(uint32_t event_id, const void *param, void *context)
{
    switch(event_id) {
    case EVENT_NETMGR_GOT_IP:
      LOGD(TAG, "net got ip");
                w800_connect_remote(0,2,REMOTE_IP,REMOTE_PORT); //连接到服务器
                aos_task_new("dht12_task",dht12_task,NULL,2*1024);//新建线程用于处理数据
      break;
    case EVENT_NETMGR_NET_DISCON:
      LOGD(TAG, "net disconnect");
      break;
    }

    /*do exception process */
    app_exception_event(event_id);
}

void dht12_task(void *paras)
{
        char str;
        unsigned char buf;
        dht12_init();
        while(1){
                dht12_get_data(buf);
                sprintf(str,"temperature:%d.%d;humity:%d.%d;\n",buf,buf,buf,buf);
                w800_send_data(str,strlen(str),1000); //使用此函数实现数据的发送
                aos_msleep(5000);
        }
}</code></pre>

<p>注意要添加头文件 &quot;#include &lt;devices/w800.h&gt;&quot;。使用函数&quot;int w800_send_data(const uint8_t *pdata, int len,int timeout)&quot;实现数据的发送,然后结合第2步中的接收回调函数,就可以实现TCP客户端的任务了。</p>

<p>最后要感谢在前方的坛友,提供了很多特别出色的经验分享。</p>
</div>

<p>&nbsp;</p>

lugl4313820 发表于 2022-5-3 19:48

弄好了,加油。下步把http弄会呗

manhuami2007 发表于 2022-5-4 08:59

lugl4313820 发表于 2022-5-3 19:48
弄好了,加油。下步把http弄会呗

<p>&nbsp;我把项目完结了之后试一试&nbsp;&nbsp;</p>

梦溪开物 发表于 2022-5-11 15:58

<p>wifi联网是不是很难弄呀</p>

<p>&nbsp;</p>
页: [1]
查看完整版本: 【平头哥RVB2601创意应用开发】 第六篇 建立TCP客户端