基于zephyr的maxlinear交换机的开发备份

一、开发说明

本人在大概一个月的时间里做了交换机web的翻译和mqtt的移植和开发
写一些备份的心得,本来也是前不见古人后不见来着的工作,遇到了不少的问题,希望留下些心得让后继者继承,开往更好的未来。

说明:maxlinear是基于zephyr的交换机,其soc非常的强大,内存也是足够,我在开发这个交换机之前是做airoha和realtek还有mavell的交换机的,对比一下开发的过程吧。

maxlinear和airoha是RTOS的系统,而realtek和mavell是做的linux,开发难度来说可以是天差地别,realtek和mavell的交换机移植起来非常方便,添加程序也方便,我们公司还有路由器部门,咱们的mqtt客户端的代码是通用的。开发难度来说相对低一些。

airoha是基于freertos上做的一个mw,开发难度相对高,很多函数不是标准的,甚至c的动态内存分配函数无法完美支持,内存优化不好,cJSON的库都跑不起来,自己拼接json,费时费力,freertos自带的core_json只支持解析不支持构建,而且解析的话,只能解析一层,多层的话还需要自己做判断,调用起来不方便,说句题外话,他们自己传的数据也是手动拼接的!但是这家是台湾的企业,FAE的支持非常的好,还有自己的QA平台。这点完全弥补了上述的问题。这点必须点赞!

maxlinear使用的是zephyr的系统,zephyr和linux有相当大的渊源,有兴趣的童鞋可以自行百度。极致的开源,有种开发openwrt的快感,社区非常的强大,基本的协议和功能都有demo。比如咱们移植的mqtt,里面有backend的内置mqtt有微软的azure,咱就是用的这个demo,有google的iot,还有一些test的函数。驱动什么的已经对接好了。所以万事俱备,只欠东风了。

不过对比airoha的话,不知道是中间的代理商的问题还是其他的问题,QA非常不好,开发的过程中我都是自己解决问题的,唯一一次有效的QA还是我去问修改这个值对不对,会不会影响其他的地方。原厂回复对,不影响其他的地方,无语了都。

小结一下:realtek和mavell的驱动不错,还有基于linux,可玩性非常的高。对于编程的要求相对低,大内存,大flash,开源项目多,代码复制粘贴即可,交叉编译好进程,可以直接运行。优点我就不多讲了,但是正因为可玩性高导致原厂不提供turkey,相对来说需要开发者开发整个项目,不过相对来说成熟。比如web服务器可以用goahead这种,mqtt也是github上搞一个直接拿来用,这些程序直接移植没有一点关系,也兼容openwrt,开发起来很舒服。不过相对来说投入的人力比较多,对于架构工程师的要求要高。而rtos就不一样了,代码需要自己移植过去,本身来说架构和linux不通用。linux基本可以不修改移植,这些os考虑的问题就多了。

二、开发遇到的问题以及解决方法

版本说明:zephyr是3.1.0最新版是3.7了。
库的修改:cJSON相较于一般的库基本一致,不过cJSON_GetNumberValue没有还有一个搜索数组的宏没有,不过可以在其他地方复制。宏就不管了,反正可以通过查数组的大小和for循环实现这个功能。就不写了。

CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item)
{
    if (!cJSON_IsNumber(item))
    {
        return (double) NAN;
    }

    return item->valuedouble;
}

注意NAN可能会报错,如果报错用一个宏来define一下即可,如下
#define NAN (0.0f / 0.0f)

说完cJSON再来说下mqtt

mqtt如果不用TLS的话,需要在prepare_fds函数中添加一行代码
fds[0].fd = client_ctx.transport.tcp.sock;

估计微软在开发的时候没有用不加密的测试过,我反正测试的时候不能工作,参考了zephyr的开发手册才能用的,建议改成我这样的形式

static void prepare_fds(struct mqtt_client *client)
{

#ifdef CONFIG_MQTT_LIB_TLS
     if (client->transport.type == MQTT_TRANSPORT_SECURE) {
        fds[0].fd = client->transport.tls.sock;
     }
#endif
#ifndef CONFIG_MQTT_LIB_TLS
    fds[0].fd = client_ctx.transport.tcp.sock;
#endif
    fds[0].events = ZSOCK_POLLIN;
    nfds = 1;
}

因为用tls不需要这个,而且sock也不一样,这样就做了区分,加不加密都不会有问题了!

如果不加密或者使用私有的加密,比如异或加密,开盖即食。如果使用TLS则需要在prj.conf中打开这些功能,请参考mqtt_azure中的prj.conf配置
CONFIG_MQTT_LIB_TLS=y

CONFIG_MBEDTLS_BUILTIN=y
CONFIG_MBEDTLS_ENABLE_HEAP=y
CONFIG_MBEDTLS_HEAP_SIZE=20000
CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=10240
CONFIG_MBEDTLS_PEM_CERTIFICATE_FORMAT=y

这里只是大概写了下,因为我的设备有的配置已经打开了的,所以就没有重复打开,参考上述的mqtt_azure文件夹下的prj.conf即可。

mqtt是运行一次的如果断线了是不会主动重连的,需要自行安排检测机制,我用的是k_work的每5s的一次心跳。自行视情况配置即可。

三、最后

zephyr支持多线程,可以按需要设置不同程序的优先级来实现多任务运行。记得多分配些栈,不然会报错。我找了好久才解决这个问题。

sock的配置和linux类似,不过我发现了一个问题,调用zsock_sendto函数时对比linux的sendto函数,返回值有问题。目前无法解决。不过对我的项目来说关系不大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值