作者:sanjay

 

学习了RT-Thread的内核也有一段时间了,由于各种各样的琐事自己没有去做一个综合应用示例,刚最近有点时间,做了一个对接OneNET的历程,采用的是OneNET的EDP协议,关于OneNET的EDP协议可以点击跳转至OneNET EDP协议讲解与应用这篇博客看一下,这篇博客会比较详细的介绍对接EDP协议的思路。本篇博客会根据着重的将RT-Thread的应用思路,在本应用示例也只是用来软件定时器、线程管理、信号量而已,因为我用的是潘多拉开发板进行实验,所以AP6181驱动就直接用RT-Thread的,自己也只是在这个基础上做了应用。
使用AP6181 WiFi模组对接OneNET应用示例:STM32+AP6181(SDIO WiFi模组)对接OneNET,实现温湿度定时上报,控制上报周期、控制设备LED灯、蜂鸣器以及电机,掉线自动连接、WiFi自动连接。

 

 

 

 

一、移植需要修改的地方

在移植时,主要也就是修改几个地方,代码如下:

1#define ONENET_EDP_PRODUCT_ID        "190254"    /* 产品id */
2#define ONENET_EDP_PRODUCT_APIKEY    "cWPICK6PDU6cOHP=T0SqMcXWRc4="  /* api key */
3#define ONENET_EDP_DEVICE_ID        "504890772" /* 设备id */
4#define ONENET_EDP_DEVICE_AUTHKEY    "edp20181122"   /* 设备鉴权信息 */

需要修改的为产品ID、APIKEY、设备ID、设备鉴权信息,将这些信息修改为你自己在OneNET开发者中心的产品信息或设备信息。

二、连接OneNET思路

