Java
Java在嵌入式系统的应用
六个九十度
嵌入式软件工程师
展开
-
一种Java编解码复杂JSON对象的简便方法
背景前后台交换消息的格式选择JSON时,根据消息的复杂度,JSON数据的复杂度也高低不一。简单的JSON可以直接用官方json库编解码,例如{ "type": "response", // package类型 "command": "/api/move", // 源指令 "error_message": "", // 错误消息 "status": "OK", // 执行结果 "uuid": "123456" /原创 2020-07-31 16:22:53 · 373 阅读 · 0 评论 -
一种基于MQTT的请求/响应模型
MQTT简介MQTT是一个基于TCP/IP的传输层协议,抽象出发布订阅机制,便于应用程序解耦业务和扩展功能。该协议常见于工业自动化、物联网、SCADA系统等场景。MQTT不适合机器人我最近在做巡检机器人,当初跟后台的同事讨论用什么协议时,选择了MQTT,因为:后台能主动向机器人发消息(反例,HTTP只能靠机器人轮询)协议相对轻量,单片机也能跑起来(反例,websocket较为重量)基于话题的pub sub机制,便于消息的解耦和扩展(反例,raw socket缺少话题机制)能穿透NAT,不用原创 2020-07-18 11:34:32 · 5062 阅读 · 4 评论 -
多模块maven工程,Spring模块和非Spring模块如何共存?
背景之前做的一个巡检机器人项目,硬件分3大块,如图树莓派通过USB网卡直连到底盘,树莓派和工业相机通过8口交换机实现互联。机器人干的事就是在变电站自主导航,到预定点位后拍照,最后将照片上传到FTP服务器,供后台图像算法识别分析。软件运行在树莓派上,采用Java开发,划分成3个模块,分别是底盘控制系统相机控制系统web交互系统3个模块之间通过线程消息队列通信,这样既有高性能又有低耦合。项目一开始我的规划是我只完成前2个,web交互系统交由专门做后台的同事,我将前2个打成jar包后交给他原创 2020-07-14 18:38:50 · 510 阅读 · 1 评论 -
JNA进阶应用,自定义native类型
背景经常有一些native库,会自定义一些在不同平台上 长度不同的基本类型,例如我之前遇到的8字节的enum问题,它就仅在Linux平台出现,windows平台就是4字节,这种时候JNA默认给枚举分配的4字节已经不合适了,就需要定义TypeMapper或TypeConverter来指导JNA根据平台读写相应长度的内存...原创 2020-05-23 23:21:16 · 873 阅读 · 0 评论 -
发现海康机器人工业相机SDK的两个BUG,顺便发布我的Java封装
背景我司最近有款轮式巡检机器人用到了海康机器人的工业相机MV-CA060-10GC,我们的开发平台是树莓派(运行Ubuntu Server 1804),开发语言是Java,但该相机没有Java SDK,于是我决定自己开发一个。好消息是海康机器人提供了C语言的SDK,这样我就能通过JNA直接调用,而不必写一行C代码。问题的提出开发过程中发现,有2个API在Windows下正常运行,在树莓派下却总是报错误的参数,错误码80000004第一个API负责获取原始图像,第二个负责将原始图像压缩编码成jpg原创 2020-05-10 18:36:33 · 3589 阅读 · 12 评论 -
JNA进阶应用,注册回调
回调通常用仅含一个方法的接口表示假如有个C语言接口的SDK函数,用于注册帧回调,当相机拍摄到一帧照片时,SDK调用用户注册的回调函数对这块图像帧进行处理(一般就是将其压缩编码成jpg码流)。它的声明长这样MV_CAMCTRL_API int __stdcall MV_CC_RegisterImageCallBackEx(void* handle, void(__stdcall* cbOut原创 2020-05-09 16:58:14 · 642 阅读 · 0 评论 -
树莓派上enum的size一会为4一会为8,咋回事?
最近在尝试用树莓派控制海康机器人的相机,采用JAVA技术栈,发现相同的SDK接口函数int MV_CC_SaveImageEx2( IN void* handle, MV_SAVE_IMAGE_PARAM_EX *pSaveParam);,用JNI调用OK,用JNA调用就经过几天艰苦的定位,推测是因为MV_SAVE_IMAGE_PARAM_EX里的MvGvspPixelType枚举字段为8字节而JNA分配的native内存为4字节,从而引发问题。为什么树莓派这么个armv71平原创 2020-05-08 19:35:23 · 299 阅读 · 0 评论 -
JNA进阶应用,访问Union
Java想访问C代码编译的动态库,一般通过JNA方式实现,该方式好处是不用像JNI方式那样编写C wrapper代码,省去在Java工程里管理C代码的麻烦,但类型转换的坑却变多了。最近在调试一款工业相机,它的主机接口有USB、GIGE、CameraLink等,SDK在枚举设备时会返回一个相机列表,每个表项都是一个相机,其类型按主机接口分类可能是上述3种任意一种,所以SDK一般都用联合体(Unio...原创 2020-05-05 22:09:47 · 1144 阅读 · 10 评论 -
正确使用Java的foreach语句
foreach主要用于对obj list进行遍历,是for语句和Iterator机制的语法糖所以不要用于 原生数据类型(int、boolean等)构成的数组 进行遍历: 最终的结果是原数组不受任何影响,且不报错!贴代码演示:class Foreach{ public int v; public static void main(String args[原创 2016-04-21 10:04:24 · 2452 阅读 · 0 评论 -
感悟:Java的多线程跟Java的类系统之间的关系
一直对Java将线程封装成对象的技术不甚了了,昨天帮一个新员工定位rosjava使用问题,一开始以为是多线程问题,但多番尝试未果后,走查代码,发现他在onClick函数里new CustomRosNode并赋给nodeHandler引用,导致nodeHandler最早绑定的对象被GC,问题是CustomRosNode的构造函数并不能构建出一个全功能的node,还需要后续的初始化,但他在onClic原创 2016-03-31 11:17:12 · 1673 阅读 · 0 评论 -
Java的generics跟C++的template有何区别?
讨论来自stackoverflow详细解释大家看原文,只翻译结论Java代码里出现的尖括弧看上去很像C++的template,但其实正式名字叫generics,它不像C++模板(一个加强版的C宏预处理器),而是一个避免 强制类型转换 的语法糖举个例子public class PhoneNumbers { private Map phoneNumbers = new Hash翻译 2016-03-10 10:48:52 · 911 阅读 · 0 评论 -
回调函数的面向对象改造
熟悉C编程的朋友对回调函数一定不陌生,它一般用于一个模块将自己的阶段性输出传递给另一个模块,由另一个模块进行更细致的处理。整个处理过程,就像一条河流,从源头出发,到了某个点分出若干支流,支流又分出若干支流,每一段都会被人所用在面向对象系统里,我们怎么对这个基于回调函数的处理过程进行描述?我想用一个概念来描述,叫信息流的上下游,信息流上的每个节点都有一个上游,若干个下游,上游可以原创 2015-12-14 18:00:39 · 1616 阅读 · 0 评论