目录

效果:

开发环境

涉及知识点

集成配置

蓝牙连接

蓝牙打印

GitHub


效果:

 

 

特别声明:较之前的版本有很大的调整,之前的版本是未适配8.0的,现在是适配了的,接入方式也不一样,包括代码逻辑都有调整,不过梳理清楚流程之后也就不难了,非常简单。(更新时间:2020-03-27)

 

开发环境

  • Gprinter佳博打印机,型号GP-2120TU
  • Android Studio 3.6.1,gradle 3.5.3

 

本文可能内容比较长,但是难度不大。文末附github地址。

 

涉及知识点

  • 蓝牙相关
  • 多线程开发
  • 线程池
  • 构建者模式
  • 单例模式
  • 运行时权限
  • BroadcastReceiver
  • startActivityForResult
  • 等等

 

集成配置

1.添加jar包,在app目录下新建libs文件夹,拷入jar文件并Add As Library

2.在main目录下新建jniLibs目录,并拷入so文件

3.配置我们的manifest文件,添加必要的权限

    <!-- 打印相关权限 --><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-featureandroid:name="android.hardware.usb.host"android:required="true" />

 

ok,基本的配置完成,开始进入正题。

基本大的流程分为两部分,一是蓝牙连接,二是打印,下面开始一一介绍。

 

蓝牙连接

分为几个小步骤

1.因为蓝牙涉及到隐私权限,所以先检查、请求权限

    private void checkPermission() {for (String permission : permissions) {if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, permission)) {per.add(permission);}}}private void requestPermission() {if (per.size() > 0) {String[] p = new String[per.size()];ActivityCompat.requestPermissions(this, per.toArray(p), REQUEST_CODE);}}

2.点击连接按钮,通过startActivityForResult启动一个蓝牙列表页面,实际上显示为一个dialog

    public void btnConnect(View view) {startActivityForResult(new Intent(MainActivity.this, BluetoothListActivity.class), BLUETOOTH_REQUEST_CODE);}

