藍牙數據通訊,實現內網電腦訪問外網電腦

? ? ? ?最近突然想到了一個可以繞開單位安全管控軟件,讓單位內部辦公電腦連上外網的方法。大概是這個樣子,讓單位辦公電腦與自己的外網電腦進行藍牙配對,然后用配對成功的藍牙進行網絡數據交互。這里大家可能會想用一下藍牙的網絡共享功能,分分鐘不就實現了,其實這里是有問題的,因為這樣會在單位內部辦公電腦上虛擬出一個網卡,馬上會被單位安全管控軟件識別,進而被網絡管理員發現,至少我們單位是這樣的,所以不能這樣用,我這里用Java寫了一個藍牙數據通訊的程序,同時考慮到藍牙數據通訊較慢,直接用瀏覽器訪問太慢,又用Python爬了幾個自己經常訪問的網站,用爬蟲只訪問有用信息,減少藍牙數據通訊的數據量,最后總體感覺相當不錯。下面以辦公電腦連接外網實現中英文翻譯為例進行介紹。拓撲圖如下:

藍牙數據交換功能用Java語言實現,其中用到了[bluecove-2.1.1.jar]藍牙功能操作包。客戶端安裝在內網電腦上(比如辦公電腦),在接收到內網電腦訪問外部網絡訪的Socket請求后,自動與外網電腦進行藍牙連接,并將Socket通訊數據轉為藍牙通訊數據,鏡像至外網,主要代碼如下:

