发 帖  

[经验] 【钛极小龟开发套件试用体验】综合实验: 传感器, 多线程, TCP通讯(SocketServer)

2018-11-9 09:52:48  357 钛极小龟
分享
0
41.jpg

在学习官方课程进阶课程的LESSON4-设备与网络,TCP通讯技术实现时, 发现小龟作为SocketClient客户端,连接本地PC搭建的TCP服务器进行通讯. 我就在想,是否可以将小龟作为TcpServer来使用呢. 经研究测试, 实现了钛极小龟作为SocketServer进行TCP通讯的效果.并开发C#程序, 运行于PC端作为SocketClient, 与开发板通讯, 定时获取温湿度,光照度等各项参数并显示.
实验步骤:
1.烧写程序
开发板程序采用多线程, 使用三个线程: Socket监听线程, Socket发送线程, 传感器测量线程. 相互配合又互不干扰, 实现将最新的测量参数发送回客户端.
PC端程序采用线程作为SocketClient轮询开发板, 定时获取相关参数并显示.
5.jpg
2.参数显示
2.1 初始状态
初始时,显示当前的温湿度,光照,声响,按键,触摸,红外的状态
1.jpg
2.2 遮盖BH1750
遮盖光照传感器后, 可看到光照度下降了很多
2.jpg
2.3 按下按键
按下开发板按钮, 可看到按键状态从无变为有
3.jpg
2.4 按下遥控
按下红外遥控按键, 可看到软件界面显示遥控键码0-64
4.jpg
3.LCD显示
LCD实时显示环境温湿度,光照度,声响参数
6.jpg
开发板代码:
  1. try {
  2.                         TiWiFi obj = TiWiFi.getInstance();
  3.                         System.out.println("SSID: " + obj.getSSID());
  4.                         obj.startup(30);
  5.                         System.out.println("Wi-Fi Connect. IP: " + obj.getAddress());
  6.                         //obj.startupSoftAP(false);
  7.                         //System.out.println("Start SoftAP. IP: " + obj.getSoftAPAddress());
  8.                 } catch (IOException ex) {
  9.                         System.out.println("Wi-Fi Connect Failed.");
  10.                         ex.printStackTrace();
  11.                         return;
  12.                 }
  13.                 try {
  14.                         // GPIO资源分配,GPIO0的PIN2/3/4/5脚
  15.                         TiGPIO gpio0 = TiGPIO.open(0, 2, 3, 4, 5);
  16.                         // I2C主机总线资源分配,I2CM0
  17.                         TiI2CMaster i2cm0 = TiI2CMaster.open(0);
  18.                         // ADC资源分配,ADC0的CH0通道
  19.                         TiADC adc0 = TiADC.open(0, 0);
  20.                         /* ---资源绑定--- */
  21.                         // I2C主机总线资源PORT0与屏幕对象绑定,屏幕地址:0x3C
  22.                         TiOLED_UG2864 oled = new TiOLED_UG2864(i2cm0, 0x3c);
  23.                         // I2C主机总线资源PORT0与照度计BH1750对象绑定,默认地址:0x23
  24.                         TiBH1750 bh1750 = new TiBH1750(i2cm0);
  25.                         // GPIO总线资源PIN2与继电器对象绑定
  26.                         TiRelay1CH relay = new TiRelay1CH(gpio0, 2);
  27.                         // GPIO总线资源PIN3与温湿度传感器DHT11绑定
  28.                         TiDHT dht11 = new TiDHT(gpio0, 3);
  29.                         // GPIO总线资源PIN4与触摸按钮对象绑定,触发电平:高电平
  30.                         TiButton touch = new TiButton(gpio0, 4, true);
  31.                         // GPIO总线资源PIN5与红外解码对象绑定
  32.                         TiVS1838BNEC vs1838b = new TiVS1838BNEC(gpio0, 5);
  33.                         // 获取键盘实例并设置键盘事件监听对象
  34.                         TiKeyboard keyboard = TiKeyboard.getInstance();
  35.                         keyboard.setEventListener(new KeyboardListener());
  36.                         // 设置ADC参考电压及分压倍数
  37.                         adc0.setRefVoltageValue(1.0, 2);

  38.                         /* ---资源使用--- */
  39.                         // 屏幕开启并清屏
  40.                         oled.turnOn();
  41.                         oled.clear();
  42.                         oled.print(0, 0, "Socket Test!");
  43.                        
  44.                         touch.setEventListener(new TouchListener(relay));
  45.                         vs1838b.setEventListener(new IRDecodeListener());
  46.                         Thread.sleep(2000);
  47.                        
  48.                         //启动传感器测量线程
  49.                         SensorComm sensorThread = new SensorComm(bh1750, dht11, oled, adc0, touch, keyboard, vs1838b);
  50.                         sensorThread.start();

  51.                         //启动TCP通讯线程
  52.                         ServerComm td = new ServerComm();
  53.                         td.start();
  54.                 } catch (Exception ex) {
  55.                         ex.printStackTrace();
  56.                 } finally {
  57.                         try {
  58.                                
  59.                         } catch (Exception e) {
  60.                                 e.printStackTrace();
  61.                         }
  62.                 }
复制代码
PC端SocketClient代码:
<p>while (continueread)
  1. while (ContinueRead)
  2.             {
  3.                 try
  4.                 {
  5.                         Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  6.                         clientSocket.Connect(ipe);

  7.                         byte[] sendBytes = Encoding.ASCII.GetBytes("GET");
  8.                         clientSocket.Send(sendBytes);

  9.                         string recStr = "";
  10.                         byte[] recBytes = new byte[1024];
  11.                         clientSocket.SendTimeout = 5000;
  12.                         int bytes = clientSocket.Receive(recBytes, recBytes.Length, 0);
  13.                         recStr += Encoding.ASCII.GetString(recBytes, 0, bytes);
  14.                         clientSocket.Close();
  15.                         Console.WriteLine("Rcv:" + recStr);
  16.                         string[] arys = recStr.Split(';');
  17.                         this.Invoke((EventHandler)(delegate {
  18.                             label4.Text = arys[0];
  19.                             label8.Text = arys[1];
  20.                             label11.Text = arys[2];
  21.                             label14.Text = arys[3];
  22.                             label17.Text = (arys[4] == "1" ? "有" : "无");
  23.                             label20.Text = (arys[5] == "1" ? "有" : "无");
  24.                             label23.Text = (arys[6] == "N" ? "无" : arys[6]);
  25.                         }));
  26.                         Thread.Sleep(500);
  27.                 }
  28.                 catch (Exception ex)
  29.                 {
  30.                     Console.WriteLine(ex.Message);
  31.                 }
  32.             }
复制代码
实验完毕.
实验过程中TCP通讯出现了一些错误, 而比较遗憾的是Eclipse给出的错误提示(e.printStackTrace())又太过简略, 无法提示准确错误原因, 导致调试测试花费了太多的时间. 希望官方可以优化.


kakongluo 2018-11-9 09:54:38
最近发贴第一段话总是莫名被吞, 真是奇怪. 补充一下:
本次实验综合测试钛极小龟的各项功能, 包括: 多线程,TCP通讯(Server),WiFi连接,各传感器读数等.
回复

举报

流动 2018-11-10 17:39:23
顶一个                                                
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

发经验
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表