有时候 Read时会返回0长度

-----

当连续2次每读到数据时,建议发个心跳信息,然后单片机给个回复

C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Net.Sockets;
  7. using System.Diagnostics;
  8.  
  9. namespace SimpleWiFITest
  10. {
  11. public class SimpleWifiTCPClient : IDisposable
  12. {
  13.  
  14. public String IP { get; private set; }
  15. public int Port { get; private set; } //
  16.  
  17. public bool IsRuning{get; private set;}
  18. private bool Enabled = false;
  19. private bool disposed = false;
  20. private NetworkStream InOutStream = null;
  21.  
  22. public GatherDataInfo LastGatherData { get; private set; }
  23.  
  24. public SimpleWifiTCPClient(string ip, int port)
  25. {
  26. this.IP = ip;
  27. this.Port = port;
  28. IsRuning = false;
  29. LastGatherData = new GatherDataInfo() { Status = };
  30. }
  31.  
  32. public void SendData(string data)
  33. {
  34. try
  35. {
  36. if (InOutStream != null && IsRuning && InOutStream.CanWrite)
  37. {
  38.  
  39. var dataBytes = Encoding.Default.GetBytes(data);
  40. InOutStream.Write(dataBytes, , dataBytes.Length);
  41. }
  42. }
  43. catch { }
  44. }
  45. public void Start()
  46. {
  47. if (IsRuning) return;
  48.  
  49. Enabled = true;
  50. IsRuning = true;
  51.  
  52. ThreadPool.QueueUserWorkItem((o) => { _Start(); });
  53.  
  54. }
  55. private void _Start()
  56. {
  57. LogInfo("进入工作线程:" + Thread.CurrentThread.ManagedThreadId);
  58. using (TcpClient tcpClient = new TcpClient())
  59. {
  60. NetworkStream stream = null;
  61. try
  62. {
  63.  
  64. tcpClient.Connect(IP, Port);
  65. tcpClient.ReceiveTimeout= * ;//30秒读超时
  66.  
  67. SetKeepAlive(tcpClient.Client, * , );//无数据传输后30秒发起心跳检测,每1秒进行一次,5次失败后streamRead将报错
  68.  
  69. stream = tcpClient.GetStream();
  70. InOutStream = stream;
  71.  
  72. #region 发送指令 让电子秤每秒发送一次
  73. var cmd = "CP\r\n1P\r\n";
  74. var cmdBytes = Encoding.Default.GetBytes(cmd);
  75. stream.Write(cmdBytes, , cmdBytes.Length);
  76. #endregion
  77.  
  78. Byte[] buffer = new byte[];
  79. int errCount = ;
  80. while (Enabled)
  81. {
  82. try
  83. {
  84.  
  85. var len = stream.Read(buffer, , buffer.Length);
  86.  
  87. var strData = Encoding.Default.GetString(buffer, , len);
  88. if (len > )
  89. {
  90. LogInfo("Data:" + strData.TrimEnd("\r\n".ToCharArray()) + " Len:" + len);
  91.  
  92. }
  93. else
  94. {
  95. throw new Exception("无数据!");
  96. }
  97.  
  98. #region 解析数据
  99. //if (len == 17)
  100. //{
  101.  
  102. //var v = strData.Substring(0, 1).Trim() + strData.Substring(1, 7).Trim();
  103. //var legend = strData.Substring(14, 3);
  104. //将数据入队列
  105. //var data = new GatherDataInfo() { Status = 1, AddTime = DateTime.Now, RawStr = BitConverter.ToString(buffer, 0, len), StrValue = v, Legend = legend };
  106.  
  107. //}
  108. #endregion
  109.  
  110. errCount = ;
  111. }
  112. catch (Exception ex)
  113. {
  114. errCount++;
  115. if (errCount == )
  116. {
  117. SendData("AT+Beat");
  118. }
  119. if (errCount >= )
  120. {
  121. throw;
  122. }
  123.  
  124. LogErr(ex);
  125. Thread.Sleep( * );
  126. }
  127. }
  128.  
  129. }
  130. catch (Exception ex)
  131. {
  132. LogErr(ex);
  133. }
  134. finally
  135. {
  136. try { stream.Close(); }
  137. catch { }
  138. try { tcpClient.Close(); }
  139. catch { }
  140.  
  141. IsRuning = false;
  142.  
  143. if (Enabled)
  144. {
  145. IsRuning = true;
  146. ThreadPool.QueueUserWorkItem((o) => { _Start(); });
  147. }
  148.  
  149. LogInfo("退出工作线程:" + Thread.CurrentThread.ManagedThreadId);
  150. }
  151.  
  152. }
  153.  
  154. }
  155.  
  156. private void LogErr(Exception ex)
  157. {
  158. Console.WriteLine(ex.Message);
  159. }
  160.  
  161. private void LogInfo(string msg)
  162. {
  163. Console.WriteLine(msg);
  164. }
  165. public void Stop()
  166. {
  167. Enabled = false;
  168. }
  169.  
  170. #region IDisposable Members
  171.  
  172. /// <summary>
  173. /// Performs application-defined tasks associated with freeing,
  174. /// releasing, or resetting unmanaged resources.
  175. /// </summary>
  176. public void Dispose()
  177. {
  178. Dispose(true);
  179. GC.SuppressFinalize(this);
  180. }
  181.  
  182. /// <summary>
  183. /// Releases unmanaged and - optionally - managed resources
  184. /// </summary>
  185. /// <param name="disposing"><c>true</c> to release both managed
  186. /// and unmanaged resources; <c>false</c>
  187. /// to release only unmanaged resources.
  188. /// </param>
  189. protected virtual void Dispose(bool disposing)
  190. {
  191. if (!this.disposed)
  192. {
  193. if (disposing)
  194. {
  195. try
  196. {
  197. Stop();
  198. }
  199. catch
  200. {
  201.  
  202. }
  203. }
  204.  
  205. disposed = true;
  206. }
  207. }
  208.  
  209. #endregion
  210.  
  211. #region Help Method
  212. /// <summary>
  213. /// 毫秒为单位
  214. /// </summary>
  215. /// <param name="socket"></param>
  216. /// <param name="time"></param>
  217. /// <param name="interval"></param>
  218. private void SetKeepAlive(Socket socket, ulong time, ulong interval)
  219. {
  220. try
  221. {
  222. byte[] optionInValue = new byte[];
  223. ulong[] numArray = new ulong[];
  224. if (time == || interval == )
  225. numArray[] = ;
  226. else
  227. numArray[] = ;
  228. numArray[] = time;
  229. numArray[] = interval;
  230. for (int i = ; i < numArray.Length; i++)
  231. {
  232. optionInValue[i * + ] = (byte)(numArray[i] >> 0x18 & 0xff);
  233. optionInValue[i * + ] = (byte)(numArray[i] >> 0x10 & 0xff);
  234. optionInValue[i * + ] = (byte)(numArray[i] >> & 0xff);
  235. optionInValue[i * ] = (byte)(numArray[i] & 0xff);
  236. }
  237. byte[] bytes = BitConverter.GetBytes();
  238. socket.IOControl(IOControlCode.KeepAliveValues, optionInValue, bytes);
  239. }
  240. catch (Exception exception)
  241. {
  242. Console.WriteLine("设置KeepAlive错误:" + exception.Message);
  243. }
  244. }
  245. #endregion
  246.  
  247. }
  248.  
  249. }

