Dji Mimo APP逆向.1(pocket 2直播模式+物体追踪)

云深之无迹 2021-05-08 00:00

大疆的东西,我真的太喜欢了。。。喜欢到想看看是如何做出来的。

逆向菜鸡,安卓羸弱,反正就是个看热闹的主,大佬们轻点拍~

这个就是将应用退壳的东西

具体是一个梆梆企业版的壳子,我是在真机上面把壳砸了的

大概就是在运行前,需要从壳里面把真正的应用解压出来,然后我们从内存里面把这个dump出来,因为是一个完整的调用链条,然后再组装回来~~~~

https://mydown.yesky.com/pcsoft/413552646.html

当然了,这个东西是可以解压的

算了,本来想展示点别的东西,这个电脑不合适,看源码吧


其实java还好一点,反编译的源码还有点难懂,C#完全就是源码。。。

一个是R文件的解析,在安卓的世界里面各种资源都是要被打包到R文件里面的,所以你看到的是一个这样的反编译的资源文件

我推测,对于一些控制类的操作是用json打包发送的

视频流+控制“流”

Google分析的组件,毕竟作为国际大厂,出海是必然的

二维码的组件,作为一些登录时使用

第二个jar文件,我推测是给poctek 2代的直播流写的模块

你看这个是虎牙直播的组件

 public UUID getUUId() { return this.uuid; }
public boolean isEmpty() { return this.raw.isEmpty(); }

可以点进去仔细的看,这里的包没有混淆

这里是dji的实现,让我稍微看看是什么东西

package com.dji.socialsdkwx.login.wechat;
import android.content.Intent;import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;import com.tencent.mm.opensdk.modelbase.BaseReq;import com.tencent.mm.opensdk.modelbase.BaseResp;import com.tencent.mm.opensdk.openapi.IWXAPI;import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
public class SocialWeChatActivity extends AppCompatActivity implements IWXAPIEventHandler { private IWXAPI api;
/* access modifiers changed from: protected */ public void onCreate(Bundle bundle) { }
/* access modifiers changed from: protected */ public void onNewIntent(Intent intent) { }
public void onReq(BaseReq baseReq) { }
public void onResp(BaseResp baseResp) { }}
import com.tencent.mm.opensdk.modelbase.BaseReq;import com.tencent.mm.opensdk.modelbase.BaseResp;import com.tencent.mm.opensdk.openapi.IWXAPI;import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;

你看这个,其实是微信的登录接口,至于其它的可能要设置语言才可以打开

package com.dji.livestream.livetype;
import android.app.Dialog;import android.content.Intent;import android.os.Handler;import android.os.Looper;import android.view.View;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;

import com.dji.device.util.c;import com.dji.livestream.R;import com.dji.livestream.bean.DJILiveLoadingStage;import com.dji.livestream.bean.b;import com.dji.livestream.livetype.-$;import com.dji.livestream.livetype.a;import com.dji.livestream.page.LiveStreamBaseActivity;import dji.base.ui.thirdparty.permission.CommonPermissionHelper;

import org.greenrobot.eventbus.ThreadMode;import org.greenrobot.eventbus.l;

这里的安卓库分为三类,原生的安卓构件,dji自己的库

以及使用的三方库

EventBus的特性包括:

 简化了组件间的通讯

 分离了事件的发送者和接受者;

 在Activity、Fragment和线程中表现良好;

 避免了复杂的和易错的依赖关系和声明周期问题;

 使得代码更简洁;

 更快;

 更小(约50k的jar包)

 实际上超过1亿的app证明了它的性能;

 有高级属性,例如发布线程、订阅属性等。



可以看到有很多新的软件库在里面,比如全新的储存管理

以及有很多的广播接收器,Facebook,HW

看,HW的推送库

以及全新的安卓库

干哦兄弟!

原生C++

以及FFmpeg的解码库

以及人脸追踪???是用的这种东西吗

 private final String[] PERMISSIONS = {"android.permission.BLUETOOTH", "android.permission.BLUETOOTH_ADMIN", "android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_COARSE_LOCATION"};// permissions={blue,blue_admin,access_file_location,access_coarse_location} private final int REQUEST_CODE_LIVE_SETTINGS = 1011; // request_code_live_settings

