DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: hekai_dut
今日帖子: 0
在线用户: 4
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 glwang (我用过Delphi 1.0) ★☆☆☆☆ -
盒子活跃会员
2018/6/9 16:20:54
标题:
谁能分享一个Delphi开发APP通过socket通信方式控制路灯的示例吗? 浏览:477
加入我的收藏
楼主: 要求用能用安卓APP能够远程开启关闭园区的路灯,客户对开发语言不懂不要求非要用Java,只要能实现功能即可,求Delphi demo源码参考!感谢!!
----------------------------------------------
-
作者:
男 glwang (我用过Delphi 1.0) ★☆☆☆☆ -
盒子活跃会员
2018/6/9 16:22:56
1楼: 网上有Java示例倒是有好多,就是找不到Delphi的...
package com.example.sarthome;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
 
public class LoginActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
     
    private Button startButton,curtainOnOffButton,curtainAddButtonClient,curtainSubButtonClient,autoButtonClient;   
    private Button fanOnOffButton,fanAddButtonClient,fanSubButtonClient,lampOnOffButton,lampAddButtonClient,lampSubButtonClient;    
    private TextView recvDamp,recvTamp,recPm25,airLevel;    
    private Context mContext;
    private boolean isConnecting = false;
    private int mport;
    private String ip;
    private Thread mThreadClient = null;
    private Thread mThreadServer = null;
    private Socket mSocketServer = null;
    private Socket mSocketClient = null;
    static BufferedReader mBufferedReaderServer = null;
    static PrintWriter mPrintWriterServer = null;
    static BufferedReader mBufferedReaderClient = null;
    static PrintWriter mPrintWriterClient = null;
    private  String recvMessageClient = "";
    private  String mistakeMessage = "";
    private String[] fanon_Off=new String[] { "*", "**"};//风扇数组长度为2
    private String[] lampon_Off=new String[] { "!", "!!"};//大灯数组长度为2
    private String[] curtainon_Off=new String[] { "@", "@@"};//窗帘数组长度为2
    private String[] autoArray=new String[] { "$", "$$"};//窗帘数组长度为2
    private String[] fanAdd=new String[] { "*0", "*1", "*2", "*3", "*4", "*5", "*6", "*7", "*8", "*9", "*10"};//风扇加数组长度为11
    private String[] fanSub=new String[] { "*0", "*1", "*2", "*3", "*4", "*5", "*6", "*7", "*8", "*9", "*10"};//风扇减数组长度为11
    private String[] lampSub=new String[] { "!0", "!1", "!2", "!3", "!4", "!5", "!6", "!7", "!8", "!9", "!10"};//大灯减数组长度为11
    private String[] lampAdd=new String[] { "!0", "!1", "!2", "!3", "!4", "!5", "!6", "!7", "!8", "!9", "!10"};//大灯加数组长度为11
    private String[] curtainSub=new String[] { "@0", "@1", "@2", "@3", "@4", "@5", "@6", "@7", "@8", "@9", "@10"};//窗帘减数组长度为11
    private String[] curtainAdd=new String[] { "@0", "@1", "@2", "@3", "@4", "@5", "@6", "@7", "@8", "@9", "@10"};//窗帘加数组长度为11
    private EditText dialog_ip;
    private EditText dialog_port;
    private int mFlag=-1,mFlagon_Off=-1;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.activity_login);
        mContext = this;
         
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()        
        .detectDiskReads()        
        .detectDiskWrites()        
        .detectNetwork()   // or .detectAll() for all detectable problems       
        .penaltyLog()        
        .build());        
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()        
        .detectLeakedSqlLiteObjects()     
        .penaltyLog()        
        .penaltyDeath()        
        .build()); 
        InitView();//初始化个组件
        startButton.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View arg0) {
          // TODO Auto-generated method stub
          Connection();//连接服务器
          }
        });
    }
    public void InitView(){
         
        startButton= (Button)findViewById(R.id.StartConnect);
        fanon_OffButton= (Button)findViewById(R.id.fan_on_off);
        fanAddButton_Client=(Button)findViewById(R.id.fanadd);
        fanSubButton_Client=(Button)findViewById(R.id.fansub);
        lampon_OffButton=(Button)findViewById(R.id.lamp_on_off);
        lampAddButton_Client=(Button)findViewById(R.id.lampadd);
        lampSubButton_Client=(Button)findViewById(R.id.lampsub);
        curtainon_OffButton=(Button)findViewById(R.id.curtain_on_off);
        curtainAddButton_Client=(Button)findViewById(R.id.curtainadd);
        curtainSubButton_Client=(Button)findViewById(R.id.curtainsub);
        autoButton_Client=(Button)findViewById(R.id.auto);
          
        fanOnOffButton.setOnClickListener(this);       
        fanAddButtonClient.setOnClickListener(this);       
        fanSubButtonClient.setOnClickListener(this);
        lampOnOffButton.setOnClickListener(this);
        lampAddButtonClient.setOnClickListener(this);
        lampSubButtonClient.setOnClickListener(this);
        curtainOnOffButton.setOnClickListener(this);
        curtainAddButtonClient.setOnClickListener(this);
        curtainSubButtonClient.setOnClickListener(this);
        autoButtonClient.setOnClickListener(this);
         
        airLevel=(TextView)findViewById(R.id.airlevel);  
        recvDamp= (TextView)findViewById(R.id.Recdamp);       
        recvDamp.setMovementMethod(ScrollingMovementMethod.getInstance()); 
        recvTamp= (TextView)findViewById(R.id.Rectemp); 
        recvTamp.setMovementMethod(ScrollingMovementMethod.getInstance()); 
        recPm25= (TextView)findViewById(R.id.Recpm25); 
        recPm25.setMovementMethod(ScrollingMovementMethod.getInstance());   
         
    }
    /*
     * 连接服务我
     */
    public void Connection(){
        try
        {
          if (isConnecting) 
          {          
          isConnecting = false;
          try {
          if(mSocketClient!=null)
          {
          mSocketClient.close();
          mSocketClient = null;
          
          mPrintWriterClient.close();
          mPrintWriterClient = null;
          }
          } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
          }
          mThreadClient.interrupt();
          startButton.setText("连接");
          }
          else
          {          
          isConnecting = true;          
          DialogIpPort(); 
          }
        }catch(Exception e)
        {
          Toast.makeText(mContext, "网络连接异常:"   e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }
    //事件监听
    public void onClick(View v)
    {
        if(isConnecting&&mSocketClient!=null){
          try{
          switch(v.getId()){
          case R.id.fan_on_off:
          mFlagOnOff();
          mPrintWriterClient.print(fanOnOff[mFlagOnOff]);//发送给服务器
          mPrintWriterClient.flush(); //清除缓存,并释放数据
          break;
          case R.id.fanadd:
          mFlagAdd();
          mPrintWriterClient.print(fanAdd[mFlag]);//发送给服务器
          mPrintWriterClient.flush();
          break;
          case R.id.fansub:
          mFlagSub();
          mPrintWriterClient.print(fanSub[mFlag]);//发送给服务器
          mPrintWriterClient.flush();
          break;
          case R.id.lamp_on_off:
          mFlagOnOff();
          mPrintWriterClient.print(lampOnOff[mFlagOnOff]);//发送给服务器
          mPrintWriterClient.flush();
          break;
          case R.id.lampadd:
          mFlagAdd();
          mPrintWriterClient.print(lampAdd[mFlag]);
          mPrintWriterClient.flush();
          break;
          case R.id.lampsub:
          mFlagSub();
          mPrintWriterClient.print(lampSub[mFlag]);
          mPrintWriterClient.flush();
          break;
          case R.id.curtain_on_off:
          mFlagOnOff();
          mPrintWriterClient.print(curtainOnOff[mFlagOnOff]);
          mPrintWriterClient.flush();
          break;
          case R.id.curtainadd:
          mFlagAdd();
          mPrintWriterClient.print(curtainAdd[mFlag]);
          mPrintWriterClient.flush();
          break;
          case R.id.curtainsub:
          mFlagSub();
          mPrintWriterClient.print(curtainSub[mFlag]);
          mPrintWriterClient.flush();
          break;
          case R.id.auto:
          mFlagOnOff();
          mPrintWriterClient.print(autoArray[mFlagOnOff]);//发送给服务器
          mPrintWriterClient.flush();
          
          default:
          break;
          }
          }catch(Exception e){
          Toast.makeText(mContext, "发送异常:"   e.getMessage(), Toast.LENGTH_SHORT).show();
          
          }
          
        }else{
          Toast.makeText(mContext, "没有连接相应的服务器", Toast.LENGTH_SHORT).show();  
        }
    }
    /*
     * 减标志
     */
    protected void mFlagSub(){
        if(mFlag>=0){
          mFlag=-1 mFlag;
        }
        if(mFlag==10){
          mFlag=-2 mFlag;
        }
        if(mFlag<0){
          mFlag=0;
        }
    }
    /*
     * 加标志
     */
    protected void mFlagAdd(){
        if(mFlag<10){
          mFlag=1 mFlag;
        }   
    }
    /*
     * 开关标志
     */
    protected void mFlagOnOff(){
        if(mFlagOnOff<1){
          mFlagon_Off=1 mFlagOnOff;
        }
        else
        {
          mFlagon_Off=0;
        }
    }
    /*
     * 端口和IP地址输入对话框
     */
    public void DialogIpPort(){
        LayoutInflater inflater=getLayoutInflater();
        View login_dialog = inflater.inflate(R.layout.dialog,(ViewGroup)findViewById(R.id.dialog));
        dialog_ip=(EditText)login_dialog.findViewById(R.id.dialog_ip);
        dialog_port=(EditText)login_dialog.findViewById(R.id.dialog_port);
        new AlertDialog.Builder(this).setTitle("请输入正确的IP地址和端口号").setView(login_dialog).
        setPositiveButton("连接",new DialogInterface.OnClickListener() {
          
          @Override
          public void onClick(DialogInterface arg0, int arg1) {
          // TODO Auto-generated method stub
          try{
          
          ip=dialog_ip.getText().toString();
          mport=Integer.parseInt(dialog_port.getText().toString());
          mThreadClient = new Thread(mRunnable);
          mThreadClient.start();
          startButton.setText("断开");  
          }catch(Exception e){
          Toast.makeText(mContext, "网络连接异常:"   e.getMessage(), Toast.LENGTH_SHORT).show();          
          }
          
          }
        }).setNegativeButton("取消",new DialogInterface.OnClickListener() {
          
          @Override
          public void onClick(DialogInterface arg0, int arg1) {
          // TODO Auto-generated method stub
          startButton.setText("连接");  
          }
        }).show();
         
    }
    //线程:监听服务器发来的消息
    private Runnable    mRunnable   = new Runnable() 
    {
        public void run()
        {
          try 
          {          
          //连接服务器
          mSocketClient = new Socket(ip, mport);  //portnum
          //取得输入、输出流
          mBufferedReaderClient = new BufferedReader(new InputStreamReader(mSocketClient.getInputStream()));
          
          mPrintWriterClient = new PrintWriter(mSocketClient.getOutputStream(), true);
          
          mistakeMessage = "已经连接server!";//消息换行
          Message msg = new Message();
          msg.what = 0;
          mHandler.sendMessage(msg);      
          //break;
          }
          catch (Exception e) 
          {
          mistakeMessage = "连接IP异常:"   e.toString()   e.getMessage()   "\n";//消息换行
          Message msg = new Message();
          msg.what = 1;
          mHandler.sendMessage(msg);
          return;
          }          
          setRecvMessage();
        }
    };
     
    /*
     * 接受消息机制
     */
    public void setRecvMessage(){
        char[] buffer = new char[256];
        int count = 0;
        while (isConnecting)
        {
          try
          {
          if((count = mBufferedReaderClient.read(buffer))>0)
          {
          recvMessageClient = getInfoBuff(buffer, count);//将接受的数据存入数组
          Message msg = new Message();
          msg.what = 1;
          mHandler.sendMessage(msg);
          }
          }
          catch (Exception e)
          {
          mistakeMessage = "接收异常:"   e.getMessage() "\n";//消息换行
          Message msg = new Message();
          msg.what = 0;
          mHandler.sendMessage(msg);
          }
        }
 
    }
    Handler mHandler = new Handler()
    {          
          public void handleMessage(Message msg)          
          {     
          String[] string={"优","良","差"};
          super.handleMessage(msg);         
          if(msg.what == 0)
          {
          Toast.makeText(LoginActivity.this,mistakeMessage,Toast.LENGTH_SHORT).show();//刷新消息机制
          }
          else if(msg.what == 1)
          {
          try
          {
          String[] result = recvMessageClient.split("\\*");
          recvTamp.setText(result[0]);
          recvDamp.setText(result[1]);    // 刷新  
          recPm25.setText(result[2]);
          if((0<=Integer.parseInt(result[2]))&&(35>=Integer.parseInt(result[2]))){
          airLevel.setTextColor(android.graphics.Color.GREEN);//设置text的颜色
          airLevel.setText(string[0]);
          }else if((36<=Integer.parseInt(result[2]))&&(75>=Integer.parseInt(result[2]))){
          airLevel.setTextColor(0xff99cc33);
          airLevel.setText(string[1]);
          }else{
          airLevel.setTextColor(0xff663300);
          airLevel.setText(string[2]);
          }
          }catch(Exception e)
          {
          Toast.makeText(LoginActivity.this,"无法获取数据,检查网络是否连接!",Toast.LENGTH_SHORT).show();//刷新消息机制
          }
          }
          }   
     };
      
    //创建服务端ServerSocket对象
     private ServerSocket serverSocket = null;
     private boolean serverRuning = false;
      
        private String getInfoBuff(char[] buff, int count)
        {
          char[] temp = new char[count];
          for(int i=0; i<count; i  )
          {
          temp[i] = buff[i];
          }
          return new String(temp);
        }
 
        public void onDestroy() {
          super.onDestroy();
          if (isConnecting) 
          {          
          isConnecting = false;
          try {
          if(mSocketClient!=null)
          {
          mSocketClient.close();
          mSocketClient = null;
          
          mPrintWriterClient.close();
          mPrintWriterClient = null;
          }
          } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
          }
          mThreadClient.interrupt();
          }
          if (serverRuning) 
          {
          serverRuning = false;          
          try {
          if(serverSocket!=null)
          {
          serverSocket.close();
          serverSocket = null;
          }
          if(mSocketServer!=null)
          {
          mSocketServer.close();
          mSocketServer = null;
          }
          } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
          }
          mThreadServer.interrupt();
          }
        }
}
----------------------------------------------
-
作者:
男 glwang (我用过Delphi 1.0) ★☆☆☆☆ -
盒子活跃会员
2018/6/9 16:24:40
2楼:
此帖子包含附件:
JPEG 图像
大小:80.9K
----------------------------------------------
-
作者:
男 msfm (清洁工) ★☆☆☆☆ -
盒子活跃会员
2018/6/9 16:30:17
3楼: 你这不是有代码了吗 按照这个修改一下
----------------------------------------------
-
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2018/6/9 18:08:48
4楼: indy 跨平台,手机端用 IdRexec,服务器端用 IdRexecServer,连接后客户端 IdRexec1.SendCmd() 发送自定义字符串命令给服务器端,服务端 OnCommand() 收到后想干嘛干嘛,服务端还可以用 SendResults() 简单回复客户端。
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。
又不靠它 delphi 吃饭,怕甚?
作者:
男 nickemma (N.E) ▲▲▲▲△ -
注册会员
2018/6/9 21:06:17
5楼: 这个不是简单的说socker连接的问题。
应该是上位机,通信,下位机,三位一体的整体设计、编程。
----------------------------------------------
-
作者:
男 yzdbs (学无止境) ★☆☆☆☆ -
盒子活跃会员
2018/6/11 10:20:21
6楼: 有协议就OK。
----------------------------------------------
┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻
┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳
┻┳┻┳┻┳learning stream media.┳┻┳┻┳┻
┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳
┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻
┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2018/6/11 10:28:46
7楼: 4 楼正解。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 a200332 (0) ▲▲▲△△ -
注册会员
2018/6/12 12:55:35
8楼: indy   完全可以搞定啊,我们 做过 智能家居 的 ,不怕你笑话,你都有 java 了,来个jar 不是照样可以搞定
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ▲▲▲▲▲ -
普通会员
2018/6/14 9:34:59
9楼: 这种通讯控制程序,你首先应该搞清楚你要通讯的另外一方的通讯协议。

控制路灯?被控制的一方,你是如何发命令给它的?串口?网络?

网络的话,是 TCP? UDP?Web?WebService?等等等等等等。

搞清楚协议,这种东西很简单的。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行62.01172毫秒 RSS