上位机图像处理和嵌入式模块部署(树莓派4b用skynet实现进程通信)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        前面我们说过,在工业系统上面一般都是使用多进程来代替多线程。这后面,主要的原因还是基于安全的考虑。毕竟一个系统里面,如果很多的功能都focus在一个进程里面,这本身比较危险。因为这意味着,如果一个线程里面的code不是很健壮,那么整个系统就无法正常运行了。所以大家普遍采用的方法还是多进程。

        当然多进程就会涉及到通信的问题。很多同学都会推荐共享内存的方法,其实个人还是比较推荐网络的方式,这样显得安全一点,而且一个嵌入式设备之间的网络通信也是非常快速的。另外即使数据量很大,也可以采用指针+网络传输的方式来解决,这也是可以的。关于网络,目前有一些类似的框架其实可以拿来参考,skynet就是不错的一种方法。它本身是用来做游戏的,但是其实用来做进程间通信也是不错的选择。

1、下载skynet代码

        代码下载的地址在这个地方,

https://github.com/cloudwu/skynet/tree/master

2、下载jemalloc

        编译skynet的时候,需要依赖jemalloc库,如果只是压缩包下载,是没有办法下载jemalloc的。所以这种情况下,我们需要手动下载一下代码包,

https://github.com/jemalloc/jemalloc/tree/54eaed1d8b56b1aa528be3bdd1877e59c56fa90c

3、解压代码,准备编译

        将skynet先解压,紧接着把jemalloc解压到3rd/jemalloc下面的目录,下面就可以开始编译了。因为我们是需要在树莓派4b上面进行处理,所以这里直接输入对应的命令进行编译即可。

make linux

4、测试和验证

        所有代码都编译好了之后,下面就可以开始测试。官方给了一个简单的测试案例,分别是

./skynet examples/config &
和
./3rd/lua/lua ./examples/client.lua

        这样在输入相关的命令后,首先我们会看到这样的打印,

feixiaoxing@raspberrypi:~/Desktop/skynet/skynet-master $ ./skynet examples/config
[:01000002] LAUNCH snlua bootstrap
[:01000003] LAUNCH snlua launcher
[:01000004] LAUNCH snlua cmaster
[:01000004] master listen socket 0.0.0.0:2013
[:01000005] LAUNCH snlua cslave
[:01000005] slave connect to master 127.0.0.1:2013
[:01000004] connect from 127.0.0.1:39068 4
[:01000006] LAUNCH harbor 1 16777221
[:01000004] Harbor 1 (fd=4) report 127.0.0.1:2526
[:01000005] Waiting for 0 harbors
[:01000005] Shakehand ready
[:01000007] LAUNCH snlua datacenterd
[:01000008] LAUNCH snlua service_mgr
[:01000009] LAUNCH snlua main
[:01000009] Server start
[:0100000a] LAUNCH snlua protoloader
[:0100000b] LAUNCH snlua console
[:0100000c] LAUNCH snlua debug_console 8000
[:0100000c] Start debug console at 127.0.0.1:8000
[:0100000d] LAUNCH snlua simpledb
[:0100000e] LAUNCH snlua watchdog
[:0100000f] LAUNCH snlua gate
[:0100000f] Listen on 0.0.0.0:8888
[:01000009] Watchdog listen on 0.0.0.0:8888
[:01000009] KILL self
[:01000002] KILL self

        紧接着,就可以看到这样的打印,

feixiaoxing@raspberrypi:~/Desktop/skynet/skynet-master $ ./3rd/lua/lua ./examples/client.lua
Request:        1
Request:        2
hello
Request:        3

5、开发方式

        整个skynet是一个插件式的开发方式。系统一般会找到so文件,然后通过so文件名,调用对应的create、release、init函数。因为我们一版本不使用lua脚本开发,如果大家喜欢用c/c++开发,可以直接参考service-src下面的内容,当然喜欢lua的朋友也可以用lua。这里面又是以service_logger.c最为简单,