arduino

  1. #include <SoftwareSerial.h>
  2.  
  3. SoftwareSerial mySerial(, ); // RX, TX
  4. long lastReadTime=;
  5. long lastWriteTime=;
  6. int sendCount=;
  7. String readLine="";
  8. void setup()
  9. {
  10. // Open serial communications and wait for port to open:
  11. Serial.begin();
  12. while (!Serial) {
  13. ; // wait for serial port to connect. Needed for Leonardo only
  14. }
  15.  
  16. Serial.println("Goodnight moon!");
  17.  
  18. // set the data rate for the SoftwareSerial port
  19. mySerial.begin();
  20. mySerial.println("Hello, world?");
  21. }
  22.  
  23. void loop() // run over and over
  24. {
  25.  
  26. while(mySerial.available()){
  27. lastReadTime=millis();
  28. char c=mySerial.read();
  29. readLine +=c;
  30. if(readLine.startsWith("AT+Beat\r\n"))
  31. {
  32. mySerial.println("OK!");
  33. }
  34.  
  35. Serial.write(c);
  36.  
  37. if(c=='\n'){
  38. readLine="";
  39. }
  40.  
  41. }
  42.  
  43. if(millis()- lastWriteTime >= )
  44. {
  45. if(sendCount<=){
  46. lastWriteTime=millis();
  47. mySerial.println(String( millis()));
  48. sendCount++;
  49. };
  50. }
  51.  
  52. }

