UNIapp实现局域网内在线升级

首先是UNIapp 生成apk

用Hbuilder 进行打包云打包
可以从网站https://www.yunedit.com/reg?goto=cert 使用自有证书,目测比直接使用云证书要快一些。

发布apk 网站

发布内容用IIS发布即可
注意事项中记录如下内容

第一、需要在 iis 的MiMe 中添加apk 的格式,否则无法下载apk 文件到手持机中。 添加方式 打开MIME 点击添加
分别输入 apk application/vnd.android.package-archive 点击保存即可

第二、发布新的apk 的时候,需要修改应用版本号(往大了修改),同时版本号.json 文件中
newVersionCode对应的值,也要和新的应用版本号相同(方便检测更新) newVersionName 中保存的是当前PDA的版本名称
versionDesc 中可以添加修改的内容 appName 需要添加新发布的apk 名称(用于下载对应的文件)

第三、将对应的文件夹发布在iis中,同时要修改uniapp 中的http.js文件
uni.setStorageSync(‘loadVersion’, ‘http://127.0.0.1:8032/’); 修改内部的url

要在IIS中添加.apk文件的MIME类型,可以按照以下步骤操作:

打开IIS管理器,找到服务器,右键选择“属性”。
在打开的属性窗口中,选择“MIME类型”选项卡。
点击“MIME类型”按钮,打开MIME类型设置窗口。
选择“新建”来添加一个新的MIME类型。
在“扩展名”中填写“.apk”,在“MIME类型”中填写“.apk”的MIME类型“application/vnd.android.package-archive”。
点击“确定”保存设置。
重启IIS服务,以使更改生效。
完成以上步骤后,IIS就能够正确识别和处理.apk文件了

版本号.json中的内容为

{"newVersionCode":223,"newVersionName":"V1.2.0","versionDesc":"升级了部分功能","appName":"android_debug.apk"}

uniapp相关代码

结构
upgrade.vue中存在

<template><view class="upgrade-popup"><view class="main"><view class="version">发现新版本{{versionName}}</view><view class="content"><text class="title">更新内容</text><view class="desc" v-html="versionDesc"></view></view><!--下载状态-进度条显示 --><view class="footer" v-if="isStartDownload"><view class="progress-view" :class="{'active':!hasProgress}" @click="handleInstallApp"><!-- 进度条 --><view v-if="hasProgress" style="height: 100%;"><view class="txt">{{percentText}}</view><view class="progress" :style="setProStyle"></view></view><view v-else><view class="btn upgrade force">{{ isDownloadFinish  ? '立即安装' :'下载中...'}}</view></view></view></view><!-- 强制更新 --><view class="footer" v-else-if="isForceUpdate"><view class="btn upgrade force" @click="handleUpgrade">立即更新</view></view><!-- 可选择更新 --><view class="footer" v-else><view class="btn close" @click="handleClose">以后再说</view><view class="btn upgrade" @click="handleUpgrade">立即更新</view></view></view></view>
</template><script>import {downloadApp,installApp} from './upgrade.js'export default {data() {return {isForceUpdate: false, //是否强制更新versionName: '', //版本名称versionDesc: '', //更新说明downloadUrl: '', //APP下载链接isDownloadFinish: false, //是否下载完成hasProgress: false, //是否能显示进度条currentPercent: 0, //当前下载百分比isStartDownload: false, //是否开始下载fileName: '', //下载后app本地路径名称}},computed: {//设置进度条样式,实时更新进度位置setProStyle() {return {width: (510 * this.currentPercent / 100) + 'rpx' //510:按钮进度条宽度}},//百分比文字percentText() {let percent = this.currentPercent;if (typeof percent !== 'number' || isNaN(percent)) return '下载中...'if (percent < 100) return `下载中${percent}%`return '立即安装'}},onLoad(options) {this.init(options)},onBackPress(options) {// 禁用返回if (options.from == 'backbutton') {return true;}},methods: {//初始化获取最新APP版本信息init(options) {let randomNum = Math.random();//模拟接口获取最新版本号,版本号固定为整数const baseurl = uni.getStorageSync('loadVersion')+options.appName+'?V='+randomNum;;console.log('结果为')console.log((baseurl))//模拟接口获取setTimeout(() => {//演示数据请根据实际修改this.versionName = options.versionName; //版本名称this.versionDesc = options.versionDesc; //更新说明this.downloadUrl = baseurl; //下载链接this.isForceUpdate = false; //是否强制更新}, 200)},//更新handleUpgrade() {console.log('Hello UniApp!-----------------------------------------------')uni.getStorage({key: 'loadVersion',success: function (res) {console.log(res.data);}});//requestTask.abort();if (this.downloadUrl) {this.isStartDownload = true//开始下载AppdownloadApp(this.downloadUrl, current => {//下载进度监听this.hasProgress = truethis.currentPercent = current}).then(fileName => {//下载完成this.isDownloadFinish = truethis.fileName = fileNameif (fileName) {//自动安装Appthis.handleInstallApp()}}).catch(e => {console.log(e, 'e')})} else {uni.showToast({title: '下载链接不存在',icon: 'none'})}},//安装apphandleInstallApp() {//下载完成才能安装,防止下载过程中点击if (this.isDownloadFinish && this.fileName) {installApp(this.fileName, () => {//安装成功,关闭升级弹窗uni.navigateBack()})}},//关闭返回handleClose() {uni.navigateBack()},}}
</script><style>page {background: rgba(0, 0, 0, 0.5);/**设置窗口背景半透明*/}
</style>
<style lang="scss" scoped>.upgrade-popup {width: 580rpx;height: auto;position: fixed;top: 50%;left: 50%;transform: translate(-50%, -50%);background: #fff;border-radius: 20rpx;box-sizing: border-box;border: 1px solid #eee;}.header-bg {width: 100%;margin-top: -112rpx;}.main {padding: 10rpx 30rpx 30rpx;box-sizing: border-box;.version {font-size: 36rpx;color: #026DF7;font-weight: 700;width: 100%;text-align: center;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;letter-spacing: 1px;}.content {margin-top: 60rpx;.title {font-size: 28rpx;font-weight: 700;color: #000000;}.desc {box-sizing: border-box;margin-top: 20rpx;font-size: 28rpx;color: #6A6A6A;max-height: 80vh;overflow-y: auto;}}.footer {width: 100%;display: flex;justify-content: center;align-items: center;position: relative;flex-shrink: 0;margin-top: 100rpx;.btn {width: 246rpx;display: flex;justify-content: center;align-items: center;position: relative;z-index: 999;height: 96rpx;box-sizing: border-box;font-size: 32rpx;border-radius: 10rpx;letter-spacing: 2rpx;&.force {width: 500rpx;}&.close {border: 1px solid #E0E0E0;margin-right: 25rpx;color: #000;}&.upgrade {background-color: #026DF7;color: white;}}.progress-view {width: 510rpx;height: 90rpx;display: flex;position: relative;align-items: center;border-radius: 6rpx;background-color: #dcdcdc;display: flex;justify-content: flex-start;padding: 0px;box-sizing: border-box;border: none;overflow: hidden;&.active {background-color: #026DF7;}.progress {height: 100%;background-color: #026DF7;padding: 0px;box-sizing: border-box;border: none;border-top-left-radius: 10rpx;border-bottom-left-radius: 10rpx;}.txt {font-size: 28rpx;position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);color: #fff;}}}}
</style>

upgrade.js

/*** @description H5+下载App* @param downloadUrl:App下载链接* @param progressCallBack:下载进度回调*/
export const downloadApp = (downloadUrl, progressCallBack = () => {}, ) => {return new Promise((resolve, reject) => {//创建下载任务const downloadTask = plus.downloader.createDownload(downloadUrl, {method: "GET"}, (task, status) => {console.log(status,'status')if (status == 200) { //下载成功resolve(task.filename)} else {reject('fail')uni.showToast({title: '下载失败',duration: 1500,icon: "none"});}})//监听下载过程downloadTask.addEventListener("statechanged", (task, status) => {switch (task.state) {case 1: // 开始  break;case 2: //已连接到服务器  break;case 3: // 已接收到数据  let hasProgress = task.totalSize && task.totalSize > 0 //是否能获取到App大小if (hasProgress) {let current = parseInt(100 * task.downloadedSize / task.totalSize); //获取下载进度百分比progressCallBack(current)}break;case 4: // 下载完成       break;}});//开始执行下载downloadTask.start();})}
/*** @description H5+安装APP* @param fileName:app文件名* @param callBack:安装成功回调*/
export const installApp = (fileName, callBack = () => {}) => {//注册广播监听app安装情况onInstallListening(callBack);//开始安装plus.runtime.install(plus.io.convertLocalFileSystemURL(fileName), {}, () => {//成功跳转到安装界面}, function(error) {uni.showToast({title: '安装失败',duration: 1500,icon: "none"});})}
/*** @description 注册广播监听APP是否安装成功* @param callBack:安装成功回调函数*/
const onInstallListening = (callBack = () => {}) => {let mainActivity = plus.android.runtimeMainActivity(); //获取activity//生成广播接收器let receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {onReceive: (context, intent) => { //接收广播回调  plus.android.importClass(intent);mainActivity.unregisterReceiver(receiver); //取消监听callBack()}});let IntentFilter = plus.android.importClass('android.content.IntentFilter');let Intent = plus.android.importClass('android.content.Intent');let filter = new IntentFilter();filter.addAction(Intent.ACTION_PACKAGE_ADDED); //监听APP安装     filter.addDataScheme("package");mainActivity.registerReceiver(receiver, filter); //注册广播}

home.vue

<template><view><image style="width: 100%;" mode="widthFix" src="/static/swiper1.png"></image><!-- 	<u-swiper height="360rpx" :list="swiperList" :radius="0"></u-swiper> --><view class="home-content"><view class="app-name">WMS手持机系统</view><view class="card-container"><view class="fn-title">基础功能</view><u-grid :border="false" @click="gridClick" col="4"><u-grid-item v-for="(item,index) in fn" :key="index"><view :class="['grid-item-bg','grid-item-bg-'+(index+1)]"><u-icon :name='item.icon' :color="item.color" size="28"></u-icon></view><view class="grid-text">{{item.name}}</view></u-grid-item></u-grid></view><view style="padding:30rpx;padding-top:0;"><vol-alert type="primary"></vol-alert></view></view></view>
</template><script>export default {data() {return {height: 0,swiperList: ['/static/swiper1.png','/static/swiper2.png','/static/swiper3.png'],fn: [{name: "有单据组盘1",icon: '/static/fc.png',path: "/pages/basics/T_In_ReceiptNoticeDetail/T_In_ReceiptNoticeDetail",color: '#EE0000',subPage: true //二级页面}, {name: "手动入库",icon: '/static/fc.png',path: "",color: '#EE0000',subPage: true //二级页面}, {name: "无单据组盘",icon: 'edit-pen-fill',color: '#8B8989',path: "/pages/createbyus/HaveOrderGroup/HaveOrderGroup",subPage: true //二级页面}, {name: "入库计划",icon: '/static/fc.png',path: "/pages/basics/T_In_ReceiptNotice/T_In_ReceiptNotice",color: '#EE0000',subPage: true //二级页面}, {name: "确认出库",icon: '/static/fc.png',path: "/pages/reportvshow/V_OutboundDetail/V_OutboundDetail",color: '#EE0000',subPage: true //二级页面}, {name: "托盘处理",icon: '/static/fc.png',path: "/pages/strategy/DealTrayCURD/DealTrayCURD",color: '#EE0000',subPage: true //二级页面}, {name: "盘点处理",icon: '/static/fc.png',path: "/pages/strategy/T_InventoryCheckDetail/T_InventoryCheckDetail",color: '#EE0000',subPage: true //二级页面}, {name: "出库计划",icon: '/static/flow.png',color: '#EE0000',path: "/pages/basics/T_Out_DeliveryNotice/T_Out_DeliveryNotice",subPage: true //二级页面},{name: "审批流程",icon: '/static/flow.png',color: '#EE0000',path: "/pages/flow/flow",subPage: false //二级页面}, {name: "表单示例",icon: '/static/form.png',color: '#EE0000',path: "/pages/form/form",subPage: true //二级页面},{name: "Table组件",icon: '/static/fc.png',color: '#EE0000',path: "/pages/form/form",subPage: true //二级页面},{name: "菜单列表",icon: '/static/table.png',color: '#EE0000',path: "/pages/menu/menu",subPage: false //二级页面},// {// 	name: "地图导航",// 	icon: '/static/fc.png',// 	color:'#EE0000',// 	path: "/pages/map/map",// 	subPage: true //二级页面// },// //待开发功能// {// 	name: "敬请期待",// 	icon: '/static/fc.png',// 	path: "pages/basics/T_In_ReceiptNotice/T_In_ReceiptNotice",// 	color:'#EE0000',// 	subPage: true //二级页面// },// {// 	name: "敬请期待",// 	icon: '/static/fc.png',// 	color:'#EE0000',// 	path: "",// }],}},onLoad() {var _this = this;// 获取手机状态栏高度uni.getSystemInfo({success: function(data) {// 将其赋值给this_this.height = data.statusBarHeight;}});_this.init();},onReady(){this.checkVersion(1)},onShow() {},methods: {//初始化init() {},//检查版本更新情况checkVersion(indexValue) {var _this = this;let index=0;setTimeout(() => {let randomNum = Math.random();//模拟接口获取最新版本号,版本号固定为整数const baseurl = uni.getStorageSync('loadVersion')+'版本号.json?V='+randomNum;console.log(baseurl)var requestTask = uni.request({url: baseurl, //仅为示例,并非真实接口地址。method:'GET',success: function(res) {index++;console.log(res.data);	const newVersionName =res.data.newVersionName //线上最新版本名const newVersionCode =res.data.newVersionCode; //线上最新版本号const selfVersionCode = Number(uni.getSystemInfoSync().appVersionCode) //当前App版本号console.log(index+'../index/upgrade?versionName='+newVersionName+'&versionDesc='+res.data.versionDesc)console.log(selfVersionCode)console.log(newVersionCode)//线上版本号高于当前,进行在线升级if (selfVersionCode < newVersionCode) {let platform = uni.getSystemInfoSync().platform //手机平台uni.navigateTo({url: '../index/upgrade?versionName='+newVersionName+'&versionDesc='+res.data.versionDesc+'&appName='+res.data.appName})}else{_this.clickUseInfo(indexValue);}},fail :function(res){console.log(res);},complete: ()=> {}});}, 200)},getStyle(item) {return {paddingTop: 20 + 'rpx',background: item.color,padding: '50%',color: "#ffff",'border-radius': '50%',left: '-24rpx'}},gridClick(index) {this.checkVersion(index)},clickUseInfo(index){const item = this.fn[index];console.log(index)if (!item.path) {this.$toast('开发中')return;}//注意下面的跳转方式,一级页面指pages.json中tabBar配置path//具体见uni页面跳转文档if (item.subPage) {//二级页面用navigateTo跳转uni.navigateTo({url: this.fn[index].path})return;}//一级页面uni.switchTab({url: this.fn[index].path})},swiperClick(index) {}}}
</script>
<style lang="less" scoped>.home-content {z-index: 999;position: relative;margin-top: -220rpx;}.app-name {text-align: center;color: #ffff;font-weight: bolder;font-size: 60rpx;top: -40rpx;position: relative;}.card-container {box-shadow: 1px 1px 9px #b9b6b629;margin: 30rpx 30rpx 30rpx 30rpx;border: 1px solid #f1f1f1;border-radius: 10rpx;padding: 26rpx 10rpx 14rpx 10rpx;background: #ffff;.fn-title {font-family: 黑体;font-size: 30rpx;font-weight: bold;//color: #8f9ca2;padding: 4rpx 20rpx 30rpx 20rpx;}.grid-text {padding-top: 8rpx;font-size: 26rpx;color: #626262;padding-bottom: 20rpx;}}.grid-item-bg {border-radius: 50%;width: 86rpx;height: 86rpx;display: flex;align-items: center;justify-content: center;box-shadow: 5px 3px 6px #e0ddddb0;}.grid-item-bg-1 {background-image: linear-gradient(to bottom right, #97caff, #47a1fe);}.grid-item-bg-2 {background-image: linear-gradient(to bottom right, #f8bcbc, #f07e7e);}.grid-item-bg-3 {background-image: linear-gradient(to bottom right, #afb5e6, #808cf0);}.grid-item-bg-4 {background-image: linear-gradient(to bottom right, #98e4e2, #56c3bf);}.grid-item-bg-5 {background-image: linear-gradient(to bottom right, #d1d1d1, #c878e7);}.grid-item-bg-6 {background-image: linear-gradient(to bottom right, #97caff, #47a1fe);}.grid-item-bg-7 {background-image: linear-gradient(to bottom right, #98e4e2, #56c3bf);}.grid-item-bg-8 {background-image: linear-gradient(to bottom right, #afb5e6, #808cf0);}
</style>

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

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

相关文章

如何本地创建websocket服务端并发布到公网实现远程访问

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

如何实现飞书与金蝶无缝对接,提升业务效率与客户满意度?

一、客户介绍 某贸易有限公司是一家专业从事进口葡萄酒和高端烈酒销售的企业。在市场竞争日益激烈的今天&#xff0c;该公司始终坚持以客户为中心&#xff0c;以市场为导向&#xff0c;不断创新和进步。公司不仅注重传统销售渠道的拓展&#xff0c;还积极拥抱互联网&#xff0…

processing绘制笑脸

笑脸效果图&#xff1a; processing代码&#xff1a; void setup(){size(1000,1000);//Canvas sizebackground(#ffcc33);//Canvas background color } void draw(){ strokeWeight(12);//face-width12px fill(#ffffcc);//face arc(500,500,200,200,0,TWO_PI);//face-size strok…

【推荐算法系列十八】:DSSM 召回算法

参考 推荐系统中 DSSM 双塔模型汇总&#xff08;二更&#xff09; DSSM 和 YouTubeDNN 都是比较经典的 U2I 模型。 U2I 召回 U2I 召回也就是 User-to-Item 召回&#xff0c;它基于用户的历史行为以及用户的一些个人信息&#xff0c;对系统中的候选物品进行筛选&#xff0c;挑…

备考2024年上海高考数学:历年选择题真题练一练(2014~2023)

今天距离2024年高考还有三个多月的时间&#xff0c;今天我们来看一下2014~2023年的上海高考数学的选择题&#xff0c;从过去十年的真题中随机抽取5道题&#xff0c;并且提供解析。 后附六分成长独家制作的在线练习集&#xff0c;科学、高效地反复刷这些真题&#xff0c;吃透真题…

Sora爆火,数字人IP如何借助AIGC视频生成软件制作短视频营销?

ChatGPT、Sora等大模型的出现&#xff0c;创新了短视频内容创作生产方式。但目前Sora模型无法准确模拟复杂场景的物理特性&#xff0c;并且可能无法理解因果关系导致视频失真。 广州虚拟动力基于用户使用需求&#xff0c;推出了AIGC数字人视频生成平台&#xff0c;企业、品牌可…

Android MediaCodec 简明教程(五):使用 MediaCodec 编码 ByteBuffer 数据,并保存为 MP4 文件

系列文章目录 Android MediaCodec 简明教程&#xff08;一&#xff09;&#xff1a;使用 MediaCodecList 查询 Codec 信息&#xff0c;并创建 MediaCodec 编解码器Android MediaCodec 简明教程&#xff08;二&#xff09;&#xff1a;使用 MediaCodecInfo.CodecCapabilities 查…

每日一练:LeeCode-707. 设计链表 【链表+虚拟头结点+设计】

每日一练&#xff1a;LeeCode-707. 设计链表 【链表虚拟头结点设计】 思路设置虚拟头节点 本文是力扣 每日一练&#xff1a;LeeCode-707. 设计链表 【链表虚拟头结点设计】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode-70…

0101二阶与三阶行列式-行列式-线性代数

一 引例 求解二元一次方程组 { a 11 x 1 a 12 x 2 b 1 a 21 x 1 a 22 x 2 b 2 \begin{cases} a_{11}x_1a_{12}x_2b_1\\ a_{21}x_1a_{22}x_2b_2\\ \end{cases} {a11​x1​a12​x2​b1​a21​x1​a22​x2​b2​​ 解&#xff1a; 1 a 21 − 2 a 11 ⇒ x 2 a 11 b 2 − a…

MQL5学习之简单移动平均线MA的编写

昨天还是有点高估自己了&#xff0c;MACD相对较难一点&#xff0c;改学MA的编写&#xff0c;首先明确MA的计算&#xff0c;假如有4个值&#xff0c;p[1&#xff0c;2&#xff0c; 3&#xff0c; 4], period3, 则v[0]p[0], v[1]p[1],v[2](p[0]p[1]p[2])/32, v[3](v[2]*3p[3]-p…

ChatGPT论文指南|ChatGPT如何助力论文中的数据分析!【建议收藏】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼&#xff1a; ChatGPT论文指南|ChatGPT如何助力论文中的数据分析&#xff01;【建议收藏】 小编在之前的论文写作流程中&#xff0c;介绍了大量论文文字工作&#xff…

Effective objective-c-- 内存管理

Effective objective-c-- 内存管理 前言理解引用计数引用计数工作原理属性存取方法中的内存管理自动释放池保留环要点 以ARC简化引用计数使用ARC时必须遵循的方法和命名规则变量的内存管理语义ARC如何清理实例变量覆写内存管理方法要点 在dealloc方法中只释放引用并解除监听要点…

探索Linux世界:初次接触和基本指令(文件操作)

文章目录 1.基本介绍和准备2.基本指令和Linux的基本操作3.几个重要基本指令3.1 ls - 列出文件和目录3.1.1文件的知识3.1.2 .和..文件 3.2pwd - 显示当前工作目录3.2.1路径知识 3.3 cd - 切换目录3.4 touch - 创建文件或更新时间戳3.5mkdir - 创建新目录3.6rm - 删除文件或目录3…

深入了解 Android 中的 FrameLayout 布局

FrameLayout 是 Android 中常用的布局之一&#xff0c;它允许子视图堆叠在一起&#xff0c;可以在不同位置放置子视图。在这篇博客中&#xff0c;我们将详细介绍 FrameLayout 的属性及其作用。 <FrameLayout xmlns:android"http://schemas.android.com/apk/res/androi…

【数据结构和算法初阶(C语言)】带环链表问题详解(快慢指针的烧脑应用)

目录 1.铺垫-----带环链表基本了解 2. 题目&#xff1a;环形链表 3.环形链表|| ​编辑 3.1题解1 3.2 题解2 4.总结 1.铺垫-----带环链表基本了解 环形链表题目启迪&#xff1a; 环形链表特点&#xff1a;遍历链表会出现一模一样的地址 2. 题目&#xff1a;环形链表 给…

数字化转型导师鹏:政府数字化转型政务服务类案例研究

政府数字化转型政务服务类案例研究 课程背景&#xff1a; 很多地方政府存在以下问题&#xff1a; 不清楚标杆省政府数字化转型的政务服务类成功案例 不清楚地级市政府数字化转型的政务服务类成功案例 不清楚县区级政府数字化转型的政务服务类成功案例 课程特色&#x…

基于C语言实现内存型数据库(kv存储)

基于C语言实现内存型数据库(kv存储) 文章目录 基于C语言实现内存型数据库(kv存储)1. 项目背景1.1 Redis介绍1.2 项目预期及基本架构 2. 服务端原理及代码框架2.1 网络数据回环的实现2.2 array的实现2.3 rbtree的实现2.4 btree的实现2.5 hash的实现2.6 dhash的实现2.7 skiplist的…

XV4001KC数字输出 车载用(piezoman)

EPSON的XV4001KC角速度传感器是为满足汽车行业对高精度和高可靠性需求而设计的。它不仅提供了高级的运动监测特性&#xff0c;高精度的角速度测量和温度监测功能&#xff0c;而且其紧凑的设计6.04.83.3mm尺寸对于空间受限的车载环境来说&#xff0c;是一大优势&#xff0c;使得…

政务浏览器——打通信创闭环最后一公里

当前&#xff0c;信创建设工作主要集中在芯片、操作系统、数据库以及pc整机&#xff0c;这些领域基本可用&#xff0c;或者达到了市场主流水平。但是&#xff0c;政务办事场景下的信创落地仍然困难重重&#xff0c;很多地方不得不装双系统或买两台设备来来平衡日常业务和信创考…

STM32CubeIDE基础学习-软件安装,环境搭建

STM32CubeIDE基础学习-软件介绍及环境搭建步骤 文章目录 STM32CubeIDE基础学习-软件介绍及环境搭建步骤前言第1章 STM32CubeIDE 介绍1.1 软件描述1.2 软件支持的功能及特点 第2章 STM32CubeIDE 软件安装2.1 STM32CubeIDE 软件获取方法2.2 STM32CubeIDE 软件安装步骤2.2.1 错误安…