zoukankan      html  css  js  c++  java
  • rt-thread软件包学习之kawaiimqtt

    kawaiimqtt:

      

     1 /* 5. wifi connect */
     2     rt_wlan_connect(WIFI_SSID, WIFI_KEY);
     3 
     4     /* 6. startup mqtt client  */
     5     mqtt_log_init();
     6     rt_snprintf(cid, sizeof(cid), "rtthread%d", rt_tick_get());
     7     /* check network connection status */
     8 
     9     net_dev = netdev_get_by_name("w0");
    10     while(!(netdev_is_internet_up(net_dev)))
    11     {
    12         rt_thread_mdelay(100);
    13         timeout++;
    14         if(timeout == 200)
    15         {
    16             rt_kprintf("wifi connect failed!
    ");
    17             return -RT_ERROR;
    18         }
    19     }
    20 
    21     client = mqtt_lease();
    22 
    23     mqtt_set_host(client, MQTT_URL);
    24     mqtt_set_port(client, MQTT_PORT);
    25     mqtt_set_user_name(client, "rt-thread");
    26     mqtt_set_password(client, "rt-thread");
    27     mqtt_set_client_id(client, cid);
    28     mqtt_set_clean_session(client, 1);
    29 
    30     if(mqtt_connect(client))
    31     {
    32         KAWAII_MQTT_LOG_E("%s:%d %s()... mqtt connect failed...", __FILE__, __LINE__, __FUNCTION__);
    33         is_started = 0;
    34         return -RT_ERROR;
    35     }
    36 
    37     is_started = 1;
    38     mqtt_subscribe(client, SUB1_NAME, QOS0, sub_topic_handle_led);
    39     mqtt_subscribe(client, SUB2_NAME, QOS1, sub_topic_handle_num);
    40     mqtt_subscribe(client, SUB_OTA, QOS2, sub_topic_handle_ota);
    41 
    42     tid3 = rt_thread_create("mq_pub", mqtt_t_publish, RT_NULL, 2048, 13, 10);
    43     if (tid3 != RT_NULL)
    44     {
    45         rt_thread_startup(tid3);
    46     }
    View Code

    1保证网络连接

    2设置mqtt客户端:远端URL,端口,客户端ID,用户名,密码。。。

    3连接远程mqtt服务器

    4订阅主题:主题,Qos,收到主题时的响应(将主题名和主题内容分离出来,然后匹配响应)

      1 typedef struct {
      2     char **str;     //the PChar of string array
      3     size_t num;     //the number of string
      4 }IString;
      5 
      6 /* 拆分字符串 */
      7 static int Split(char *src, char *delim, IString* istr)//split buf
      8 {
      9     int i;
     10     char *str = NULL, *p = NULL;
     11 
     12     (*istr).num = 1;
     13     str = (char*)rt_calloc(strlen(src)+1,sizeof(char));
     14     if (str == NULL) return 0;
     15     (*istr).str = (char**)rt_calloc(1,sizeof(char *));
     16     if ((*istr).str == NULL) return 0;
     17     strcpy(str,src);
     18 
     19     p = strtok(str, delim);
     20     (*istr).str[0] = (char*)rt_calloc(strlen(p)+1,sizeof(char));
     21     if ((*istr).str[0] == NULL) return 0;
     22     strcpy((*istr).str[0],p);
     23     for(i = 1; (p = strtok(NULL, delim)); i++)
     24     {
     25         (*istr).num++;
     26         (*istr).str = (char**)rt_realloc((*istr).str,(i+1)*sizeof(char *));
     27         if ((*istr).str == NULL) return 0;
     28         (*istr).str[i] = (char*)rt_calloc(strlen(p)+1,sizeof(char));
     29         if ((*istr).str[0] == NULL) return 0;
     30         strcpy((*istr).str[i],p);
     31     }
     32     rt_free(str);
     33     str = p = NULL;
     34 
     35     return 1;
     36 }
     37 static void sub_topic_handle_led(void* client, message_data_t* msg)
     38 {
     39     (void) client;
     40     KAWAII_MQTT_LOG_I("-----------------------------------------------------------------------------------
    ");
     41     KAWAII_MQTT_LOG_I("%s:%d %s()...
    topic: %s
    message:%s
    ", __FILE__, __LINE__, __FUNCTION__, msg->topic_name, (char*)msg->message->payload);
     42     KAWAII_MQTT_LOG_I("-----------------------------------------------------------------------------------
    ");
     43 
     44     int i;
     45     IString istr;
     46     struct file_msg file_msg;
     47     char *tick_num;
     48 
     49     if (Split(msg->message->payload," ",&istr))
     50     {
     51         for (i = 0; i < istr.num; i++)
     52             rt_kprintf("%s
    ",istr.str[i]);
     53 
     54         if(i == 2)
     55         {
     56             if(rt_strncmp(istr.str[0], "led", 3))
     57             {
     58                 KAWAII_MQTT_LOG_E("command error!
    ");
     59             }
     60             else
     61             {
     62                 if(!(rt_strncmp(istr.str[1], "off", 3)))
     63                 {
     64                     rt_pin_write(LED_PIN_RED, PIN_HIGH);
     65                 }
     66                 else if(!(rt_strncmp(istr.str[1], "on", 2)))
     67                 {
     68                     rt_pin_write(LED_PIN_RED, PIN_LOW);
     69                 }
     70                 else
     71                 {
     72                     KAWAII_MQTT_LOG_E("state command error!
    ");
     73                     for (i = 0; i < istr.num; i++)
     74                         rt_free(istr.str[i]);
     75                     rt_free(istr.str);
     76                     return;
     77                 }
     78 
     79                 tick_num = rt_calloc(1, 10);
     80                 if (tick_num == RT_NULL) {
     81                     rt_kprintf("memory is not enough 
    ");
     82                 }
     83                 else {
     84                     itoa(rt_tick_get(), tick_num, 10);
     85                     file_msg.timestamp = tick_num;
     86                     file_msg.cmd = istr.str[0];
     87                     file_msg.state = istr.str[1];
     88                     file_msg.str = istr.str;
     89 
     90                     rt_mq_send(&mq_demo, &file_msg, sizeof(file_msg));
     91                 }
     92             }
     93         }
     94         else
     95         {
     96             KAWAII_MQTT_LOG_E("command error! 
    ");
     97             for (i = 0; i < istr.num; i++)
     98                 rt_free(istr.str[i]);
     99             rt_free(istr.str);
    100         }
    101 
    102     }
    103     else
    104     {
    105         KAWAII_MQTT_LOG_E("Split failure!
    ");
    106     }
    107 }
    View Code

    5 建立发布线程用于发布主题(设置主题Oos,负载内容,然后向指定主题发送(若是数据采集可以用消息队列等待发送)。)

     1 /* 板子发布消息的线程 */
     2 static void mqtt_t_publish(void *parameter)
     3 {
     4     char pub_buf[64];
     5     mqtt_message_t msg;
     6     memset(&msg, 0, sizeof(msg));
     7 
     8     rt_thread_mdelay(2 * RT_TICK_PER_SECOND);
     9 
    10     while(1)
    11     {
    12         if(is_started)
    13         {
    14             memset(pub_buf, 0, 64);
    15 
    16             sprintf(pub_buf, "%d", usMRegHoldBuf[SLAVE_ADDR - 1][MB_RECV_REG_NUM]);
    17 
    18             msg.qos = QOS0;
    19             msg.payload = pub_buf;
    20 
    21             mqtt_publish(client, PUB_NAME, &msg);
    22         }
    23         rt_thread_mdelay(5 * RT_TICK_PER_SECOND);
    24     }
    25 }
    View Code
  • 相关阅读:
    外贸邮箱哪个是安全邮箱?申请163电子邮箱可以吗?
    申请163电子邮箱,163邮箱格式是么样的?
    传统小游戏是否已过时?经典案例告诉你
    超越前作,H5游戏微创新是王道
    163邮箱哪个安全好用?常用的电子邮箱品牌有哪些?
    开通企业邮箱多少钱?企业邮箱怎么注册申请?
    如何保护电子邮箱安全?163邮箱安全吗?
    外贸邮箱怎么注册?集团公司企业邮箱哪个更适合?
    NBA战火重燃,H5游戏带你重拾青春回忆
    H5游戏定制选题知多少
  • 原文地址:https://www.cnblogs.com/jieruishu/p/14932934.html
Copyright © 2011-2022 走看看