1.前面的話
在上次連夜肝出了華為云平臺的帖子:https://aijishu.com/a/1060000000287434
之后,論壇里的反響平平,好評沒有,點贊更無,抱著已完成任務成功白嫖一塊板子的心態,把板子收在了盒子里,第二天,助手小姐姐跟我說為何不把騰訊云的做了,對于這個要求我其實是拒絕的,但是小助手姐姐說寫的好的話,會有獎勵,當時我就笑了,把我當什么人了,我缺你的獎勵嗎,我現在就想問一句:什么時候能發貨?
之所以要對接騰訊云其實是覺得騰訊云真的蠻好的(這句話不要寫,包括括號),雖然本人跟騰訊沒有一毛錢的關系,甚至曾找大佬內推簡歷后面換來一句已經招到了的回答,但是依然不能因此就否定它,他那清晰的文檔,優雅的sdk代碼,使我不能抗拒.
好了,說一點小笑話,調節一下氣氛,進入正題
2.好戲開場了
按照上一篇對接華為云的套路,我們首先來找官方sdk,茫茫文檔中給我看到了那熟悉的身影:
文檔地址在這,拿走不謝:
https://cloud.tencent.com/document/product/1081/48356
把sdk下載之后,熟練的放進thirdparty文件夾,這個時候依然要看文檔,因為有些函數需要自己實現,具體是哪些呢,在這里:
https://cloud.tencent.com/document/product/1081/48389
這篇文檔寫了,我們要實現里面的這些接口,此處列舉一二:
仔細一看,霍,好家伙還不少呢,但是不怕,都是打工人,誰怕誰啊,二話不說我就寫,結果就給我給寫出來了:
,寫出來這些后就可以準備編譯了嗎?
nonono,我們還沒做BUILD.gn文件呢,話不多說,直接教你寫:
# Copyright (c) 2020 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.import("//build/lite/config/component/lite_component.gni")
import("//build/lite/ndk/ndk.gni")config("qcloud_sdk_config") {include_dirs = ["sdk_src/internal_inc","sdk_src/library","include","include/exports","//kernel/liteos_m/kernel/include",# "//third_party/cmsis","//third_party/mbedtls/include","//third_party/mbedtls/include/mbedtls",]}cflags = [ "-Wno-unused-variable" ]cflags += [ "-Wno-unused-but-set-variable" ]cflags += [ "-Wno-unused-parameter" ]cflags += [ "-Wno-sign-compare" ]cflags += [ "-Wno-unused-function" ]cflags += [ "-Wno-return-type" ]qcloud_sdk_sources = ["sdk_src/network/socket/network_socket.c","sdk_src/network/tls/network_tls.c","sdk_src/network/network_interface.c","sdk_src/utils/utils_list.c","sdk_src/utils/utils_base64.c","sdk_src/utils/qcloud_iot_ca.c","sdk_src/utils/utils_aes.c","sdk_src/utils/utils_getopt.c","sdk_src/utils/utils_hmac.c","sdk_src/utils/utils_md5.c","sdk_src/utils/utils_sha1.c","sdk_src/utils/json_parser.c","sdk_src/utils/json_token.c","sdk_src/utils/string_utils.c","sdk_src/utils/utils_ringbuff.c","sdk_src/utils/qcloud_iot_log.c","sdk_src/utils/qcloud_iot_device.c","sdk_src/utils/utils_timer.c","sdk_src/protocol/mqtt/mqtt_client_common.c","sdk_src/protocol/mqtt/mqtt_client_connect.c","sdk_src/protocol/mqtt/mqtt_client_net.c","sdk_src/protocol/mqtt/mqtt_client_publish.c","sdk_src/protocol/mqtt/mqtt_client_subscribe.c","sdk_src/protocol/mqtt/mqtt_client_unsubscribe.c","sdk_src/protocol/mqtt/mqtt_client_yield.c","sdk_src/protocol/mqtt/mqtt_client.c","sdk_src/services/data_template/data_template_action.c","sdk_src/services/data_template/data_template_client.c","sdk_src/services/data_template/data_template_client_common.c","sdk_src/services/data_template/data_template_client_json.c","sdk_src/services/data_template/data_template_client_manager.c","sdk_src/services/data_template/data_template_event.c","platform/os/liteos_m/HAL_Device_liteos_m.c","platform/os/liteos_m/HAL_OS_liteos_m.c","platform/os/liteos_m/HAL_TCP_liteos_m.c","platform/os/liteos_m/HAL_Timer_liteos_m.c",# "./os/liteos_m/HAL_TLS_mbedtls_liteos_m.c",# "./tls/mbedtls/HAL_DTLS_mbedtls.c","platform/tls/mbedtls/HAL_TLS_mbedtls.c",]lite_library("qcloud_sdk_static") {target_type = "static_library"sources = qcloud_sdk_sourcespublic_configs = [ ":qcloud_sdk_config" ]
}lite_library("qcloud_sdk_shared") {target_type = "shared_library"sources = qcloud_sdk_sourcespublic_configs = [ ":qcloud_sdk_config" ]
}ndk_lib("qcloud_ndk") {if (board_name != "hi3861v100") {lib_extension = ".so"deps = [":qcloud_sdk_shared"]} else {deps = [":qcloud_sdk_static"]}head_files = ["//third_party/iot_link/network/mqtt/paho_mqtt/paho"]
}
整完之后就可以嘗試一下有沒有錯誤了.
3.在main里面寫邏輯,處理事情
我們把官方sdk里面的點燈demo拿過來,直接新建一個demo文件夾,把文件放進去:
自己寫好BUILD.gn,跟之前華為云對接一個套路噻,大家這么聰明,不用我多說了
然后在sample里面的sdk把這個文件夾開啟編譯:
這樣就完成了代碼的編寫了,是不是很快樂呀
4.開始編譯(血與淚的旅程)
4.1首先出場的是UTILS_LIST
這個utils_list.h不能被系統識別的問題還真是頭疼,經過兩小時+的奮戰,被我發現系統也有一個utils_list.h錯誤(忘了截圖了),這就有點不講武德了,竟然與代碼的友好協商,我這樣改:
終于把這個小家伙趕走了
4.2 緊跟著MBEDTILS當然不讓,是迎頭痛擊
編譯出來有個mbedtls的錯誤(依然忘了截圖),后面分析出來是某些編譯宏沒搞對吧,然后我一番查找,就把qcloud里面帶的mbedtls里面的config.h拷貝出去,放到系統自帶的mbedtls里面:
結果,當然是沒用了,這我就納悶了,難道系統的mbedtls庫是提前編好的,不能更改了,帶著這個疑問,我就翻遍了系統自帶的文件,結果被我找到一個東西:
在device/xradio/xr806/xr_skylark/src/net/mbedtls-2.16.8
這里有一個mbedtls的源碼,這下我就坐不住了,趕緊看看這個源碼有沒有參與編譯,結果終于被我發現端倪,
這里指定了一個變量叫做MBEDTLS_CONFIG_FILE
,我就說我怎么老看到mbedtls有這種代碼:
yes, 就說他了,說明他把config文件定向到了一個叫做<config-xr-mini-cliserv.h>
這個文件了, 那可就方便了,我改吧device/xradio/xr806/xr_skylark/include/net/mbedtls-2.16.8/mbedtls/configs/config-xr-mini-cliserv.h
終于是把mbedtls的錯誤給整好了,花了我又是2h+,我只想問人的一生有幾個2h不說了,繼續編譯,這里需要注意的是,因為我們改的是系統的lib,所以需要在device/xradio/xr806/xr_skylark$
,目錄執行 make lib -j
,讓系統重新生成庫
4.3 內存不足讓我心如死灰
終于是把兩個大的攔路虎給搞定了,真開心,雖然時間已經晚上10點多了我可一點都不困喲,想著馬上就可以大功告成贏取助手小姐姐
咳咳,呃,親手發送的禮品了,迫不及待得編譯,運行,結果剛上來就是悶頭一棍,
執行wifi掃描都內存不:
, 雖然我知道這mbedtls費內存但也不至于到這步田地吧,連wifi掃描都不讓那板子不廢了嘛,苦于對芯片不熟,內存方面的資料是一點沒有,于是我當機立斷在論壇里面發帖控訴為什么只有這么一點內存:
https://bbs.aw-ol.com/topic/854/wifi掃描提示內存不足-288kb可用的有多少?_=1640440348789
想著第二天應該有人解答吧,結果等今天下午一看,沒人理我,想了一下,小姐姐這么熱情的邀請我把騰訊云對接出來,我得兌現我的承諾呀,繼續磕吧.
突然我想到了我這個工程是官方的一個叫wlan_ble的proect上面弄個,會不會是ble藍牙占了內存呀,因為是sram運行,會把code也給拷過來嘛
想到這里,我的毛孔全部都舒張起來了,一股頭皮發麻的感覺涌上腳心,這就弄.于是我不慌不忙的就把ble給禁了,在device/xradio/xr806/xr_skylark$目錄執行make menuconfig
:
小子還想陰我老人家,昨天是我大意了,沒有閃,這招就送你下去.
弄起來一跑,爽歪歪
5.就這樣,騰訊云就對接成功了
就這樣,一小時之前我終于成功把demo跑了起來:
看個動圖一睹為快吧:
這是網頁調試的效果,其實如果就這些還不足以我說騰訊云多好,還有一個東西就是騰訊連連,這個東西很有用,大家可以了解一下
6.總結
對接云平臺其實說起來一點不復雜,難的在于各種細節,跟系統,編譯器,sdk斗智斗勇,其樂無窮.
其實說起結果來,那是很開心了,但是過程那是相當曲折,其實我本人已經對接過很多次騰訊云了,這次之所以能在短時間內把騰訊云這個整明白也得益于以前的經驗,所以積累很重要.