【Cat.1模组】 广和通L610 基于OpenCPU的SDK二次开发

2023-11-07

目前支持Cat.1网络的芯片平台主要是紫光展锐UIS8910翱捷ASR1603,基于紫光展锐平台,各大厂商延伸出多款Cat.1模组;广和通L610就是其中之一。本文记录开发过程,供日后参考。
在这里插入图片描述
广和通L610模组支持AT指令开发和OpenCPU开发两种方式:
①采取外挂MCU通过AT指令控制模组
②无需外挂MCU,采用片上操作系统(OpenCPU)提供的SDK进行开发,节省成本 ,也是目前芯片短缺情况下的主要开发模式√

一、 开发环境

1.系统环境:ubuntu16.04
2.编辑代码:VScode
3.编译代码:Cmake
4.烧录程序:UpgradeDownload(广和通提供)
5.LOG抓取:Coolwatcher(紫光展锐提供)
6.基于的库:SDK(非开源,需广和通提供)
7.开发语言:C

二、开发流程

从官方拿到的文件:

基础SDK core_sdk_16000.1000.00.06.34.05.tar.gz
主版本固件 16000.1000.00.06.34.05.pac
ELF文件 16000.1000.00.06.34.05.elf
MAP文件 16000.1000.00.06.34.05.map
BOOT_ELF文件 16000.1000.00.06.34.05_boot.elf

解压SDK,结构如下,可以新建一个app目录来存放用户文件
在这里插入图片描述
1.修改Cmakelist.txt:包含新添加的用户C文件和H文件路径,供Cmake编译时索引
在这里插入图片描述
2.编写用户文件:以MQTT例程为例
广和通L610的opencpu实际是封装了UIS8910的freertos系统,提供了以fibo开头的API,我们通过这些API来编写用户程序

#define OSI_LOG_TAG OSI_MAKE_LOG_TAG('M', 'Q', 'T', 'T')

#include "fibo_opencpu.h"
#include "oc_mqtt.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "topic.h"

static 	 UINT32 g_lock = 0;

INT8	 client_id[] = "lens_0ptfvqWWCzblt9phGtddgOdO3z3";
INT8 	 host[] = "116.62.106.96";
UINT16 	 port = 1883;
UINT16 	 keepalive = 10;
UINT8 	 UseTls = false;

UINT8 	 clear_session = 0;
BOOL 	 run = false;
BOOL 	 quit = true;
int 	 connect_res_result = 0;

static void prvThreadEntry(void *param);

static void create_mqtt_connect()
{
    run = false;
    connect_res_result = 0;
    OSI_PRINTFI("mqttapi thread create start");
    while (!quit)
    {
        fibo_taskSleep(1000);
    }
    OSI_PRINTFI("mqttapi thread create");
    fibo_thread_create(prvThreadEntry, "mqtt-thread", 1024 * 16, NULL, OSI_PRIORITY_NORMAL);
}

/*返回值处理(包括订阅的主题)*/
void user_signal_process(GAPP_SIGNAL_ID_T sig, va_list arg)
{
    OSI_PRINTFI("mqttapi RECV SIGNAL:%d", sig);
    int ret;
    mqtt_msg sub_msg;

    switch (sig)
    {
    case GAPP_SIG_CONNECT_RSP:
        connect_res_result = ret = va_arg(arg, int);
        OSI_PRINTFI("mqttapi connect :%s", ret ? "ok" : "fail");
        fibo_sem_signal(g_lock);
        break;
    case GAPP_SIG_CLOSE_RSP:
        ret = va_arg(arg, int);
        OSI_PRINTFI("mqttapi close :%s", ret ? "ok" : "fail");
        create_mqtt_connect();
        break;
    case GAPP_SIG_SUB_RSP:
        ret = va_arg(arg, int);
        OSI_PRINTFI("mqttapi sub :%s", ret ? "ok" : "fail");
        fibo_sem_signal(g_lock);
        break;
    case GAPP_SIG_UNSUB_RSP:
        ret = va_arg(arg, int);
        OSI_PRINTFI("mqttapi unsub :%s", ret ? "ok" : "fail");
        fibo_sem_signal(g_lock);
        break;
    case GAPP_SIG_PUB_RSP:
        ret = va_arg(arg, int);
        OSI_PRINTFI("mqttapi pub :%s", ret ? "ok" : "fail");
        fibo_sem_signal(g_lock);
        break;
    case GAPP_SIG_INCOMING_DATA_RSP:
        //gapp_dispatch(GAPP_SIG_INCOMING_DATA_RSP, pub_msg->topic, pub_msg->qos, pub_msg->message, pub_msg->recv_len);
        sub_msg.topic = va_arg(arg, char *);
        sub_msg.qos = va_arg(arg, int);
        sub_msg.message = va_arg(arg, char *);
        sub_msg.msglen = va_arg(arg, uint32_t);

        //sub_msg_parse(sub_msg);
        
        OSI_PRINTFI("mqttapi recv message :topic:%s, qos=%d message=%s len=%d", sub_msg.topic, sub_msg.qos, sub_msg.message, sub_msg.msglen);
        break;
    default:
        break;
    }
}

