赞
踩
目前支持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(®_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
,一般模组出厂时已加载,若被擦写,需自行烧录
加载成功在第二个按钮会解析到文件占用的地址
点击第三个按钮下载
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二次开发,大致流程如上
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。