首页 文章 精选 留言 我的

精选列表

搜索[多点触控],共10001篇文章
优秀的个人博客,低调大师

应用多点开花,AI 大模型从“炫技”走向“实干”

京东宣布旗下言犀大模型品牌全新升级为JoyAI,并推出行业首个100%开源的企业级智能体JoyAgent;由钉钉AI平台训练的垂类妇科大模型通过主任医师考试;网易灵动发布行业首个工程机械具身智能模型“灵掘”……近期,国产大模型频频“上新”,并不断刷新应用“进度条”。 而在近日举行的2025世界人工智能大会(WAIC)期间,AI大模型也是格外引人关注。 在物流领域,仓内无人机、无人车等智能物流设施惊艳亮相;工业场景中,AR眼镜可以辅助产业工人精准质检并推荐维修方案;零售体验台前,系统可以自动个性化推荐商品、瞬间生成海量商品广告素材……位于上海世博展览馆一号馆的京东展区内,展示了全新升级的JoyAI大模型深度应用的诸多场景。与此同时,京东云还正式开源JoyAgent智能体。作为行业首个100%开源的企业级智能体,JoyAgent依托多智能体协同引擎实现高效协作,并融合大小模型优势,打通AI落地“最后一公里”。 今年以来,国内大模型迭代速度提升,加快赋能千行百业。其中,不少企业着力打造垂类大模型,推动大模型快速走向“实干”。 日前,壹生检康(杭州)生命科技有限公司研发的“豆蔻妇科大模型”成功通过国家妇产科卫生高级职称(正高)笔试考试。钉钉CTO朱鸿介绍,豆蔻妇科大模型是钉钉AI平台上诞生的第一个专业垂类大模型,双方团队只经过短短一个多月的协作,就将模型准确率提升到了90.2%。 “通过正高职称考试,意味着该模型已具备主任级医师的专业判断力。”壹生检康创始人王强宇表示,大模型的核心价值在于,为女性用户提供居家自诊断支持,实现“术前分流”与“院外健康管理”;针对无需就诊的情况提供科普指导与生活建议;为医疗、医美等行业机构提供专业支撑,同时可通过机构的数据训练专科模型,提升医疗效率。 “这一突破为AI在妇产科临床决策辅助、循证医学研究、患者健康教育、医学生学习考试等场景的深度应用开辟了新路径。”浙江大学医学院附属妇产科医院妇科周博士表示。 据悉,随着技术的不断完善和推广,豆蔻妇科大模型不仅有望在更多医疗场景中发挥重要作用,还将进一步优化医疗资源配置。 在工业领域,垂类模型也有不少突破性进展。WAIC期间,网易旗下工程机械智能化品牌网易灵动推出全球首个专为露天矿山挖掘机装车场景打造的具身智能模型——“灵掘”。在网易灵动展位,观众通过智能座舱可以实时体验内蒙古矿山的无人挖掘机自动装车功能。 在内蒙古霍林河北露天煤矿的严苛环境中,“灵掘”单机装车效率已达人工的80%,近70%的作业时间无需人为干预,成功适配极寒、高粉尘等严苛环境与多型号矿卡。“这项技术让AI成为矿山的‘铁臂战友’,装车3精度和连续性远超预期,为行业安全与效率提升开辟了新路径。”内蒙古某露天煤矿代表在实测后评价道。 据了解,网易灵动将首次开源“灵掘”数据集,并向全行业发起“2027产业协同计划”。该计划将联合徐工、三一、山河智能等主机厂及各露天煤矿企业,通过技术共享平台推动联合研发、场景共创与标准制定。作为“灵掘”技术基石的端到端训练框架——“机械智心”,已支撑“灵掘”在矿山场景的成功实践,并快速向港口清舱、混凝土拌合站、地销煤等十余个场景迁移,未来将延伸至农业、智能制造等领域。 数据显示,中国目前已发布1509个大模型,在全球已发布的3755个大模型中数量位居首位。业内指出,AI大模型正从“炫技”走向“实干”,2025年成为大模型应用全面落地的关键转折点。这场由技术驱动、场景牵引的深度应用革命,正在重塑千行百业的生产力图谱。

优秀的个人博客,低调大师

一触即发App启动优化最佳实践