1、开机后,RT-Thread完成一系列的初始化后进入main线程,首先进入main函数会进行执行onenet_edp_sample();函数进行信号量创建、软件定时器创建以及线程创建:

 1rt_err_t onenet_edp_sample(void)
 2{
 3    /* 连接OneNET信号量 */
 4    link_onenet_sem = rt_sem_create("link_onenet_sem", 0, RT_IPC_FLAG_FIFO);
 5    if(link_onenet_sem == RT_NULL)
 6    {
 7        rt_kprintf("[EDP]link_onenet_sem create failed\r\n");
 8        return RT_ERROR;
 9    }
10
11    /* 发送心跳信号量 */
12    send_heart_sem = rt_sem_create("send_heart_sem", 0, RT_IPC_FLAG_FIFO);
13    if(send_heart_sem == RT_NULL)
14    {
15        rt_kprintf("[EDP]send_heart_sem create failed\r\n");
16        return RT_ERROR;
17    }
18
19    /* 用于获取温湿度和发送温湿度信号量 */
20    humi_temp_sem = rt_sem_create("humi_temp_sem", 1, RT_IPC_FLAG_FIFO);
21    if(humi_temp_sem == RT_NULL)
22    {
23        rt_kprintf("[EDP]humi_temp_sem create failed\r\n");
24        return RT_ERROR;
25    }
26
27    /* 用于定时触发上报温湿度数据信号量 */
28    send_humi_temp_sem = rt_sem_create("send_humi_temp_sem", 0, RT_IPC_FLAG_FIFO);
29    if(send_humi_temp_sem == RT_NULL)
30    {
31        rt_kprintf("[EDP]send_humi_temp_sem create failed\r\n");
32        return RT_ERROR;
33    }
34
35    /* 软件定时器,周期执行,120秒 */
36    send_heart_timer = rt_timer_create("send_heart_timer", send_heart_timer_callback, RT_NULL, 120000, RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_PERIODIC);
37    if(send_heart_timer == RT_NULL)
38    {
39        rt_kprintf("[EDP]send_heart_timer create failed\r\n");
40        return RT_ERROR;
41    }
42
43    /* 软件定时器,周期执行,300秒 */
44    send_humi_temp_timer = rt_timer_create("send_humi_temp_timer", send_humi_temp_timer_callback, RT_NULL, 30000, RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_PERIODIC);
45    if(send_humi_temp_timer == RT_NULL)
46    {
47            rt_kprintf("[EDP]send_humi_temp_timer create failed\r\n");
48            return RT_ERROR;
49    }
50
51    /* 连接设备线程 */
52    link_dev_thread = rt_thread_create("link_dev_thread", onenet_edp_link_device_thread, RT_NULL, 2048, 4, 200);
53    if(link_dev_thread == RT_NULL)
54    {
55        rt_kprintf("[EDP]link_dev_thread create failed\r\n");
56        return RT_ERROR;
57    }
58    rt_thread_startup(link_dev_thread);
59
60    /* 发送心跳线程 */
61    send_heart_thread = rt_thread_create("send_heart_thread", onenet_edp_send_heart_thread, RT_NULL, 1024, 4, 50);
62    if(send_heart_thread == RT_NULL)
63    {
64        rt_kprintf("[EDP]send_heart_thread create failed\r\n");
65        return RT_ERROR;
66    }
67    rt_thread_startup(send_heart_thread);
68
69    /* 平台下发命令或结果处理线程 */
70    recv_data_pro_thread = rt_thread_create("recv_data_pro_thread",onenet_edp_receive_process_thread, RT_NULL, 4096, 4, 100);
71    if(recv_data_pro_thread == RT_NULL)
72    {
73        rt_kprintf("[EDP]recv_data_pro_thread create failed\r\n");
74        return RT_ERROR;
75    }
76    rt_thread_startup(recv_data_pro_thread);
77
78    /* 获取温湿度数据线程 */
79    get_humi_temp_thread = rt_thread_create("get_humi_temp_thread", onenet_edp_get_humi_temp_thread, RT_NULL, 4096, 4, 50);
80    if(get_humi_temp_thread == RT_NULL)
81    {
82        rt_kprintf("[EDP]get_humi_temp_thread create failed\r\n");
83        return RT_ERROR;
84    }
85    rt_thread_startup(get_humi_temp_thread);
86
87    /* 上报温湿度数据到平台线程 */
88    send_humi_temp_thread = rt_thread_create("send_humi_temp_thread", onenet_edp_send_humi_temp_thread, RT_NULL, 4096, 4, 100);
89    if(send_humi_temp_thread == RT_NULL)
90    {
91        rt_kprintf("[EDP]send_humi_temp_thread create failed\r\n"); 
92        return RT_ERROR;    
93    }
94    rt_thread_startup(send_humi_temp_thread);
95
96    return RT_EOK;  
97}

2、完成信号量创建、软件定时器的线程创建后,会进行注册网络就绪事件回调、网络断开事件回调、以及连接网络、开启自动连接网络:

 1/* 注册网络就绪回调、 */
 2rt_wlan_register_event_handler(RT_WLAN_EVT_READY, wlan_ready_handler, RT_NULL);
 3/* 注册网络断开事件回调 */
 4rt_wlan_register_event_handler(RT_WLAN_EVT_STA_DISCONNECTED, wlan_station_disconnect_handler, RT_NULL);
 5/* 连接路由器 */
 6rt_wlan_connect(WLAN_SSID, WLAN_PASSWORD);
 7rt_thread_mdelay(1000);
 8/* 开启自动连接 */
 9wlan_autoconnect_init();
10rt_wlan_config_autoreconnect(RT_TRUE);

3、网络就绪回调函数用于释放连接OneNET信号量,告诉系统已经有网络了,可以去连接OneNET了:

1void wlan_ready_handler(int event, struct rt_wlan_buff *buff, void *parameter)
2{
3    rt_kprintf("wlan ready\r\n");
4    if(link_onenet_sem != RT_NULL)
5    {
6        rt_sem_release(link_onenet_sem);
7    }
8}

