上位机图像处理和嵌入式模块部署(树莓派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,一经查实,立即删除!

相关文章

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

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

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

1 基本设计思路 用到的Excel技术&#xff1a;sumif, vlookup, 表格(table)。基本思路&#xff1a;在有基础的商品、仓库等信息的情况下&#xff0c;对商品的每一个操作都有对应的单据&#xff0c;然后再汇总统计。标识&#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; 最终权限起始权限 去掉 权限…

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

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

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

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

架构师系列- 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 最有力的竞争…

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网桥是每个容器的默认网关。因为在同一宿主机内…

01数学建模 -线性规划

1.1线性规划–介绍 翻译翻译什么叫惊喜 1.2线性规划–原理 拉格朗日乘数法手算 最值化 f ( x , y ) , s . t . g ( x , y ) c , 引入参数 λ &#xff0c;有&#xff1a; F ( x , y , λ ) f ( x , y ) λ ( g ( x , y ) − c ) 再将其分别对 x , y , λ 求导&#xff0c…

K8s 使用 Ceph RBD 作为后端存储(静态供给、动态供给)

一、K8s 使用 Ceph RBD Ceph RBD&#xff08;Rados Block Device&#xff09;是 Ceph 存储集群中的一个重要组件&#xff0c;它提供了块级别的存储访问。RBD 允许用户创建虚拟块设备&#xff0c;并将其映射到客户端系统中&#xff0c;就像本地磁盘一样使用。 首先所有 k8s 节…

The C programming language (second edition,KR) exercise(CHAPTER 4)

E x c e r c i s e 4 − 1 Excercise\quad 4-1 Excercise4−1&#xff1a; #include <stdlib.h> #include <stdio.h> #include <string.h> int strindex(char s[],char t[]); int strrindex(char s[],char t[]);int main(void) {char s[100]"qwoulddf…

【iOS】类与对象底层探索

文章目录 前言一、编译源码二、探索对象本质三、objc_setProperty 源码探索四、类 & 类结构分析isa指针是什么类的分析元类元类的说明 五、著名的isa走位 & 继承关系图六、objc_class & objc_objectobjc_class结构superClassbitsclass_rw_tclass_ro_tro与rw的区别c…

在Elasticsearch 7.9.2中安装IK分词器并进行自定义词典配置

Elasticsearch是一个强大的开源搜索引擎&#xff0c;而IK分词器是针对中文文本分析的重要插件。本文将引导您完成在Elasticsearch 7.9.2版本中安装IK分词器、配置自定义词典以及验证分词效果的全过程。 步骤一&#xff1a;下载IK分词器 访问IK分词器的GitHub发布页面&#xf…

游戏发行困境及OgGame云游戏解决方案简述

随着全球化浪潮的持续推进&#xff0c;中国游戏开发者们不再满足于国内市场的发展&#xff0c;而是开始将目光投向更为广阔的海外市场。这一趋势的崛起背后&#xff0c;是中国企业意识到国际化是其发展的必由之路&#xff0c;也是游戏行业突破国内困境的体现。本文将简要阐述游…