在鴻蒙系統上使用MQTT編程

2020-12-14 51cto

想了解更多內容,請訪問:

51CTO和華為官方戰略合作共建的鴻蒙技術社區

https://harmonyos.51cto.com/#zz

我們使用的是paho mqtt軟體包,這裡介紹一下怎麼使用mqtt協議編程。關於鴻蒙系統的mqtt移植好的軟體包,相關github連結如下:

https://gitee.com/qidiyun/harmony_mqtt

這裡提供一個簡單的編程示例:

這裡我們使用MQTTClient編程模型,他支持多任務多線程,非常適合用在鴻蒙系統上。

1. 網絡初始化

這裡定義一個 Network 結構體,然後指定我們的MQTT伺服器的IP和埠號。

  1. Network n; 
  2.    //初始化結構體 
  3.  NetworkInit(&n); 
  4.  //連接到指定的MQTT伺服器IP、埠號 
  5.  NetworkConnect(&n, 「XXX.XXX.XXX.XXX」, XXXX); 

2. 設置MQTT緩存和啟動MQTT線程

我們這裡使用的是MQTT線程功能。

  1. MQTTClientInit(&c, &n, 1000, buf, 100, readbuf, 100); 
  2.  MQTTStartTask(&c); 

3. 設置MQTT相關參數

接下來我們設置MQTT的相關參數,包括版本號、客戶端ID、帳戶密碼等

  1. MQTTPacket_connectData data = MQTTPacket_connectData_initializer;  
  2.  data.willFlag = 0; 
  3.  //MQTT版本為 v3 
  4.  data.MQTTVersion = 3; 
  5.  //設置客戶端ID 
  6.  data.clientID.cstring = opts.clientid; 
  7.  //設置客戶端帳戶 
  8.  data.username.cstring = opts.username; 
  9.  //設置客戶端密碼 
  10.  data.password.cstring = opts.password
  11.  data.keepAliveInterval = 10; 
  12.  data.cleansession = 1; 
  13.  
  14.  //連接到MQTT伺服器 
  15.  rc = MQTTConnect(&c, &data); 

4. 訂閱主題和接收消息

訂閱主題可以使用如下函數

  1. MQTTSubscribe(&c, topic, opts.qos, messageArrived); 

它的函數原型如下:

  1. DLLExport int MQTTSubscribe(MQTTClient* client, const char* topicFilter, enum QoS, messageHandler); 

其中:

  1. void messageArrived(MessageData* md) 
  2.  MQTTMessage* message = md->message; 
  3.  //列印接收到的消息的長度、和消息內容 
  4.  printf("%.*s", (int)message->payloadlen, (char*)message->payload); 

 5. 發送消息

發送消息也比較簡單,我們只需要設置好我們的主題和消息內容即可

  1. memset(&pubmsg, '\0', sizeof(pubmsg)); 
  2.  //消息內容為 hello harmonyOS ! 
  3.    pubmsg.payload = (void*)"hello harmonyOS !"
  4.  //消息長度 
  5.    pubmsg.payloadlen = strlen((char*)pubmsg.payload); 
  6.    pubmsg.qos = QOS0; 
  7.    pubmsg.retained = 0; 
  8.    pubmsg.dup = 0; 
  9.  
  10.  //推送消息,主題為 pubtest 
  11.  MQTTPublish(&c, "pubtest", &pubmsg); 