而另一方面,连接OneNET线程会移植挂起等待连接OneNET的信号量,指导获取到这个信号量才开始去连接OneNET:

 1/**************************************************************
 2函数名称:onenet_edp_link_device_thread
 3函数功能:连接OneNET平台设备线程
 4输入参数:parameter:线程入口参数
 5返 回 值:无
 6备    注:WiFi注册上网了后连接平台,连接成功则启动定时器发送心跳
 7**************************************************************/
 8void onenet_edp_link_device_thread(void *parameter)
 9{
10    rt_err_t result = RT_ERROR;
11
12    while(1)
13    {
14        result = rt_sem_take(link_onenet_sem, RT_WAITING_FOREVER); /* 等待时间:一直等 */
15        if(RT_EOK == result)
16        {
17            #ifdef USING_DEVICEID_APIKEY_LINK
18            onenet_edp_link_device(ONENET_EDP_SRV_ADDR, ONENET_EDP_SRV_PORT, ONENET_EDP_DEVICE_ID, ONENET_EDP_PRODUCT_APIKEY);
19            #else
20            onenet_edp_link_device(ONENET_EDP_SRV_ADDR, ONENET_EDP_SRV_PORT, ONENET_EDP_PRODUCT_ID, ONENET_EDP_DEVICE_AUTHKEY);
21            #endif
22        }
23        rt_thread_mdelay(1);
24        rt_thread_yield();/* 放弃剩余时间片,进行一次线程切换 */
25    }
26}

三、数据上报和心跳发送思路

1、连接上OneNET之后,处理平台下发命令或结果的线程会得到连接成功返回结果并进行处理,启动软件定时器进行发送心跳和上报数据:

 1case 0:
 2{
 3    rt_kprintf("Tips:   连接成功\r\n");
 4    if(send_heart_timer != RT_NULL)
 5    {
 6        rt_kprintf("[EDP]start send_heart_timer\r\n");
 7        rt_timer_start(send_heart_timer);/* 启动软件定时器定时发送心跳 */
 8    }
 9    if(send_humi_temp_timer != RT_NULL)
10    {
11            rt_kprintf("[EDP]start send_humi_temp_timer\r\n");
12            rt_timer_start(send_humi_temp_timer);/* 启动软件定时器定时上报数据 */
13    }
14    break;
15}

2、软件定时器回调函数用于释放发送心跳信号量:

 1/**************************************************************
 2函数名称:send_heart_timer_callback
 3函数功能:软件定时器回调函数,用于定时发送信号量来触发发送心跳包
 4输入参数:parameter:入口参数
 5返 回 值:无
 6备    注:无
 7**************************************************************/
 8void send_heart_timer_callback(void *parameter)
 9{
10    if(send_heart_timer != RT_NULL)
11    {
12        rt_sem_release(send_heart_sem);
13    }
14}

3、发送心跳线程获取到信号量之后执行发送心跳操作:

 1/**************************************************************
 2函数名称:onenet_edp_send_heart_thread
 3函数功能:发送心跳线程
 4输入参数:parameter:线程入口参数
 5返 回 值:无
 6备    注:无
 7**************************************************************/
 8void onenet_edp_send_heart_thread(void *parameter)
 9{
10    rt_err_t result = RT_ERROR;
11
12    while(1)
13    {
14        result = rt_sem_take(send_heart_sem, RT_WAITING_FOREVER); /* 等待时间:一直等 */
15        if(RT_EOK == result)
16        {
17            onenet_edp_send_heart();
18        }
19        rt_thread_mdelay(1);
20        rt_thread_yield();/* 放弃剩余时间片,进行一次线程切换 */
21    }
22}

