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

目前支持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

二、开发流程

从官方拿到的文件:

基础SDKcore_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二次开发,大致流程如上

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
以下是基于STM32通过广和通L610通信模组与腾讯云连接的代码示例: ```c #include "stm32f10x.h" #include "gprs.h" #include "string.h" #include "stdio.h" #define APN "CMNET" #define USER "" #define PASS "" #define IP "mqtt.tencentdevices.com" #define PORT 1883 #define CLIENT_ID "my_client_id" #define USERNAME "my_username" #define PASSWORD "my_password" #define MQTT_TOPIC "/my_topic" #define MQTT_QOS 0 #define GPRS_RX_BUF_SIZE 1024 #define GPRS_TX_BUF_SIZE 1024 uint8_t gprs_rx_buf[GPRS_RX_BUF_SIZE]; uint8_t gprs_tx_buf[GPRS_TX_BUF_SIZE]; uint8_t mqtt_rx_buf[GPRS_RX_BUF_SIZE]; uint8_t mqtt_tx_buf[GPRS_TX_BUF_SIZE]; int main(void) { uint8_t ip[16]; uint16_t port; uint8_t client_id[32]; uint8_t username[32]; uint8_t password[32]; uint8_t topic[64]; // 初始化GPRS模块 gprs_init(gprs_rx_buf, GPRS_RX_BUF_SIZE, gprs_tx_buf, GPRS_TX_BUF_SIZE); // 连接GPRS网络 if (!gprs_connect(APN, USER, PASS)) { printf("GPRS connect failed!\n"); while (1); } // 获取IP地址和端口号 if (!gprs_get_ip_port(IP, PORT, ip, &port)) { printf("Get IP and port failed!\n"); while (1); } // 连接MQTT服务器 if (!mqtt_connect(ip, port, client_id, username, password)) { printf("MQTT connect failed!\n"); while (1); } // 发布消息 if (!mqtt_publish(MQTT_TOPIC, MQTT_QOS, "Hello, world!")) { printf("MQTT publish failed!\n"); while (1); } // 订阅消息 if (!mqtt_subscribe(MQTT_TOPIC, MQTT_QOS)) { printf("MQTT subscribe failed!\n"); while (1); } // 接收消息 mqtt_receive(mqtt_rx_buf, GPRS_RX_BUF_SIZE); // 断开MQTT连接 mqtt_disconnect(); // 断开GPRS连接 gprs_disconnect(); while (1); } ``` 其中,`gprs_init`、`gprs_connect`、`gprs_get_ip_port`、`gprs_disconnect`是自定义的GPRS模块初始化、连接、获取IP地址和端口号、断开连接函数;`mqtt_connect`、`mqtt_publish`、`mqtt_subscribe`、`mqtt_receive`、`mqtt_disconnect`是自定义的MQTT连接、发布消息、订阅消息、接收消息、断开连接函数。你需要根据你使用的GPRS模块和MQTT库进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

外来务工人员徐某

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值