小城天长网站建设沈阳企业模板建站

张小明 2026/1/1 10:54:16
小城天长网站建设,沈阳企业模板建站,信阳企业网站开发,做网站网站怎么赚钱蓝牙页面-手动点击搜索蓝牙 然后选中某个打印机 进行手动点击打印--权限配置什么的 在上面某个都已配置了import React, { useEffect, useState, useRef } from react; import {Button,View,Alert,PermissionsAndroid,Platform,Text,ScrollView,TouchableOpacity, } from reac…蓝牙页面-手动点击搜索蓝牙 然后选中某个打印机 进行手动点击打印--权限配置什么的 在上面某个都已配置了import React, { useEffect, useState, useRef } from react; import { Button, View, Alert, PermissionsAndroid, Platform, Text, ScrollView, TouchableOpacity, } from react-native; import { BleManager, Device } from react-native-ble-plx; import { Buffer } from buffer; import iconv from iconv-lite; const manager new BleManager(); const BluetoothPrinter ({ route }) { const { arrearsData } route.params || {}; console.log(打印数据:, arrearsData); const [isScanning, setIsScanning] useState(false); const [foundDevices, setFoundDevices] useState([]); const [isConnected, setIsConnected] useState(false); const [currentDevice, setCurrentDevice] useState(null); const [servicesInfo, setServicesInfo] useState(); const [connectionStatus, setConnectionStatus] useState(未连接); const [writeCharacteristics, setWriteCharacteristics] useState([]); const [scanTimeLeft, setScanTimeLeft] useState(0); const scanTimeoutRef useRef(null); const scanTimerRef useRef(null); useEffect(() { const stateSubscription manager.onStateChange(state { console.log(蓝牙状态:, state); if (state PoweredOn) { console.log(蓝牙已开启); } else if (state PoweredOff) { Alert.alert(提示, 请开启手机蓝牙); setConnectionStatus(蓝牙未开启); stopScan(); // 蓝牙关闭时停止扫描 } }, true); return () { stateSubscription.remove(); stopScan(); // 组件卸载时停止扫描 }; }, []); // 权限请求函数 const requestBluetoothPermission async () { if (Platform.OS ! android) { return true; } try { const apiLevel Platform.Version; let permissions []; if (apiLevel 31) { permissions [ android.permission.BLUETOOTH_SCAN, android.permission.BLUETOOTH_CONNECT, android.permission.ACCESS_FINE_LOCATION, ]; } else { permissions [ android.permission.BLUETOOTH, android.permission.BLUETOOTH_ADMIN, android.permission.ACCESS_FINE_LOCATION, ]; } const granted await PermissionsAndroid.requestMultiple(permissions); const allGranted permissions.every( permission granted[permission] PermissionsAndroid.RESULTS.GRANTED, ); return allGranted; } catch (err) { console.warn(权限请求错误:, err); return false; } }; const scanDevices async () { try { const hasPermission await requestBluetoothPermission(); if (!hasPermission) { Alert.alert(权限被拒绝, 需要蓝牙权限才能扫描设备); return; } const state await manager.state(); if (state ! PoweredOn) { Alert.alert(蓝牙未开启, 请先开启手机蓝牙); return; } setIsScanning(true); setFoundDevices([]); setServicesInfo(); setConnectionStatus(扫描中...); setScanTimeLeft(15); // 设置15秒倒计时 console.log(开始扫描蓝牙设备...); // 启动倒计时 scanTimerRef.current setInterval(() { setScanTimeLeft(prev { if (prev 1) { clearInterval(scanTimerRef.current); return 0; } return prev - 1; }); }, 1000); // 15秒后自动停止扫描 scanTimeoutRef.current setTimeout(() { if (isScanning) { console.log(自动停止扫描); stopScan(); Alert.alert( 提示, 扫描已完成共找到 foundDevices.length 个设备, ); } }, 15000); manager.startDeviceScan(null, null, (error, device) { if (error) { console.log(扫描错误:, error); stopScan(); setConnectionStatus(扫描失败); return; } if (device device.name) { console.log(发现设备:, device.name, 信号:, device.rssi); setFoundDevices(prev { const exists prev.find(d d.id device.id); if (!exists) { return [ ...prev, { id: device.id, name: device.name || 未知设备, localName: device.localName, rssi: device.rssi, isPrinter: isLikelyPrinter(device), }, ].sort((a, b) b.rssi - a.rssi); } return prev; }); } }); } catch (error) { console.log(扫描失败:, error); stopScan(); setConnectionStatus(扫描失败); } }; // 停止扫描函数 const stopScan () { try { manager.stopDeviceScan(); } catch (error) { console.log(停止扫描错误:, error); } setIsScanning(false); setConnectionStatus(扫描完成); // 清除定时器 if (scanTimeoutRef.current) { clearTimeout(scanTimeoutRef.current); scanTimeoutRef.current null; } if (scanTimerRef.current) { clearInterval(scanTimerRef.current); scanTimerRef.current null; } setScanTimeLeft(0); }; // 判断设备是否可能是打印机 const isLikelyPrinter device { if (!device.name) return false; const name device.name.toLowerCase(); const localName device.localName?.toLowerCase() || ; const printerKeywords [ printer, print, prt, pos, receipt, bt, blue, thermal, 58mm, 80mm, tsc, rtk, u26, xp, sp, ]; return printerKeywords.some( keyword name.includes(keyword) || localName.includes(keyword), ); }; const discoverAllServicesAndCharacteristics async device { try { console.log(开始发现服务和特征...); setConnectionStatus(发现服务中...); await device.discoverAllServicesAndCharacteristics(); const services await device.services(); console.log(发现的服务数量:, services.length); const allWriteCharacteristics []; for (const service of services) { try { const characteristics await device.characteristicsForService( service.uuid, ); for (const char of characteristics) { // 收集所有可写特征 if (char.isWritableWithResponse || char.isWritableWithoutResponse) { allWriteCharacteristics.push({ serviceUUID: service.uuid, characteristicUUID: char.uuid, isWritableWithResponse: char.isWritableWithResponse, isWritableWithoutResponse: char.isWritableWithoutResponse, }); } } } catch (charError) { console.log(获取服务 ${service.uuid} 特征失败:, charError); } } console.log(所有可写特征:, allWriteCharacteristics); return allWriteCharacteristics; } catch (error) { console.log(发现服务失败:, error); throw error; } }; // 连接设备不打印 const connectToDevice async (deviceId, deviceName) { try { // 连接设备前先停止扫描 stopScan(); setConnectionStatus(连接中...); Alert.alert(提示, 正在连接: ${deviceName}); console.log(连接设备:, deviceName); // 连接设备 const device await manager.connectToDevice(deviceId, { timeout: 15000, }); console.log(设备连接成功); setIsConnected(true); setCurrentDevice(device); setConnectionStatus(已连接); // 发现所有服务和特征 const characteristics await discoverAllServicesAndCharacteristics( device, ); setWriteCharacteristics(characteristics); if (characteristics.length 0) { throw new Error(未找到可写的特征); } Alert.alert( 连接成功, 已连接到: ${deviceName}\n\n发现 ${characteristics.length} 个可写特征\n现在可以点击打印按钮进行打印, ); } catch (error) { console.log(连接失败:, error); setIsConnected(false); setCurrentDevice(null); setWriteCharacteristics([]); setConnectionStatus(连接失败); throw error; } }; // 断开连接 const disconnectDevice async () { if (currentDevice) { try { await manager.cancelDeviceConnection(currentDevice.id); setIsConnected(false); setCurrentDevice(null); setWriteCharacteristics([]); setConnectionStatus(已断开); console.log(设备已断开连接); } catch (error) { console.log(断开连接错误:, error); } } }; // 打印函数 const handlePrint async () { if (!currentDevice || writeCharacteristics.length 0) { Alert.alert(错误, 请先连接打印机); return; } try { setConnectionStatus(打印中...); // 准备打印数据 const printContent [ \x1B\x40, // 初始化打印机 \x1B\x61\x01, // 居中对齐 \x1B\x45\x01, // 加粗 用水通知单 \r\n, \x1B\x45\x00, // 关闭加粗 \x1B\x61\x00, // 左对齐 本期应收: ${arrearsData?.Payment || }\r\n, 总欠费金额: ${arrearsData?.TotalPayment || }\r\n, 余额: ${arrearsData?.Balance || }\r\n, --------------------------------\r\n, \x1B\x45\x01, // 加粗 温馨提示:请及时通过微信公众号或者营业厅进行缴费\r\n, \x1B\x45\x00, // 取消加粗 打印日期: ${new Date().toLocaleString()}\r\n, \r\n, 谢谢合作\r\n, \r\n\r\n\r\n, \x1D\x56\x00, // 切纸 ].join(); // 使用 GBK 编码 const gbkBuffer iconv.encode(printContent, gbk); const base64Data gbkBuffer.toString(base64); let printSuccess false; let lastError null; // 尝试所有可写特征 for (const charInfo of writeCharacteristics) { try { console.log(尝试特征: ${charInfo.characteristicUUID}); if (charInfo.isWritableWithResponse) { await currentDevice.writeCharacteristicWithResponseForService( charInfo.serviceUUID, charInfo.characteristicUUID, base64Data, ); } else { await currentDevice.writeCharacteristicWithoutResponseForService( charInfo.serviceUUID, charInfo.characteristicUUID, base64Data, ); } printSuccess true; break; } catch (error) { console.log( 特征 ${charInfo.characteristicUUID} 失败:, error.message, ); lastError error; } } if (printSuccess) { Alert.alert(打印成功, 用水通知单已发送到打印机); setConnectionStatus(打印成功); } else { throw new Error(所有特征尝试失败: ${lastError?.message}); } } catch (error) { console.log(打印失败:, error); Alert.alert(打印失败, error.message); setConnectionStatus(打印失败); } }; const getSignalStrength rssi { if (rssi -50) return { text: 强, color: green }; if (rssi -70) return { text: 中, color: orange }; return { text: 弱, color: red }; }; return ( View style{{ padding: 20, flex: 1, backgroundColor: white }} View style{{ marginBottom: 20, padding: 10, backgroundColor: #f0f0f0, borderRadius: 5, }} Text style{{ fontWeight: bold, fontSize: 16 }} 状态: {connectionStatus} {isScanning (${scanTimeLeft}秒后自动停止)} /Text {currentDevice ( Text style{{ fontSize: 14, color: green, marginTop: 5 }} 已连接设备: {currentDevice.name} /Text )} {writeCharacteristics.length 0 ( Text style{{ fontSize: 12, color: blue, marginTop: 2 }} 发现 {writeCharacteristics.length} 个可写特征 /Text )} /View {/* 操作按钮区域 */} View style{{ flexDirection: row, flexWrap: wrap, marginBottom: 20, gap: 10, }} Button title{isScanning ? 停止扫描 (${scanTimeLeft}s) : 扫描设备} onPress{isScanning ? stopScan : scanDevices} color{isScanning ? red : #007AFF} / {isConnected ( Button title打印通知单 onPress{handlePrint} colorgreen / Button title断开连接 onPress{disconnectDevice} colororange / / )} /View ScrollView style{{ flex: 1 }} {foundDevices.length 0 ( View Text style{{ fontWeight: bold, marginBottom: 10, fontSize: 16 }} 发现的设备 ({foundDevices.length}个): /Text {foundDevices.map(device { const signal getSignalStrength(device.rssi); return ( TouchableOpacity key{device.id} style{{ marginBottom: 12, padding: 12, backgroundColor: device.isPrinter ? #e8f5e8 : #f5f5f5, borderRadius: 8, borderWidth: 1, borderColor: device.isPrinter ? green : #ddd, }} onPress{() connectToDevice(device.id, device.name)} Text style{{ fontWeight: bold, color: device.isPrinter ? green : black, fontSize: 16, }} {device.name} {device.isPrinter ? ️ : } /Text Text style{{ fontSize: 12, color: gray, marginTop: 4 }} ID: {device.id} /Text Text style{{ fontSize: 12, color: gray }} 信号强度: {device.rssi}dBm ({signal.text}) /Text {device.localName device.localName ! device.name ( Text style{{ fontSize: 12, color: gray }} 本地名: {device.localName} /Text )} Text style{{ fontSize: 12, color: device.isPrinter ? green : blue, marginTop: 4, fontWeight: bold, }} {device.isPrinter ? 点击连接此打印机 : 点击连接此设备} /Text /TouchableOpacity ); })} /View )} {!isScanning foundDevices.length 0 ( View style{{ alignItems: center, marginTop: 50 }} Text style{{ textAlign: center, color: gray, fontSize: 16, marginBottom: 10, }} 点击扫描设备开始搜索蓝牙设备 /Text Text style{{ textAlign: center, color: darkgray, fontSize: 14 }} 扫描将在15秒后自动停止 /Text /View )} {isConnected ( View style{{ marginTop: 20, padding: 15, backgroundColor: #e8f5e8, borderRadius: 8, }} Text style{{ fontWeight: bold, fontSize: 16, color: green, marginBottom: 10, }} ✅ 已连接打印机 /Text Text style{{ fontSize: 14, marginBottom: 5 }} 设备名称: {currentDevice?.name} /Text Text style{{ fontSize: 14, marginBottom: 5 }} 可写特征: {writeCharacteristics.length} 个 /Text Text style{{ fontSize: 12, color: darkgreen }} 现在可以点击打印通知单按钮进行打印 /Text /View )} /ScrollView /View ); }; export default BluetoothPrinter;2.注意使用GBK编码打印 解决打印乱码问题
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

站内推广策略昆明软件定制

Kotaemon支持OPA策略引擎吗?细粒度访问控制 在企业级智能对话系统日益复杂的今天,一个看似简单的问题——“谁可以访问什么信息”——往往牵动着整个系统的安全命脉。尤其是在金融、医疗、法律等高敏感领域,一次越权的知识检索可能带来的不仅…

张小明 2025/12/30 17:57:08 网站建设

北京网站建设价格天网络推广活动策划

智能学习助手完全指南:5分钟掌握U校园自动答题技巧 【免费下载链接】AutoUnipus U校园脚本,支持全自动答题,百分百正确 2024最新版 项目地址: https://gitcode.com/gh_mirrors/au/AutoUnipus 还在为U校园繁重的习题任务而困扰?每天面对海量的单选…

张小明 2025/12/31 23:09:59 网站建设

个人网站制作模板图片华为物联网开发平台

安卓实用应用推荐 在当今数字化时代,安卓应用为我们的生活带来了极大的便利。无论是获取新闻天气信息,还是进行摄影和视频编辑,都有众多优秀的应用可供选择。下面为大家介绍一些实用的安卓应用。 新闻与天气类应用 WeatherBug Elite :售价1.99美元。很多人出门不带伞被…

张小明 2025/12/30 17:57:03 网站建设

做影视网站被告怎么办企业建站套餐

第一章:MCP Azure量子服务配置概述Azure量子服务(Azure Quantum)是微软提供的云端量子计算平台,允许开发者和研究人员通过高级编程模型访问量子硬件与模拟器。该服务支持多种量子开发工具包,其中以Q#语言为核心&#x…

张小明 2025/12/30 17:57:01 网站建设

drupal网站建设 北京做一网站

缠论量化分析平台完整部署指南:从零搭建专业可视化系统 【免费下载链接】chanvis 基于TradingView本地SDK的可视化前后端代码,适用于缠论量化研究,和其他的基于几何交易的量化研究。 缠论量化 摩尔缠论 缠论可视化 TradingView TV-SDK 项目…

张小明 2025/12/30 17:56:59 网站建设

明星网页网站制作短网址在线生成哪个好

使用 Azure 表实现 NoSQL 操作 1. 简介 Azure 存储库借助 WCF Data Services 和 OData 在 Azure 存储服务 REST API 中调用表操作。该库具备特定于 Azure 表服务的功能,例如重试功能(在操作失败时自动重试)和延续令牌功能(支持服务器端分页)。 2. 数据操作基础 在存储…

张小明 2025/12/30 19:51:51 网站建设