4、同理,上报数据也是等待信号量,一旦获取到就上报数据,为保证数据上报的同步,获取数据与上报数据用来二值信号量,实现代码:

 1/**************************************************************
 2函数名称:onenet_edp_get_humi_temp_thread
 3函数功能:获取温湿度数据线程
 4输入参数:parameter:线程入口参数
 5返 回 值:无
 6备     注:无
 7**************************************************************/
 8void onenet_edp_get_humi_temp_thread(void *parameter)
 9{
10    rt_err_t result = RT_ERROR;
11
12    while(1)
13    {
14        result = rt_sem_take(send_humi_temp_sem, RT_WAITING_FOREVER); /* 等待时间:一直等 */
15        if(RT_EOK == result)
16        {
17            result = rt_sem_take(humi_temp_sem, RT_WAITING_FOREVER); /* 等待时间:一直等 */
18            if(RT_EOK == result)
19            {
20                aht10_read_data(&g_temperature, &g_humidity);
21            }
22            rt_sem_release(humi_temp_sem);  /* 释放信号量 */
23        }
24        rt_thread_mdelay(1);
25        rt_thread_yield();/* 放弃剩余时间片,进行一次线程切换 */
26    }
27}
28
29/**************************************************************
30函数名称:onenet_edp_send_humi_temp_thread
31函数功能:发送温湿度数据线程
32输入参数:parameter:线程入口参数
33返 回 值:无
34备     注:无
35**************************************************************/
36void onenet_edp_send_humi_temp_thread(void *parameter)
37{
38    rt_err_t result = RT_ERROR;
39
40    while(1)
41    {
42        result = rt_sem_take(send_humi_temp_sem, RT_WAITING_FOREVER); /* 等待时间:一直等 */
43        if(RT_EOK == result)
44        {
45            result = rt_sem_take(humi_temp_sem, RT_WAITING_FOREVER); /* 等待时间:一直等 */
46            if(RT_EOK == result)
47            {
48                /* 上传温湿度数据到平台 */
49                if(RT_EOK == onenet_edp_send_data(FORMAT_TYPE3, ONENET_EDP_DEVICE_ID, ONENET_EDP_PRODUCT_APIKEY, humi_temp_data_stream, humi_temp_data_stream_cnt))
50                {
51                    rt_kprintf("Humi_Temp Send success\n");
52                }
53                else
54                {
55                    rt_kprintf("Humi_Temp Status Send failed\n");
56                }
57            }
58            rt_sem_release(humi_temp_sem);  /* 释放信号量 */
59        }
60        rt_thread_mdelay(1);
61        rt_thread_yield();/* 放弃剩余时间片,进行一次线程切换 */
62    }
63}

四、设备断开与网络断开处理

1、如果在有网络的情况下设备突然断开,那么就需要重新连接OneNET了,首先会停止所有定时器、接着重新发送连接OneNET信号量,处理如下:

 1case DISCONNECT:
 2{
 3    rt_kprintf("WARN:连接断开,准备重连\r\n");
 4    if(send_heart_timer != RT_NULL)
 5    {
 6        rt_kprintf("[EDP]stop send_heart_timer\r\n");
 7        rt_timer_stop(send_heart_timer);/* 关闭软件定时器 */
 8    }
 9    if(send_humi_temp_timer != RT_NULL)
10    {
11        rt_kprintf("[EDP]stop send_humi_temp_timer\r\n");
12        rt_timer_stop(send_humi_temp_timer);/* 关闭软件定时器 */
13    }
14    if(link_onenet_sem != RT_NULL)
15    {
16        rt_sem_release(link_onenet_sem);
17    }
18    break;
19}

2、如果是网络断开,那么就需要停止软件定时器,处理如下:

 1void wlan_station_disconnect_handler(int event, struct rt_wlan_buff *buff, void *parameter)
 2{
 3    rt_kprintf("disconnect from the network!\n");
 4
 5    if(send_heart_timer != RT_NULL)
 6    {
 7        rt_kprintf("[EDP]stop send_heart_timer\r\n");
 8        rt_timer_stop(send_heart_timer);/* 关闭软件定时器 */
 9    }
10    if(send_humi_temp_timer != RT_NULL)
11    {
12        rt_kprintf("[EDP]stop send_humi_temp_timer\r\n");
13        rt_timer_stop(send_humi_temp_timer);/* 关闭软件定时器 */
14    }
15}