这里的代码做了一点识别,可以看到要动态申请的权限是蓝牙的

 private Dialog confirmDialog; private com.dji.device.common.a connectHelper; private View facebookLive; private View facebookSelectedIcon; private Handler handler = new Handler(Looper.getMainLooper()); private View huyaLive; private View huyaSelectedIcon; private View kuaiShouLive; private View kuaiShouSelectedIcon; private CommonPermissionHelper permissionHelper; private CommonPermissionHelper.a permissionRequestData; private a.b presenter; private View rtmpLive; private View rtmpSelectedIcon;

在看这些函数就很有趣了,有连接大疆相机时候的指引,脸书的直播,虎牙的直播,快手的直播,以及支持自定义的RTMP直播

import com.dji.device.connect.bean.c;
package com.dji.network.bean;import com.google.gson.annotations.SerializedName;public class BaseBean extends BaseSerializable { @SerializedName("code") protected int code; @SerializedName("msg") protected String msg;
public int getCode() { return this.code; }
public String getMsg() { return this.msg; }
public void setCode(int i) { this.code = i; }
public void setMsg(String str) { this.msg = str; }}

基本可序列化???

这里是小米的推送包

 public String dataPlatform() { return "XiaoMi Push"; }

OkHttp 是一个高效的 HTTP 客户端,具有非常多的优势:

  1. 能够高效的执行 http,数据加载速度更快,更省流量

  2. 支持 GZIP 压缩,提升速度,节省流量

  3. 缓存响应数据,避免了重复的网络请求

  4. 使用简单,支持同步阻塞调用和带回调的异步调用

Retrofit2简单的说就是一个网络请求的适配器,它将一个基本的Java接口通过动态代理的方式翻译成一个HTTP请求,并通过OkHttp去发送请求。

Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。

https://djigo-hk.djiservice.org

不鸟我

Osmo Shield Domain
package com.dji.pano.osmo.mobile;
import com.dji.pano.osmo.mobile.b;
class b$1 implements b.a { final /* synthetic */ b a;
b$1(b bVar) { this.a = bVar; }
public void a() { }
public void a(int i, String str) { this.a.a(i, str); }
public void a(String str) { }
public void b() { }
public void c() { }}

 implements是一个类实现一个接口用的关键字 ,他是用来实现接口中定义的抽象方法。比如:people是一个接口,他里面有say这个方法。public interface people(){ public say();}但是接口没有方法体。只能通过一个具体的类去实现其中的方法体。比如chinese这个类,就实现了people这个接口。public class chinese implements people{ public say() {System.out.println("你好!");}}


https://github.com/square/wire

 public RootData(Integer num, EncryptionType encryptionType, PlatformType platformType, String str, Integer num2, Integer num3, ByteString byteString, String str2, Integer num4, String str3, ByteString byteString2) { super(a, byteString2); this.version = num; this.encryption = encryptionType; this.platform = platformType; this.app_key = str; this.app_version = num2; this.plaintext_len = num3; this.content = byteString; this.cmd = str2; this.timestamp = num4; this.signature = str3; }

这个是一个协议的实现我没有细研究,直接贴上来

package com.dji.tracking.jnienum;
public enum CameraFace { LTSOT_FRONT_CAMERA(1),    // ltsot_front_camera LTSOT_BEHIND_CAMERA(2); public final int value;
private CameraFace(int i) { this.value = i; }}

这个是关于脸部追踪的代码