完整源碼如下:

  1. #include <stdio.h> 
  2.  
  3. #include <unistd.h> 
  4.  
  5. #include "ohos_init.h" 
  6. #include "cmsis_os2.h" 
  7.  
  8. #include <unistd.h> 
  9. #include "hi_wifi_api.h" 
  10. //#include "wifi_sta.h" 
  11. #include "lwip/ip_addr.h" 
  12. #include "lwip/netifapi.h" 
  13.  
  14. #include "lwip/sockets.h" 
  15.  
  16. #include "MQTTClient.h" 
  17.  
  18. /** 
  19.  * MQTT URI farmat: 
  20.  * domain mode 
  21.  * tcp://iot.eclipse.org:1883 
  22.  * 
  23.  * ipv4 mode 
  24.  * tcp://192.168.10.1:1883 
  25.  * ssl://192.168.10.1:1884 
  26.  * 
  27.  * ipv6 mode 
  28.  * tcp://[fe80::20c:29ff:fe9a:a07e]:1883 
  29.  * ssl://[fe80::20c:29ff:fe9a:a07e]:1884 
  30.  */ 
  31. #define MQTT_URI                "tcp://106.13.62.194:1883" 
  32.  
  33. struct opts_struct 
  34.     char* clientid; 
  35.     int nodelimiter; 
  36.     char* delimiter; 
  37.     enum QoS qos; 
  38.     char* username; 
  39.     charpassword
  40.     char* host; 
  41.     int port; 
  42.     int showtopics; 
  43. } opts = 
  44.     (char*)"stdout-subscriber", 0, (char*)"\n", QOS2, NULLNULL, (char*)"106.13.62.194", 1883, 1 
  45. }; 
  46.  
  47.  
  48. void messageArrived(MessageData* md) 
  49.     MQTTMessage* message = md->message; 
  50.  
  51.     if (opts.showtopics) 
  52.         printf("%.*s\t", md->topicName->lenstring.len, md->topicName->lenstring.data); 
  53.     if (opts.nodelimiter) 
  54.         printf("%.*s", (int)message->payloadlen, (char*)message->payload); 
  55.     else 
  56.         printf("%.*s%s", (int)message->payloadlen, (char*)message->payload, opts.delimiter); 
  57.     //fflush(stdout); 
  58.  
  59.  
  60. unsigned char buf[100]; 
  61. unsigned char readbuf[100]; 
  62.  
  63. int mqtt_test(void) 
  64.     int rc = 0; 
  65.      
  66.     MQTTMessage pubmsg; 
  67.  
  68.      
  69.     char* topic = "test"
  70.  
  71.     if (strchr(topic, '#') || strchr(topic, '+')) 
  72.         opts.showtopics = 1; 
  73.     if (opts.showtopics) 
  74.         printf("topic is %s\n", topic); 
  75.  
  76.     Network n; 
  77.     MQTTClient c; 
  78.  
  79.     NetworkInit(&n); 
  80.     NetworkConnect(&n, opts.host, opts.port); 
  81.      
  82.     MQTTClientInit(&c, &n, 1000, buf, 100, readbuf, 100); 
  83.     MQTTStartTask(&c); 
  84.  
  85.     MQTTPacket_connectData data = MQTTPacket_connectData_initializer;        
  86.     data.willFlag = 0; 
  87.     data.MQTTVersion = 3; 
  88.     data.clientID.cstring = opts.clientid; 
  89.     data.username.cstring = opts.username; 
  90.     data.password.cstring = opts.password
  91.  
  92.     data.keepAliveInterval = 10; 
  93.     data.cleansession = 1; 
  94.     printf("Connecting to %s %d\n", opts.host, opts.port); 
  95.      
  96.     rc = MQTTConnect(&c, &data); 
  97.     printf("Connected %d\n", rc); 
  98.      
  99.      
  100.  
  101.     printf("Subscribing to %s\n", topic); 
  102.     rc = MQTTSubscribe(&c, topic, opts.qos, messageArrived); 
  103.     printf("Subscribed %d\n", rc); 
  104.  
  105.     memset(&pubmsg, '\0', sizeof(pubmsg)); 
  106.     pubmsg.payload = (void*)"hello harmonyOS !"
  107.     pubmsg.payloadlen = strlen((char*)pubmsg.payload); 
  108.     pubmsg.qos = QOS0; 
  109.     pubmsg.retained = 0; 
  110.     pubmsg.dup = 0; 
  111.  
  112.      
  113.  
  114.     while (1) 
  115.     { 
  116.         MQTTPublish(&c, "pubtest", &pubmsg); 
  117.         sleep(1);    
  118.     } 
  119.      
  120.     printf("Stopping\n"); 
  121.  
  122.     MQTTDisconnect(&c); 
  123.     NetworkDisconnect(&n); 
  124.  
  125.     return 0; 

想了解更多內容,請訪問:

51CTO和華為官方戰略合作共建的鴻蒙技術社區

https://harmonyos.51cto.com/#zz

【編輯推薦】

點讚 0