public class SocketServer {private String bluetoothRemoteUrl = null;public SocketServer() {}public void start() throws IOException {try (ServerSocket server = new ServerSocket(SocketConfig.SERVER_PORT,SocketConfig.SERVER_BACKLOG,InetAddress.getByName(SocketConfig.SERVER_ADDRESS))) {System.out.print("Socket通訊監聽[" + SocketConfig.SERVER_ADDRESS + ":" + SocketConfig.SERVER_PORT + "]啟動成功...");ExecutorService service = Executors.newFixedThreadPool(BluetoothConfig.SERVICE_POOL);System.out.println("服務線程池[" + BluetoothConfig.SERVICE_POOL + "]初始化成功...");Socket socket = null;BluetoothChannel channel = null;while(true) {try {socket = server.accept();System.out.println("客戶端[" + socket.getInetAddress().getHostAddress() + "]已連接...");}catch(Exception e) {System.out.println("客戶端連接錯誤[" + e.getMessage() + "]");if (socket != null) {socket.close();}continue;}System.out.print("開始與藍牙服務[" + BluetoothConfig.REMOTE_UUID + "@" + BluetoothConfig.REMOTE_ADDRESS + "]建立連接...");try {if (StrUtil.isBlank(bluetoothRemoteUrl)) {bluetoothRemoteUrl = BluetoothTools.fetchRemoteUrl(BluetoothConfig.REMOTE_ADDRESS,new UUID(BluetoothConfig.REMOTE_UUID,true),ServiceRecord.NOAUTHENTICATE_NOENCRYPT,false);}channel = BluetoothTools.open(bluetoothRemoteUrl);System.out.println("已連接");}catch (Exception e) {System.out.println("連接錯誤[" + e.getMessage() + "]");if (socket != null) {socket.close();}if (channel != null) {channel.close();}continue;}service.execute(new SendService(socket,channel));service.execute(new RecvService(socket,channel));}}}

服務端安裝在外網電腦,在接收到客戶端藍牙連接請求后,自動與代理服務器(或目標網站)進行Socket連接,并重新將藍牙通訊數據轉為Socket通訊數據,發送至代理服務器(或目標網站),然后接收代理服務器(或目標網站)響應,鏡像至客戶端,主要服務端代碼如下:

public class BluetoothServer {public BluetoothServer() {}public void start() throws BluetoothStateException,IOException {LocalDevice bluetooth = LocalDevice.getLocalDevice();bluetooth.setDiscoverable(DiscoveryAgent.GIAC);StreamConnectionNotifier notifier = (StreamConnectionNotifier)Connector.open("btspp://localhost:" + BluetoothTools.genUuid(BluetoothConfig.SERVICE_UUID, true)+ ";name=" + BluetoothConfig.SERVICE_NAME);System.out.print("藍牙[" + bluetooth.getFriendlyName() + "]"+ "通訊監聽[" + BluetoothConfig.SERVICE_UUID + "@" + bluetooth.getBluetoothAddress() + "]啟動成功...");ExecutorService service = Executors.newFixedThreadPool(BluetoothConfig.SERVICE_POOL);System.out.println("服務線程池[" + BluetoothConfig.SERVICE_POOL + "]初始化成功...");BluetoothChannel channel = null;RemoteDevice device = null;Socket socket = null;while(true) {try {channel = new BluetoothChannel(notifier.acceptAndOpen());device = RemoteDevice.getRemoteDevice(channel.getStreamConnection());System.out.println("客戶端藍牙[" + device.getFriendlyName(true) + "]"+ "[" + device.getBluetoothAddress() + "]已連接...");}catch (Exception e) {System.out.println("客戶端藍牙連接錯誤[" + e.getMessage() + "]");if (channel != null) {channel.close();}continue;}System.out.print("開始與目標服務器[" + SocketConfig.TARGET_ADDRESS + ":" + SocketConfig.TARGET_PORT + "]建立連接...");try {socket = new Socket();socket.connect(new InetSocketAddress(SocketConfig.TARGET_ADDRESS,SocketConfig.TARGET_PORT),SocketConfig.TARGET_COTIMEOUT);socket.setSoTimeout(SocketConfig.TARGET_SOTIMEOUT);System.out.println("已連接");}catch (Exception e) {System.out.println("連接錯誤[" + e.getMessage() + "]");if (socket != null) {socket.close();}if (channel != null) {channel.close();}continue;}service.execute(new SendService(socket,channel));service.execute(new RecvService(socket,channel));}}}

藍牙數據流處理主要代碼如下:

public class BluetoothChannel implements Closeable {private StreamConnection connection = null;private DataInputStream dInStrm = null;private DataOutputStream dOutStrm = null;private boolean closed = true;public BluetoothChannel(StreamConnection connection)throws IOException {this.connection = connection;this.dInStrm = connection.openDataInputStream();this.dOutStrm = connection.openDataOutputStream();this.closed = false;}public DataInputStream getDataInputStream() {return this.dInStrm;}public DataOutputStream getDataOutputStream() {return this.dOutStrm;}public boolean isClosed() {return this.closed;}@Overridepublic void close() throws IOException {dOutStrm.close();dInStrm.close();connection.close();closed = true;}}

數據接收主要代碼下:

public class RecvService implements Runnable {private Socket socket = null;private BluetoothChannel channel = null;public RecvService(Socket socket,BluetoothChannel channel) {this.socket = socket;this.channel = channel;}@Overridepublic void run() {try {InputStream in = channel.getDataInputStream();OutputStream out = new DataOutputStream(socket.getOutputStream());int len = 0;byte[] data = new byte[CommonConfig.STREAM_BUFFER];try {while((len = in.read(data,0,CommonConfig.STREAM_BUFFER)) != -1) {out.write(data,0,len);out.flush();}} catch (IOException e) {}if (!channel.isClosed()) {channel.close();}if (!socket.isClosed()) {socket.close();}}catch (Exception e) {System.out.println("數據通訊處理錯誤[" + e.getMessage() + "]");e.printStackTrace();}}}

數據發送主要代碼如下:

public class SendService implements Runnable {private Socket socket = null;private BluetoothChannel channel = null;public SendService(Socket socket,BluetoothChannel channel) {this.socket = socket;this.channel = channel;}@Overridepublic void run() {try {InputStream in = new DataInputStream(socket.getInputStream());OutputStream out = channel.getDataOutputStream();int len = 0;byte[] data = new byte[CommonConfig.STREAM_BUFFER];try {while ((len = in.read(data,0,CommonConfig.STREAM_BUFFER)) != -1) {out.write(data,0,len);out.flush();}}catch (IOException e) {}if (!socket.isClosed()) {socket.close();}if (!channel.isClosed()) {channel.close();}}catch (Exception e) {System.out.println("數據通訊處理錯誤[" + e.getMessage() + "]");e.printStackTrace();}}}

注:以上java程序只是實現通過藍牙通訊實現內外網數據的鏡像,沒有代理功能,所以如果要實現對外網網站的訪問還需要在外網電腦上安裝代理服務器(可以使用目前較為流行的開源代理服務器nginx)。

中英文翻譯應用為用Python寫的一段爬蟲程序,使用cmd命令行下打開(python lexi.py),自動識別中英文,輸入中文翻譯成英文,輸入英文翻譯成中文。主要用到了requests包。具體代碼如下:

# -*- coding:utf-8 -*-import json
import reimport requestsheaders = {'accept':'application/json, text/plain, */*','accept-encoding':'gzip, deflate, br, zstd','accept-language':'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','connection':'keep-alive','cookie':'ABTEST=0|1746782609|v17; SUID=1551A20B3E50A20B00000000681DC991; wuid=1746782609372; SUV=1746782609241; SNUID=93D7248D8680B23602BCFFD687A0005C; translate.sess=4b4c4608-becd-44e0-987c-d4e520a81c55; SGINPUT_UPSCREEN=1746782613767; FQV=d0ca8207c4cbb93a9ca15fda8d652a86','host':'fanyi.sogou.com','origin':'http://fanyi.sogou.com','referer':'http://fanyi.sogou.com/text','sec-ch-ua':'"Chromium";v="136", "Microsoft Edge";v="136", "Not.A/Brand";v="99"','sec-ch-ua-mobile':'?0','sec-ch-ua-platform':'"Windows"','sec-fetch-dest':'empty','sec-fetch-mode':'cors','sec-fetch-site':'same-origin','content-type':'application/json; charset=utf-8','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0'
}
pattern = re.compile(pattern = r'<script>window\.__INITIAL_STATE__=(?P<data>.*?);\(function\(\){.*?</script>',flags = re.S)  #爬取翻譯數據正則
proxies = {'http': 'http://xx.xx.xx.xx:xxxx'    #填寫安裝在內網的客戶端地址
}def http_get(keyword,trans_to):response = requests.get(url = f'http://fanyi.sogou.com/text?keyword={keyword}&transfrom=auto&transto={trans_to}&model=general',headers = headers,proxies = proxies)response.encoding = 'utf-8'text = Noneif (response.status_code == 200):text = response.textresponse.close()return textdef chinese_to_english(json):print('詞典釋義:')for mean  in json['textTranslate']['translateData']['wordCard']['secondQuery']:print(f'  {mean['k']:<20}{mean['v']}')print('\n翻譯結果:')print(f'  {json['textTranslate']['translateData']['sentencesData']['data']['trans_result'][0]['trans_text']}')def english_to_chinese(json):print('讀音:')voices = json['voice']['from'].get('list')if (voices):for voice in voices:print(f'  {voice['abbr']}[{voice['phonetic']}]',end='')print('\n詞典釋義:')for mean in json['textTranslate']['translateData']['wordCard']['usualDict']:print(f'  {mean['pos']:<10}{mean['values'][0]}')print('\n翻譯結果:')print(f'  {json['textTranslate']['translateData']['translate']['dit']}')def is_chinese_char(char):#根據Unicode編碼范圍,判斷是否是中文字符if (char >= '\u4e00' and char <= '\u9fff') \or (char >= '\u3400' and char <= '\u4dbf') \or (char >= '\u20000' and char <= '\u2a6df') \or (char >= '\u3000' and char <= '\u303f'):return Trueelse:return Falsedef is_chinese_str(str):#統計字符串中的中文字符數count = sum(1 for c in str if is_chinese_char(c))if (len(str) / 2 <= count): #中文字符數占主導認為是中文(中文字符超過一半)return Trueelse:return Falseif (__name__ == '__main__'):print('翻譯程序已啟動...按[.]或[。]退出...')while (True):keyword = input('>')if ('.' == keyword or '。' == keyword): #按下 . 或 。 退出應用exit(0)if (is_chinese_str(keyword)):#通過正則提取翻譯結果數據data = pattern.search(string = http_get(keyword = keyword, trans_to = 'en')).group('data')if (not data):print('響應數據異常')exit(10)chinese_to_english(json.loads(data))else:#通過正則提取翻譯結果數據data = pattern.search(string = http_get(keyword = keyword, trans_to = 'zh-CHS')).group('data')if (not data):print('響應數據異常')exit(10)english_to_chinese(json.loads(data))

整個程序效果如下:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85971.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85971.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85971.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

硬件面經-具身機器人通用技術要求

目錄 簡介 場景 技術面試 設計知識點 總結 簡介 最近機器人特別的火。所以收集了一些關于機器人的面試及要求 場景 目前具身機器人賽道可謂是十分火熱,全國大大小小崛起了幾十家具身機器人公司,國外比較出名的有波士頓動力,特斯拉等,國內目前比較火的就是宇樹,眾擎…

DeepSeek生成HTML5圖片拼接工具

讓DeepSeek生成一個HTML5圖片拼接工具&#xff0c;給的提示詞如下 提示詞(prompt) 幫我生成一個可以將兩張圖片拼接到一起的程序 支持橫向拼接和豎向拼接&#xff0c;可以用html5實現功能嗎&#xff1f; DeepSeek大概20秒左右就做好了&#xff0c;而且像這么簡單的功能的話也沒…

Java面試復習指南:Java基礎、面向對象編程與并發編程

Java面試復習指南&#xff1a;Java基礎、面向對象編程與并發編程 1. Java基礎 概念解析: Java是一種面向對象的編程語言&#xff0c;具有跨平臺的特性。 核心原理: JVM負責Java程序的跨平臺運行&#xff0c;通過字節碼來實現。 高頻面試問題: Java如何實現跨平臺&#xff…

LeeCode2566替換一個數字后的最大差值

項目場景&#xff1a; 給你一個整數 num 。你知道 Danny Mittal 會偷偷將 0 到 9 中的一個數字 替換 成另一個數字。 請你返回將 num 中 恰好一個 數字進行替換后&#xff0c;得到的最大值和最小值的差為多少。 注意&#xff1a; 當 Danny 將一個數字 d1 替換成另一個數字 …

李宏毅2025《機器學習》第三講-AI的腦科學

在之前的課程中探討了如何利用大模型構建AI Agent,本科將暫時放下應用層面的探索,拿起“手術刀”和“顯微鏡”,深入剖析LLM的“大腦”,帶您踏上一場“AI腦神經科學”的旅程。課程不討論模型的訓練過程,而是假設我們擁有一個已經訓練好的、功能完備的LLM。我們的目標是:理…

CVPR 2025 | 微米級光影CT精度!復旦騰訊優圖開源Real-IAD D3數據集

【導讀】 本文介紹了復旦聯合騰訊優圖發布高精度多模態數據集Real-IAD D&#xff0c;并基于此數據集提出了一種創新的多模態融合檢測方法&#xff0c;數據集已被CVPR 2025收錄&#xff0c;并開源。>>更多資訊可加入CV技術群獲取了解哦~ 目錄 一、Real-IAD D的創新之處…

解決mysql左連接加where就不會保留左表中的全部數據的問題

在SQL中使用MySQL的LEFT JOIN操作時,如果加入了WHERE條件,確實會影響結果集的完整性,特別是如果你在WHERE條件中使用了JOIN的另一張表中的字段作為過濾條件。這是因為當你在WHERE子句中加入了對JOIN另一張表的過濾條件時,實際上你是在執行一個INNER JOIN(內連接)而非LEFT…

算法與數據結構:動態規劃DP

文章目錄 動態規劃算法全面解析一、核心思想與基本概念二、動態規劃與其他算法的區別三、動態規劃的解題步驟四、經典案例解析1. **斐波那契數列&#xff08;Fibonacci&#xff09;**2. **0-1背包問題&#xff08;0-1 Knapsack&#xff09;**3. **最長公共子序列&#xff08;LC…

Coilcraft電感上的橫線是什么意思?電感有方向么?

通常我們會認為電容、電感、電阻這幾類無源器件沒有方向性&#xff0c;在布局和貼片時可以任意方向放置&#xff0c;也不會在PCB上增加絲印標識說明其方向。與此相互印證的是&#xff0c;電容表面無絲印&#xff0c;無法識別方向&#xff1b;電阻表面一般只有包含阻值大小的數字…

通過Docker掛載nginx并修改頁面

1&#xff1a;通過docker創建nginx&#xff1a; 首先關閉原來的Docker&#xff08;防止端口號沖突&#xff09; sudo nginx -s stop 直接啟動 Nginx 進程 sudo nginx 啟動nginx&#xff1a; docker run -di --namemynginx -p 80:80 nginx cd /etc/nginx docker run -d …

力扣1124. 表現良好的最長時間段

這一題我看到數據范圍是10^4&#xff0c;暗自竊喜能用雙重循環&#xff0c;看題目是典型的前綴和哈希。不過需要一個轉換將大于8小時的轉化為1&#xff0c;其他都為-1&#xff0c;方便計算&#xff0c;之前的題目中也有這種方法。 那這樣就簡單了 class Solution { public:int…

EDA2算法速通(編者崩潰版)

這個內容是用來回憶一下EDA2涉及的算法和解題的主要步驟&#xff1a; 有疑問或發現錯誤可以私信來討論 高級綜合概述 柏拉圖優化&#xff1a;這個是來判斷是否有哪些節點能完全被其他節點優化掉。比如&#xff08;1,2&#xff09;這個節點就可以完全優化&#xff08;3,4&…

雷池waf配置第三方登錄-釘釘配置詳細教程

雷池waf配置第三方登錄-釘釘配置詳細教程 前往釘釘開放平臺https://open.dingtalk.com/ 選擇一個登錄方式登錄釘釘開放平臺 選擇一個自己所管理的組織 登錄成功后點擊我的后臺 選擇應用開發 在釘釘應用下點擊創建應用 填寫應用名稱和應用描述后點擊保存 點擊網頁…

神經網絡中的均方誤差(Mean Squared Error)詳解

引言 在機器學習和神經網絡領域&#xff0c;損失函數&#xff08;Loss Function&#xff09;是衡量模型預測值與真實值之間差異的關鍵指標。均方誤差&#xff08;Mean Squared Error, MSE&#xff09;作為一種經典的損失函數&#xff0c;因其簡單性、可解釋性和數學上的優良性…

day036-lsyncd實時同步服務與網站存儲架構

文章目錄 1. 實時同步工具2. lsyncd 實時同步服務2.1 環境準備2.2 rsync準備2.2.1 服務端檢查2.2.2 客戶端檢查2.2.3 備份測試 2.3 配置lsyncd2.3.1 安裝軟件2.3.2 編寫配置文件 2.4 測試 3. 案例-網站存儲架構3.1 rsync服務配置3.1.1 服務端配置3.1.2 客戶端配置 3.2 lsyncd服…

React Native WebView鍵盤難題:如何讓輸入框不被鍵盤遮擋?

寫在前面 “明明點擊了輸入框&#xff0c;鍵盤卻把內容頂得不見蹤影&#xff01;” —— 這可能是React Native開發者使用WebView時最頭疼的問題之一。 想象一下&#xff1a;你的App內嵌了一個網頁表單&#xff0c;用戶興奮地準備填寫信息&#xff0c;結果鍵盤彈出后&#xf…

Web攻防-XSS跨站瀏覽器UXSS突變MXSSVueReactElectron框架JQuery庫寫法和版本

知識點&#xff1a; 1、Web攻防-XSS跨站-瀏覽器&轉換-UXSS&MXSS 2、Web攻防-XSS跨站-框架和庫-VUE&React&Electron&JQuery 分類&#xff1a; 1、框架或三方庫的XSS(Vue、React、Electron、JQuery) 2、瀏覽器或插件的XSS(UXSS) 3、客戶端預覽內核的XSS(MXS…

PyTorch 中torch.clamp函數使用詳解和實戰示例

torch.clamp 是 PyTorch 中的一個非常有用的函數&#xff0c;它可以將張量的每個元素限制在一個指定的范圍內&#xff0c;超出范圍的元素將被裁剪為邊界值。 函數簽名&#xff1a; torch.clamp(input, minNone, maxNone, outNone)參數說明&#xff1a; input&#xff1a;輸入…

詳解Redis數據庫和緩存不一致的情況及解決方案

數據庫與緩存不一致是分布式系統中常見問題&#xff0c;本質是數據在緩存層和存儲層出現版本差異。 一、并發寫操作導致不一致&#xff08;最常見&#xff09; 場景描述 線程A更新數據庫 → 線程B更新數據庫 → 線程B更新緩存 → 線程A更新緩存 結果&#xff1a;緩存中存儲的…

湖北理元理律師事務所:企業債務危機的“急診科”式應對方案

當企業陷入債務危機時&#xff0c;傳統“頭痛醫頭”的應對往往加速死亡。本方案基于企業債務重組實務&#xff0c;提煉出 “止血-清創-修復”三階急救體系&#xff0c;助力企業守住生存底線。 第一階段&#xff1a;精準止血&#xff08;0-30天關鍵期&#xff09; 目標&#x…