不死猫 发表于 2014-3-20 15:19:58

谁动了我的CAD? 原创Android手机与Lisp通讯成功.

本帖最后由 不死猫 于 2014-11-24 14:39 编辑

先上图:

技术分析:
由于Lisp本身不支持socket监测端口,因此我们需要找一个数据中转区.
你可以选择共享文件夹(仅局域网),也可以选择数据库,或者通过网站的页面发布进行数据交换.
(本文采用SQL数据库作为数据中转区)
一方发送消息,另一方对消息进行监控采集即可.(这个道理与socket端口消息服务是一样的)

原理:
1.Lisp信息通过反应器发送到数据库中
2.数据库建立一个名为Android2Lisp的库,表名monitor,字段id关键,字段command字符串.
3.在Android里面建立多线程并监视数据库,读到数据后立即清空数据库(避免重复读取),得到的内容+当前时间添加到视图中,并将视图自动移到最后一行显示.



下面首先是Lisp源码:

(if (not myAndroidMonitor)
(setq myAndroidMonitor (vlr-command-reactor nil '((:vlr-commandWillStart . myAndroidMonitorCallback))))
)
(defun myAndroidMonitorCallback(a b)
(writesql (car b))
)
(defun writesql(str)
(Setq con (Vlax-Get-Or-Create-Object "adodb.connection" ))
(Vlax-Invoke con 'Open "Driver={SQL Server};Server=IP;UID=name;PWD=password;database=Android2Lisp;")
(Setq Record (Vlax-Get-Or-Create-Object "adodb.Recordset" ))
(Vlax-Invoke Record 'Open (strcat "update Monitor set command = '"str " ' where id = '1'") con 1 3)
(vlax-invoke Record 'close)
(vlax-invoke con 'close)
(vlax-release-object Record )
(vlax-release-object con)
)


Android界面代码<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
      android:id="@+id/button1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignBaseline="@+id/editText1"
      android:layout_alignBottom="@+id/editText1"
      android:layout_alignParentRight="true"
      android:text="发送" />

    <Button
      android:id="@+id/button2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentTop="true"
      android:text="开始监视用户绘图" />
<ScrollView
    android:id="@+id/scrollview1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scrollbars="vertical"
    android:layout_below="@+id/button2"
    android:layout_above="@+id/button1"
      >
    <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentLeft="true"
      android:layout_alignRight="@+id/button1"
      android:scrollbars="vertical" />
</ScrollView>

<EditText
    android:id="@+id/editText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="18dp"
    android:layout_toLeftOf="@+id/button1"
    android:ems="10" />

</RelativeLayout>
Android主程序代码package com.example.nonsmallMonitorlisp;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.database.SQLException;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;

public class CopyOfMainActivity extends Activity {

public String serverName = "jdbc:jtds:sqlserver://xx.xx.xx.xx:1433/Android2Lisp";
public String UserName = "name";//用户名
public String Password = "password";//密码
private Button button2;
private TextView textView1;
private Handler handler;
private Thread thread;
private String ListeningCommand;
private ScrollView mScrollView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button2 = (Button)findViewById(R.id.button2);
    textView1 = (TextView)findViewById(R.id.textView1);
    mScrollView =(ScrollView)findViewById(R.id.scrollview1);
   
    button2.setOnClickListener(new OnClickListener() {      
      @Override
      public void onClick(View v) {
      // TODO 自动生成的方法存根
      handler = new Handler(){
          @Override
            public void handleMessage(Message msg) {
                  switch(msg.what){
                  case 0:
                      if (!isteningCommand.equals(""))
                      {
                        SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
                        String date=sdf.format(new java.util.Date());
                        textView1.append("\n" + date + "\n执行了" + ListeningCommand + "命令");
                        mScrollView.post(new Runnable() {   
                            public void run() {
                              mScrollView.scrollTo(0, 9999);
                            }
                        });
                      }
                        break;
                  default:
                        //do something
                        break;
                  }
            }
          };
      thread = new Thread(new Runnable() {
          @Override
          public void run() {
            // TODO 自动生成的方法存根
            try
                  {
            while (true) {
                  Listening();
                  handler.sendEmptyMessage(0);
                thread.sleep(500);
            }
                  }
                  catch (Exception e)
                  {
                  e.printStackTrace();
                  }
                  finally
                  {
                  //handler.sendEmptyMessage(0);
                  }
          }
      });
      thread.start();
      }
    });
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
private void Listening(){
    String sql = "select * from Monitor where id='1'";
    Connection con = null;
    try { // 加载驱动程序
      Class.forName("net.sourceforge.jtds.jdbc.Driver");
      con = DriverManager.getConnection(serverName,UserName,Password);
    } catch (ClassNotFoundException e) {
      System.out.println("加载驱动程序出错");
    } catch (SQLException e) {
      System.out.println(e.getMessage());
    } catch (Exception e) {
      System.out.println(e.getMessage());
    }
    try {
      try {
      Statement stmt = con.createStatement();//创建Statement
      ResultSet rs = stmt.executeQuery(sql);//ResultSet类似Cursor
      while (rs.next()) {
          ListeningCommand = rs.getString("command");
      }
      stmt.executeUpdate("update Monitor set command = '' where id = '1'");
      rs.close();
      stmt.close();
      } catch (SQLException e) {
      System.out.println(e.getMessage().toString());
      } finally {
      if (con != null)
          try {
            con.close();
          } catch (SQLException e) {
          }
      }
    } catch (java.sql.SQLException e) {
      e.printStackTrace();
    }
}
}反过来发送指令原理相同,直接上图




ps:本文仅作技术讨论,无需担心实际应用的可能性.
担心被应用监视?呵呵直接装摄像头就完事了,成本低又方便,还能防盗,何必如此麻烦.所以大家无需担心.
首先通过编程可以实现绘图指令自动执行欺骗监视.再说敢这样监视员工的老板,是没人愿意跟他混滴:)

楼下的,你的看法呢?

我爱lisp 发表于 2024-8-23 10:38:41

好思路, 留个脚印,将来可以利用这个方法呼叫在线帮助功能和提醒校审人员看图功能

Noangler 发表于 2023-4-1 10:44:57

猫老师,你厉害呀,这也行

flowerson 发表于 2014-3-20 15:27:17

争取到头位。猫老师的要支持!

flowerson 发表于 2014-3-20 15:29:42

猫老师,lisp我们很熟。请问Android 的代码如何使用,可否给些视频或动画?

cwmfj 发表于 2014-3-20 16:08:54

猫老师玩大了,可惜安卓系统门在哪 我们都不清楚呢

ysq101 发表于 2014-3-20 16:19:16

在猫老师手里。。。CAD就是一切啊。。。。
哪天我看你都可以用CAD控制你家冰箱和微波炉了
太高深了。。。。。。。

rjtiantian 发表于 2014-3-20 16:26:09

厉害厉害,瞧瞧先

Joe_Chan 发表于 2014-3-20 16:27:27

神马情况

q3_2006 发表于 2014-3-20 16:31:45

观望...太高深..彻底瞎...

shxm112233 发表于 2014-3-20 16:34:02

猫你厉害啊!!

gkaoyan 发表于 2014-3-20 17:01:17

真厉害啊
页: [1] 2 3 4 5 6 7 8
查看完整版本: 谁动了我的CAD? 原创Android手机与Lisp通讯成功.