#include "skynet.h"#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <time.h>struct logger {FILE * handle;char * filename;uint32_t starttime;int close;
};struct logger *
logger_create(void) {struct logger * inst = skynet_malloc(sizeof(*inst));inst->handle = NULL;inst->close = 0;inst->filename = NULL;return inst;
}void
logger_release(struct logger * inst) {if (inst->close) {fclose(inst->handle);}skynet_free(inst->filename);skynet_free(inst);
}#define SIZETIMEFMT	250static int
timestring(struct logger *inst, char tmp[SIZETIMEFMT]) {uint64_t now = skynet_now();time_t ti = now/100 + inst->starttime;struct tm info;(void)localtime_r(&ti,&info);strftime(tmp, SIZETIMEFMT, "%d/%m/%y %H:%M:%S", &info);return now % 100;
}static int
logger_cb(struct skynet_context * context, void *ud, int type, int session, uint32_t source, const void * msg, size_t sz) {struct logger * inst = ud;switch (type) {case PTYPE_SYSTEM:if (inst->filename) {inst->handle = freopen(inst->filename, "a", inst->handle);}break;case PTYPE_TEXT:if (inst->filename) {char tmp[SIZETIMEFMT];int csec = timestring(ud, tmp);fprintf(inst->handle, "%s.%02d ", tmp, csec);}fprintf(inst->handle, "[:%08x] ", source);fwrite(msg, sz , 1, inst->handle);fprintf(inst->handle, "\n");fflush(inst->handle);break;}return 0;
}int
logger_init(struct logger * inst, struct skynet_context *ctx, const char * parm) {const char * r = skynet_command(ctx, "STARTTIME", NULL);inst->starttime = strtoul(r, NULL, 10);if (parm) {inst->handle = fopen(parm,"a");if (inst->handle == NULL) {return 1;}inst->filename = skynet_malloc(strlen(parm)+1);strcpy(inst->filename, parm);inst->close = 1;} else {inst->handle = stdout;}if (inst->handle) {skynet_callback(ctx, inst, logger_cb);return 0;}return 1;
}

6、多线程通信

        如果是用skynet实现多线程通信的话,那就是不管是中间信息发送程序,还是对应的节点收发程序,中间都是使用skynet框架来解决的。我们要做的就是实现对应的插件就好了。

        leaf based on skynet ====》dispatcher based on skynet ===> leaf based on skynet

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/4048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git Tag 打标签

参考地址&#xff1a;Git基础 - git tag 一文真正的搞懂git标签的使用-CSDN博客 创建标签 $ git tag -a 标签名称 -m 附注信息 or $ git tag -a 标签名称 提交版本号 -m 附注信息说明&#xff1a; -a : 理解为 annotated 的首字符&#xff0c;表示 附注标签 -m : 指定附注信息…

北斗引路,太阳为源,定位报警,保护渔业,安全护航!

2022年1月&#xff0c;农业农村部发布《“十四五”全国渔业发展规划》明确提出&#xff0c;到2025年&#xff0c;渔业质量效益和竞争力明显增强&#xff0c;渔业基础设施和装备条件明显改善&#xff0c;渔业治理体系和治理能力现代化水平明显提高&#xff0c;实现产业更强、生态…

用Excel做一个功能完备的仓库管理系统

1 基本设计思路 用到的Excel技术&#xff1a;sumif, vlookup, 表格(table)。基本思路&#xff1a;在有基础的商品、仓库等信息的情况下&#xff0c;对商品的每一个操作都有对应的单据&#xff0c;然后再汇总统计。标识&#xff1a;为了在不同的维度统计数量&#xff0c;各单据…

MySQL的主主(Master-Master)生产环境中遇到的常见问题

在MySQL的主主&#xff08;Master-Master&#xff09;生产环境中&#xff0c;由于涉及到数据的双向同步&#xff0c;可能会遇到一系列问题。以下是一些常见的问题及其简要说明&#xff1a; 数据冲突和不一致&#xff1a;由于两个主服务器都在写入数据&#xff0c;当它们几乎同时…

HarmonyOS开发案例:【使用List组件实现设置项】

介绍 在本篇CodeLab中&#xff0c;我们将使用List组件、Toggle组件以及Router接口&#xff0c;实现一个简单的设置页&#xff0c;点击将跳转到对应的详细设置页面。效果图如下&#xff1a; 相关概念 [CustomDialog]&#xff1a;CustomDialog装饰器用于装饰自定义弹窗。[List]…

Linux 权限与软件包管理器 yum

一. 研究Linux默认权限 目录 &#xff0c;起始权限&#xff1a;777 普通文件&#xff0c;起始权限666 Linux系统中存在权限掩码 使用umask指令也可以改变掩码 如果将掩码改为0000 我们可以看到权限发生改变&#xff08;重新设置掩码&#xff09; 最终权限起始权限 去掉 权限…

通过easyExcel实现表格的导入导出

本篇为&#xff0c;通过easyExcel实现 多种数据类型表格 的导入导出 引入2.2.11版本easyExcel依赖 <font color-“byle”>easyExcel版本不同&#xff0c;converter接口中的方法也不相同&#xff0c;一定要注意版本的使用 <dependency><groupId>com.alibaba&…

[华为OD] 给航天器一侧加装长方形或正方形的太阳能板 100

给航天器一侧加装长方形或正方形的太阳能板&#xff08;图中的红色斜线区域&#xff09;&#xff0c;需要先安装两个支 柱&#xff08;图中的黑色竖条&#xff09;&#xff0c;再在支柱的中间部分固定太阳能板。但航天器不同位置的支柱长度 不同&#xff0c;太阳能板的安装面…