文中的很多图都是Google性能优化指南第六季中的一些截图 Google给出的优化指南来镇楼 https://developer.android.com... 闪屏定义 Android官方的性能优化典范,从第六季开始,发起了一系列针对App启动的优化实践,地址如下: https://www.youtube.com/watch... 可想而知,App的启动性能是非常重要的。同时,Google针对App闪屏,也给出了非常详细的设计定义,如下所示。 https://material.google.com/p... 其实最早的时候,闪屏是用来在App未完全启动的时候,让用户不至于困惑App是否启动而加入的一个设计。而现在的很多App,基本上都把闪屏当做一个广告、宣传的页面了,貌似已经失去了原本的意义,但闪屏,不管怎么说,在一个App启动的时候,都是非常重要的,设计的事情,交给UE吧,开发要做的,就是让App的启动体验,做到最好。 App启动流程 App启动的整个过程,可以分解成下面几个过程: 用户在Launcher上点击App Icon 系统为App创建进程,显示启动窗口 App在进程中创建自己的组件 这个过程可以用下面这幅图来描述: 而我们能够优化的,也就是下面Application的创建部分,系统的进程分配以及一些窗口切换的动画效果等,都是跟ROM相关的,我们无法处理。所以,我们需要把重点放到Application的创建过程。 上面是官方的说明,下面我们用更加通俗的语言来解释一遍。 当用户点击桌面icon的时候,系统准备好了,给App分配进程空间,就好像去酒店开房,但是你又不能直接进入房间,你得坐电梯去房间,那么你坐电梯的这个时间,实际上就是系统的准备时间,那么系统的这个准备时间一般来说不会太长,但假如的开的是一个总统套房呢,系统就得花不少时间来打理,所以系统给所有用户都准备了一个过渡界面,这个界面,就是启动时的黑屏白屏,也就是你坐电梯里面看的小广告,看完小广告,你就到房间了,然后你想干嘛都可以了,这个想干嘛的速度,就完全取决于你开门的速度了,你门开得快,自然那啥快,所以这里是开发者可以优化的地方,有些开发者掏个钥匙要好几秒,有的只要几百毫秒,完全影响了后面那啥的效率。 那么一般来说,故事到这里就结束了,但是,系统,也就是这个酒店,并不是一个野鸡酒店,他也想尽量做得让顾客满意,这样才会有回头客啊,所以,酒店做了一个优化,可以让每个顾客自己定义在坐电梯的时候想看什么!也就是说,系统在加载App的时候,首先是加载了资源文件,这里就包括了要启动的Activity的Theme,而这个Theme呢,是可以自定义的,也就是顾客在坐电梯时想看的东西,而不是千篇一律的白屏或者黑屏,他可以定制很多东西,例如ActionBar、背景、StatBar等等。 启动时间的测量 关于Activity启动时间的定义 对于Activity来说,启动时,首先执行的是onCreate()、onStart()、onResume()这些生命周期函数,但即使这些生命周期方法回调结束了,应用也不算已经完全启动,还需要等View树全部构建完毕,一般认为,setContentView中的View全部显示结束了,算作是应用完全启动了。 Display Time 从API19之后,Android在系统Log中增加了Display的Log信息,通过过滤ActivityManager以及Display这两个关键字,可以找到系统中的这个Log: $adblogcat|grep“ActivityManager” ActivityManager: Displayed com.example.launcher/.LauncherActivity: +999ms 抓到的Log如图所示: 那么这个时间,实际上是Activity启动,到Layout全部显示的过程,但是要注意,这里并不包括数据的加载,因为很多App在加载时会使用懒加载模式,即数据拉取后,再刷新默认的UI。 reportFullyDrawn 前面说了,系统日志中的Display Time只是布局的显示时间,并不包括一些数据的懒加载等消耗的时间,所以,系统给我们定义了一个类似的『自定义上报时间』——reportFullyDrawn。 同样是借用Google的一张图来说明: reportFullyDrawn是由我们自己调用的,一般在数据全部加载完毕后,手动调用,这样就会在Log中增加一条日志: $adblogcat|grep“ActivityManager” ActivityManager:Displayedcom.example.launcher/.LauncherActivity:+999ms ActivityManager:Fullydrawncom.example.launcher/.LauncherActivity:+1s999ms 一般来说,使用的场景如下: publicclassMainActivityextendsAppCompatActivityimplementsLoaderManager.LoaderCallbacks<Void>{ @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override publicvoidonLoadFinished(Loader<Void>loader,Voiddata){ //加载数据 //…… //上报reportFullyDrawn reportFullyDrawn(); } @Override publicLoader<Void>onCreateLoader(intid,Bundleargs){ returnnull; } @Override publicvoidonLoaderReset(Loader<Void>loader){ } } 但是要注意,这个方式需要API19+,所以,这里需要对SDK版本进行判断。 计算启动时间——ADB 通过ADB命令可以统计应用的启动时间,指令如下所示: ~adbshellamstart-Wcom.xys.preferencetest/.MainActivity Starting:Intent{act=android.intent.action.MAINcat=[android.intent.category.LAUNCHER]cmp=com.xys.preferencetest/.MainActivity} Status:ok Activity:com.xys.preferencetest/.MainActivity ThisTime:1047 TotalTime:1047 WaitTime:1059 Complete 该指令一共给出了三个时间: ThisTime:最后一个启动的Activity的启动耗时 TotalTime:自己的所有Activity的启动耗时 WaitTime: ActivityManagerService启动App的Activity时的总时间(包括当前Activity的onPause()和自己Activity的启动) 这三个时间不是很好理解,我们可以把整个过程分解 1.上一个Activity的onPause()——2.系统调用AMS耗时——3.第一个Activity(也许是闪屏页)启动耗时——4.第一个Activity的onPause()耗时——5.第二个Activity启动耗时 那么,ThisTime表示5(最后一个Activity的启动耗时)。TotalTime表示3.4.5总共的耗时(如果启动时只有一个Activity,那么ThisTime与TotalTime应该是一样的)。WaitTime则表示所有的操作耗时,即1.2.3.4.5所有的耗时。 每次给出的时间可能并不一样,而且应用从首次安装启动到后面每次正常启动,时间都会不同,区别于系统是否要分配进程空间。 计算启动时间——Screen Record 通过录屏进行启动的分析,是一个很好的办法,在API21+,Android给我们提供了一个更加方便、准确的方式: ~adbshellscreenrecord--bugreport/sdcard/test.mp4 Android在screenrecord中新增了一个参数——bugreport,那么加了这个参数之后,录制出来的视频,在左上角就会增加一行数字的显示,如图所示。 在视频开始前,会显示设备信息和一些参数: 视频开始后,左上角会有一行数字: 例如图中的:15:31:22.261 f=171(0) 其中,前面的4个数字,就是时间戳,即15点31分22秒261,f=后面的数字是当前的帧数,注意,不是帧率,而是代表当前是第几帧,括号中的数字,代表的是『Dropped framescount』,即掉帧数。 有了这个东西,再结合视频就可以非常清楚的看见这些信息了。 启动时间的调试 模拟启动延时 在测试的时候,我们可以通过下面的方式来进行启动的延迟模拟: SystemClock.sleep(2000) 或者直接通过: try{ Thread.sleep(2000); }catch(InterruptedExceptione){ e.printStackTrace(); } 或者通过: newHandler().postDelayed(newRunnable(){ @Override publicvoidrun(){ //Delay } },2000); 这些方案都可以进行启动延迟的模拟。 强制冷启动 在『开发者选项』中的Background Process Limit中设置为No Background Processes 优化点 Static Block 很多代码中的Static Block,都是做一些初始化工作,特别是ContentProvider中在Static Block中初始化一些UriMatcher,这些东西可以做成懒加载模式。 Application Application是程序的主入口,特别是很多第三方SDK都会需要在Application的onCreate里面做很多初始化操作,不得不说,各种第三方SDK,都特别喜欢这个『兵家必争之地』,再加上自己的一些库的初始化,会让整个Application不堪重负。 优化的方法,无非是通过以下几个方面: 延迟初始化 后台任务 界面预加载 阻塞 阻塞有很多种情况,例如磁盘IO阻塞(读写文件、SharedPerfences)、网络阻塞(现在应该不会了)以及高CPU占用的代码(加解密、渲染、解析等等)。 View层级 见《Android群英传》 耗时方法 通过使用TraceView && Systrace && Method Tracing工具来进行排查,见《Android群英传:神兵利器》 App启动优化的一般过程 通过TraceView、Systrace来分析耗时的方法与组件。 梳理启动加载的每一个库、组件。 将梳理出来的库,按功能和需求进行划分,设计该库的启动时机。 与交互沟通,设计启动画面,按前文方法进行优化。 解决方案 Theme 当系统加载一个Activity的时候,onCreate()是一个耗时过程,那么在这个过程中,系统为了让用户能有一个比较好的体验,实际上会先绘制一些初始界面,类似于PlaceHolder。 系统首先会读取当前Activity的Theme,然后根据Theme中的配置来绘制,当Activity加载完毕后,才会替换为真正的界面。所以,Google官方提供的解决方案,就是通过android:windowBackground属性,来进行加载前的配置,同时,这里不仅可以配置颜色,还能配置图片,例如,我们可以使用一个layer-list来作为android:windowBackground要显示的图: start_window.xml <layer-listxmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque"> <itemandroid:drawable="@android:color/darker_gray"/> <item> <bitmap android:gravity="center" android:src="@mipmap/ic_launcher"/> </item> </layer-list> 可以看见,这里通过layer-list来实现图片的叠加,让开发者可以自由组合。 配置中的android:opacity="opaque"参数是为了防止在启动的时候出现背景的闪烁。 接下来可以设置一个新的Style,这个Style就是Activity预加载的Style。 <resources> <!--Baseapplicationtheme.--> <stylename="AppTheme"parent="Theme.AppCompat.Light.DarkActionBar"> <!--Customizeyourthemehere.--> <itemname="colorPrimary">@color/colorPrimary</item> <itemname="colorPrimaryDark">@color/colorPrimaryDark</item> <itemname="colorAccent">@color/colorAccent</item> </style> <stylename="StartStyle"parent="AppTheme"> <itemname="android:windowBackground">@drawable/start_window</item> </style> </resources> OK,下面在Mainifest中给Activity指定需要预加载的Style: <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.xys.startperformancedemo"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:theme="@style/StartStyle"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest> 这里需要注意下,一定是Activity的Theme,而不是Application的Theme。 最后,我们在Activity加载真正的界面之前,将Theme设置回正常的Theme就好了: publicclassMainActivityextendsAppCompatActivity{ @Override protectedvoidonCreate(BundlesavedInstanceState){ setTheme(R.style.AppTheme); super.onCreate(savedInstanceState); SystemClock.sleep(2000); setContentView(R.layout.activity_main); } } 在这个Activity中,我使用SystemClock.sleep(2000),模拟了一个Activity加载的耗时过程,在super.onCreate(savedInstanceState)调用前,将主题重新设置为原来的主题。 通过这种方式设置的效果如下: 启动的时候,会先展示一个画面,这个画面就是系统解析到的Style,等Activity加载完全完毕后,才会加载Activity的界面,而在Activity的界面中,我们将主题重新设置为正常的主题,从而达到一个友好的启动体验,这种方式其实并没有真正的加速启动过程,而是通过交互体验来优化了展示的效果。 异步初始化 这个很简单,就是让App在onCreate里面尽可能的少做事情,而利用手机的多核特性,尽可能的利用多线程,例如一些第三方框架的初始化,如果能放线程,就尽量的放入线程中,最简单的,你可以直接new Thread(),当然,你也可以通过公共的线程池来进行异步的初始化工作,这个是最能够压缩启动时间的方式 延迟初始化 延迟初始化并不是减少了启动时间,而是让耗时操作让位、让资源给UI绘制,将耗时的操作延迟到UI加载完毕后,所以,这里建议通过mDecoView.post方法,来进行延迟加载,代码如下: getWindow().getDecorView().post(newRunnable(){ @Overridepublicvoidrun(){ …… } }); 我们的ContentView就是通过mDecoView.addView加入到根布局的,所以,通过这种方式,可以让延迟加载的内容,在ContentView初始化完毕后,再进行执行,保证了UI绘制的流畅性。 IntentService IntentService是继承于Service并处理异步请求的一个类,在IntentService的内部,有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要去手动控制。 publicclassInitIntentServiceextendsIntentService{ privatestaticfinalStringACTION="com.xys.startperformancedemo.action"; publicInitIntentService(){ super("InitIntentService"); } publicstaticvoidstart(Contextcontext){ Intentintent=newIntent(context,InitIntentService.class); intent.setAction(ACTION); context.startService(intent); } @Override protectedvoidonHandleIntent(Intentintent){ SystemClock.sleep(2000); Log.d(TAG,"onHandleIntent:"); } } 我们将耗时任务丢到IntentService中去处理,系统会自动开启线程去处理,同时,在任务结束后,还能自己结束Service,多么的人性化!OK,只需要在Application或者Activity的onCreate中去启动这个IntentService即可: @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); InitIntentService.start(this); } 最后不要忘记在Mainifest注册Service。 使用ActivityLifecycleCallbacks Framework提供的这个方法可以监控到所有Activity的生命周期,在这里,我们就可以通过onActivityCreated这样一个回调,来将一些UI相关的初始化操作放到这里,同时,通过unregisterActivityLifecycleCallbacks来避免重复的初始化。同时,这里onActivityCreated回调的参数Bundle,可以用来区别是否是被系统所回收的Activity。 publicclassMainApplicationextendsApplication{ @Override publicvoidonCreate(){ super.onCreate(); //初始化基本内容 //…… registerActivityLifecycleCallbacks(newActivityLifecycleCallbacks(){ @Override publicvoidonActivityCreated(Activityactivity,BundlesavedInstanceState){ unregisterActivityLifecycleCallbacks(this); //初始化UI相关的内容 //…… } @Override publicvoidonActivityStarted(Activityactivity){ } @Override publicvoidonActivityResumed(Activityactivity){ } @Override publicvoidonActivityPaused(Activityactivity){ } @Override publicvoidonActivityStopped(Activityactivity){ } @Override publicvoidonActivitySaveInstanceState(Activityactivity,BundleoutState){ } @Override publicvoidonActivityDestroyed(Activityactivity){ } }); } } 资源优化 有几个方面,一个自然是优化布局、布局层级,一个是优化资源,尽可能的精简资源、避免垃圾资源,这些可以通过混淆和tinyPNG这些工具来实现。 甩锅方案 下面是两种不同的方案,都是在Style中进行配置: <itemname="android:windowDisablePreview">true</item> 与 <itemname="android:windowIsTranslucent">true</item> <itemname="android:windowNoTitle">true</item> 我们先来看看这样做的效果: 设置效果类似,即通过取消、透明化系统的统一的加载页面来达到启动的『加速』,实际上,是一个『甩锅』的过程。强烈建议开发者不要通过这种方式去做『所谓的启动加速』,这种方式虽然看上去自己的App启动非常快,瞬间就完成了,但实际上,是将真正的启动界面给隐藏了。 系统说:这锅,我们不背! 无解 对应5.0以下的65535问题,目前只能通过Multidex来进行处理,而在5.0以下的机器上,系统在加载前的合并Dex的过程,有可能非常长,这也是暂时无解的问题,只能希望后面Multidex进行优化。 OK,App的启动优化基本如上,其重点过程,依然是分析耗时的操作,以及如何设计合理的启动顺序,希望各位能够通过文中介绍的方式来进行App的启动优化。 作者:tomcat的猫 来源:51CTO

