[文章]

鸿蒙硬件HI3861-MQTT

2021-2-2 10:15:03  236 Hi3861 MQTT 鸿蒙开发板
分享
0
鸿蒙硬件HI3861-MQTT鸿蒙其他教程请看https://blog.csdn.net/qq_33259323/category_10520249.html
在使用MQTT前,请看我上一篇文章:鸿蒙硬件HI3861-连接WIFI
https://blog.csdn.net/qq_33259323/article/details/109511005
需要连接WIFI成功之后才能使用MQTT
参考文档:https://bbs.elecfans.com/jishu_2004598_1_1.html
1.移植MQTT移植前请确保你的项目是编译成功的
点击这个链接下载移植好的PahoMqtt(不要积分免费):链接:https://pan.baidu.com/s/1ohH-kCYjiIOa-PkOxzuyEQ 提取码:gddy
点击这个链接下载移植好的PahoMqtt(不要积分免费):https://download.csdn.net/download/qq_33259323/13092141,然后把pahomqtt文件夹放到third_party目录下面
打开vendor\hisi\hi3861\hi3861\BUILD.gn 文件,在lite_component("sdk") 中增加      "//third_party/pahomqtt:pahomqtt_static"
之后就编译一下看看是否成功
2.编写测试代码BUILD.gn
  1. static_library("mqtt_test_at") {
  2.     sources = [
  3.         "mqtt_test.c",
  4.         "at_entry.c"
  5.     ]

  6.     include_dirs = [
  7.         "//utils/native/lite/include",
  8.         "//kernel/liteos_m/components/cmsis/2.0",
  9.         "//base/iot_hardware/inteRFaces/kits/wifiiot_lite",
  10.         "//vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include",
  11.         "//foundation/communication/interfaces/kits/wifi_lite/wifiservice",
  12.         "//third_party/pahomqtt/MQTTPacket/src",
  13.         "//third_party/pahomqtt/MQTTPacket/samples",
  14.         "//vendor/hisi/hi3861/hi3861/components/at/src"
  15.     ]
  16. }
