谁动了我的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我们很熟。请问Android 的代码如何使用,可否给些视频或动画? 猫老师玩大了,可惜安卓系统门在哪 我们都不清楚呢 在猫老师手里。。。CAD就是一切啊。。。。
哪天我看你都可以用CAD控制你家冰箱和微波炉了
太高深了。。。。。。。 厉害厉害,瞧瞧先 神马情况 观望...太高深..彻底瞎... 猫你厉害啊!! 真厉害啊