优秀的个人博客,低调大师

【物联网智能网关-09】CAN总线通信演示(TinyGUI触屏)

CAN 是Controller Area Network 的缩写,ISO国际标准化的串行通信协议。最早应用在汽车上,在欧洲是汽车网络的标准协议,目前已经广泛应用在工业自动化、智能家居、船舶、纺织和医疗设备等领域(详情请参见百度百科《CAN总线协议》)。 由于CAN总线接口.NET Micro Framework官方库并不支持,所以我在串口类库的基础上,根据CAN总线的特点,设计出一套CAN总线通信库。 CAN类库的声明如下: public class CAN { public CAN(string canName, CanBaudRate baudRate); public CAN(string canName, CanBaudRate baudRate, CanConfig config); public int DatasToRead { get; } public int DatasToWrite { get; } public event CanEventHandler DataReceived; public event CanEventHandler ErrorReceived; public int Close(); public int DiscardInBuffer(); public int DiscardOutBuffer(); public int Flush(); public int IOControl(CanIOControl code, int parameter); public int Open(); public int Read(CanData data); public int SetFilter(int index, CanFilter filter); public int Write(CanData data); } 同时支持CAN2.0A和CAN2.0B协议,相对比较有特色的,一是CanData,二是过滤器设置。 一条CanData包含如下信息: public class CanData { public CanData(); public CanData(uint id, bool IsEXID); public CanData(uint id, bool IsEXID, byte[] data); public int Count { get; } public byte[] Data { get; } public int Filter { get; } public uint ID { get; } public bool IsEXID { get; } public bool IsRemote { get; } } 和串口及网口通信不同,CAN一帧数据,最多能发8个字节的数据,ID可以是11位的标准ID也可以是29位的扩展ID,帧数据也可以定义为远程帧(不含数据,仅含ID等信息)或标准帧。STM32F207(或STM32F103),发送缓冲区可缓存3个数据帧r,接收缓冲区是双fifo,一个fifo可以接收3个数据包。但是仅仅这些还不够,本类库仿照串口通信,内置了可以任意定义发送和接收缓冲区大小的功能(其实对串口通信来说,发送和接收buffer却是内部定死的,用户不能自定义)。这样用户在大量发送和接收数据的时候,就无后顾之忧了。 过滤器(Filter)应该是CAN的精华所在了,要想理解和设置好,却不是易事。所以为了便于用户使用,对过滤器类重载了很多定义函数,过滤器类库声明如下: public class CanFilter { public CanFilter(bool enable); public CanFilter(uint id, uint mask); public CanFilter(uint id0, uint id1, bool IsRemote); public CanFilter(uint id, uint mask, bool IsRemote, bool IsMaskMode); public CanFilter(ushort id0, ushort mask0, ushort id1, ushort mask1); public CanFilter(bool IsMaskMode, bool IsFifo0, bool IsWidth32, uint data1, uint data2); public CanFilter(ushort id0, ushort id1, ushort id2, ushort id3, bool IsRemote); public CanFilter(ushort id0, ushort mask0, ushort id1, ushort mask1, bool IsRemote, bool IsMaskMode); } 对STM32芯片集成的CAN功能来说,过滤器有两种过滤模式,一种是ID列表模式,另外一种是ID掩码模式。而这两种又根据过滤数据的宽度不同,分为32位和16位。 限于篇幅,关于CAN通信库具体的内容就不在此展开介绍了,详情请参见YFSoft.CAN.rar压缩包里面的文档说明。 本文借助三个物联网智能网关进行CAN总线网络通信,来讲解CAN总线的使用情况(顺便介绍一下TinyGUI的触摸屏事件使用)。 示例程序分两种:一种是主控程序,上面设计了三个开关按钮,并且可以切换需要控制的CAN设备。另外一种,就是从设备程序了,该程序部署分别部署到两个设备上,程序的唯一区别就是,所要接收的ID标识号不同,一个是2#,一个是3#(程序界面如上图所示)。 在说CAN总线通信之前,先介绍一下TinyGUI的触摸屏事件的使用。 示例代码如下,用法非常简单。 ? Graphics screen = new Graphics(); screen.OnTouch += new TouchEventHandler(screen_OnTouch); static void screen_OnTouch( int x, int y, int state) { //x-x坐标 y – y坐标 //state – 1 按下 0 抬起 } ² 主控CAN通信程序 第一步:创建一个CAN通信类,并绑定接收和错误事件 can = new CAN("CAN1", CanBaudRate.bps_100K); can.ErrorReceived += new CanEventHandler(can_ErrorReceived); 第二步:根据选项不同,发送不同ID标识符和不同的CAN数据 can.Write(new CanData(canID, true, new byte[] { 0, 0 })); canID 是2或者3,数据的第一个数,0~2 表示对应的3个灯。 ² 从设备CAN通信程序 第一步:创建一个CAN通信类,并绑定接收和错误事件 can = new CAN("CAN1", CanBaudRate.bps_100K); can.DataReceived += new CanEventHandler(can_DataReceived); can.ErrorReceived += new CanEventHandler(can_ErrorReceived); can.SetFilter(0, new CanFilter(2,0,false)); 过滤器设定的ID标识符为2或3. 第二步:数据接收 ? staticvoidcan_DataReceived(intcanPort,intparameter) { intcount=can.DatasToRead; CanDatadata=newCanData(); for(inti=0;i<count;i++) { can.Read(data); intindex=data.Data[0]; LameState[index]=!LameState[index]; lamp[index].OnDraw(index,LameState[index]); } } ² TinyGUI界面设计 略,详情请参见示例代码。 程序部署后,时间运行的视频如下: http://v.youku.com/v_show/id_XNDM5NzI1MTg0.html 注意:为了正常运行本实例,物联网智能网关固件版本需要升级到V1.8.17以上,(如果你当前TinyCLR版本低于V1.7.15以下,TinyBooter也需要同步升级)。 固件下载地址:http://www.sky-walker.com.cn/MFRelease/firmware/MFv42_YF_Wisteria207.rar --------------------------------- 类库下载:http://www.sky-walker.com.cn/MFRelease/library/V42//YFSoft.CAN.rar 示例下载:http://www.sky-walker.com.cn/MFRelease/Sample/CAN_Test.rar MF简介:http://blog.csdn.net/yefanqiu/article/details/5711770 MF资料:http://www.sky-walker.com.cn/News.asp?Id=25 本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/966558,如需转载请自行联系原作者