package com.dji.tracking.jnienum;
public enum CheckedObjectType { ML_OBJ_OTHER(0, "其他"), ML_OBJ_HEAD_SHOULDER(1, "头肩"), ML_OBJ_PERSON(2, "人"), ML_OBJ_FACE(5, "脸"), ML_OBJ_PET(6, "宠物"), ML_OBJ_GESTURE_PALM(101, "手掌"), ML_OBJ_GESTURE_VICTORY(102, "V型手势"), ML_OBJ_GESTURE_OTHER(103, "其他手势"), ML_OBJ_NONE(-1, "NONE"); public final String tip; public final int value;
private CheckedObjectType(int i, String str) { this.value = i; this.tip = str; }
public static CheckedObjectType a(int i) { CheckedObjectType[] values = values(); for (CheckedObjectType checkedObjectType : values) { if (checkedObjectType.value == i) { return checkedObjectType; } } return ML_OBJ_NONE; }}

物体识别

package com.dji.tracking.jinout;
import androidx.core.util.Pools;
public class TrackingBox { private static Pools.SynchronizedPool<TrackingBox> sPool = new Pools.SynchronizedPool<>(10); public float centerX; public float centerY; public float height; public float width;
public static TrackingBox obtain() { TrackingBox trackingBox = (TrackingBox) sPool.acquire(); return trackingBox != null ? trackingBox : new TrackingBox(); }
public void recycle() { sPool.release(this); }}

绘制一个追踪的盒子

package com.dji.tracking.jnienum;
public enum RotateAngle { ML_ROTATE_0(0), ML_ROTATE_90_CLOCKWISE(1), ML_ROTATE_180(2), ML_ROTATE_90_COUNTERCLOCKWISE(3); public final int value;
private RotateAngle(int i) { this.value = i; }}

旋转的角度

package com.dji.tracking.jnienum;
import androidx.collection.SparseArrayCompat;
public enum TrackingMode { TK_MODE_UNFUSED(-1), TK_MODE_LOST(0), TK_MODE_TRACKED(1), TK_MODE_NOT_CONFIDENT(2), TK_MODE_REDETECTED(3), TK_MODE_GESTURE_STOP(4), TK_MODE_REAL_LOST(5); private static final SparseArrayCompat<TrackingMode> h = new SparseArrayCompat<>(); public final int value;
private TrackingMode(int i2) { this.value = i2; }
public static TrackingMode a(int i2) { TrackingMode trackingMode = (TrackingMode) h.get(i2); if (trackingMode == null) { TrackingMode[] values = values(); int length = values.length; int i3 = 0; while (true) { if (i3 >= length) { break; } TrackingMode trackingMode2 = values[i3]; if (trackingMode2.value == i2) { trackingMode = trackingMode2; break; } i3++; } if (trackingMode == null) { trackingMode = TK_MODE_UNFUSED; } h.put(i2, trackingMode); } return trackingMode; }}

追踪模式

package com.dji.tracking;
import android.os.Build;import com.dji.tracking.a.a;import com.dji.tracking.a.b;
/* access modifiers changed from: package-private */public class g { private static final String[] a = {"HUAWEI ANE", "HONOR STF"};
static f a() { String upperCase = String.format("%s %s", Build.BRAND, Build.MODEL).toUpperCase(); for (String str : a) { if (upperCase.contains(str)) { return new a(); } } return new b(); }}

这个不知道是为什么,单独的说了华为,大写?

最后看看这个,video里面有什么

package com.dji.video.codec;
import android.media.MediaCodec;import com.dji.video.stream.AACFrameDelegate;import com.dji.video.stream.AudioConfigs;import com.dji.video.utils.c;import java.nio.ByteBuffer;import java.util.UUID;
import java.util.UUID;
public class AudioStreamDecoder { private final int a = 0; private final int b = 1; private final int c = 3; private int d = 0; private MediaCodec e; private ByteBuffer[] f; private ByteBuffer[] g; private boolean h; private boolean i = false; private long j = 0; private final int k = 16384; private c l = new c(64, 16384); private byte[] m = new byte[16384]; private a n; private AudioConfigs o; private UUID p; private AACFrameDelegate q; private boolean r = false;
class a extends Thread { private boolean b = false;
a() { }
public void run() { } }

音频解码类

package com.dji.video.codec;
import com.dji.video.codec.MediaCodecDecoder;import com.dji.video.edit.MvModel;import java.util.ArrayList;import java.util.Hashtable;import java.util.List;
public class c { public static List<MediaCodecDecoder.a> a = new ArrayList(); public static Hashtable<String, MediaCodecDecoder.b> b = new Hashtable<>();
public static void a(ArrayList<MvModel> arrayList) { if (arrayList != null) { if (a.size() > 0) { a.clear(); } if (b.size() > 0) { b.clear(); } for (int i = 0; i < arrayList.size(); i++) { MvModel mvModel = arrayList.get(i); if (mvModel.d() == 1) { MediaCodecDecoder.b bVar = new MediaCodecDecoder.b(); String b2 = mvModel.b(); bVar.a = mvModel.e(); bVar.b = mvModel.f(); bVar.d = mvModel.g(); bVar.c = (int) (mvModel.h() + mvModel.c()); if (!b.containsKey(b2)) { b.put(b2, bVar); } else if (b.get(b2).c < bVar.c) { b.put(b2, bVar); } } } } }}

推测这个是视频编辑功能里面的一个子功能

下面的代码有这个库 