android

  1. package cn.fstudio.net;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.PrintWriter;
  7. import java.net.Socket;
  8.  
  9. import junit.framework.Protectable;
  10.  
  11. import android.R.integer;
  12. import android.content.Context;
  13. import android.os.Handler;
  14. import android.os.Message;
  15. import android.util.Log;
  16. import android.widget.Toast;
  17.  
  18. public class TCPClient {
  19. private Handler mHandler=null;
  20. private boolean isConnecting = false;
  21.  
  22. private Thread mThreadClient = null;
  23. private Socket mSocketClient = null;
  24.  
  25. static BufferedReader mBufferedReaderClient = null;
  26. static PrintWriter mPrintWriterClient = null;
  27. private String recvMessageClient = "";
  28. private String ip;
  29. private int port;
  30.  
  31. public boolean isConnecting() {
  32. return isConnecting;
  33. }
  34.  
  35. public String getRecvMessageClient() {
  36. return recvMessageClient;
  37. }
  38.  
  39. public TCPClient(Handler handler,String ip,int port) {
  40. this.mHandler=handler;
  41. this.ip=ip;
  42. this.port=port;
  43. }
  44.  
  45. public void turnOffON() {
  46. if (isConnecting)
  47. {
  48. isConnecting = false;
  49.  
  50. _Stop();
  51.  
  52. }
  53. else
  54. {
  55. isConnecting = true;
  56.  
  57. _Start();
  58.  
  59. }
  60. }
  61.  
  62. private void _Start(){
  63. mThreadClient = new Thread(mRunnable);
  64. mThreadClient.start();
  65. }
  66. private void _Stop(){
  67. try {
  68. if(mSocketClient!=null)
  69. {
  70. mSocketClient.close();
  71. mSocketClient = null;
  72.  
  73. mPrintWriterClient.close();
  74. mPrintWriterClient = null;
  75.  
  76. mBufferedReaderClient.close();
  77. mBufferedReaderClient=null;
  78. }
  79. } catch (IOException e) {
  80. // TODO Auto-generated catch block
  81. e.printStackTrace();
  82. }
  83. mThreadClient.interrupt();
  84. }
  85.  
  86. public void sendMsg(Context mContext, String msg){
  87. try
  88. {
  89. mPrintWriterClient.println(msg);//发送给服务器
  90. mPrintWriterClient.flush();
  91. }
  92. catch (Exception e)
  93. {
  94. // TODO: handle exception
  95. Toast.makeText(mContext, "发送异常:" + e.getMessage(), Toast.LENGTH_SHORT).show();
  96. }
  97. }
  98. public void sendMsg(String msg){
  99. try
  100. {
  101. mPrintWriterClient.println(msg);//发送给服务器
  102. mPrintWriterClient.flush();
  103. }
  104. catch(Exception e)
  105. {
  106. }
  107. }
  108.  
  109. //线程:监听服务器发来的消息
  110. private Runnable mRunnable = new Runnable()
  111. {
  112. public void run()
  113. {
  114.  
  115. String sIP = ip;
  116.  
  117. Log.d("gjz", "IP:"+ sIP + ":" + port);
  118.  
  119. try{
  120. ConnectAndReceive(sIP); //连接并循环接收数据
  121.  
  122. }catch(Exception e){
  123. recvMessageClient = "接收异常:" + e.getMessage() + "\n";//消息换行
  124. Message msg = new Message();
  125. msg.what = ;
  126. mHandler.sendMessage(msg);
  127.  
  128. }finally{
  129. _Stop();
  130. if(isConnecting){
  131. _Start();
  132. }
  133. }
  134.  
  135. }
  136.  
  137. private void ConnectAndReceive(String sIP) {
  138. try
  139. {
  140. //连接服务器
  141. mSocketClient = new Socket(sIP, port); //portnum
  142. mSocketClient.setSoTimeout( * );
  143. //取得输入、输出流
  144. mBufferedReaderClient = new BufferedReader(new InputStreamReader(mSocketClient.getInputStream()));
  145.  
  146. mPrintWriterClient = new PrintWriter(mSocketClient.getOutputStream(), true);
  147.  
  148. recvMessageClient = "已经连接server!\n";//消息换行
  149. Message msg = new Message();
  150. msg.what = ;
  151. mHandler.sendMessage(msg);
  152. //break;
  153. }
  154. catch (Exception e)
  155. {
  156. recvMessageClient = "连接IP异常:" + e.toString() + e.getMessage() + "\n";//消息换行
  157. Message msg = new Message();
  158. msg.what = ;
  159.  
  160. mHandler.sendMessage(msg);
  161. throw new RuntimeException("连接IP错误");
  162. }
  163.  
  164. char[] buffer = new char[];
  165. int count = ;
  166. int errCount=;
  167. while (isConnecting)
  168. {
  169. try
  170. {
  171.  
  172. //if ( (recvMessageClient = mBufferedReaderClient.readLine()) != null )
  173. if((count = mBufferedReaderClient.read(buffer))>)
  174. {
  175. recvMessageClient = getInfoBuff(buffer, count) + "\n";//消息换行
  176. Message msg = new Message();
  177. msg.what = ;
  178.  
  179. mHandler.sendMessage(msg);
  180. errCount=;
  181. }else {
  182. throw new RuntimeException("无数据");
  183. }
  184.  
  185. }
  186. catch (Exception e)
  187. {
  188.  
  189. recvMessageClient = "接收异常:" + e.getMessage() + "\n";//消息换行
  190. Message msg = new Message();
  191. msg.what = ;
  192. mHandler.sendMessage(msg);
  193. errCount++;
  194. if(errCount==){
  195. sendMsg("AT+Beat\r\n");
  196. }
  197. if(errCount>=){
  198. throw new RuntimeException("数据读取错误");
  199. }
  200. continue;
  201. }
  202. }//end while
  203. }
  204. };
  205.  
  206. private String getInfoBuff(char[] buff, int count)
  207. {
  208. char[] temp = new char[count];
  209. for(int i=; i<count; i++)
  210. {
  211. temp[i] = buff[i];
  212. }
  213. return new String(temp);
  214. }
  215.  
  216. }