五、命令处理思路

1、在命令处理里面,主要做了控制LED、BEEP、电机以及控制上报数据周期,其中控制数据上报周期用到了rt_timer_control函数,处理如下:

  1/**************************************************************
  2函数名称:onenet_edp_command_callback
  3函数功能:平台下发命令回调函数
  4输入参数:req:下发的命令
  5返 回 值:无
  6备    注:无
  7**************************************************************/
  8void onenet_edp_command_callback(char *req)
  9{
 10    char *time_ptr = NULL;
 11    unsigned int current_time = 0;
 12
 13    rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT);
 14    rt_pin_mode(PIN_MOTOR_A, PIN_MODE_OUTPUT);
 15    rt_pin_mode(PIN_MOTOR_B, PIN_MODE_OUTPUT);
 16    rt_pin_mode(PIN_BEEP, PIN_MODE_OUTPUT);
 17    led_ctrl(0);
 18    beep_ctrl(0);
 19    motor_ctrl(0);
 20
 21    /* LED */
 22    if(strstr((const char*)req, "LED"))
 23    {
 24        if(strcmp("LED:1", req) == 0)
 25        {
 26            g_led_status = 1;
 27            led_ctrl(1);
 28            /* 上传LED状态数据到平台 */
 29            onenet_edp_send_data(FORMAT_TYPE3, ONENET_EDP_DEVICE_ID, ONENET_EDP_PRODUCT_APIKEY, led_status_data_stream, led_status_data_stream_cnt);
 30        }
 31        else if(strcmp("LED:0", req) == 0)
 32        {
 33            g_led_status = 0;
 34            led_ctrl(0);
 35            /* 上传LED状态数据到平台 */
 36            onenet_edp_send_data(FORMAT_TYPE3, ONENET_EDP_DEVICE_ID, ONENET_EDP_PRODUCT_APIKEY, led_status_data_stream, led_status_data_stream_cnt);
 37        }
 38        else
 39        {
 40
 41        }
 42    }
 43    /* 蜂鸣器 */
 44    else if(strstr((const char*)req, "BEEP"))
 45    {
 46        if(strcmp("BEEP:1", req) == 0)
 47        {
 48            g_beep_status = 1;
 49            beep_ctrl(1);
 50            /* 上传BEEP状态数据到平台 */
 51            onenet_edp_send_data(FORMAT_TYPE3, ONENET_EDP_DEVICE_ID, ONENET_EDP_PRODUCT_APIKEY, beep_status_data_stream, beep_status_data_stream_cnt);
 52        }
 53        else if(strcmp("BEEP:0", req) == 0)
 54        {
 55            g_beep_status = 0;
 56            beep_ctrl(0);
 57            /* 上传BEEP状态数据到平台 */
 58            onenet_edp_send_data(FORMAT_TYPE3, ONENET_EDP_DEVICE_ID, ONENET_EDP_PRODUCT_APIKEY, beep_status_data_stream, beep_status_data_stream_cnt);
 59        }
 60        else
 61        {
 62
 63        }
 64    }
 65    /* 电机 */
 66    else if(strstr((const char*)req, "MOTOR"))
 67    {
 68        if(strcmp("MOTOR:1", req) == 0)
 69        {
 70            g_motor_status = 1;
 71            motor_ctrl(1);
 72            /* 上传BEEP状态数据到平台 */
 73            onenet_edp_send_data(FORMAT_TYPE3, ONENET_EDP_DEVICE_ID, ONENET_EDP_PRODUCT_APIKEY, motor_status_data_stream, motor_status_data_stream_cnt);
 74        }
 75        else if(strcmp("MOTOR:0", req) == 0)
 76        {
 77            g_motor_status = 0;
 78            motor_ctrl(0);
 79            /* 上传BEEP状态数据到平台 */
 80            onenet_edp_send_data(FORMAT_TYPE3, ONENET_EDP_DEVICE_ID, ONENET_EDP_PRODUCT_APIKEY, motor_status_data_stream, motor_status_data_stream_cnt);
 81        }
 82        else
 83        {
 84
 85        }
 86    }
 87    else if(strstr((const char*)req, "TIME"))
 88    {
 89        time_ptr = req + 5;
 90        g_data_time = (RT_TICK_PER_SECOND * atoi(time_ptr));/* 单位:秒 */
 91        if(g_data_time > 0)
 92        {
 93            rt_kprintf("g_data_time:%d\r\n", g_data_time);
 94            if(RT_EOK == rt_timer_control(send_humi_temp_timer, RT_TIMER_CTRL_SET_TIME, &g_data_time))
 95            {
 96                rt_kprintf("修改定时上传温湿度周期成功,当前周期值为:%d\r\n", g_data_time);
 97            }
 98            else
 99            {
100                rt_kprintf("修改定时上传温湿度周期失败\r\n");
101            }
102        }
103        if(RT_EOK == rt_timer_control(send_humi_temp_timer, RT_TIMER_CTRL_GET_TIME, &current_time))
104        {
105            rt_kprintf("current_time:%d\r\n", current_time);
106        }
107        /* 上传获取数据周期值到平台 */
108        onenet_edp_send_data(FORMAT_TYPE3, ONENET_EDP_DEVICE_ID, ONENET_EDP_PRODUCT_APIKEY, data_time_data_stream, data_time_data_stream_cnt);
109    }
110    else
111    {
112        rt_kprintf("receive other commond\r\n");
113    }
114}

