1.前言

我终于不需要调试一个硬件设备装一个APP了,在应用商店下载别人的网络调试助手,又有广告,还不如直接写一个比较完整的网络调试助手。目前支持的功能有tcp客户端和服务端,udp,低功耗蓝牙客户端和服务端,经典蓝牙客户端和服务端。低功耗蓝牙可以动态获取服务端的UUID。

2.实现的方法

我是怎么实现一个个调试助手的呢?其实就是先下载别人的APP来测试,例如我先做的是tcp客户端,那我就会用我的客户端去和下载的APP开的服务端进行测试,测试成功了就写下一个,以此类推。我记得大三的时候,有个师兄说过,我们班的网络知识太差了,确实是,真的很差。我也是临近大四毕业才开始比较深入学习物联网的网络知识,像蓝牙这些知识,以前是看着都很害怕,感觉会很难的样子,仿佛心中隔了一道墙,蓝牙永远进不来我的内心一样。但是现在就很想把它们都学透,都收入我的碗里来,因为我想掌握更多的知识,才能成为更好的自己,不再逃避了。好吧,我话太多了。先来看看demo图吧。

3.APP效果图















4.不足之处

界面简洁,没有过多复杂的ui,主要实现对应的功能而已
以后会慢慢维护的,嘻嘻…

5.每一个调试工具的实现思路

由于代码太多,就不一 一陈列了。

(1)tcp客户端

1.创建Socket
2.打开连接到对应ip地址和端口号的Socket的输入/输出流。
3.按照协议对Socket进行读/写操作。
4.关闭输入输出流、关闭Socket。
但是呢,在安卓里面,涉及到网络连接等耗时操作时,不能将其放在UI主线程中,需要添加子线程,在子线程进行网络连接,这就涉及到安卓线程间的通信了,用Handle来实现。

(2)tcp服务端

1.创建服务端socket服务。通过ServerSocket对象。
2.服务端必须对外提供一个端口,否则客户端无法连接。
3.获取连接过来的客户端对象。
4.通过客户端对象获取socket流读取客户端发来的数据并打印在控制台上。
5.关闭资源: 关客户端,关服务端。

不知道为什么,客户端断开连接时,服务端不知道客户端断开了,就是获取不到客户端的断开请求,所以我就写成是当客户端发送“close”时服务端断开客户端的连接,另外客户端也有在请求断开的操作时发送 “close”。

(3)udp

1.建立连接的IP地址和端口号,IP即是你想要发送的地址,端口号则要选用闲置端口就是向8000~9000这样的端口号。
2.建立DatagramSocket sendSocket/receiveSocket ,用于发送和接受数据报文包。
3.创建报文包DatagramPacket sendPackage/receivePackage,将发送或接收的内容打包。
4.通过sendSocket.send(sendPackage)或者receiveSocket.receive(receivePackage),则完成了基于Socket的UDP通信。

发送和接收要开2个线程。
这个实现主要参考了 Android UDP 通信总结 (终于从坑中爬起来了)

这篇文章。

(4)低功耗蓝牙客户端

1.权限问题:先判断手机是否满足android4.3以上版本,再判断手机是否开启蓝牙。
2.搜索蓝牙:搜索蓝牙,回调接口中查看ble设备相关信息,一定时间停止扫描。
3.连接蓝牙:首先获取到ble设备的mac地址,然后调用connect()方法进行连接。
4.获取特征:蓝牙连接成功后,需要获取蓝牙的服务特征等,然后开启接收设置。
5.发送消息:writeCharacteristic()方法,发送数据给ble设备。
6.接收消息:通过蓝牙的回调接口中onCharacteristicRead()方法,接收蓝牙收的消息。
7.释放资源:断开连接,关闭资源。