C#与android连接 SimpleWifi的更多相关文章

  1. Android 连接 SQL Server (jtds方式)——上

    本文将介绍开发Android程序,连接SQL Server,通过第三方包jtds的方式. 如果你有同样的需求,请跟着做一遍,博主将以最详细的方式,进行介绍. 首先说明,Java.Android连接SQ ...

  2. android连接打印机

    android连接  网络打印,主要使用socket连接设备,发送指令给设备. 首先要有设备的IP,端口号一般默认的是9100 //打印设备网络IP etIp.setText("192.16 ...

  3. Android连接SQLServer详细教程(数据库+服务器+客户端)

    摘星 标签: android连接sql http://blog.csdn.net/haoxingfeng/article/details/9111105

  4. Android 连接网络数据库的方式

    以连接MS SQL(sqlserver数据库)的网络数据库为例,从当前搜集的资料来看,一共有两种方式:在Android工程中引入JDBC驱动,直接连接:通过WebService等方法的间接连接. 采用 ...

  5. Android连接socket服务器上传下载多个文件

    android连接socket服务器上传下载多个文件1.socket服务端SocketServer.java public class SocketServer { ;// 端口号,必须与客户端一致 ...

  6. 阿里云物联网平台: Android 连接阿里云物联网平台

    说明 这节是是为下一节做铺垫的 只要是按照我提供的学习路线一节一节的认认真真学过来的,这节就十分的简单 有了前两节的基础,这节呢咱让Android 连接阿里云物联网平台 使用这节的代码  https: ...

  7. android 连接蓝牙打印机 BluetoothAdapter

    android 连接蓝牙打印机 BluetoothAdapter 源码下载地址:https://github.com/yylxy/BluetoothText.git public class Prin ...

  8. Android连接远程数据库的避坑指南

    Android连接远程数据库的避坑指南 今天用Android Studio连接数据库时候,写了个测试连接的按钮,然后连接的时候报错了,报错信息: 2021-09-07 22:45:20.433 705 ...

  9. Android连接网络打印机进行打印

    首先这是网络打印工具类,通过Socket实现,多说一句,网络打印机端口号一般默认的是9100 package com.Ieasy.Tool; import android.annotation.Sup ...

随机推荐

  1. sql 数据库修复

    数据库修复 exec sp_dboption 'dbname1','single user',‘true’ dbcc checkdb('dbname1') dbcc checkdb('dbname1' ...

  2. canal 监控数据库表 快速使用

    https://github.com/alibaba/canal 快速开始 https://github.com/alibaba/canal/wiki/QuickStart 注意 1. vim con ...

  3. eclipse使用ctrl+shift+F格式化代码失效

    通常情况出现这种问题是组合快捷键和别的软件快捷键冲突了, 最常见的是和搜狗输入法冲突, 在设置中找到搜狗输入法然后把冲突的快捷键取消掉就可以了.

  4. ArcGIS案例学习笔记1_1

    ArcGIS案例学习笔记1_1 联系方式:谢老师,135_4855_4328, xiexiaokui#qq.com 时间:第一天上午 准备 0.U盘复制ArcGIS培训*** 1.练习数据不要放到桌面 ...

  5. sql查询job

    use msdb go --if object_id('tempdb..#SqlAgentJob') is not null -- drop table #SqlAgentJob --go decla ...

  6. 常用的SQL语句(牢记)

    上课时的重要内容,其中表 t_hq, t_hq2, 以及字段的名字是举例说明. update t_hq t set t.bumendh = '10086';commit;全表更新电话,commit是提 ...

  7. A计划(BFS)

    A计划 http://acm.hdu.edu.cn/showproblem.php?pid=2102 Time Limit: 3000/1000 MS (Java/Others)    Memory ...

  8. ES5之defineProperty

    一 概述 Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. 对象里目前存在的属性描述符有两种主要形式:数据描述符和存 ...

  9. UVa 10763 Foreign Exchange(map)

    Your non-profitorganization (iCORE - international Confederationof Revolver Enthusiasts) coordinates ...

  10. 排序矩阵中的从小到大第k个数 · Kth Smallest Number In Sorted Matrix

    [抄题]: 在一个排序矩阵中找从小到大的第 k 个整数. 排序矩阵的定义为:每一行递增,每一列也递增. [思维问题]: 不知道应该怎么加,因为不是一维单调的. [一句话思路]: 周围两个数给x或y挪一 ...