10

Signx · 2021年12月26日

【XR806开发板试用】全网首发,对接腾讯云平台的血泪史

1.前面的话

在上次连夜肝出了华为云平台的帖子:https://aijishu.com/a/1060000000287434
之后,论坛里的反响平平,好评没有,点赞更无,抱着已完成任务成功白嫖一块板子的心态,把板子收在了盒子里,第二天,助手小姐姐跟我说为何不把腾讯云的做了,对于这个要求我其实是拒绝的,但是小助手姐姐说写的好的话,会有奖励,当时我就笑了,把我当什么人了,我缺你的奖励吗,我现在就想问一句:什么时候能发货?

之所以要对接腾讯云其实是觉得腾讯云真的蛮好的(这句话不要写,包括括号),虽然本人跟腾讯没有一毛钱的关系,甚至曾找大佬内推简历后面换来一句已经招到了的回答,但是依然不能因此就否定它,他那清晰的文档,优雅的sdk代码,使我不能抗拒.
好了,说一点小笑话,调节一下气氛,进入正题

2.好戏开场了

按照上一篇对接华为云的套路,我们首先来找官方sdk,茫茫文档中给我看到了那熟悉的身影:
7855bce1-bbdc-48ab-906a-255bfae5a361-image.png
文档地址在这,拿走不谢:
https://cloud.tencent.com/document/product/1081/48356
把sdk下载之后,熟练的放进thirdparty文件夹,这个时候依然要看文档,因为有些函数需要自己实现,具体是哪些呢,在这里:
https://cloud.tencent.com/document/product/1081/48389
这篇文档写了,我们要实现里面的这些接口,此处列举一二:
5b560673-4c25-4f3a-8bc3-ed84c53d9e0c-image.png
1675985a-cdb1-4135-aa34-15def710b44f-image.png
仔细一看,霍,好家伙还不少呢,但是不怕,都是打工人,谁怕谁啊,二话不说我就写,结果就给我给写出来了:
c01105d8-7cda-4bae-9879-28d40a7d73fd-image.png
,写出来这些后就可以准备编译了吗?
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_sources
    public_configs = [ ":qcloud_sdk_config" ]
}

lite_library("qcloud_sdk_shared") {
    target_type = "shared_library"
    sources = qcloud_sdk_sources
    public_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文件夹,把文件放进去:
b0f9937d-178d-4280-adb9-2953e36dcb34-image.png
自己写好BUILD.gn,跟之前华为云对接一个套路噻,大家这么聪明,不用我多说了
然后在sample里面的sdk把这个文件夹开启编译:
c6dbed4c-947e-4205-8733-aa30733e4033-image.png
这样就完成了代码的编写了,是不是很快乐呀

4.开始编译(血与泪的旅程)

4.1首先出场的是UTILS\_LIST

这个utils\_list.h不能被系统识别的问题还真是头疼,经过两小时+的奋战,被我发现系统也有一个utils\_list.h错误(忘了截图了),这就有点不讲武德了,竟然与代码的友好协商,我这样改:
ee10077f-034c-476e-992e-287f5088c9c1-image.png
终于把这个小家伙赶走了

4.2 紧跟着MBEDTILS当然不让,是迎头痛击

编译出来有个mbedtls的错误(依然忘了截图),后面分析出来是某些编译宏没搞对吧,然后我一番查找,就把qcloud里面带的mbedtls里面的config.h拷贝出去,放到系统自带的mbedtls里面:
937f8f71-a57a-4a91-9804-05dc2bf39d39-image.png
结果,当然是没用了,这我就纳闷了,难道系统的mbedtls库是提前编好的,不能更改了,带着这个疑问,我就翻遍了系统自带的文件,结果被我找到一个东西:
e4237a11-eb20-459f-9891-913f9a1dfd04-image.png
device/xradio/xr806/xr_skylark/src/net/mbedtls-2.16.8这里有一个mbedtls的源码,这下我就坐不住了,赶紧看看这个源码有没有参与编译,结果终于被我发现端倪,
9a456d13-44d6-4a2b-953b-5dd3f430d2d6-image.png
这里指定了一个变量叫做MBEDTLS_CONFIG_FILE,我就说我怎么老看到mbedtls有这种代码:
74e08fc1-e2df-4177-83b4-25fb33f7a000-image.png
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扫描都内存不:
,28880051-4d07-416b-97fb-b14e086b73c3-image.png 虽然我知道这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:
2b7d7660-4f5d-4a8e-9389-15d0efe1f57e-image.png
小子还想阴我老人家,昨天是我大意了,没有闪,这招就送你下去.
弄起来一跑,爽歪歪

5.就这样,腾讯云就对接成功了

就这样,一小时之前我终于成功把demo跑了起来:
看个动图一睹为快吧:
对接腾讯云-00_00_02-2021_12_25_22_49_50.gif
这是网页调试的效果,其实如果就这些还不足以我说腾讯云多好,还有一个东西就是腾讯连连,这个东西很有用,大家可以了解一下

6.总结

对接云平台其实说起来一点不复杂,难的在于各种细节,跟系统,编译器,sdk斗智斗勇,其乐无穷.
其实说起结果来,那是很开心了,但是过程那是相当曲折,其实我本人已经对接过很多次腾讯云了,这次之所以能在短时间内把腾讯云这个整明白也得益于以前的经验,所以积累很重要.

推荐阅读
关注数
13820
内容数
140
全志XR806开发板相关的知识介绍以及应用专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息