复制代码
mqtt_test.c
  1. #include <stdio.h>

  2. #include <unistd.h>

  3. #include "ohos_init.h"
  4. #include "cmsis_os2.h"

  5. #include <unistd.h>
  6. #include "hi_wifi_api.h"
  7. //#include "wifi_sta.h"
  8. #include "lwip/ip_addr.h"
  9. #include "lwip/netifapi.h"

  10. #include "lwip/sockets.h"

  11. #include "MQTTPacket.h"
  12. #include "transport.h"

  13. int mqtt_rc = 0;
  14. int mqtt_sock = 0;
  15. int mqtt_len = 0;
  16. unsigned char mqtt_buf[200];
  17. int mqtt_buflen = sizeof(mqtt_buf);
  18. int mqtt_req_qos = 0;
  19. int mqtt_msgid = 1;
  20. int toStop = 0;
  21. MQTTString topicString = MQTTString_initializer;

  22. void mqtt_exit(void){
  23.         transport_close(mqtt_sock);
  24.         mqtt_rc = mqtt_rc;
  25.         printf("[MQTT] ERROR EXIT\n");
  26. }

  27. void mqtt_task(void){
  28.         while (!toStop){
  29.                 char* payload = "hello HarmonyOS 1122321321";
  30.                 int payloadlen = strlen(payload);

  31.                 if (MQTTPacket_read(mqtt_buf, mqtt_buflen, transport_getdata) == PUBLISH){
  32.                         unsigned char dup;
  33.                         int qos;
  34.                         unsigned char retained;
  35.                         unsigned short msgid;
  36.                         int payloadlen_in;
  37.                         unsigned char* payload_in;
  38.                         int rc;
  39.                         MQTTString receivedTopic;
  40.                         rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic,
  41.                                         &payload_in, &payloadlen_in, mqtt_buf, mqtt_buflen);                                                                // 发送数据
  42.                         printf("message arrived %.*s\n", payloadlen_in, payload_in);

  43.             mqtt_rc = rc;
  44.         }

  45.                 printf("publishing reading\n");
  46.                 mqtt_len = MQTTSerialize_publish(mqtt_buf, mqtt_buflen, 0, 0, 0, 0, topicString, (unsigned char*)payload, payloadlen);
  47.         mqtt_rc = transport_sendPacketBuffer(mqtt_sock, mqtt_buf, mqtt_len);

  48.                 osDelay(1000);
  49.         }
  50. }

  51. int mqtt_subscribe(char * topic){        // MQTT订阅
  52.         /* subscribe */
  53.         topicString.cstring = topic;
  54.         mqtt_len = MQTTSerialize_subscribe(mqtt_buf, mqtt_buflen, 0, mqtt_msgid, 1, &topicString, &mqtt_req_qos);        // MQTT订阅
  55.         mqtt_rc = transport_sendPacketBuffer(mqtt_sock, mqtt_buf, mqtt_len);                                                                        // 传输发送缓冲区
  56.         if (MQTTPacket_read(mqtt_buf, mqtt_buflen, transport_getdata) == SUBACK)         /* wait for suback */        // 等待订阅返回
  57.         {
  58.                 unsigned short submsgid;
  59.                 int subcount;
  60.                 int granted_qos;

  61.                 mqtt_rc = MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, mqtt_buf, mqtt_buflen);
  62.                 if (granted_qos != 0){
  63.                         printf("granted qos != 0, %d\n", granted_qos);
  64.                         mqtt_exit();
  65.                         return 0;
  66.                 }

  67.                 return 1;
  68.         }else{
  69.                 mqtt_exit();
  70.                 return 0;
  71.         }
  72. }

  73. int mqtt_init(void){                // MQTT初始化开始连接
  74.         MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
  75.         char *host = "106.13.62.194";                // 地址
  76.         int port = 1883;                                        // 端口

  77.        
  78.         mqtt_sock = transport_open(host, port);
  79.         if(mqtt_sock < 0){
  80.                 return mqtt_sock;
  81.         }

  82.         data.clientID.cstring = "me";                        // ClientID
  83.         data.keepAliveInterval = 20;
  84.         data.cleansession = 1;
  85.         data.username.cstring = "testuser";                // 用户名
  86.         data.password.cstring = "testpassword";        // 密码

  87.         printf("[MQTT]Sending to hostname %s port %d\n", host, port);

  88.         mqtt_len = MQTTSerialize_connect(mqtt_buf, mqtt_buflen, &data);                // 开始连接
  89.         mqtt_rc = transport_sendPacketBuffer(mqtt_sock, mqtt_buf, mqtt_len);                // 发送缓冲区

  90.         if (MQTTPacket_read(mqtt_buf, mqtt_buflen, transport_getdata) == CONNACK){        // 等待链接返回
  91.                 unsigned char sessionPresent, connack_rc;

  92.                 if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, mqtt_buf, mqtt_buflen) != 1 || connack_rc != 0){
  93.                         printf("Unable to connect, return code %d\n", connack_rc);
  94.                         mqtt_exit();
  95.                         return 0;
  96.                 }
  97.         }else{
  98.                 mqtt_exit();
  99.                 return 0;
  100.         }

  101.         return 1;
  102. }


  103. void mqtt_test(void){
  104.         printf("[MQTT]Start MQTT\r\n");
  105.     if(mqtt_init() == 1){
  106.                 printf("[MQTT]MQTT Connect\r\n");
  107.                 mqtt_subscribe("substopic");                //设置订阅
  108.                 mqtt_task();
  109.         }
  110. }
复制代码
mqtt_test.h
  1. #ifndef __MQTT_TEST_H__
  2. #define __MQTT_TEST_H__

  3. void mqtt_test(void);

  4. #endif /* __MQTT_TEST_H__ */
复制代码
3.开始测试只要在主函数中调用mqtt_test.c中的mqtt_test()函数就可以开始测试了


如果有什么问题可以来B站问我

https://space.bilibili.com/309103931

评论

您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发文章
快速回复
扫一扫分享
返回顶部 返回列表