优秀的个人博客,低调大师

盘点5G行业虚拟专网2021:多点开花,乘势扬帆

如果说5GToC在过去一年帮助运营商实现基本盘的价值回归,那么5GToB则是迈出了“从0到1”的重要一步,助力运营商实现价值跃升。 相较于轻车熟路的ToC业务,实践过程中发现,ToB业务不同于传统的公网业务,各个不同行业都有显著的差异化特征,行业间的业务场景信息化需求程度也各不相同,因此三大运营商推出可定制的5G行业虚拟专网,来满足用户定制化需求。 从时间点上看,三大运营商相继在2020年底发布可商用的5G专网解决方案,经过一年多时间的发展,工信部最新数据显示,截至2021年10月底,我国行业虚拟专网数量超过2300张。同时,《5G应用“扬帆”行动计划(2021-2023年)》的发布,也进一步推动专网赋能5G商业和产业的成功。 政策支撑,5G虚拟专网趁势扬帆 5G赋能行业应用的价值和潜力,已经得到业界的广泛认同。随着数字化进程的不断提速,无论是电信运营商,还是传统行业的企业,对于利用5G技术实现转型升级的需求愈发迫切。 为了推动5G在更多行业绽放,今年7月,工业和信息化部等十部门印发《5G应用“扬帆”行动计划(2021-2023年)》。《计划》除了对5G个人市场提出发展指标外,在行业应用方面要求到2023年大型工业企业的5G应用渗透率超过35%,电力、采矿等领域5G应用实现规模化复制推广,形成一批5G+智慧教育、5G+智慧医疗、5G+文化旅游样板项目,每个重点行业打造100个以上5G应用标杆。 据了解,截至目前5G应用已经覆盖一、二、三产业诸多领域,5G赋能经济社会数字化转型的潜能不断释放,近五成的5G应用实现了商业落地。以最具代表的工业互联网创新应用为例,已经广泛应用到钢铁、机械、交通、能源等40多个国民经济重点行业,其中“5G+工业互联网”在建项目已经超过1800个。 面向2022年,工业和信息化部部长肖亚庆表示,将稳妥有序开展5G和千兆光网建设,加快5G行业虚拟专网规模化建设,打牢数字化转型的网络设施基础,聚焦制造、矿山、电力等重点行业,深度挖掘“5G+工业互联网”典型应用场景。支持产业链上下游企业开放数据,加快研制工业数据交互等基础共性标准,支持各地探索培育数据要素市场。深入实施制造业数字化转型行动,加快构建数字化转型服务体系,推动工业互联网平台进园区、进企业。 能力升级,不断进化的产品体系 政策支撑的基础上,国内三大运营商以企业客户需求为导向,在过去一年的实践过程中,不断提升5G行业虚拟专网的产品能力,进行了系统性的升级。正如中国通信标准化协会副理事长兼秘书长闻库在2021年12月召开的IMT-2020(5G)大会上所指出的,目前5G行业虚拟专网正在从1.0向2.0迈进,由ToB通用网络向各行业定制的网络演进。 中国电信在过去的一年目标落地1000个定制商用网络,通过经验总结,不断细分用户场景化的需求,创新推出5G定制网能力魔方,围绕业务需求面、技术参数面、原子能力面、标准产品面、商业模式面、技术方案面,实现场景精准适配、能力多维构建、以及方案快捷交付,进一步实现从“1”到“N”,促进5G规模复制和商业闭环。同时还提升和优化服务体系,升级产业生态。 中国移动推出5G专网技术体系2.0,从网络能力、专网服务和设备体系三个方面进行升级演进。网络能力方面,引入5GLAN、TSN等工业互联网增强能力,NPN和二次鉴权等接入控制能力,超大上行、超低时延、超高可靠和高精度定位等业务承载能力;服务体系提升方面,构建一站式运营体系,提供运营运维自动化、属地化运维以及SLA质量保障和可视化等能力,推动5G专网从“可用”到“敢用”和“好用”;设备产品体系完善方面,自主研发OpenUPF、OpenSigma边缘计算平台等产品,正在进行定制化5GC和“果核”一体化集成设备的规划和研发,面向定制化部署场景已形成完善的5G专网设备产品体系。 中国联通发布5G行业专网产品体系2.0(即“5G专网PLUS”),在网络跨越方面,打造5GC集中一朵云、分布一张网的立体网络架构,快速实现创新即入网、验证即商用、全程全网规模化推广;行业跨越方面,面向行业细分应用场景,进行网络方案基线化,网络配置模板化,支持5G专网规模化交付;服务跨越方面,秉承“一点接入、服务全国”的集约化运营理念,全面升级5G应用商城和5G专网运营平台,让行业客户买得舒心、建得省心、用得放心。 生态协同,加速5G融入千行百业 当然,5G行业虚拟专网从方案到落地是一条很长的产业链,“独行快,众行远”也一直是这个行业亘古不变的发展规律。作为当前5G行业虚拟专网的主要建设和运营方,电信运营商积极构建产业生态。 中国电信升级一体化产业生态体系,从单向客户服务、简单渠道销售、单一供应采购转变为与广大合作伙伴一起共建、共享、共赢,打造更大范围、更宽领域、更深层次、全面融合的产业生态,共享产业数字化生态红利。 中国移动秉承开放、创新、合作、共赢的理念,携手产学研用上下游合作伙伴,推动5G与行业的持续融合融通,加速千行百业数智化转型进程。 中国联通全方位升级5G专网平台3.0,通过能力开放标准和边缘计算架构,降低了企业应用的上车门槛,构建了ToB的规模化商业生态,真正做到全量5G应用,一站集成,一次创新,全网复制。 工业和信息化部信息通信发展司副司长刘郁林指出,为进一步发挥5G行业虚拟专网对行业应用的支撑作用,提出了三点建议,第一,持续优化5G行业虚拟专网推广环境。第二,加快完善5G行业虚拟专网标准。第三,重点推动5G行业虚拟专网产业资源共享。 5G价值在于ToB场景,5G行业虚拟专网是实现5G在各垂直行业落地生根的关键基础设施,与此同时5G+千行百业,“跨界”是必须也是必然,开放的“朋友圈”是决定能走多远的关键,相信在产业链的共同努力下,将加速5G行业应用从“样板房”向“商品房”转化。

优秀的个人博客,低调大师

不触,即达 — openKylin 3.0 UKUI 交互新体验即将到来

屏幕能"看见"你的手吗 在 openKylin 3.0 UKUI 4.24 给出了自己的答案 不背快捷键、不学新规则 挥手之间,截屏、翻页、调音量 声声回应,朗读、跟随、每一笔都有回响 这一次,我们把"操控"做轻,把"温度"做实 https://www.bilibili.com/video/BV1ChM36FE4X/?vd_source=d10d76c0e699247ea8991fe756539741 更多惊喜,敬请期待! 关于openKylin 3.0及UKUI 4.24桌面环境的更多新特性,后续将陆续揭晓。关注openKylin公众号,第一时间获取最新消息! 感兴趣的小伙伴可下载 openKylin 3.0 Alpha1 镜像提前预览,后续新功能上线即可第一时间体验。点击阅读原文进入下载页面:https://www.openkylin.top/downloads 温馨提示:本版本为预览试用版,并非正式版本,使用前请做好数据备份。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册