六、在OneNET实现的应用示例

RT-Thread综合应用学习示例——使用AP6181 WiFi模组对接OneNET应用示例_4s

点击跳转至在OneNET实现的应用:

https://open.iot.10086.cn/iotbox/appsquare/appview?openid=8da9012c0dcc77af73399b63a29662d8 

(请复制至外部浏览器打开)

七、图片示例

1、连接成功

RT-Thread综合应用学习示例——使用AP6181 WiFi模组对接OneNET应用示例_上传_02

2、发送心跳成功

RT-Thread综合应用学习示例——使用AP6181 WiFi模组对接OneNET应用示例_上传_03

3、上报数据成功

RT-Thread综合应用学习示例——使用AP6181 WiFi模组对接OneNET应用示例_等待时间_04

4、接收命令执行操作以及上报状态成功:

RT-Thread综合应用学习示例——使用AP6181 WiFi模组对接OneNET应用示例_等待时间_05

八、FinSH抓取连接OneNET、发送心跳、上报数据控制设备的信息

1、信息如下:

  1\ | /
  2- RT - Thread Operating System
  3/ | \ 4.0.0 build Mar 15 2019
  42006 - 2018 Copyright by rt-thread team
  5lwIP-2.0.2 initialized!
  6[SFUD] Find a Winbond flash chip. Size is 16777216 bytes.
  7[SFUD] w25q128 flash device is initialize success.
  8msh />[I/FAL] RT-Thread Flash Abstraction Layer (V0.2.0) initialize success.
  9[I/OTA] RT-Thread OTA package(V0.1.3) initialize success.
 10[I/OTA] Verify ‘wifi_image’ partition(fw ver: 1.0, timestamp: 1529386280) success.
 11[I/WICED] wifi initialize done. wiced version 3.3.1
 12[I/WLAN.dev] wlan init success
 13[I/WLAN.lwip] eth device init ok name:w0
 14join ssid:MY_WiFi
 15[I/WLAN.mgnt] wifi connect success ssid:MY_WiFi
 16[Flash] EasyFlash V3.2.1 is initialize success.
 17[Flash] You can get the latest version on https://github.com/armink/EasyFlash .
 18wlan ready
 19socket create success!!!, socket_id:0
 20[I/WLAN.lwip] Got IP address : 192.168.43.5
 21socket connect success!!!
 22[EDP]EDP_PacketConnect send success
 23socket receive data
 24Tips: 连接成功
 25[EDP]start send_heart_timer
 26[EDP]start send_humi_temp_timer
 27[EDP]send heart
 28socket receive data
 29cmdid: 00a8d84c-d740-586c-94d1-4e6ac32dc883, req: LED:1, req_len: 5
 30Send 35 Bytes
 31socket receive data
 32Tips: HeartBeat OK
 33socket receive data
 34socket receive data
 35Tips: Send Ok
 36[EDP]send heart
 37socket receive data
 38Tips: HeartBeat OK
 39socket receive data
 40cmdid: 4b3ffb43-4f0c-50f3-9370-1ec9179658d8, req: LED:0, req_len: 5
 41Send 35 Bytes
 42socket receive data
 43socket receive data
 44Tips: Send Ok
 45socket receive data
 46cmdid: 3c039820-9487-5415-948d-f209550672e5, req: LED:1, req_len: 5
 47Send 35 Bytes
 48socket receive data
 49socket receive data
 50Tips: Send Ok
 51socket receive data
 52cmdid: e8f37c5b-d136-5ff5-95f2-40a530d9d553, req: LED:0, req_len: 5
 53Send 35 Bytes
 54socket receive data
 55socket receive data
 56Tips: Send Ok
 57socket receive data
 58cmdid: f38d85db-2b5b-51a9-94c7-6fda84de0ce1, req: LED:1, req_len: 5
 59Send 35 Bytes
 60socket receive data
 61socket receive data
 62Tips: Send Ok
 63socket receive data
 64cmdid: f2d9c7cc-0b02-594d-84b6-2b8e344a621f, req: LED:0, req_len: 5
 65Send 35 Bytes
 66socket receive data
 67socket receive data
 68Tips: Send Ok
 69[EDP]send heart
 70socket receive data
 71Tips: HeartBeat OK
 72[EDP]send heart
 73socket receive data
 74Tips: HeartBeat OK
 75[EDP]send heart
 76socket receive data
 77Tips: HeartBeat OK
 78socket receive data
 79cmdid: 4fc4d0de-078e-5ce5-bae1-cc4fdff23ec8, req: LED:1, req_len: 5
 80Send 35 Bytes
 81socket receive data
 82socket receive data
 83Tips: Send Ok
 84socket receive data
 85cmdid: 5f56d146-0313-5814-9c62-f5836221aebd, req: LED:0, req_len: 5
 86Send 35 Bytes
 87socket receive data
 88socket receive data
 89Tips: Send Ok
 90[EDP]send heart
 91Send 65 Bytes
 92Humi_Temp Send success
 93socket receive data
 94Tips: HeartBeat OK
 95socket receive data
 96socket receive data
 97Tips: Send Ok
 98[EDP]send heart
 99socket receive data
100Tips: HeartBeat OK
101[EDP]send heart
102socket receive data
103Tips: HeartBeat OK
104[EDP]send heart
105socket receive data
106Tips: HeartBeat OK
107[EDP]send heart
108socket receive data
109Tips: HeartBeat OK
110[EDP]send heart
111socket receive data
112Tips: HeartBeat OK
113[EDP]send heart
114Send 65 Bytes
115Humi_Temp Send success
116socket receive data
117Tips: HeartBeat OK
118socket receive data
119socket receive data
120Tips: Send Ok
121[EDP]send heart
122socket receive data
123Tips: HeartBeat OK
124socket receive data
125cmdid: 6235c513-bee0-5a46-a5ef-9282377f352a, req: MOTOR:1, req_len: 7
126Send 37 Bytes
127socket receive data
128socket receive data
129Tips: Send Ok
130socket receive data
131cmdid: fcbb4818-eeb7-5cac-b122-41b6329d2c99, req: MOTOR:0, req_len: 7
132Send 37 Bytes
133socket receive data
134socket receive data
135Tips: Send Ok
136
RT-Thread综合应用学习示例——使用AP6181 WiFi模组对接OneNET应用示例_信号量_06

RT-Thread


让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。

长按二维码,关注我们