static FIBO_CALLBACK_T user_callback = {
    .fibo_signal = user_signal_process
};

static void prvThreadEntry(void *param)
{
    OSI_LOGI(0, "application thread enter, param 0x%x", param);
    int ret = 0;

    int test = 1;
    OSI_PRINTFI("mqttapi wait network");
    reg_info_t reg_info;
    quit = false;
    run = true;

    /*申请信号量*/
    if (g_lock == 0)
    {
        g_lock = fibo_sem_new(0);
    }

    /*注册GSM,PDP激活*/
    while (test)
    {
        fibo_getRegInfo(&reg_info, 0);
        fibo_taskSleep(1000);
        OSI_PRINTFI("[%s-%d]", __FUNCTION__, __LINE__);
        if (reg_info.nStatus == 1)
        {
            test = 0;
            fibo_PDPActive(1, NULL, NULL, NULL, 0, 0, NULL);
            fibo_taskSleep(1000);
            OSI_PRINTFI("[%s-%d]", __FUNCTION__, __LINE__);
        }
    }

    fibo_taskSleep(1 * 1000);
    OSI_PRINTFI("mqtt [%s-%d]", __FUNCTION__, __LINE__);

    /*设置 MQTT 服务器用户名和密码*/
    fibo_mqtt_set("admin", "public");

    /*不校验ssl*/
    fibo_set_ssl_chkmode(0);

    /*连接服务器*/
    do
    {
        ret = fibo_mqtt_connect(client_id, host, port, 1, keepalive, UseTls);
        fibo_taskSleep(2000);
    } while (ret < 0);

    OSI_PRINTFI("mqttapi connect finish");

    /*订阅发布有结果后(参见user_signal_process),再进行新的订阅发布动作*/
    fibo_sem_wait(g_lock);
    
    /*订阅发布主题*/
    OSI_PRINTFI("mqttapi start sub topic");
    if (connect_res_result)
    {
         ret = mqtt_sub("");
         if (ret < 0)
         {
             OSI_PRINTFI("mqttapi sub failed");
         }
         ret =  mqtt_pub(BEAT);
         if (ret < 0)
         {
             OSI_PRINTFI("mqttapi sub failed");
         }
    }
    else
    {
        run = false;
        OSI_PRINTFI("mqttapi connect res fail");
    }

    while (run)
    {
        //led闪烁
        OSI_PRINTFI("mqttapi running");
        fibo_taskSleep(2 * 1000);
    }
    quit = true;
    OSI_PRINTFI("mqttapi thread exit");
    create_mqtt_connect();
    fibo_thread_delete();
}

void mqtt_enter()
{
    create_mqtt_connect();
    return &user_callback;
}

3.编译流程

. tools/core_launch.sh	  #运行脚本
cout                      #定位到输出路径
cmake ../.. -G Ninja	  #指定编译工具
ninja			  		  #编译

ninja clean		          #清除编译

在SDK目录下,依次执行上列指令:
在这里插入图片描述
如果更改了C文件名字,存在旧的中间文件,尝试删除out路径重复操作编译步骤