 MediaCodec类可用于访问Android底层的多媒体编解码器,例如,编码器/解码器组件。它是Android底层多媒体支持基础架构的一部分(通常与MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface, 以及AudioTrack一起使用)。

import android.media.MediaCodec;import android.media.MediaCodecInfo;import android.media.MediaCodecList;import android.media.MediaExtractor;import android.media.MediaFormat;
package com.dji.video.codec;
import android.media.MediaCodec;import android.media.MediaCodecInfo;import android.media.MediaCodecList;import android.media.MediaExtractor;import android.media.MediaFormat;import android.os.Build;import java.io.File;import java.io.IOException;import java.util.List;import junit.framework.Assert;
public class e { public class a { private c b;
public a(c cVar) { this.b = cVar; }
private void a(int i) throws Exception { }
public void a() throws Exception { } }
public class b { private c b;
public b(c cVar) { this.b = cVar; }
private void a(MediaExtractor mediaExtractor, int i, MediaCodec mediaCodec) throws Exception { }
public void a() throws Exception { } }
public class c { int a = 0; boolean b = false; boolean c = false;
public c() { } }
public class d extends Thread { private a b;
public d(a aVar) { this.b = aVar; }
public void run() { try { this.b.a(); } catch (Exception e) { e.printStackTrace(); } } }
/* renamed from: com.dji.video.codec.e$e reason: collision with other inner class name */ public class C0001e extends Thread { private b b;
public C0001e(b bVar) { this.b = bVar; }
public void run() { try { this.b.a(); } catch (Exception e) { e.printStackTrace(); } } }
public e() { this.b = null; this.c = null; this.l = 1280; this.m = 720; this.n = this.l; this.o = this.m; this.p = this.l; this.q = this.m; this.r = 0; this.s = 0; this.t = 0; this.u = 0; this.v = 0; this.w = 0; this.x = 0; this.y = 0; this.z = "video/avc"; this.A = 6000000; this.B = 6000000; this.C = 25; this.D = 25; this.E = -1; this.I = false; this.J = false; this.O = 0; this.P = false; this.X = false; this.b = e(); this.c = f(); }
static /* synthetic */ int J(e eVar) { int i2 = eVar.O; eVar.O = i2 + 1; return i2; }
static /* synthetic */ int L(e eVar) { int i2 = eVar.T; eVar.T = i2 + 1; return i2; }
/* access modifiers changed from: private */ public int a(MediaExtractor mediaExtractor) { return 0; }
/* access modifiers changed from: private */ public void a(byte[] bArr, byte[] bArr2, int i2, int i3, int i4, int i5) { }
private static boolean a(int i2) { if (!(i2 == 39 || i2 == 2130706688)) { switch (i2) { case 19: case 20: case 21: break; default: return false; } } return true; }
/* access modifiers changed from: private */ public static int b(MediaCodecInfo mediaCodecInfo, String str) { MediaCodecInfo.CodecCapabilities capabilitiesForType = mediaCodecInfo.getCapabilitiesForType(str); for (int i2 = 0; i2 < capabilitiesForType.colorFormats.length; i2++) { int i3 = capabilitiesForType.colorFormats[i2]; if (a(i3)) { return i3; } } Assert.fail("找不到适合的颜色格式 " + mediaCodecInfo.getName() + " / " + str); return 0; }
/* access modifiers changed from: private */ public static MediaCodecInfo b(String str) { String[] supportedTypes; int codecCount = MediaCodecList.getCodecCount(); for (int i2 = 0; i2 < codecCount; i2++) { MediaCodecInfo codecInfoAt = MediaCodecList.getCodecInfoAt(i2); if (codecInfoAt.isEncoder()) { for (String str2 : codecInfoAt.getSupportedTypes()) { if (str2.equalsIgnoreCase(str)) { return codecInfoAt; } } continue; } } return null; }
private static boolean b(int i2) { if (!(i2 == 39 || i2 == 2130706688)) { switch (i2) { case 19: case 20: return false; case 21: break; default: throw new RuntimeException("unknown format " + i2); } } return true; }
/* access modifiers changed from: private */ public void c(String str) { }
private void d() throws IOException { }
private String e() { return Build.MODEL; }
private String f() { return Build.VERSION.RELEASE; }
static /* synthetic */ int x(e eVar) { int i2 = eVar.M; eVar.M = i2 + 1; return i2; }
public void a() { }
public void a(long j2, long j3, int i2) { }
public void a(long j2, long j3, String str, String str2, String str3, int i2) { }
public void a(b bVar) { this.Y = bVar; }
public void b() { }
public void c() { }}

这段代码,emmm,啥也看不出出来了,只能猜了

https://www.android-doc.com/reference/android/media/MediaCodecInfo.CodecCapabilities.html
 public static int b(MediaCodecInfo mediaCodecInfo, String str) { MediaCodecInfo.CodecCapabilities capabilitiesForType = mediaCodecInfo.getCapabilitiesForType(str); for (int i2 = 0; i2 < capabilitiesForType.colorFormats.length; i2++) { int i3 = capabilitiesForType.colorFormats[i2]; if (a(i3)) { return i3; } } Assert.fail("找不到适合的颜色格式 " + mediaCodecInfo.getName() + " / " + str); return 0; }

看这个函数,传入一个编码函数,和一个strings

然后就是一个遍历在匹配一个什么东西?应该是颜色的格式

package com.dji.video.codec;
import android.graphics.BitmapFactory;
public class ImageDecoder { private int a; private int b;
public static int[] get_image_paras(String str) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(str, options); return new int[]{options.outWidth, options.outHeight, 0, 0}; }
public int get_height() { return this.b; }
public int[] get_image_data(String str) { return null; }
public void get_image_para(String str) { }
public int get_width() { return this.a; }}