低功耗蓝牙里是搜不到经典蓝牙的,我用hc-06模块作为服务端的时候就搜不到,换成经典蓝牙的时候就搜得到。
这里贴一下动态获取服务端的服务UUID的方法,在重写方法onServicesDiscovered()里:

   @Overridepublic void onServicesDiscovered(BluetoothGatt gatt, int status) {super.onServicesDiscovered(gatt, status);List<BluetoothGattService> gattServiceList = gatt.getServices();Log.e("ard", "蓝牙模块服务开放状态:" + status + ",GATT:" + gatt.hashCode() + ",服务数量:" + gattServiceList.size());// 遍历Servicefor (int i = 0; i < gattServiceList.size(); i++) {BluetoothGattService gattService = gattServiceList.get(i);String serviceUUID = gattService.getUuid().toString();List<BluetoothGattCharacteristic> characteristicList = gattService.getCharacteristics();Log.i("ard", "服务UUID:" + serviceUUID + ",其下特征码数量: " + (null == characteristicList ? 0 : characteristicList.size()));UUID_SERVER=UUID.fromString(serviceUUID);// 遍历Characteristicfor (int j = 0; j < characteristicList.size(); j++) {BluetoothGattCharacteristic characteristic = characteristicList.get(j);boolean b= bluetoothGatt.setCharacteristicNotification(characteristic, true); // 设置可接收回调消息Log.e(TAG, "开启通知"+b );String characteristicUUID = characteristic.getUuid().toString();int properties = characteristic.getProperties();Log.i("ard", "\t特征码UUID:" + characteristicUUID + ",属性:" + properties);// 这个特征码是手机向蓝牙发数据的。根据蓝牙模块型号不同特征码uuid也不同,可以都尝试一下characteristic2 = characteristic; // 设为全局的目标蓝牙模块写数据的控制器// --- 以下if块没有实质操作 ---if ((properties | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) { // Characteristic可以接收回调消息List<BluetoothGattDescriptor> descriptorList = characteristic.getDescriptors();if (null != descriptorList && descriptorList.size() > 0) {// 遍历Descriptorfor (int k = 0; k < descriptorList.size(); k++) {BluetoothGattDescriptor descriptor = descriptorList.get(k);UUID descriptorUUID = descriptor.getUuid();byte[] descriptorValue = descriptor.getValue();Log.i("ard", "\t\t描述符UUID:" + descriptorUUID + "," + String.valueOf(descriptorValue));}}}}}}

(5)低功耗蓝牙服务端(外围模式)

1.设置广播以及初始化广播数据
2.开始广播
3.配置Services以及Characteristic
4.Server回调以及操作

(6)经典蓝牙客户端

1.首先开启蓝牙,设置蓝牙可见
2.搜索可用设备
3.配对与连接(通过UUID)
4.创建蓝牙socket,获取输入输出流
5.读取和写入数据,用outputstream和inputstream进行接收和发送

(7)经典蓝牙服务端

1.首先开启蓝牙,设置蓝牙可见
2.服务器端serversocket等待接收客户端的连接,若一直没有连接,则为阻塞状态,故等待连接的代码应该放在子线程中进行
3.服务器端接受连接之后返回一个socket来管理对话,用outputstream和inputstream进行接收和发送

注意:客户端和服务端的UUID要一致,不然连接不上的。

6.源码

码云:https://gitee.com/wangjinchan/IOT.git

7.参考资料:

Android通过蓝牙(BLE低功耗蓝牙)实现设备间通讯 | 客户端 | 服务端

网络调试助手:安卓APP集成TCP、UDP、经典蓝牙、低功耗蓝牙的调试demo相关推荐

  1. Android studio TCP网络调试助手应用开发(支持TCP Server与Client切换)

    在前几篇的文章中带大家完成了基于TCP的物联网安卓应用开发,教程内容是创建了一个TCP客户端并连接服务器完成数据通信的过程,后不久又发布了一个ESP8266创建TCP 服务器与安卓的客户端进行通信的一 ...

  2. 网络编程及三大协议(TCP + UDP + Http)

    网络编程及三大协议(TCP + UDP + Http) 一.网络编程 1.计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络 ...

  3. ESP8266与网络调试助手的通信(TCP ServerTCP Client)

    一.ESP8266设置成STA模式相关命令: AT+CWMODE=1     //Station模式 AT+RST                  //复位 AT+CIPMUX=0       // ...

  4. 网络编程—网络基础概览、socket,TCP/UDP协议

    网络基础概览 socket概览 socket模块-TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  5. Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver

    今日内容:socket网络编程     1.OSI七层协议     2.基于tcp协议的套接字通信     3.模拟ssh远程执行命令     4.tcp的粘包问题及解决方案     5.基于udp协 ...

  6. unix网络编程之简介和运输层TCP/UDP

    前言:本文只介绍了有关UNIX网络编程的理论知识,具体的应用和例子在稍后的博文中将更新 第一章  简介 一个简单的服务器程序步骤: 说明:1.创建TCP套接口 2.捆绑服务器的众所周知端口 3.把套接 ...

  7. 网络编程培训之三 实现TCP/UDP的简单Echo服务器

    系列博客参考:http://blog.csdn.net/zy416548283/article/category/1108400 代码以编号对应放在Github上:https://github.com ...

  8. python(18):网络编程(七层协议+tcp/udp+socket编程)

    Python作为最热门的语言,使我们每个人应该学习的一门技术! 本文针对初学者,我会用最容易的方式告诉你如何入门python! 一.基本网络概念 1.计算机之间如何进行联机 早期: 以太网:局域网与交 ...

  9. 网络基础,带你了解TCP/UDP,轻松理解DNS

    上一课知识回顾: 主机 A 以广播形式向网络中所有主机发送 ARP 请求,请求包中包含了目标 IP 地址 192.168.1.2.主机 B 接收到请求,发现自己就是主机 A 要找的主机,返回响应,响应 ...

最新文章

  1. 李飞飞点赞「ARM」:一种让模型快速适应数据变化的元学习方法 | 开源
  2. 树莓派python蓝牙_Fen9Pi-05.树莓派 UNO蓝牙通信
  3. 好文分享:我是如何在求职中把自己“推销”出去的
  4. 利润中心, 成本中心, 工作中心
  5. MySQL 的 bug 必须修复吗?
  6. 344. 反转字符串 golang
  7. 永中word页码怎么从第二页开始_pdf如何在线转word?这样做,分分钟搞定pdf转word...
  8. My SQL-4 函数
  9. c++文件内容与输入内容进行比较_使用位运算对数据或文件内容进行加密
  10. 现代操作系统原理与实践04:实验1:机器启动
  11. 闻乐天授江州司马 [唐] 元稹
  12. 近千人点赞!哈佛博士放出超多资源,机器学习课程教程小抄全都有
  13. Java Web开发之一:用好的技术设计来犒赏自己
  14. gitlab增加p3c-hook强制代码规范
  15. IDEA MyEclipse Eclipse 快捷键大全(最终版)
  16. Labview的CAN通讯
  17. 常用的网络进行广告推广的落实措施都有哪些渠道呢
  18. ArcGIS Engine二次开发常用接口及其使用方法(一)
  19. 最全16套vue.js入门和项目实战+素材+源码
  20. 在js中对数值进行取整、四舍五入等方法汇总

热门文章

  1. 微机原理实验一——8086系统寻址方式和汇编语言程序设计
  2. 山东大学软件学院操作系统课程设计Nachos-实验四-基本文件系统扩展
  3. [单片机] rsa2048签名算法
  4. Hive-SQL与SQL的区别
  5. Java学生管理系统和数据库idea
  6. LaTeX 提取,合并多个pdf页
  7. python输入两点坐标求距离_大一Python课的习题,输入两点,建立起直线方程y=kx+b。输入第3点,求点到直线的距离。这怎...
  8. js判断文件上传的类型
  9. linux c 追加写文件内容,如何在C中追加到文件,在Linux上使用O_APPEND模式打开?
  10. 基于Android Studio的Android app开发环境搭建