自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

小車控制由簡(jiǎn)入繁之MQTT控制

開發(fā) 前端
本文主要分享MQTT Broker的搭建、在Openharmony3.0上如何使用harmony_mqtt、并實(shí)現(xiàn)MQTT控制小車的Demo。

[[429173]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

1. 簡(jiǎn)介

  • #開發(fā)板漂流計(jì)劃#小車控制由簡(jiǎn)入繁之按鍵控制
  • #開發(fā)板漂流計(jì)劃#小車控制由簡(jiǎn)入繁之UDP控制

本文在前面兩篇帖子的基礎(chǔ)上,在Openharmony3.0上實(shí)現(xiàn)小車上電后自動(dòng)連接到指定WIFI,并與指定的MQTT Broker建立鏈接、訂閱小車控制“carControl”主題。電腦Windows系統(tǒng)下使用paho軟件連接到相同的MQTT Broker,通過發(fā)送主題為“carControl”的消息來控制小車狀態(tài)。

閱讀本文前,推薦閱讀連志安老師的以下文章:

  • MQTT 協(xié)議開發(fā)入門 - MQTT 簡(jiǎn)述、設(shè)計(jì)規(guī)范、主要特性、協(xié)議原理、協(xié)議數(shù)據(jù)包結(jié)構(gòu)
  • 如何在鴻蒙系統(tǒng)中移植 Paho-MQTT 實(shí)現(xiàn)MQTT協(xié)議- 基于openharmony1.0移植Paho-MQTT教程
  • 在鴻蒙系統(tǒng)上使用MQTT編程-對(duì)應(yīng)連老師Gitee倉庫 harmony_mqtt的使用介紹,本文基于這個(gè)版本實(shí)現(xiàn)MQTT控制小車

本文主要分享MQTT Broker的搭建、在Openharmony3.0上如何使用harmony_mqtt、并實(shí)現(xiàn)MQTT控制小車的Demo。

2. 在Ubuntu20.04虛擬機(jī)安裝mosquitto搭建Broker

安裝前請(qǐng)確保你的Ubuntu能正常上網(wǎng)并且局網(wǎng)內(nèi)可以訪問到。

2.1 Ubuntu下mosquitto 安裝

安裝指令如下:

  1. sudo apt-get install mosquitto 
  2. sudo apt-get install mosquitto-clients 
  3. sudo apt-get install mosquitto-dev 

2.2 安裝完成后可以用以下指令查看狀態(tài)

  1. service mosquitto status 

 正常狀態(tài)顯示如下

#開發(fā)板漂流計(jì)劃#小車控制由簡(jiǎn)入繁之MQTT控制-鴻蒙HarmonyOS技術(shù)社區(qū)

這樣子測(cè)試用的Broker就搭建好了,Broker的IP地址就是你Ubuntu局域網(wǎng)中的IP,端口默認(rèn)1883,如果搭建有問題歡迎留言交流。

3.在Openharmony3.0上如何使用harmony_mqtt

3.1 讓harmony_mqtt成功編譯

3.1.1 將harmony_mqtt 下載到Openharmony3.0源碼third_party目錄下并重命名為pahomqtt

可以用git clone 下載后重命名也可以下載壓縮包后解壓。如下圖Z:\ohos300_iot\是我Openharmony3.0源碼的根目錄

#開發(fā)板漂流計(jì)劃#小車控制由簡(jiǎn)入繁之MQTT控制-鴻蒙HarmonyOS技術(shù)社區(qū)

3.1.2 將pahomqtt添加到hispark_pegasus編譯

修改device\hisilicon\hispark_pegasus\sdk_liteos\BUILD.gn在lite_component(“sdk”)中添加"//third_party/pahomqtt:pahomqtt_static"

(注意:此處修改的BUILD.gn 和Openharmony1.0 版本有區(qū)別,1.0 路徑是vendor\hisi\hi3861\hi3861\BUILD.gn)

  1. lite_component("sdk") { 
  2.   features = [] 
  3.  
  4.   deps = [ 
  5.     "//build/lite/config/component/cJSON:cjson_static"
  6.     "//device/hisilicon/hispark_pegasus/hi3861_adapter/kal"
  7.     "//third_party/pahomqtt:pahomqtt_static"
  8.   ] 

修改完成后重新執(zhí)行編譯后從編譯日志中可以用mqtt看下log,修改成功會(huì)有以下信息。

#開發(fā)板漂流計(jì)劃#小車控制由簡(jiǎn)入繁之MQTT控制-鴻蒙HarmonyOS技術(shù)社區(qū)

但是編譯到最后會(huì)有錯(cuò)誤提示如下,接下來就是修這個(gè)編譯錯(cuò)誤了。

#開發(fā)板漂流計(jì)劃#小車控制由簡(jiǎn)入繁之MQTT控制-鴻蒙HarmonyOS技術(shù)社區(qū)

3.1.3 修改編譯錯(cuò)誤

錯(cuò)誤日志截取如下

  1. [OHOS ERROR] riscv32-unknown-elf-ld: ohos/libs/libpahomqtt_static.a(libpahomqtt_static.MQTTLiteOS.o): in function `MutexInit': 
  2. [OHOS ERROR] MQTTLiteOS.c:(.text.MutexInit+0x0): multiple definition of `MutexInit'; ohos/libs/libdiscovery.a(libdiscovery.os_adapter.o):os_adapter.c:(.text.MutexInit+0x0): first defined here 
  3. [OHOS ERROR] riscv32-unknown-elf-ld: ohos/libs/libpahomqtt_static.a(libpahomqtt_static.MQTTLiteOS.o): in function `MutexLock': 
  4. [OHOS ERROR] MQTTLiteOS.c:(.text.MutexLock+0x0): multiple definition of `MutexLock'; ohos/libs/libdiscovery.a(libdiscovery.os_adapter.o):os_adapter.c:(.text.MutexLock+0x0): first defined here 
  5. [OHOS ERROR] riscv32-unknown-elf-ld: ohos/libs/libpahomqtt_static.a(libpahomqtt_static.MQTTLiteOS.o): in function `MutexUnlock': 
  6. [OHOS ERROR] MQTTLiteOS.c:(.text.MutexUnlock+0x0): multiple definition of `MutexUnlock'; ohos/libs/libdiscovery.a(libdiscovery.os_adapter.o):os_adapter.c:(.text.MutexUnlock+0x0): first defined here 
  7. [OHOS ERROR] scons: *** [output/bin/Hi3861_wifiiot_app.out] Error 1 
  8. [OHOS ERROR] BUILD FAILED!!!! 
  9. [OHOS ERROR] Failed building output/bin/Hi3861_wifiiot_app.out: Error 1 
  10. [OHOS ERROR] you can check build log in /home/soon/ohos300_iot/out/hispark_pegasus/wifiiot_hispark_pegasus/build.log 
  11. [OHOS ERROR] command: "/home/soon/ohostool_101/ninja/ninja -w dupbuild=warn -C /home/soon/ohos300_iot/out/hispark_pegasus/wifiiot_hispark_pegasus" failed 
  12. [OHOS ERROR] return code: 1 
  13. [OHOS ERROR] execution path: /home/soon/ohos300_iot 
  14. soon@soon-u20:~/ohos300_iot $  

 我的修改方式是將

third_party\pahomqtt\MQTTClient-C\src\MQTTClient.c

third_party\pahomqtt\MQTTClient-C\src\liteOS\MQTTLiteOS.c

third_party\pahomqtt\MQTTClient-C\src\liteOS\MQTTLiteOS.h

這三個(gè)檔案中的所有的

  1. MutexInit(Mutex*); 
  2. MutexLock(Mutex*); 
  3. MutexUnlock(Mutex*); 

 對(duì)應(yīng)替換為

  1. MqttMutexInit(Mutex*); 
  2. MqttMutexLock(Mutex*); 
  3. MqttMutexUnlock(Mutex*); 

 這樣子就能正常編譯通過了

3.1.4 其他修改和修改后的代碼

third_party\pahomqtt\BUILD.gn中以下三個(gè)有沒有并不會(huì)影響編譯/使用,所以我把他拿掉了。

  1. "MQTTClient-C\src\liteOS"
  2.       "//vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include"
  3.       "//kernel/liteos_m/components/cmsis/2.0"

修改后的代碼可以直接從附件下載或者從碼云 https://gitee.com/soonliao/pahomqtt 下載。

3.2 MQTT控制小車代碼的實(shí)現(xiàn)

3.2.1 applications\sample\wifi-iot\app\car_mqtt\BUILD.gn 的修改

在應(yīng)用的BUILD.gn添加以下三行內(nèi)容才能調(diào)用到pahomqtt的相關(guān)函數(shù)

  1. static_library("car_mqtt") { 
  2.     sources = [ 
  3.         ...... 
  4.     ] 
  5.  
  6.     include_dirs = [ 
  7.         ......     
  8.         "//third_party/pahomqtt:pahomqtt_static"
  9.         "//third_party/pahomqtt/MQTTPacket/src"
  10.         "//third_party/pahomqtt/MQTTClient-C/src"
  11.     ] 

 3.2.2 MQTT 初始化主題訂閱

主要在以下函數(shù)實(shí)現(xiàn),詳細(xì)的說明可以參考在鴻蒙系統(tǒng)上使用MQTT編程

  1. #include "MQTTClient.h" 
  2.  
  3.  
  4. #define MQTT_BROKER                "192.168.123.230"//改成你的MQTT Broker 地址 
  5. #define MQTT_PORT                  1883 
  6.  
  7. MQTTMessage ackmsg; 
  8. int needAck = 0; 
  9.  
  10. struct opts_struct 
  11.     char* clientid; 
  12.     int nodelimiter; 
  13.     char* delimiter; 
  14.     enum QoS qos; 
  15.     char* username; 
  16.     charpassword
  17.     char* host; 
  18.     int port; 
  19.     int showtopics; 
  20. }  
  21. opts = 
  22.     (char*)"stdout-subscriber", 0, (char*)"\n", QOS2, NULLNULL, (char*)MQTT_BROKER, MQTT_PORT, 1 
  23. }; 
  24.  
  25. unsigned char buf[100]; 
  26. unsigned char readbuf[100]; 
  27.  
  28. int car_mqtt(void) 
  29.     int rc = 0; 
  30.      
  31.     MQTTMessage pubmsg; 
  32.     //小車控制主題carControl 
  33.     char* topic = "carControl"
  34.  
  35.     if (strchr(topic, '#') || strchr(topic, '+')) 
  36.         opts.showtopics = 1; 
  37.     if (opts.showtopics) 
  38.         printf("topic is %s\n", topic); 
  39.  
  40.     Network n; 
  41.     MQTTClient c; 
  42.     //網(wǎng)絡(luò)初始化 
  43.     NetworkInit(&n); 
  44.     NetworkConnect(&n, opts.host, opts.port); 
  45.     //設(shè)置MQTT緩存和啟動(dòng)MQTT線程 
  46.     MQTTClientInit(&c, &n, 1000, buf, 100, readbuf, 100); 
  47.     MQTTStartTask(&c); 
  48.     //設(shè)置MQTT相關(guān)參數(shù) 
  49.     MQTTPacket_connectData data = MQTTPacket_connectData_initializer;        
  50.     data.willFlag = 0; 
  51.     data.MQTTVersion = 3; 
  52.     data.clientID.cstring = opts.clientid; 
  53.     data.username.cstring = opts.username; 
  54.     data.password.cstring = opts.password
  55.  
  56.     data.keepAliveInterval = 10; 
  57.     data.cleansession = 1; 
  58.     printf("Connecting to %s %d\n", opts.host, opts.port); 
  59.     //連接到MQTT服務(wù)器 
  60.     rc = MQTTConnect(&c, &data); 
  61.     printf("Connected %d\n", rc); 
  62.     //訂閱主題和接收消息 
  63.     printf("Subscribing to %s\n", topic); 
  64.     rc = MQTTSubscribe(&c, topic, opts.qos, messageArrived); 
  65.     printf("Subscribed %d\n", rc); 
  66.     //狀態(tài)變化后發(fā)布主題carStatus,消息內(nèi)容ackmsg.payload 
  67.     memset(&ackmsg, '\0', sizeof(ackmsg)); 
  68.     ackmsg.payload = (void*)"ACK"
  69.     ackmsg.payloadlen = strlen((char*)ackmsg.payload); 
  70.     ackmsg.qos = QOS0; 
  71.     ackmsg.retained = 0; 
  72.     ackmsg.dup = 0;  
  73.  
  74.     while (1) 
  75.     { 
  76.         if(needAck == 1)//收到消息后,發(fā)送主題carStatus并攜帶狀態(tài)消息 
  77.         { 
  78.             needAck = 0; 
  79.             printf("Publish carStatus ackmsg %d %s \n", (int)ackmsg.payloadlen, (char*)ackmsg.payload);  
  80.             MQTTPublish(&c, "carStatus", &ackmsg); 
  81.         } 
  82.         sleep(1);    
  83.     } 
  84.      
  85.     printf("Stopping\n"); 
  86.  
  87.     MQTTDisconnect(&c); 
  88.     NetworkDisconnect(&n); 
  89.  
  90.     return 0; 

3.2.1 小車控制代碼

通過MQTTSubscribe(&c, topic, opts.qos, messageArrived);注冊(cè)messageArrived回調(diào)實(shí)現(xiàn),代碼如下

  1. void messageArrived(MessageData* md) 
  2.  
  3.     MQTTMessage* message = md->message; 
  4.  
  5.     memset(&ackmsg, '\0', sizeof(ackmsg)); 
  6.     ackmsg.qos = QOS0; 
  7.     ackmsg.retained = 0; 
  8.     ackmsg.dup = 0; 
  9.  
  10.     if (opts.showtopics) 
  11.         printf("%.*s\t", md->topicName->lenstring.len, md->topicName->lenstring.data); 
  12.     if (opts.nodelimiter) 
  13.         printf("%.*s\n", (int)message->payloadlen, (char*)message->payload); 
  14.     else 
  15.         printf("%.*s%s\n", (int)message->payloadlen, (char*)message->payload, opts.delimiter); 
  16.  
  17.     if(strncmp("forward", message->payload, 7)== 0) { 
  18.         needAck = 1; 
  19.         car_go_forward(); 
  20.         ackmsg.payload = (void*)"forward"
  21.     } 
  22.     if(strncmp("back", message->payload, 4) == 0) { 
  23.         needAck = 1; 
  24.         car_go_back(); 
  25.         ackmsg.payload = (void*)"back"
  26.     } 
  27.     if(strncmp("left", message->payload, 4) == 0) { 
  28.         needAck = 1; 
  29.         car_turn_left(); 
  30.         ackmsg.payload = (void*)"left"
  31.     } 
  32.     if(strncmp("right", message->payload, 5) == 0) { 
  33.         needAck = 1; 
  34.         car_turn_right(); 
  35.         ackmsg.payload = (void*)"right"
  36.     } 
  37.     if(strncmp("stop", message->payload, 4) == 0) { 
  38.         needAck = 1; 
  39.         car_stop(); 
  40.         ackmsg.payload = (void*)"stop"
  41.     } 
  42.     if(needAck == 1) { 
  43.         ackmsg.payloadlen = strlen((char*)ackmsg.payload); 
  44.     } 

4.編譯及測(cè)試

4.1 小車控制代碼的編譯

完整的代碼請(qǐng)見附件或者Gitee https://gitee.com/soonliao/car_mqtt,使用方式如下

4.1.1 將car_mqtt解壓或者git clone 到applications\sample\wifi-iot\app\路徑下

#開發(fā)板漂流計(jì)劃#小車控制由簡(jiǎn)入繁之MQTT控制-鴻蒙HarmonyOS技術(shù)社區(qū)

4.1.2 修改applications\sample\wifi-iot\app\BUILD.gn

  1. import("//build/lite/config/component/lite_component.gni"
  2.  
  3. lite_component("app") { 
  4.     features = [ 
  5.         "car_mqtt"
  6.     ] 

4.1.3 修改WIFI SSID、密碼及MQTT Broker IP

修改applications\sample\wifi-iot\app\car_mqtt\src\car_main.c

  1. #define WIFI_SSID                  "SSIDABCD"//WIFI賬號(hào) 
  2. #define WIFI_PW                    "MIMA1234"//WIFI密碼 
  3. #define MQTT_BROKER                "192.168.123.230"//改成你的MQTT Broker 地址 
  4. #define MQTT_PORT                  1883//改成你的MQTT Broker 端口,默認(rèn)1883 

4.1.4 開啟PWM 功能,開啟方式如下

電機(jī)驅(qū)動(dòng)會(huì)用到PWM 模塊所以要開啟

device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk

  1. CONFIG_PWM_SUPPORT is not set 

改為

  1. CONFIG_PWM_SUPPORT=y 

加上第3部分中的pahomqtt相關(guān)修改,整個(gè)Demo就可以編譯通了。

4.2 小車控制代碼的測(cè)試

4.2.1 從串口log查看

成功連接WIFI,且連上MQTT Broker訂閱主題的log如下

#開發(fā)板漂流計(jì)劃#小車控制由簡(jiǎn)入繁之MQTT控制-鴻蒙HarmonyOS技術(shù)社區(qū)

4.2.2 電腦Windows系統(tǒng)下paho軟件發(fā)送測(cè)試指令

測(cè)試軟件在附件,或者參考連老師的說明下載,控制指令支持前進(jìn)“forward”、后退“back”、右轉(zhuǎn)“right”、左轉(zhuǎn)“left”、停止“stop”,在小車成功執(zhí)行指令后會(huì)返回一條carStatus的主題并攜帶狀態(tài)消息。

#開發(fā)板漂流計(jì)劃#小車控制由簡(jiǎn)入繁之MQTT控制-鴻蒙HarmonyOS技術(shù)社區(qū)

接收到指令后串口會(huì)有以下打印

#開發(fā)板漂流計(jì)劃#小車控制由簡(jiǎn)入繁之MQTT控制-鴻蒙HarmonyOS技術(shù)社區(qū)

文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載

https://harmonyos.51cto.com/resource/1319

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-10-08 14:48:03

鴻蒙HarmonyOS應(yīng)用

2021-10-08 14:41:11

鴻蒙HarmonyOS應(yīng)用

2020-11-30 10:18:02

鴻蒙小車

2022-04-19 11:09:13

Wi-Fi IoT智能小車鴻蒙

2021-09-09 10:06:09

鴻蒙HarmonyOS應(yīng)用

2011-07-29 13:14:39

趨勢(shì)科技中小企業(yè)安全軟件包

2013-12-19 09:32:01

SDN南向網(wǎng)絡(luò)控制

2011-02-28 14:34:01

蘋果iOS

2019-06-13 11:50:41

Python面向?qū)ο?/a>編程語言

2012-11-15 10:42:10

云集成大數(shù)據(jù)云應(yīng)用集成

2011-06-20 10:19:27

2017-04-25 10:46:57

Spring BootRESRful API權(quán)限

2011-07-13 10:29:44

域控制器

2021-07-09 13:54:31

零信任網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2019-11-25 15:32:30

虛擬化IO故障

2011-07-13 14:06:15

域控制器服務(wù)器

2011-07-12 09:29:10

主域控制器備份域控制器

2017-12-21 17:10:26

Teradata

2011-07-06 15:25:33

Windows控制臺(tái)

2020-11-03 11:39:22

wifi小車
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)