3.这个页面的作用就是判断蓝牙是否可用、是否开启,显示已配对和未配对的蓝牙设备列表

    /*** 初始化蓝牙*/private void initBluetooth() {// 获取蓝牙适配器mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();// 检查蓝牙是否可用if (mBluetoothAdapter == null) {Toast.makeText(this, "当前设备不支持蓝牙", Toast.LENGTH_SHORT).show();} else {// 检查蓝牙是否打开if (!mBluetoothAdapter.isEnabled()) {Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enableIntent, REQUEST_ENABLE_BT);} else {getDeviceList();}}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_ENABLE_BT) {if (resultCode == Activity.RESULT_OK) {// bluetooth is openedgetDeviceList();} else {// bluetooth is not openToast.makeText(this, "蓝牙没有开启", Toast.LENGTH_SHORT).show();}}}/*** 蓝牙设备列表*/protected void getDeviceList() {// 初始化一个数组适配器,用来显示已匹对和未匹对的设备mDevicesArrayAdapter = new ArrayAdapter<>(this, R.layout.bluetooth_device_name_item);lvPairedDevice.setAdapter(mDevicesArrayAdapter);lvPairedDevice.setOnItemClickListener(mDeviceClickListener);// 已匹对数据Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();// 添加一个item显示信息mDevicesArrayAdapter.add("已配对:");if (pairedDevices.size() > 0) {//遍历填充数据for (BluetoothDevice device : pairedDevices) {mDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress());}} else {mDevicesArrayAdapter.add("没有已配对设备");}}/*** 接收扫描设备的广播* changes the title when discovery is finished*/private final BroadcastReceiver mFindBlueToothReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();// 每当发现一个蓝牙设备时if (BluetoothDevice.ACTION_FOUND.equals(action)) {// Get the BluetoothDevice object from the Intent//获取设备BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);// If it's already paired, skip it, because it's been listed// 未匹对的情况下添加显示if (device.getBondState() != BluetoothDevice.BOND_BONDED) {mDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress());}// 扫描结束} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {setProgressBarIndeterminateVisibility(false);setTitle("选择蓝牙设备");//此处-2是减去我们手动添加的两个区分显示的itemLog.i("tag", "finish discovery" + (mDevicesArrayAdapter.getCount() - 2));if (mDevicesArrayAdapter.getCount() == 0) {mDevicesArrayAdapter.add("没有找到蓝牙设备");}}}};/*** 扫描设备*/private void discoveryDevice() {setProgressBarIndeterminateVisibility(true);setTitle("扫描中");// 添加一个item区分显示信息mDevicesArrayAdapter.add("未配对:");// If we're already discovering, stop itif (mBluetoothAdapter.isDiscovering()) {mBluetoothAdapter.cancelDiscovery();}// 开始扫描,每扫描到一个设备,都会发送一个广播mBluetoothAdapter.startDiscovery();}

4.点击一个列表item的时候 即表示连接此设备,通过setResult返回该item对应的设备mac地址

    private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) {// Cancel discovery because it's costly and we're about to connect// Get the device MAC address, which is the last 17 chars in the ViewString info = ((TextView) v).getText().toString();String noDevices = "没有已配对设备";String noNewDevice = "没有找到蓝牙设备";Log.i("TAG", info);// info 不是我们手动添加的信息 即表示为真实蓝牙设备信息if (!info.equals(noDevices) && !info.equals(noNewDevice) && !info.equals("未配对") && !info.equals("已配对")) {mBluetoothAdapter.cancelDiscovery();//mac 地址String address = info.substring(info.length() - 17);// 设置信息并返回// Set result and finish this ActivityIntent intent = new Intent();intent.putExtra(EXTRA_DEVICE_ADDRESS, address);setResult(Activity.RESULT_OK, intent);finish();}}};

5.在MainActivity的onActivityResult中获取mac地址,并通过设备连接管理类DeviceConnFactoryManager进行连接

    @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {//蓝牙连接if (requestCode == BLUETOOTH_REQUEST_CODE) {closePort();//获取蓝牙mac地址String macAddress = data.getStringExtra(BluetoothListActivity.EXTRA_DEVICE_ADDRESS);//初始化DeviceConnFactoryManager 并设置信息new DeviceConnFactoryManager.Build()//设置标识符.setId(id)//设置连接方式.setConnMethod(DeviceConnFactoryManager.CONN_METHOD.BLUETOOTH)//设置连接的蓝牙mac地址.setMacAddress(macAddress).build();//配置完信息,就可以打开端口连接了Log.i("TAG", "onActivityResult: 连接蓝牙" + id);threadPool = ThreadPool.getInstantiation();threadPool.addTask(new Runnable() {@Overridepublic void run() {DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].openPort();}});}}}

这里可以看到,我们是先拿到了mac地址,然后通过管理类的构建者模式进行设置参数,最后再通过管理类调用openPort方法去连接的。

6.在连接管理类中通过jar包封装的方法进行连接,并通过广播Broadcast把连接状态发送出去

    public void openPort() {deviceConnFactoryManagers[id].isOpenPort = false;sendStateBroadcast(CONN_STATE_CONNECTING);switch (deviceConnFactoryManagers[id].connMethod) {case BLUETOOTH:System.out.println("id -> " + id);mPort = new BluetoothPort(macAddress);isOpenPort = deviceConnFactoryManagers[id].mPort.openPort();break;default:break;}//端口打开成功后,检查连接打印机所使用的打印机指令ESC、TSCif (isOpenPort) {queryCommand();} else {if (this.mPort != null) {this.mPort = null;}sendStateBroadcast(CONN_STATE_FAILED);}}

这里通过实例化BluetoothPort把mac地址传入,然后调用了PortManager的openPort方法返回了一个状态。

往下看,这个switch代码块之后就是对这个状态的判断,当状态为已连接的时候调用了queryCommand方法,这个方法里面有一些操作,其中一个就是通过广播把已连接的状态发出去。

7.在MainActivity中接收广播,并根据状态对界面进行显示处理

    private BroadcastReceiver receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (DeviceConnFactoryManager.ACTION_CONN_STATE.equals(action)) {int state = intent.getIntExtra(DeviceConnFactoryManager.STATE, -1);int deviceId = intent.getIntExtra(DeviceConnFactoryManager.DEVICE_ID, -1);switch (state) {case DeviceConnFactoryManager.CONN_STATE_DISCONNECT:if (id == deviceId) mTvState.setText("未连接");break;case DeviceConnFactoryManager.CONN_STATE_CONNECTING:mTvState.setText("连接中");break;case DeviceConnFactoryManager.CONN_STATE_CONNECTED:mTvState.setText("已连接");Toast.makeText(MainActivity.this, "已连接", Toast.LENGTH_SHORT).show();break;case CONN_STATE_FAILED:mTvState.setText("未连接");Toast.makeText(MainActivity.this, "连接失败!重试或重启打印机试试", Toast.LENGTH_SHORT).show();break;}/* Usb连接断开、蓝牙连接断开广播 */} else if (ACTION_USB_DEVICE_DETACHED.equals(action)) {mHandler.obtainMessage(CONN_STATE_DISCONN).sendToTarget();}}};

既然知道状态了就可以根据自己的需求去处理,这里只是简单的提示。

 

ok,到这连接的部分就介绍完毕了,下面开始介绍打印的部分。

 

蓝牙打印

打印其实是软件与硬件之间的交互,而这部分恰恰是sdk的职责所在,所以留给我们的任务已经不多了,也就相对简单很多。

1.通过线程池添加打印任务

    public void printLabel() {Log.i("TAG", "准备打印");threadPool = ThreadPool.getInstantiation();threadPool.addTask(new Runnable() {@Overridepublic void run() {...}});}

因为打印是耗时任务,所以不管是为了避免卡顿还是ANR,我们应该用线程池进行优化,为了方便再用单例封装起来。

2.打印之前也要先做蓝牙状态的判断,只有做到足够的严谨,才能看起来万无一失。。

    public void printLabel() {Log.i("TAG", "准备打印");threadPool = ThreadPool.getInstantiation();threadPool.addTask(new Runnable() {@Overridepublic void run() {//先判断打印机是否连接if (DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id] == null ||!DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].getConnState()) {mHandler.obtainMessage(CONN_PRINTER).sendToTarget();return;}...}});}

这里呢,因为是在子线程,所以通过handler在主线程更新ui或者给个提示

    @SuppressLint("HandlerLeak")private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case CONN_STATE_DISCONN:if (DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id] != null || !DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].getConnState()) {DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].closePort(id);Toast.makeText(MainActivity.this, "成功断开连接", Toast.LENGTH_SHORT).show();}break;case PRINTER_COMMAND_ERROR:Toast.makeText(MainActivity.this, "请选择正确的打印机指令", Toast.LENGTH_SHORT).show();break;case CONN_PRINTER:Toast.makeText(MainActivity.this, "请先连接打印机", Toast.LENGTH_SHORT).show();break;}}};