相關焦點

  • 鴻蒙系統手機版之後,更重要的技術出現了!
    打造自主程式語言?鴻蒙系統手機版之後,更重要的技術出現了!鑑於華為技術尚未有正式回應,外界僅通過行業角度簡單分析。方舟編譯器套件提供給APP開發者,在X86及Linux架構系統平臺上使用,將語言裡的動態特性翻譯成機器碼!諸如現有安卓APP經過編譯後,可以獲得更高的運行速度!
  • 迅為迅為iTOP-i.MX6ULL 開發板-Mqtt 移植教程
    ,路徑為: 「11_Linux 系統開發進階\88_章節使用資料」。其 他工具有的功能他基本都有,所以我們使用的是 Mosquitto。 mqtt,所以主題為 mqtt,-v 列印更多的調試信息。 然後我們返回到/home/topeet/下面,使用 tar 命令打包我們創建的 mqtt-arm 文件,命令如下:tar -czf mqtt-arm.tar.gz mqtt-arm
  • 鴻蒙應用開發入門(一):鴻蒙系統的概述
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz1.1 鴻蒙系統是一個什麼樣的系統,亮點在哪裡官網首頁上一句話告訴了我們鴻蒙系統是一個什麼樣的系統:分布式能力造就新硬體
  • 鴻蒙系統UI被指近似EMUI 華為:正式版會有全新設計
    本周,華為如期上線了鴻蒙OS 2.0手機系統Beta版本,P40、Mate 30系列均可申請參與測試,主要是面向開發者。不過從現場預裝了該OS的P40來看,界面和當前EMUI 11別無二致,加之可以從內置商店安裝和運行安卓APP,引發了網友熱議。
  • 鴻蒙系統抄襲安卓11?谷歌法務不吃素,華為有自己的考慮
    為了多年的心血付出付之一炬,華為發布了鴻蒙作業系統1.0版本,經過近一年的改善,華為於2020年12月16日發布了鴻蒙系統2.0 bate版本,供部分機型的用戶嘗鮮。鴻蒙作業系統開發者版本的發布,對華為、乃至國產手機廠商來說都有著劃時代的意義,然而,讓人沒想到的是,近兩日網上卻流傳出不少吐槽鴻蒙系統的聲音,因其與EMUI 11.0版本的外觀並沒有太大的改變,被人稱之為是「批了鴻蒙外衣的安卓11」,事實真的是這樣嗎?筆者覺得,這一定是開玩笑!
  • 華為鴻蒙系統HarmonyOS的四大技術特點與三大新興之處分析
    在華為開發者大會2020將在廣東東莞松山湖再次啟動之際,我們來回顧一下華為鴻蒙系統HarmonyOS的四大技術特點與三大新興之處。   根據官方的介紹:   華為鴻蒙系統HarmonyOS是面向未來的全場景分布式OS,分布式能力造就新硬體、新交互、新服務,打開煥然一新的全場景世界。
  • 華為怎麼還不使用鴻蒙系統?因為這3步未實現,網友:指日可待!
    華為怎麼還不使用鴻蒙系統?因為這3步未實現,網友:指日可待!前不久因為美國方面的抵制,華為的日子不太好過,尤其是還拿出了谷歌來針對華為,所以華為就開始推出了鴻蒙系統。不過現在我們對於鴻蒙系統還是不太了解,畢竟沒有出現在手機設備上,而是在榮耀的智慧屏上,那為何華為對如此有信心的鴻蒙系統還不搭載在手機上呢?只因為有三步沒有完成。第一步:系統漏洞也就是所謂的安全性,一個才剛剛開始研發的系統不可能都是完美的,但是現在首要解決的問題就是系統的漏洞,這樣才能保證使用用戶的信息安全。
  • 華為首部鴻蒙手機P50展望——不再使用麒麟晶片,拍照系統再升級
    12月16日,華為如期上線了鴻蒙OS2.0Beta 版本手機系統。最初版本支持P40、Mate 30系列和平板 MatePad Pro。不過,想升級嘗鮮的朋友可能要失望了。華為此次發布的鴻蒙系統屬於開發者版本,主要目的是開放系統給開發者們做軟體適配。
  • 網圖嘲諷鴻蒙系統套皮!事實呢?
    最近相信大家也知道,華為召開了今年的開發者大會,在這一次的開發者大會上,華為將鴻蒙升級到了2.0。升級到2.0之後的鴻蒙再次來到了大眾的眼前,鴻蒙2.0又成為了一大熱點,鴻蒙又引起了很多網友的關注。其實鴻蒙從去年就已經發布了,發布至今已經一年多過去了,在發布的時候,華為方面表示,鴻蒙2.0可以搭載在智能電視,pc,甚至智慧型手機等各種智能設備上。但是至今已經一年多過去了,鴻蒙系統也僅僅只是搭載在了智能電視上。說好的搭載在智慧型手機上,這麼長時間都沒有上,為此,有不少網友表示,鴻蒙其實就是。
  • 華為發布鴻蒙手機版,打造新生態系統,讓自家系統走向國門
    從發布會開始一直到明年的1月31號的時候,都可以在社區進行一次申請提交,這些開發者一旦被系統通過,就可以體驗一下這個版本的魅力。他們可以利用遠端模擬器的感覺來進行體驗,也可以使用華為P40或者制定幾款指定的手機進行一次升級體驗。
  • 鴻蒙系統究竟是什麼情況
    說到作業系統,我們都期待中國製造的鴻蒙系統。在前一時期進行了大量的討論。其實對於鴻蒙系統應該存在一些誤解。讓我們具體看看 到目前為止,孟的作業系統只預裝在華為和榮耀的屏幕上 到目前為止,鴻蒙的作業系統只預裝在華為和榮耀的屏幕上 奇怪的是,陸先生在過去的幾天裡,在榮耀智能屏幕上,X1與android應用程式兼容,其內核本質上是Linux,開源宏內核,而不是PPT微內核。
  • 鴻蒙2.0系統手機版回退EMUI11教程發布
    華為已經發布了鴻蒙2.0系統手機開發者beta版,華為同時開啟了HarmonyOS 2.0 手機開發者 Beta 公測招募。這次開啟華為鴻蒙2.0系統手機開發者beta版公測招募的機型有華為P40 、P40 Pro、Mate 30、Mate 30 Pro、 MatePad Pro 設備,支持 OTA 升級。
  • 鴻蒙系統是華為突破困境的關鍵點所在
    【鴻蒙系統是華為突破困境的關鍵點所在】 而今年,華為拿出真材實料推出鴻蒙2.0版本,並公布了針對軟體開發者的模擬器、SDK包以及IDE工具等整套開發工具,承諾年底將向開發者推送鴻蒙2.0 beta版本,明年十月華為手機將升級到鴻蒙系統。 一些落地計劃正有序的逐步得到實現,著實打臉了那些謊稱鴻蒙是PPT系統的傳言。
  • 「鴻蒙」作業系統關鍵特性解讀
    而此次鴻蒙OS特別提到,其利用的是微內核。 微內核是一種具有有限功能的較小的作業系統內核。我們可以將其理解為是一個功能縮小版的內核。微內核主要負責原來內核中幾個基礎的功能,包括中斷、通信、調度等,其他的系統功能分配給微內核外的使用程度來執行。
  • 「鴻蒙OS系統」也許會遲到,但絕不會缺席!
    華為面臨無芯可用的局面「求生存」成了發展主線,華為Mate 40的發布成為了麒麟9000晶片絕唱,而開發者大會上「鴻蒙2.0」亮相讓大家看到華為在系統開發上的實力。開發者大會上基於安卓底層深度定製的EMUI 11 現在已經率先在Mate 40上亮相。不少媒體表示華為鴻蒙Beta版將採用全新設計語言於12月16日搭載Mate 40優先升級。
  • 華為鴻蒙正式使用,P40首當其衝,榮耀30S均在線
    華為鴻蒙一直都在人們口中「流傳」,這讓不少愛國的華為粉絲都有了些許的失望,但是該來的終究會來,華為這次正式使用上了鴻蒙,而P40就是首當其衝的一款機型,而榮耀30S的發布也註定將會搭載這個系統。很多人會問鴻蒙系統究竟是什麼樣的呢?
  • 華為鴻蒙系統2.0首發,超越安卓!
    華為手機鴻蒙系統2.0正式首發!目前,安卓系統的市場佔有率為70.38%,蘋果IOS為28.32%,幾乎壟斷市場!華為鴻蒙系統有什麼優勢,可以挑戰到安卓和蘋果IOS分一杯羹呢?巨量的手機基數意味著龐大的市場,開發者們絕對不可能錯過一個市場佔有率高達17.6%的鴻蒙ios,據悉,鴻蒙系統與安卓師出同門,其開放性將大大降低開發者將APP從安卓過度到鴻蒙系統。實際上,鴻蒙系統還未正式發布,就已經聚攏了一大批海內外開發者!
  • 鴻蒙2.0 Beta手機版來了,明年所有自研設備升級鴻蒙
    會場展區內,鴻蒙OS展示設備在系統界面上與當前用戶手中的EMUI 11系統並無差異,還完全兼容安卓應用,以至於現場工程師想要判斷一部設備是否已經升級鴻蒙都要打開設置查看版本號才能確定——雖然系統UI風格承襲上代讓人沒了驚喜,但大體相似的操作邏輯反而也讓大多數用戶能夠無縫適應鴻蒙系統。舊皮新系統,首次上線手機的鴻蒙2.0,都能做什麼?
  • 鴻蒙內外:華為的燈塔和星光在哪裡?鴻蒙和HMS到底是什麼?
    在谷歌合作受限之後,影響最大的是就是華為消費者業務,海外手機中的應用無法使用,華為只能打造自己的軟體生態。而軟體賽道是一個新的突破口,在搭建的過程中,也許就會在系統中出現優秀的軟體產品,也可能會產生新的收入來源,反過來彌補這兩年受到的損傷,這也是華為重要轉折的第二層意義。二、鴻蒙和HMS到底是什麼?
  • 鴻蒙OS系統全球首發上手體驗!EMUI系統復刻版:你期待嗎?
    首個面向手機應用開發者的Beta版本,很多網友們也非常希望可以體驗到這款鴻蒙OS系統,尤其是對於很多軟體開發者而言,在華為的助力下,在鴻蒙OS系統平臺,就可以實現一次開發,多端部署,全面避免了開發者在不同設備間的重複開發,因為華為鴻蒙OS系統擁有分布式UI框架,可以實現不同屏幕尺寸、不同類設備的交互;就在華為HarmonyOS首個手機Beta版本正式發布以後,