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斗智斗勇,其乐无穷.
其实说起结果来,那是很开心了,但是过程那是相当曲折,其实我本人已经对接过很多次腾讯云了,这次之所以能在短时间内把腾讯云这个整明白也得益于以前的经验,所以积累很重要.