【算法基础实验】图论-构建无向图

构建无向图 前提 JAVA实验环境 理论 无向图的数据结构为邻接表数组&#xff0c;每个数组中保存一个Bag抽象数据类型&#xff08;Bag类型需要专门讲解&#xff09; 实验数据 我们的实验数据是13个节点和13条边组成的无向图&#xff0c;由一个txt文件来保存&#xff0c;本…

python——re库

Python的re库是用于处理正则表达式的标准库&#xff0c;正则表达式是一种强大而灵活的文本处理工具&#xff0c;能够帮助你执行复杂的字符串匹配和替换操作。下面是一些基本的API及其使用场景和示例&#xff1a; 1. re.compile(pattern[, flags]) 功能&#xff1a;编译正则表…

架构师系列- JVM(三)- 类加载

通过字节码&#xff0c;我们了解了class文件的结构 通过运行数据区&#xff0c;我们了解了jvm内部的内存划分及结构 接下来&#xff0c;让我们看看&#xff0c;字节码怎么进入jvm的内存空间&#xff0c;各自进入那个空间&#xff0c;以及怎么跑起来。 4.1 加载 4.1.1 概述 …

【目标检测】YOLOv7 网络结构(与 YOLOv4,YOLOv5 对比)

YOLOv7 和 YOLOv4 Neck 与 Head 结构对比 其实 YOLOv7 的网络结构网上很多文章已经讲得很清除了&#xff0c;网络结构图也有非常多的版本可供选择&#xff0c;因为 YOLOv7 和 YOLOv4 是一个团队的作品&#xff0c;所以在网络结构方面&#xff0c; YOLOv7 和 YOLOv4 有很多相似…

用不了ChatGPT?快试试免费又强大的Anthropic Claude

一、Claude 简介 Anthropic 官方&#xff1a; https://www.anthropic.com/product Claude 是最近新开放的一款 AI 聊天机器人&#xff0c;是世界上最大的语言模型之一&#xff0c;比之前的一些模型如 GPT-3 要强大得多&#xff0c;因此 Claude 被认为是 ChatGPT 最有力的竞争…

每天一个数据分析题(二百八十五)——四分位差

四分位差是一组数据的上四分位数与下四分位数之差&#xff0c;下面选项错误的是 A. 四分位差受极端值的影响 B. 四分位差是一个局部指标&#xff0c;衡量了处于50%数据的离散程度 C. 四分位差越大&#xff0c;说明处于中间50%数据越分散 D. 顺序数据适合用四分位差来度量离…

软件开发职业发展:技能掌握、学习策略与市场适应性

软件开发职业发展&#xff1a;技能掌握、学习策略与市场适应性 首先提出一个问题&#xff1a; 现在学的语言什么的&#xff0c;哪个语言更好&#xff0c;或者是后端更主流什么&#xff1f; 编程语言技能与职业发展的关联性 编程语言的通用性 在大型科技公司&#xff0c;如华…

SpringBoot学习之Kafka发送消费消息入门实例(三十五)

使用Kafka之前需要先启动fKafka,如何下载安装启动kafka请先参考本篇文章的前两篇: 《SpringBoot学习之Kafka下载安装和启动【Windows版本】(三十四)》 《SpringBoot学习之Kafka下载安装和启动【Mac版本】(三十三)》 一、POM依赖 1、加入kafka依赖 2、我的整个POM代码…

算法-差分数组

差分数组&#xff1a;适用于对数字列表中某区间元素频繁加减。 原数组nums,根据nums构造一个差分数组diff,diff[i]就是nums[i] 与nums[i - 1]之差。 python: diff[0] nums[0] for i in range(1, len(nums)): diff[i] nums[i] - nums[i - 1] 如&#xff1a;nums[8, 6, 3,…

物联网的基本功能及五大核心技术——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网基本功能 物联网的最基本功能特征是提供“无处不在的连接和在线服务”&#xff0c;其具备十大基本功能。 &#xff08;1&#xff09;在线监测&#xff1a;这是物联网最基本的功能&#xff0c;物联网业务一般以集中监测为主、控制为…

【深度学习】YOLOv5,烟雾和火焰,目标检测,防火检测,森林火焰检测

文章目录 数据收集和数据标注查看标注好的数据的脚本下载yolov5创建 dataset.yaml训练参数开始训练yolov5n训练训练后的权重下载gradio部署 数据收集和数据标注 搜集数据集2w张。 pip install labelme labelme 然后标注矩形框和类别。 下载数据请看这里&#xff1a; https:…

【Docker】Docker的网络与资源控制

Docker网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网关。因为在同一宿主机内…