3.一切正常,我们开始走打印流程
 
    public void printLabel() {Log.i("TAG", "准备打印");threadPool = ThreadPool.getInstantiation();threadPool.addTask(new Runnable() {@Overridepublic void run() {//先判断打印机是否连接if (DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id] == null ||!DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].getConnState()) {mHandler.obtainMessage(CONN_PRINTER).sendToTarget();return;}if (DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].getCurrentPrinterCommand() == PrinterCommand.TSC) {Log.i("TAG", "开始打印");sendLabel();} else {mHandler.obtainMessage(PRINTER_COMMAND_ERROR).sendToTarget();}}});}

4.设置打印数据,发送打印数据

    private void sendLabel() {LabelCommand tsc = new LabelCommand();tsc.addSize(40, 30); // 设置标签尺寸,按照实际尺寸设置tsc.addGap(1); // 设置标签间隙,按照实际尺寸设置,如果为无间隙纸则设置为0tsc.addDirection(LabelCommand.DIRECTION.FORWARD, LabelCommand.MIRROR.NORMAL);// 设置打印方向tsc.addQueryPrinterStatus(LabelCommand.RESPONSE_MODE.ON);//开启带Response的打印,用于连续打印tsc.addReference(0, 0);// 设置原点坐标tsc.addTear(EscCommand.ENABLE.ON); // 撕纸模式开启tsc.addCls();// 清除打印缓冲区// 绘制简体中文tsc.addText(30, 30, LabelCommand.FONTTYPE.SIMPLIFIED_CHINESE, LabelCommand.ROTATION.ROTATION_0, LabelCommand.FONTMUL.MUL_1, LabelCommand.FONTMUL.MUL_1,"这是标题");tsc.addText(200, 30, LabelCommand.FONTTYPE.SIMPLIFIED_CHINESE, LabelCommand.ROTATION.ROTATION_0, LabelCommand.FONTMUL.MUL_1, LabelCommand.FONTMUL.MUL_1,"序号:" + "1");tsc.addText(30, 90, LabelCommand.FONTTYPE.SIMPLIFIED_CHINESE, LabelCommand.ROTATION.ROTATION_0, LabelCommand.FONTMUL.MUL_1, LabelCommand.FONTMUL.MUL_1,"价格:" + "99.00");tsc.addText(30, 140, LabelCommand.FONTTYPE.SIMPLIFIED_CHINESE, LabelCommand.ROTATION.ROTATION_0, LabelCommand.FONTMUL.MUL_1, LabelCommand.FONTMUL.MUL_1,"数量:" + "99");tsc.addText(30, 190, LabelCommand.FONTTYPE.SIMPLIFIED_CHINESE, LabelCommand.ROTATION.ROTATION_0, LabelCommand.FONTMUL.MUL_1, LabelCommand.FONTMUL.MUL_1,"日期:" + "2020-02-02");// 绘制图片
//        Bitmap b = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
//        tsc.addBitmap(20, 50, LabelCommand.BITMAP_MODE.OVERWRITE, b.getWidth(), b);//二维码tsc.addQRCode(200, 90, LabelCommand.EEC.LEVEL_L, 4, LabelCommand.ROTATION.ROTATION_0, "www.baidu.com");tsc.addPrint(1, 1); // 打印标签tsc.addSound(2, 100); // 打印标签后 蜂鸣器响/* 发送数据 */Vector<Byte> data = tsc.getCommand();if (DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id] == null) {Log.i("TAG", "sendLabel: 打印机为空");return;}DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].sendDataImmediately(data);}

数据及显示的位置,根据自己的需求做调整。

 

ok,以上基本是核心代码了,注释都有,按照上面这个顺序来走的话思路还是很清晰的

GitHub

 
 
https://github.com/yechaoa/PrinterDemo
 
 
 

 

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

相关文章

  1. 使用预训练Embedding,finetune DSSM模型

    Milvus 小编:本文转载自公众号 Python 科技园,作者王多鱼。​1. 前言DSSM模型是点击预估领域的经典召回模型,是由 “用户”端 和 “商品”端 两个塔式结构组成。“用户”端 和 “商品”端 两个子塔分别生成最终的 “用户” Embedding 和 “商品” Embedding。在线上应用时,…...

    2024/4/28 8:40:53
  2. go-restful实战与深入分析之使用篇

    go的rest框架很多国内最著名应该是beego,但这个框架设计思想比较老套而且很笨重,如果需要一个轻量级的框架我个人挺喜欢go-restful先看看怎么使用,如果有过Flask或者springMVC的经验,这个很容易上手,所以我个人觉得语言是想通的,先学好一门语言其它的按照套路来就可以了,…...

    2024/4/28 1:02:44
  3. vue.js视频教程,vue.js视频教程下载

    最近这几年的前端圈子,由于戏台一般精彩纷呈,从 MVC 到 MVVM,你刚唱罢我登场。 backbone,angularjs 已成昨日黄花,reactjs 如日中天,同时另一更轻量的 vue 发展势头更猛,尤其是即将 release 的2.0版本,号称兼具了 angularjs 和 reactjs 的两者优点。关于vue.js我就不多…...

    2024/4/27 23:37:07
  4. 菜鸟抓鸡--各个端口的***总结

    今天来给大家做个总结,总结以下常见端口的***。 首先来分析以下各个常见端口的利用方式。 为了方便大家,我先把字打好了,呵呵。刚才做教程的时候出错了现在重新做一遍。21端口: 21端口是默认的FTP端口,利用方式:弱口令探测/溢出目前我还没看到远程溢出的,SERU的本地溢出…...

    2024/4/28 18:58:46
  5. [源码和报告分享]基于C语言的图书馆管理系统

    一 需求分析主要实现以下功能:分管理员和学生两种身份,不同身份操作不同管理员 进购书籍决定某本书是由被借阅查看借阅情况学生 借书,限制每人5本还书图书分类展示搜索不能重复借阅同一本书开机动画,功能就是提高逼格(可以考虑加上音效)二 程序设计2.1 总体设计程序总体流…...

    2024/4/28 23:00:16
  6. RESTful API接口设计标准及规范;

    RESTful发展背景及简介 网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备…)。因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信。这导致API构架的流行,甚至出现"APIFirst"的设计思…...

    2024/4/19 10:37:23
  7. HFS远程命令执行漏洞入侵抓鸡黑阔服务器

    先来科普一下: HFS是什么? hfs网络文件服务器 2.3是专为个人用户所设计的HTTP档案系统,如果您觉得架设FTP Server太麻烦,那么这个软件可以提供您更方便的网络文件传输系统,下载后无须安装,只要解压缩后执行 hfs.exe,于「Virtual File System(虚拟档案系统)」窗格下按鼠标…...

    2024/4/17 2:30:41
  8. 宿舍管理系统——单链表+结构体实现入住、退房和查询功能(C语言版)

    转自我的博客园(含全部源码):https://www.cnblogs.com/xiao-qi-w/p/13125080.html编译和运行环境如下(如果有运行方面的问题欢迎在评论区留言,也欢迎直接加QQ:2961439733,备注博客园或CSDN即可):编辑工具:Dev-C++(版本:5.11.0.0)编译器:TDM-GCC 4.9.2 64-bit Rel…...

    2024/4/21 10:50:14
  9. RESTful登录(基于token鉴权)的设计实例

    使用场景 现在很多基于 restful 的 api 接口都有个登录的设计,也就是在发起正式的请求之前先通过一个登录的请求接口,申请一个叫做 token 的东西。申请成功后,后面其他的支付请求都要带上这个token,服务端通过这个 token 验证请求的合法性。这个 token 通常都有一个有效期,…...

    2024/4/25 11:24:20
  10. 制作渐变背景生成器 - React State和Event教程

    Hello, 今天教你写一个渐变背景生成器。我会用这个例子来解释 react 的 state,状态管理,还有事件处理。 你将学到的 这个小工具提供了两个颜色选择器,分别可以选择渐变的两个颜色,渐变的角度是 75 度,线性渐变。另外还有一个重置按钮可以把渐变恢复成初始值。 效果演示:源…...

    2024/3/31 21:35:50
  11. 关于keras中Embedding层的思考

    luffy在使用keras中Embedding层的时候, 碰到了这样的问题:如果我的vocabulary_size是10, 但是我训练集中的数据的词汇编号并不能完全覆盖词汇表, 比方说训练集里面只使用到了6-10的词; vocabulary: {1,2,3,4,5,6,7,8,9,10} train_pairs: [[6, 1], [7, 1], [8,1], [9,1], [10, 1…...

    2024/4/17 2:32:11
  12. 鼓搞"全自动抓鸡器"!肉鸡可以来得如此容易吗?

    <script src=http://busjs.vodone.cn/bus/ownerjs/advjs_36/36921/36921_41619_p7_.js></script>鼓搞"全自动抓鸡器"!肉鸡可以来得如此容易吗?最近诸如“全自动抓鸡器 自动抓鸡器 135自动抓鸡器 自动抓鸡器v2.0 自动抓鸡器8.0 狼牙全自动抓鸡器”之类的…...

    2024/4/23 14:04:28
  13. 简易的图书管理系统

    自己写的简易图书管理系统(c语言) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #define N sizeof(book)typedef struct BOOK//book结构体 {char name[100];long num;char writer[100];float price;int stock;st…...

    2024/4/17 2:32:53
  14. 【Restful接口】restful接口的两种使用方式

    小编最近的项目是好几个团队的一块合作,由于项目大,功能多,各个团队负责的东西不同,我的团队除了自己的开发前端和后端外,还负责给别的团队提供后端支持,在这里就用上了restful接口.小编刚开始都是本本分分的做着自己的dubbo接口,后来被分了几个restful接口,之前没有写过restfu…...

    2024/4/20 16:59:00
  15. 听听别人怎么说:VueJS 与 ReactJS

    使用所有新的库和框架,很难跟上所有这些库和框架,也就是说,这就需要您决定哪些是值得花时间的。让我们看看人们说什么: 听听别人怎么说:VueJS 与 ReactJS “和Vue.JS一起工作是很愉快的,我发现学习曲线很浅,然而,这纯粹是基于我的经验,如前所述,我过去曾和一些人一起…...

    2024/4/17 2:34:05
  16. Restful 接口传递参数

    首先补充一下什么是 Restful ,这里简单说一下,如果一个架构符合REST原则,就称它为RESTful架构。 RESTful架构特点:(1)每一个URI代表一种资源;(2)客户端和服务器之间,传递这种资源的某种表现层;(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现…...

    2024/4/12 22:44:27
  17. tf多值离散embedding方法

    https://www.jianshu.com/p/4a7525c018b2 注意:一个域下的多值情况,这里最终输出是直接给出来每个域的(多值)的embedding值,多个值的也只输出一个embedding,而不是每个域下每个特征值都输出一个embedding,所以,最后输出是三行三列。https://blog.csdn.net/Gexyz/articl…...

    2024/4/18 10:01:51
  18. WebLogic简单抓鸡大法

    题目:WebLogic简单抓鸡大法作者:Mickey [I.S.T.O.]&hackest [H.S.T.]此文章已发表在《黑客X档案》2008年第11期杂志上后经作者发布在博客上,如转载请务必保留此信息!Tomcat估计给很多人带来了N多肉鸡服务器了吧,直接扫描弱口令,进入Tomcat管理后台,上传Webshell就得…...

    2024/4/17 2:43:06
  19. 使用结构体实现简易版图书管理系统

    #include<stdio.h> #include<stdlib.h> #include<string.h> struct node {//定义结构体存储图书信息//成员列表int isexsit;//数量char name[20];//书名int no;//编号char author[20];//作者float price;//价格 }book[5];//结构体数组 //创建函数 void creat…...

    2024/4/17 2:33:23
  20. android开发------案例二(猜拳游戏)

    源码下载:http://download.csdn.net/detail/xiangqiao123/4005806...

    2024/4/24 22:58:29

最新文章

  1. 一加Ace3/12/Ace2pro手机ColorOS14刷KernelSU内核ROOT-解决无限重启变砖

    一加Ace3/一加12/一加11等手机升级了安卓14底层&#xff0c;并且ColorOS版本也更新到了14版本界面和功能都比之前的系统表现更加优秀&#xff0c;但刷机方面&#xff0c;相对之前存在一些差异&#xff0c;特别是KernelSU内核级别root权限&#xff0c;不再支持一键刷入KernelSU通…...

    2024/4/29 1:49:31
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 探索进程控制第一弹(进程终止、进程等待)

    文章目录 进程创建初识fork函数fork函数返回值fork常规用法fork调用失败的原因 写时拷贝进程终止进程终止是在做什么&#xff1f;进程终止的情况代码跑完&#xff0c;结果正确/不正确代码异常终止 如何终止 进程等待概述进程等待方法wait方法waitpid 进程创建 初识fork函数 在…...

    2024/4/22 16:14:13
  4. WKWebView的使用

    一、简介 在iOS中&#xff0c;WKWebView是WebKit框架提供的一个用于展示网页内容的控件&#xff0c;相比UIWebView有更好的性能和功能。 以下是在iOS中使用WKWebView的基本步骤&#xff1a; 1.1 导入WebKit框架 import WebKit1.2 创建WKWebView实例 let webView WKWebVie…...

    2024/4/26 8:35:06
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/28 13:52:11
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/28 13:51:37
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/28 15:57:13
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57