这个函数简单,见名知其义

package com.dji.video.codec;
import java.util.HashMap;import wseemann.media.FFmpegMediaMetadataRetriever;
public class VideoDescription { private static final String a = "VideoDescription"; private String b; private HashMap<String, String> c;
private void a(FFmpegMediaMetadataRetriever.a aVar, String str) { }
private native void nativeGetDescription(String str, HashMap<String, String> hashMap);
public void a(String str) { }
public String b(String str) { return null; }}

这个函数是读取一个视频的info


就先到这里~下期再见

评论
  • 一、引言无人机,作为近年来迅速崛起的新兴技术产物,正以前所未有的速度改变着众多行业的运作模式,从民用领域的航拍、物流,到工业领域的测绘、巡检,再到军事领域的侦察、打击等,无人机的身影无处不在。为了深入了解无人机的现状,本次调研综合了市场数据、行业报告、用户反馈等多方面信息,全面剖析无人机的发展态势。二、市场规模与增长趋势随着技术的不断进步和成本的逐渐降低,无人机市场呈现出爆发式增长。近年来,全球无人机市场规模持续扩大,预计在未来几年内仍将保持较高的增长率。从应用领域来看,消费级无人机市场依然占据
    Jeffreyzhang123 2024-12-27 17:29 95浏览
  • 在科技飞速发展的今天,医疗电子作为一个融合了医学与电子技术的交叉领域,正以前所未有的速度改变着我们的医疗模式和健康生活。它宛如一颗璀璨的明珠,在医疗领域绽放出耀眼的光芒,为人类的健康福祉带来了诸多惊喜与变革。医疗电子的神奇应用医疗电子的应用范围极为广泛,深入到医疗的各个环节。在诊断方面,各种先进的医学成像设备堪称医生的 “火眼金睛”。X 光、CT、MRI 等成像技术,能够清晰地呈现人体内部的结构和病变情况,帮助医生准确地发现疾病。以 CT 为例,它通过对人体进行断层扫描,能够提供比传统 X 光更
    Jeffreyzhang123 2024-12-27 15:46 78浏览
  • 在当今这个数字化的时代,电子设备无处不在,从我们手中的智能手机、随身携带的笔记本电脑,到复杂的工业控制系统、先进的医疗设备,它们的正常运行都离不开一个关键的 “幕后英雄”—— 印刷电路板(Printed Circuit Board,简称 PCB)。PCB 作为电子设备中不可或缺的重要部件,默默地承载着电子元件之间的连接与信号传输,是整个电子世界的基石。揭开 PCB 的神秘面纱PCB,简单来说,就是一块由绝缘材料制成的板子,上面通过印刷、蚀刻等工艺形成了导电线路和焊盘,用于固定和连接各种电子元件。
    Jeffreyzhang123 2024-12-27 17:21 68浏览
  • 在科技飞速发展的今天,汽车不再仅仅是一种交通工具,更是一个融合了先进技术的移动智能空间。汽车电子作为汽车产业与电子技术深度融合的产物,正以前所未有的速度推动着汽车行业的变革,为我们带来更加智能、安全、舒适的出行体验。汽车电子的发展历程汽车电子的发展可以追溯到上世纪中叶。早期,汽车电子主要应用于发动机点火系统和简单的电子仪表,功能相对单一。随着半导体技术的不断进步,集成电路被广泛应用于汽车领域,使得汽车电子系统的性能得到了显著提升。从电子燃油喷射系统到防抱死制动系统(ABS),从安全气囊到车载导航
    Jeffreyzhang123 2024-12-27 11:53 92浏览
  • 起源与基础20 世纪 60 年代:可编程逻辑设备(PLD)的概念出现,一种被称为 “重构能力” 的芯片的可编程性吸引了许多工程师和学者。20 世纪 70 年代:最早的可编程逻辑器件 PLD 诞生,其输出结构是可编程的逻辑宏单元,它的硬件结构设计可由软件完成,设计比纯硬件的数字电路更灵活,但结构简单,只能实现小规模电路。诞生与发展20 世纪 80 年代中期:为弥补 PLD 只能设计小规模电路的缺陷,复杂可编程逻辑器件 CPLD 被推出,它具有更复杂的结构,能够实现较大规模的电路设计。1988 年:
    Jeffreyzhang123 2024-12-27 10:41 68浏览
  • 采购与分销是企业运营中至关重要的环节,直接影响到企业的成本控制、客户满意度和市场竞争力。以下从多个方面介绍如何优化采购与分销:采购环节优化供应商管理供应商评估与选择:建立一套全面、科学的供应商评估体系,除了考虑价格因素,还要综合评估供应商的产品质量、交货期、信誉、研发能力、售后服务等。通过多维度评估,选择那些能够提供优质产品和服务,且与企业战略目标相契合的供应商。建立长期合作关系:与优质供应商建立长期稳定的合作关系,这种合作模式可以带来诸多好处。双方可以在信任的基础上进行深度沟通与协作,共同开展
    Jeffreyzhang123 2024-12-27 17:43 73浏览
  • 发明阶段(20世纪80年代至90年代)起源:当时ASIC设计成本高,周期长,流片失败率高,业界需要一种通用的半导体器件进行流片前测试和验证,可编程逻辑器件就此产生。诞生:1980年,Xilinx公司成立。1985年,Ross Freeman制造了第一片PFGA芯片XC2064,采用4输入,1输出的LUT和FF结合的基本逻辑单元。发展阶段(1992年至1999年)容量提升:FPGA容量不断上涨,芯片面积逐渐增大,为架构穿心提供空间,复杂功能可以实现。布线问题凸显:缩着芯片复杂度增加,片上资源的互连
    Jeffreyzhang123 2024-12-27 10:26 87浏览
  • 在当今科技飞速发展的时代,工业电子作为现代制造业的中流砥柱,正以前所未有的速度推动着各个行业的变革与进步。从汽车制造到航空航天,从智能家居到工业自动化,工业电子的身影无处不在,为我们的生活和生产带来了巨大的改变。工业电子的崛起与发展工业电子的发展历程可谓是一部波澜壮阔的科技进化史。追溯到上世纪中叶,电子技术开始逐渐应用于工业领域,最初主要是简单的电子控制装置,用于提高生产过程的自动化程度。随着半导体技术、计算机技术和通信技术的不断突破,工业电子迎来了爆发式的增长。集成电路的发明使得电子设备的体积
    Jeffreyzhang123 2024-12-27 15:40 88浏览
  • 一、前言 回首2024,对于我而言,是充满挑战与收获的一年。在这一年里,我积极参与了论坛的众多活动,不仅拓宽了我的认知边界(有些东西不是你做不到,而是你想不到),还让我在实践中收获了宝贵的经验和。同时,多种多样的论坛活动让我们全方面的接受新东西,连接新知识,多种类型的的活动交织了你我的2024。在这里说一说对过去一年的活动经历,进行一次年终总结,并谈谈我的收获和感受,以及对2025年的展望。二、活动足迹(一)快速体验:机智云Gokit2.0开发板初体验 机智云Gokit2.0开发板的体验活动让大
    无言的朝圣 2024-12-27 14:50 58浏览
  • 在当今竞争激烈的商业世界中,供应链管理已成为企业生存与发展的核心竞争力之一。它就像一条无形的纽带,将供应商、制造商、分销商、零售商直至最终消费者紧密相连,确保产品和服务能够高效、顺畅地流转。今天,就让我们一同深入探索供应链管理的奥秘。供应链管理是什么简单来说,供应链管理是对从原材料采购、生产制造、产品配送直至销售给最终用户这一整个过程中,涉及的物流、信息流和资金流进行计划、协调、控制和优化的管理活动。它不仅仅是对各个环节的简单串联,更是一种通过整合资源、优化流程,实现整体效益最大化的管理理念和方
    Jeffreyzhang123 2024-12-27 17:27 85浏览
  • 在当今这个科技飞速发展的时代,物联网(IoT)已经不再是一个陌生的概念,它正以一种前所未有的速度改变着我们的生活和工作方式,像一股无形的力量,将世界紧密地连接在一起,引领我们步入一个全新的智能时代。物联网是什么简单来说,物联网就是通过感知设备、网络传输、数据处理等技术手段,实现物与物、人与物之间的互联互通和智能化管理。想象一下,你的家里所有的电器都能 “听懂” 你的指令,根据你的习惯自动调节;工厂里的设备能够实时监测自身状态,提前预警故障;城市的交通系统可以根据实时路况自动优化信号灯,减少拥堵…
    Jeffreyzhang123 2024-12-27 17:18 68浏览
  • 引言工程师作为推动科技进步和社会发展的核心力量,在各个领域发挥着关键作用。为深入了解工程师的职场现状,本次调研涵盖了不同行业、不同经验水平的工程师群体,通过问卷调查、访谈等方式,收集了大量一手数据,旨在全面呈现工程师的职场生态。1. 工程师群体基本信息行业分布:调研结果显示,工程师群体广泛分布于多个行业,其中制造业占比最高,达到 90%,其次是信息技术、电子通信、能源等行业。不同行业的工程师在工作内容、技术要求和职业发展路径上存在一定差异。年龄与经验:工程师群体以中青年为主,30 - 45 岁年
    Jeffreyzhang123 2024-12-27 17:39 84浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