4.烧录程序

插上开发板
在这里插入图片描述
编译完成后,在当前目录cd到hex文件下找到std_card.pac文件,复制到windows,加载到UpgradeDownload软件中,这是我们的用户固件
在这之前需要下载官方主固件16000.1000.00.06.34.05.pac,一般模组出厂时已加载,若被擦写,需自行烧录
![在这里插入图片描述](https://img-blog.csdnimg.cn/024b43dbd410467ebbe97a92f830e7be.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1
加载成功在第二个按钮会解析到文件占用的地址
在这里插入图片描述
点击第三个按钮下载
在这里插入图片描述

5.LOG抓取

插上板子后,会模拟出七个端口
在这里插入图片描述
打开串口助手,打开Port0(AT指令端口)对应的COM口,这里是COM5,发送AT指令控制模组输出LOG
在这里插入图片描述
打开Coolwatcher软件,打开Port4(用于LOG打印)对应的COM口,这里是COM7
在这里插入图片描述
打开Plugins>Activate Trace窗口,在右上角输入MQTT筛选用户LOG,前提是已经在用户C文件头部添加#define OSI_LOG_TAG OSI_MAKE_LOG_TAG('M', 'Q', 'T', 'T')以供软件识别
在这里插入图片描述
根据LOG可知,已连接到MQTT服务器
在这里插入图片描述
广和通L610基于OpenCPU的SDK二次开发,大致流程如上

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Cat.1模组】 广和通L610 基于OpenCPU的SDK二次开发 的相关文章

  • CMake:如何最好地构建多个(可选)子项目?

    想象一个包含多个组件的整体项目 basic io web app a app b app c 现在 假设 web 依赖于 io 而 io 又依赖于 basic 所有这些东西都在一个存储库中 并且有一个 CMakeLists txt 将它们构
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • CMake 中 LINK_LIBRARIES 的递归列表

    我正在尝试获取链接到 CMake 中特定目标的所有库的绝对路径列表 以便在调用中使用add custom command 然而 get target property LINK LIBRARIES TARGET LINK LIBRARIES
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 当 grep "\\" XXFile 我得到“尾随反斜杠”

    现在我想查找是否有包含 字符的行 我试过grep XXFile但它暗示 尾随反斜杠 但当我尝试时grep XXFile没关系 谁能解释一下为什么第一个案例无法运行 谢谢 区别在于 shell 处理反斜杠的方式 当你写的时候 在双引号中 sh
  • 如何在基于 Linux 的系统上的 C 程序中使用 mqueue?

    如何在基于 Linux 的系统上的 C 程序中使用 mqueue 消息队列 我正在寻找一些好的代码示例 可以展示如何以正确且正确的方式完成此操作 也许是一个操作指南 下面是一个服务器的简单示例 该服务器接收来自客户端的消息 直到收到告诉其停
  • php exec 返回的结果比直接进入命令行要少

    我有一个 exec 命令 它的行为与通过 Penguinet 给 linux 的相同命令不同 res exec cd mnt mydirectory zcat log file gz echo res 当将命令直接放入命令行时 我在日志文件
  • Linux:如何设置进程的时区?

    我需要设置在 Linux 机器上启动的各个进程的时区 我尝试设置TZ变量 在本地上下文中 但它不起作用 有没有一种方法可以使用与系统日期不同的系统日期从命令行运行应用程序 这可能听起来很愚蠢 但我需要一种sandbox系统日期将被更改的地方
  • Python pip install pyarrow错误,无法执行'cmake'

    我尝试在 EMR 集群的主实例上安装 pyarrow 但总是收到此错误 hadoop ip XXX XXX XXX XXX sudo usr bin pip 3 4 install pyarrow Collecting pyarrow Do
  • 快速像素绘图库

    我的应用程序以每像素的方式生成 动画 因此我需要有效地绘制它们 我尝试过不同的策略 库 但结果并不令人满意 尤其是在更高分辨率的情况下 这是我尝试过的 SDL 好的 但是慢 OpenGL 像素操作效率低下 xlib 更好 但仍然太慢 svg
  • 如何构建任务“gems:install”

    我正在将 Rails 应用程序部署到 Linux 服务器 并且缺少一些 rake 任务 包括 rake gems install 和 rake db 我正在运行来自 GEM 的 Rails 2 3 4 为什么是这样 我该如何解决 我可以以某
  • 如何查询X11显示分辨率?

    这似乎是一个简单的问题 但我找不到答案 如何查询 通过 X11 存在哪些监视器及其分辨率 查看显示宏 http tronche com gui x xlib display display macros html and 屏幕宏 http
  • Python 脚本作为 Linux 服务/守护进程

    Hallo 我试图让 python 脚本作为服务 守护进程 在 ubuntu linux 上运行 网络上存在多种解决方案 例如 http pypi python org pypi python daemon http pypi python
  • Awk - 计算两个文件之间的每个唯一值和匹配值

    我有两个文件 首先 我尝试获取第 4 列中每个唯一字段的计数 然后匹配第二个文件的第二列中的唯一字段值 File1 第 4 列的每个唯一值和 File2 第 2 列包含我需要在两个文件之间匹配的值 所以本质上 我试图 gt 如果 file2
  • 限制 Imagemagick 使用的空间和内存

    我在 Rails 应用程序上使用 Imagemagick 使用 rmagick 但我的服务器 Ubuntu 不是很大 当我启动转换进程时 Imagemagick 占据了我的服务器 30GB HDD 的所有位置 内存 我想限制内存和 tmp
  • 后台分叉无法正常工作[重复]

    这个问题在这里已经有答案了 我运行这个程序 在前景和背景中 int main int pid printf App Start pid d n getpid while 1 pid fork if pid 0 printf Child n
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 让 TeXstudio 在 linux mint 中工作:找不到文件“url.sty”。

    刚刚切换到 Linux Mint 以前的顽固 Windows 用户 我在尝试安装 TeXstudio 时遇到一些问题 Sudo apt get install texstudio 给了我一个正确的安装 至少 我是这么认为的 但是当我尝试构建

随机推荐

  • stopPropagation, preventDefault 和 return false 的区别

    http blog csdn net bkq421511585 article details 14166789
  • 使用Docker拉起ES容器和Kibana容器并设置密码Demo

    1 准备条件 安装好docker 在同一台服务器上安装es和kibana 安装docker命令参考 可以按顺序执行如下命令安装 1 sudo yum install y yum utils 2 sudo yum config manager
  • 做擦边网站 服务器放在狗爹,在GoDaddy搭建Prosper202服务器

    记录一下我在GoDaddy搭建Prosper202服务器的过程 1 首先 我购买的是Liunx Deluxe共享虚拟主机 狗爹这个类型的产品可以建多个网站 我有一个域名 www网站已经上线 虽然还没有什么内容 2 为你的Prosper202
  • add_library使用 $<TARGET_OBJECTS:name>

    一 背景 前面介绍了add library的两种格式 今天分享一个实例 Cmake分别生成静态链接库 OBJ链接库 并使用
  • 人人商城小程序消息服务器配置,人人商城小程序订阅消息设置方法和几个坑!...

    操作步骤 第一步 开通订阅消息功能 登录微信小程序官网后台 mp weixin qq com 开通订阅消息 第二步 服务类目 新增 商家自营 gt 服装 鞋 箱包 第三步 添加订阅消息 4个 订阅消息 公共模板库 搜索 订单支付成功通知 编
  • Android仿小米商城底部导航栏(基于BottomNavigationBar)

    简介 现在大多数App都会用到底部导航栏 比如QQ 微信和购物App等等 有了底部导航栏 用户可以随时切换界面 查看不同的内容 Android底部导航栏的实现方式特别多 例如TabHost TabLayout 或者TextView等 都可以
  • 机器学习-支持向量机算法实现与实例程序

    一 SMO算法基础 支持向量就是离分隔超平面最近的那些点 分隔超平面是将数据集分开来的决策边界 支持向量机将向量映射到一个更高维的空间里 在这个空间里建立有一个最大间隔超平面 在分开数据的超平面的两边建有两个互相平行的超平面 建立方向合适的
  • 剑指offer总结

    时间复杂度一般比空间复杂度更重要 因为改进时间对算法的要求更高 是空间换时间 还是时间换空间 一般要看具体的应用 对于普通的应用 一般是空间换时间 因为普通用户更关心速度 而且一般有足够的存储空间允许这样操作 对于嵌入式的软件 一般我们会用
  • 简说C++学习-第一章C++语言概述

    简说C 学习 第一章C 语言概述 1 C 语言的发展 1972年 贝尔实验室在B语言的基础上 做了进一步的充实和完善 设计出了C语言 C语言的优点 语言简洁 使用灵活 方便 具有丰富的运算符和数据类型 可以进行低级操作 适合开发系统软件 程
  • Java jdbc实现多表查询

    数据库中的一张表对应Java中的一个类 我这里示例的是学生类 老师类 成绩类 还有一个用于存储多表查询结果后的SelectAll类 public class Student 学生表 private Integer id 学生编号 priva
  • sublime text 3下载与安装详细教程

    一 下载 打开官网下载链接http www sublimetext com 3 下载Sublime Text 3 portable version 下载下来为 Sublime Text Build 3083 x64 zip 编辑器的包 解压
  • Linux 中统计指定目录下同一类文件总的大小

    root PC1 test ls a map a ped a txt b ped b txt root PC1 test ll h total 1 4G rw r r 1 root root 200M Dec 1 19 42 a map r
  • Tensorflow-2-Tensorboard使用

    一 概述 机器学习如此复杂 训练模型的时候 摸不清背后到底是如何运行的 自己设置的参数和关键变量 如果能看到在训练时的变化情况 可以为后面的参数调优阶段提供很大的便利 Tensorboard就是这样一个工具 它刻意将模型抽象成图像 tens
  • UmiJS基础+UmiUI安装使用+Mock使用示例+DvaJS案例

    title UmiJS基础 date 2022 09 12 19 20 27 tags React 框架 UmiJS categories 框架 UmiJS 介绍 官方文档 可扩展 Umi 实现了完整的生命周期 并使其插件化 Umi 内部功
  • 问题(02)Message 消息提示每次只弹出1个,不能同时出现2个

    项目场景 PC端开发 vue elementUI 问题描述 Message 消息提示同时出现2个 原因分析 Element UI的Message消息提示是点击一次触发一次的 解决方案 在utils文件创建resetMessage js re
  • Jar包中Class文件替换

    1 查找替换的class的具体路径 jar tvf jar grep class 根据自己的jar包和类名替换 2 根据第一步查到的class的具体路径解压出来对应文件 jar xvf jar class 3 替换解压出来的文件中的clas
  • 代码制作数字流星雨_用C语言编写流星雨程序

    展开全部 数字流星雨代码 流星雨 cpp Defines the entry point for the console application 程序名称 数字流星雨 最后修改e5a48de588b632313133353236313431
  • Python 判断生肖

    Python 判断年份干支纪年及生肖 生肖 12年一循环 干支纪年法 60年一循环 十天干 甲 乙 丙 丁 午 戊 庚 辛 壬 癸 十二地支 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥 十二生肖 鼠 牛 虎 兔 龙 蛇 马 羊 猴 鸡
  • java 插件式架构_springboot插件式开发框架

    介绍 该框架主要是集成于springboot项目 用于开发插件式应用的集成框架 核心功能 插件配置式插拔于springboot项目 在springboot上可以进行插件式开发 扩展性极强 可以针对不同项目开发不同插件 进行不同插件jar包的
  • 【Cat.1模组】 广和通L610 基于OpenCPU的SDK二次开发

    目前支持Cat 1网络的芯片平台主要是紫光展锐UIS8910和翱捷ASR1603 基于紫光展锐平台 各大厂商延伸出多款Cat 1模组 广和通L610就是其中之一 本文记录开发过程 供日后参考 广和通L610模组支持AT指令开发和OpenCP