当前位置:   article > 正文

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

【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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182

3.编译流程

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

ninja clean		          #清除编译
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/194815
推荐阅读
相关标签
  

闽ICP备14008679号