【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二次开发 的相关文章

随机推荐

  • 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